diff --git a/.github/workflows/datapack-linter.yml b/.github/workflows/datapack-linter.yml index 6cff1d5cfd..f44ce0c909 100644 --- a/.github/workflows/datapack-linter.yml +++ b/.github/workflows/datapack-linter.yml @@ -21,9 +21,11 @@ jobs: with: GITHUB_TOKEN: ${{ github.token }} muteSuccessResult: true + # 文字幅表は必須の引用符にも警告が出るため除外する ignoreLintPathPattern: | animated_java:** core:define_gamerule + lib:text/core/tables.m - name: Checkout Asset2 if: ${{ github.ref == 'refs/heads/master' }} diff --git a/TheSkyBlessing/data/core/functions/load_once.mcfunction b/TheSkyBlessing/data/core/functions/load_once.mcfunction index dbb47edb9e..80b3cb8f91 100644 --- a/TheSkyBlessing/data/core/functions/load_once.mcfunction +++ b/TheSkyBlessing/data/core/functions/load_once.mcfunction @@ -443,6 +443,9 @@ team modify NoCollision collisionRule never # @within function settings:** scoreboard objectives add SettingMenuResendTime dummy +#> 文字幅表を読み込む + function lib:text/core/load + #> 各Asset側のロード処理 function #asset:artifact/load function #asset:mob/load diff --git a/TheSkyBlessing/data/lib/functions/text/_index.d.mcfunction b/TheSkyBlessing/data/lib/functions/text/_index.d.mcfunction new file mode 100644 index 0000000000..4f93320f56 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/_index.d.mcfunction @@ -0,0 +1,26 @@ +#> lib:text/_index.d +# @private + +#> Text measurement +# @within function lib:text/** + #declare storage lib:text + #declare storage lib_text_fonts: + #declare score_holder $TextResult + #declare score_holder $TextValid + #declare score_holder $TextAdvance + #declare score_holder $TextUniformAdvance + #declare score_holder $TextUniformGlyph + #declare score_holder $TextUniformEncoded + #declare score_holder $TextWidth + #declare score_holder $TextGlyph + #declare score_holder $TextBold + #declare score_holder $TextOld + #declare score_holder $TextLength + #declare score_holder $TextEncoded + #declare score_holder $TextCursor + #declare score_holder $TextStart + #declare score_holder $TextAuto + #declare score_holder $TextArg + #declare score_holder $TextDigit + #declare score_holder $TextDefaultTotal + #declare score_holder $TextUniformTotal diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/argument.m.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/argument.m.mcfunction new file mode 100644 index 0000000000..0cd0d70fa5 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/argument.m.mcfunction @@ -0,0 +1,17 @@ +#> lib:text/core/component/argument.m +# @within function lib:text/core/component/placeholder + +# withの文字列をtextを持つcompoundへ変換し、Piecesへ追加する + data modify storage lib:text Component.Template.Check set value [""] + $data modify storage lib:text Component.Template.Check append from storage lib:text Component.Current.with[$(Index)] + data modify storage lib:text Component.Template.Piece set value {} + execute if data storage lib:text Component.Template.Check[1] run data modify storage lib:text Component.Template.Piece.text set from storage lib:text Component.Template.Check[1] + execute if data storage lib:text Component.Template.Check[1] run data modify storage lib:text Component.Template.Pieces append from storage lib:text Component.Template.Piece + execute if data storage lib:text Component.Template.Check[1] run return 1 + +# withのcompoundは装飾を含めてPiecesへ追加し、それ以外の型や欠損は拒否する + data modify storage lib:text Component.Template.Check set value [{}] + $data modify storage lib:text Component.Template.Check append from storage lib:text Component.Current.with[$(Index)] + execute unless data storage lib:text Component.Template.Check[1] run return fail + data modify storage lib:text Component.Template.Pieces append from storage lib:text Component.Template.Check[1] + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/children.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/children.mcfunction new file mode 100644 index 0000000000..873df05e84 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/children.mcfunction @@ -0,0 +1,12 @@ +#> lib:text/core/component/children +# @within function +# lib:text/core/component/collect +# lib:text/core/component/children + +# Childrenを末尾からNodesへ積み、先頭の子から処理できる順序にする + data modify storage lib:text Component.Node set value {} + data modify storage lib:text Component.Node.Style set from storage lib:text Component.Style + data modify storage lib:text Component.Node.Value set from storage lib:text Component.Children[-1] + data modify storage lib:text Component.Nodes append from storage lib:text Component.Node + data remove storage lib:text Component.Children[-1] + execute if data storage lib:text Component.Children[0] run function lib:text/core/component/children diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/collect.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/collect.mcfunction new file mode 100644 index 0000000000..83b3a03abb --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/collect.mcfunction @@ -0,0 +1,51 @@ +#> lib:text/core/component/collect +# @within function +# lib:text/measure_component +# lib:text/core/component/collect + +# Nodesから処理対象と継承した装飾を取り出す + data modify storage lib:text Component.Current set from storage lib:text Component.Nodes[-1].Value + data modify storage lib:text Component.Style set from storage lib:text Component.Nodes[-1].Style + data remove storage lib:text Component.Nodes[-1] + +# 本文の装飾を継承値へ重ねる +# 配列では最内側の先頭要素の装飾を後続要素にも継承する + data modify storage lib:text Component.Head set from storage lib:text Component.Current + execute if data storage lib:text Component.Head[0] run function lib:text/core/component/head + data modify storage lib:text Component.Style.Bold set from storage lib:text Component.Head.bold + data modify storage lib:text Component.Style.Font set from storage lib:text Component.Head.font + +# 配列の要素を積み直し、入れ子も同じ入口で処理する + data modify storage lib:text Component.Children set value [] + execute if data storage lib:text Component.Current[0] run data modify storage lib:text Component.Children set from storage lib:text Component.Current + execute if data storage lib:text Component.Children[0] run function lib:text/core/component/children + execute if data storage lib:text Component.Current[0] run return run function lib:text/core/component/collect + +# extra を差込み本文とは別に積み、リスト間の要素型の違いを保つ + data modify storage lib:text Component.Children set from storage lib:text Component.Current.extra + execute if data storage lib:text Component.Children[0] run function lib:text/core/component/children + +# 動的な本文の参照を拒否する + execute if data storage lib:text Component.Current.selector run return fail + execute if data storage lib:text Component.Current.nbt run return fail + execute if data storage lib:text Component.Current.score run return fail + execute if data storage lib:text Component.Current.keybind run return fail + +# 文字列・text・translateから本文を取り出す +# 文字列型のリストへ追加し、本文として扱える文字列だけを受け取る + data modify storage lib:text Component.Check set value [""] + data modify storage lib:text Component.Check append from storage lib:text Component.Current + data modify storage lib:text Component.Check append from storage lib:text Component.Current.text + execute if data storage lib:text Component.Current.translate run data modify storage lib:text Component.Check append from storage lib:text Component.Current.translate + execute unless data storage lib:text Component.Check[1] run return fail + +# 装飾付きの本文をPartsへ追加し、translateは差し込む要素へ展開する + data modify storage lib:text Component.Part set from storage lib:text Component.Style + data modify storage lib:text Component.Part.Text set from storage lib:text Component.Check[1] + execute unless data storage lib:text Component.Current.translate run data modify storage lib:text Component.Parts append from storage lib:text Component.Part + execute if data storage lib:text Component.Current.translate unless function lib:text/core/component/translate run return fail + +# 差込み本文を積み、本文・extra・兄弟の順で処理する + execute if data storage lib:text Component.Children[0] run function lib:text/core/component/children + execute if data storage lib:text Component.Nodes[0] run return run function lib:text/core/component/collect + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/head.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/head.mcfunction new file mode 100644 index 0000000000..36ff97b76c --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/head.mcfunction @@ -0,0 +1,8 @@ +#> lib:text/core/component/head +# @within function +# lib:text/core/component/collect +# lib:text/core/component/head + +# 入れ子配列の先頭を辿り、兄弟へ継承する装飾の参照先を決める + data modify storage lib:text Component.Head set from storage lib:text Component.Head[0] + execute if data storage lib:text Component.Head[0] run function lib:text/core/component/head diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/index.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/index.mcfunction new file mode 100644 index 0000000000..28d13e2df3 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/index.mcfunction @@ -0,0 +1,43 @@ +#> lib:text/core/component/index +# @within function +# lib:text/core/component/placeholder +# lib:text/core/component/index + +# 番号末尾の $s を確認し、1始まりの番号を配列添字へ変換する + data modify storage lib:text Component.Template.Char set string storage lib:text Component.Template.Remaining 0 1 + data modify storage lib:text Component.Template.IndexEnd set value false + execute if data storage lib:text Component.Template{Char:"$"} run data modify storage lib:text Component.Template.IndexEnd set value true + execute if data storage lib:text Component.Template{Char:"$"} if score $TextArg Temporary matches ..0 run return fail + execute if data storage lib:text Component.Template{Char:"$"} run data modify storage lib:text Component.Template.Remaining set string storage lib:text Component.Template.Remaining 1 + execute if data storage lib:text Component.Template{Char:"$"} run scoreboard players add $TextCursor Temporary 1 + execute if data storage lib:text Component.Template{Char:"$"} run scoreboard players remove $TextArg Temporary 1 + execute if data storage lib:text Component.Template{Char:"$"} run data modify storage lib:text Component.Template.Char set string storage lib:text Component.Template.Remaining 0 1 + execute if data storage lib:text Component.Template{IndexEnd:true,Char:"s"} run return 1 + execute if data storage lib:text Component.Template{IndexEnd:true} run return fail + +# 数字を1桁読み取り、数値へ変換する + scoreboard players set $TextDigit Temporary -1 + execute if data storage lib:text Component.Template{Char:"0"} run scoreboard players set $TextDigit Temporary 0 + execute if data storage lib:text Component.Template{Char:"1"} run scoreboard players set $TextDigit Temporary 1 + execute if data storage lib:text Component.Template{Char:"2"} run scoreboard players set $TextDigit Temporary 2 + execute if data storage lib:text Component.Template{Char:"3"} run scoreboard players set $TextDigit Temporary 3 + execute if data storage lib:text Component.Template{Char:"4"} run scoreboard players set $TextDigit Temporary 4 + execute if data storage lib:text Component.Template{Char:"5"} run scoreboard players set $TextDigit Temporary 5 + execute if data storage lib:text Component.Template{Char:"6"} run scoreboard players set $TextDigit Temporary 6 + execute if data storage lib:text Component.Template{Char:"7"} run scoreboard players set $TextDigit Temporary 7 + execute if data storage lib:text Component.Template{Char:"8"} run scoreboard players set $TextDigit Temporary 8 + execute if data storage lib:text Component.Template{Char:"9"} run scoreboard players set $TextDigit Temporary 9 + execute if score $TextDigit Temporary matches -1 run return fail + +# 番号を10倍して次の桁を足す前に、int上限を超えないか確認する +# $TextArg(更新後)= $TextArg(更新前)× 10 + $TextDigit <= 2147483647 + execute if score $TextArg Temporary matches 214748365.. run return fail + execute if score $TextArg Temporary matches 214748364 if score $TextDigit Temporary matches 8.. run return fail + scoreboard players operation $TextArg Temporary *= $10 Const + scoreboard players operation $TextArg Temporary += $TextDigit Temporary + +# 読み取った桁を消費し、次の桁または $s を調べる + data modify storage lib:text Component.Template.Remaining set string storage lib:text Component.Template.Remaining 1 + scoreboard players add $TextCursor Temporary 1 + execute if data storage lib:text Component.Template{Remaining:""} run return fail + return run function lib:text/core/component/index diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/measure.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/measure.mcfunction new file mode 100644 index 0000000000..ae96b9cc47 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/measure.mcfunction @@ -0,0 +1,31 @@ +#> lib:text/core/component/measure +# @within function lib:text/measure_component + +# 各部分を計測し、両設定の送り幅を半px単位で合計する +# 部分ごとの切り上げによる誤差を避けるため、整数幅ではなく送り幅を足す + scoreboard players set $TextDefaultTotal Temporary 0 + scoreboard players set $TextUniformTotal Temporary 0 + execute if data storage lib:text Component.Parts[0] unless function lib:text/core/component/part run return fail + +# 通常表示の送り幅を保存し、合計を整数へ切り上げる +# 以下の合計値は剰余演算前の値で、半px単位 +# Return.Default.TextAdvance = $TextDefaultTotal / 2 +# $TextWidth = floor($TextDefaultTotal / 2) + ($TextDefaultTotal mod 2) = ceil($TextDefaultTotal / 2) + execute store result storage lib: Return.Default.TextAdvance double 0.5 run scoreboard players get $TextDefaultTotal Temporary + scoreboard players operation $TextWidth Temporary = $TextDefaultTotal Temporary + scoreboard players operation $TextWidth Temporary /= $2 Const + scoreboard players operation $TextDefaultTotal Temporary %= $2 Const + execute if score $TextDefaultTotal Temporary matches 1 run scoreboard players add $TextWidth Temporary 1 + execute store result storage lib: Return.Default.TextWidth int 1 run scoreboard players get $TextWidth Temporary + +# Unicodeフォント強制時の送り幅を保存し、合計を整数へ切り上げる +# 以下の合計値は剰余演算前の値で、半px単位 +# Return.Unifont.TextAdvance = $TextUniformTotal / 2 +# $TextWidth = floor($TextUniformTotal / 2) + ($TextUniformTotal mod 2) = ceil($TextUniformTotal / 2) + execute store result storage lib: Return.Unifont.TextAdvance double 0.5 run scoreboard players get $TextUniformTotal Temporary + scoreboard players operation $TextWidth Temporary = $TextUniformTotal Temporary + scoreboard players operation $TextWidth Temporary /= $2 Const + scoreboard players operation $TextUniformTotal Temporary %= $2 Const + execute if score $TextUniformTotal Temporary matches 1 run scoreboard players add $TextWidth Temporary 1 + execute store result storage lib: Return.Unifont.TextWidth int 1 run scoreboard players get $TextWidth Temporary + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/part.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/part.mcfunction new file mode 100644 index 0000000000..3684b88445 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/part.mcfunction @@ -0,0 +1,36 @@ +#> lib:text/core/component/part +# @within function +# lib:text/core/component/measure +# lib:text/core/component/part + +# フォント名を正規化し、指定フォントで部分文字列を計測する + data modify storage lib:text Work set from storage lib:text Component.Parts[0] + execute if data storage lib:text Work{Font:"default"} run data modify storage lib:text Work.Font set value "minecraft:default" + execute if data storage lib:text Work{Font:"uniform"} run data modify storage lib:text Work.Font set value "minecraft:uniform" + execute if data storage lib:text Work{Font:"space"} run data modify storage lib:text Work.Font set value "minecraft:space" + execute unless data storage lib:text Work{Font:"minecraft:default"} unless data storage lib:text Work{Font:"minecraft:uniform"} unless data storage lib:text Work{Font:"minecraft:space"} run return fail + execute unless data storage lib:text Work{Font:"minecraft:default"} run data modify storage lib:text Work.FixedFont set from storage lib:text Work.Font + execute unless function lib:text/core/measure run return fail + +# 通常表示の幅を半px単位に戻して合計し、intのオーバーフローを検出する +# $TextGlyph = Return.Default.TextAdvance × 2 +# $TextDefaultTotal(更新後)= $TextDefaultTotal(更新前)+ $TextGlyph + execute store result score $TextGlyph Temporary run data get storage lib: Return.Default.TextAdvance 2 + scoreboard players operation $TextOld Temporary = $TextDefaultTotal Temporary + scoreboard players operation $TextDefaultTotal Temporary += $TextGlyph Temporary + execute if score $TextGlyph Temporary matches 0.. if score $TextDefaultTotal Temporary < $TextOld Temporary run return fail + execute if score $TextGlyph Temporary matches ..-1 if score $TextDefaultTotal Temporary > $TextOld Temporary run return fail + +# Unicodeフォント強制時の幅を半px単位に戻して合計し、intのオーバーフローを検出する +# $TextGlyph = Return.Unifont.TextAdvance × 2 +# $TextUniformTotal(更新後)= $TextUniformTotal(更新前)+ $TextGlyph + execute store result score $TextGlyph Temporary run data get storage lib: Return.Unifont.TextAdvance 2 + scoreboard players operation $TextOld Temporary = $TextUniformTotal Temporary + scoreboard players operation $TextUniformTotal Temporary += $TextGlyph Temporary + execute if score $TextGlyph Temporary matches 0.. if score $TextUniformTotal Temporary < $TextOld Temporary run return fail + execute if score $TextGlyph Temporary matches ..-1 if score $TextUniformTotal Temporary > $TextOld Temporary run return fail + +# 次の部分へ進む + data remove storage lib:text Component.Parts[0] + execute if data storage lib:text Component.Parts[0] run return run function lib:text/core/component/part + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/placeholder.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/placeholder.mcfunction new file mode 100644 index 0000000000..d9969254ba --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/placeholder.mcfunction @@ -0,0 +1,25 @@ +#> lib:text/core/component/placeholder +# @within function lib:text/core/component/translate_next + +# %の直後を読み、%%なら本文に%を追加する + execute if data storage lib:text Component.Template{Remaining:""} run return fail + data modify storage lib:text Component.Template.Char set string storage lib:text Component.Template.Remaining 0 1 + execute if data storage lib:text Component.Template{Char:"%"} run data modify storage lib:text Component.Template.Pieces append value {text:"%"} + +# withの添字を決める +# %sだけで出現順の番号を進め、%N$sは指定番号を使う + scoreboard players operation $TextArg Temporary = $TextAuto Temporary + execute if data storage lib:text Component.Template{Char:"s"} run scoreboard players add $TextAuto Temporary 1 + execute unless data storage lib:text Component.Template{Char:"%"} unless data storage lib:text Component.Template{Char:"s"} run scoreboard players set $TextArg Temporary 0 + execute unless data storage lib:text Component.Template{Char:"%"} unless data storage lib:text Component.Template{Char:"s"} unless function lib:text/core/component/index run return fail + +# 選んだwithの要素を差し込み、不足や未対応の型は失敗にする + execute unless data storage lib:text Component.Template{Char:"%"} store result storage lib:text Component.Template.Index int 1 run scoreboard players get $TextArg Temporary + execute unless data storage lib:text Component.Template{Char:"%"} store success score $TextValid Temporary run function lib:text/core/component/argument.m with storage lib:text Component.Template + execute unless data storage lib:text Component.Template{Char:"%"} unless score $TextValid Temporary matches 1 run return fail + +# 書式指定の末尾を消費し、次に切り出す本文の開始位置を更新する + data modify storage lib:text Component.Template.Remaining set string storage lib:text Component.Template.Remaining 1 + scoreboard players add $TextCursor Temporary 1 + scoreboard players operation $TextStart Temporary = $TextCursor Temporary + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/slice.m.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/slice.m.mcfunction new file mode 100644 index 0000000000..1b832e1d32 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/slice.m.mcfunction @@ -0,0 +1,7 @@ +#> lib:text/core/component/slice.m +# @within function lib:text/core/component/translate_next + +# 原文のStart以上End未満をtextへ切り出し、Piecesへ追加する + data modify storage lib:text Component.Template.Piece set value {} + $data modify storage lib:text Component.Template.Piece.text set string storage lib:text Component.Template.Text $(Start) $(End) + data modify storage lib:text Component.Template.Pieces append from storage lib:text Component.Template.Piece diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/translate.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/translate.mcfunction new file mode 100644 index 0000000000..fe0e4bbbcb --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/translate.mcfunction @@ -0,0 +1,16 @@ +#> lib:text/core/component/translate +# @within function lib:text/core/component/collect + +# translateの原文と走査位置を用意する +# Cursorは現在位置、Startは未確定の本文の先頭、Autoは次の%sが参照する添字 + data modify storage lib:text Component.Template set value {Pieces:[]} + data modify storage lib:text Component.Template.Text set from storage lib:text Component.Current.translate + data modify storage lib:text Component.Template.Remaining set from storage lib:text Component.Current.translate + scoreboard players set $TextCursor Temporary 0 + scoreboard players set $TextStart Temporary 0 + scoreboard players set $TextAuto Temporary 0 + +# 本文とwithの差し込みをPiecesへ展開し、子要素としてcollectへ渡す + execute unless function lib:text/core/component/translate_next run return fail + data modify storage lib:text Component.Children set from storage lib:text Component.Template.Pieces + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/core/component/translate_next.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/component/translate_next.mcfunction new file mode 100644 index 0000000000..643d512b38 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/component/translate_next.mcfunction @@ -0,0 +1,20 @@ +#> lib:text/core/component/translate_next +# @within function +# lib:text/core/component/translate +# lib:text/core/component/translate_next + +# 走査位置までの本文区間を確定し、文字列の末尾なら切り出して終了する + execute store result storage lib:text Component.Template.Start int 1 run scoreboard players get $TextStart Temporary + execute store result storage lib:text Component.Template.End int 1 run scoreboard players get $TextCursor Temporary + execute if data storage lib:text Component.Template{Remaining:""} if score $TextCursor Temporary > $TextStart Temporary run function lib:text/core/component/slice.m with storage lib:text Component.Template + execute if data storage lib:text Component.Template{Remaining:""} run return 1 + +# %を見つけたら、その直前までの本文を切り出す + data modify storage lib:text Component.Template.Char set string storage lib:text Component.Template.Remaining 0 1 + execute if data storage lib:text Component.Template{Char:"%"} if score $TextCursor Temporary > $TextStart Temporary run function lib:text/core/component/slice.m with storage lib:text Component.Template + +# 1コード単位進め、%の場合は続く書式指定とwithの差し込みを処理する + data modify storage lib:text Component.Template.Remaining set string storage lib:text Component.Template.Remaining 1 + scoreboard players add $TextCursor Temporary 1 + execute if data storage lib:text Component.Template{Char:"%"} unless function lib:text/core/component/placeholder run return fail + return run function lib:text/core/component/translate_next diff --git a/TheSkyBlessing/data/lib/functions/text/core/finish.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/finish.mcfunction new file mode 100644 index 0000000000..01004a86c0 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/finish.mcfunction @@ -0,0 +1,34 @@ +#> lib:text/core/finish +# +# @within function +# lib:text/measure +# lib:text/measure_component + +# 失敗時は途中まで計測した結果も削除する + execute unless score $TextResult Temporary matches 1 run data remove storage lib: Return.Default + execute unless score $TextResult Temporary matches 1 run data remove storage lib: Return.Unifont + +# 作業領域と一時スコアを片付け、結果の有無で成否を返す + data remove storage lib:text Work + data remove storage lib:text Component + scoreboard players reset $TextResult Temporary + scoreboard players reset $TextValid Temporary + scoreboard players reset $TextAdvance Temporary + scoreboard players reset $TextUniformAdvance Temporary + scoreboard players reset $TextUniformGlyph Temporary + scoreboard players reset $TextUniformEncoded Temporary + scoreboard players reset $TextWidth Temporary + scoreboard players reset $TextGlyph Temporary + scoreboard players reset $TextBold Temporary + scoreboard players reset $TextOld Temporary + scoreboard players reset $TextLength Temporary + scoreboard players reset $TextEncoded Temporary + scoreboard players reset $TextCursor Temporary + scoreboard players reset $TextStart Temporary + scoreboard players reset $TextAuto Temporary + scoreboard players reset $TextArg Temporary + scoreboard players reset $TextDigit Temporary + scoreboard players reset $TextDefaultTotal Temporary + scoreboard players reset $TextUniformTotal Temporary + execute if data storage lib: Return.Unifont run return 1 + return fail diff --git a/TheSkyBlessing/data/lib/functions/text/core/glyph.m.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/glyph.m.mcfunction new file mode 100644 index 0000000000..261c213f62 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/glyph.m.mcfunction @@ -0,0 +1,13 @@ +#> lib:text/core/glyph.m +# +# @within function +# lib:text/core/next +# lib:text/core/pair + +# space以外では制御文字などの拒否対象の文字で失敗する + $execute unless data storage lib:text Work{Font:"minecraft:space"} if data storage lib_text_fonts: Rejected."$(Key)" run return fail + +# 指定フォントの文字幅を取得し、設定に追従する場合は通常表示固有の幅も取得する + $data modify storage lib:text Work.UniformGlyph set from storage lib_text_fonts: Fonts."$(Font)"."$(Key)" + $execute unless data storage lib:text Work.FixedFont run data modify storage lib:text Work.Glyph set from storage lib_text_fonts: Fonts."minecraft:default"."$(Key)" + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/core/load.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/load.mcfunction new file mode 100644 index 0000000000..01e4000f32 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/load.mcfunction @@ -0,0 +1,9 @@ +#> lib:text/core/load +# Generated by scripts/text/generate_widths.cjs +# @within function core:load_once + +# 版が変わった場合だけ文字幅表を更新する + execute if data storage lib_text_fonts: {Version:"72dda72f697f3946f595d1a3b6c1066a629f21f513330406fcf8442755c8cdb7"} run return 1 + execute store success score $TextResult Temporary run function lib:text/core/tables.m {_:""} + execute if score $TextResult Temporary matches 1 run data modify storage lib_text_fonts: Version set value "72dda72f697f3946f595d1a3b6c1066a629f21f513330406fcf8442755c8cdb7" + scoreboard players reset $TextResult Temporary diff --git a/TheSkyBlessing/data/lib/functions/text/core/mark_pair_lead.m.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/mark_pair_lead.m.mcfunction new file mode 100644 index 0000000000..bacf35ceee --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/mark_pair_lead.m.mcfunction @@ -0,0 +1,5 @@ +#> lib:text/core/mark_pair_lead.m +# @within function lib:text/core/tables.m + +# 補助文字の先頭を146で登録し、通常の未収録文字と区別する + $data modify storage lib_text_fonts: Fonts."$(Font)"."$(Key)" set value 146 diff --git a/TheSkyBlessing/data/lib/functions/text/core/measure.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/measure.mcfunction new file mode 100644 index 0000000000..4d3b7b6e14 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/measure.mcfunction @@ -0,0 +1,35 @@ +#> lib:text/core/measure +# +# @within function +# lib:text/measure +# lib:text/core/component/part + +# 文字列を一度走査し、両設定の半ピクセル幅を合計する + scoreboard players set $TextAdvance Temporary 0 + scoreboard players set $TextUniformAdvance Temporary 0 + data modify storage lib:text Work.Font set value "minecraft:uniform" + execute if data storage lib:text Work.FixedFont run data modify storage lib:text Work.Font set from storage lib:text Work.FixedFont + execute unless function lib:text/core/next run return fail + +# 通常表示の送り幅を保存して整数へ切り上げる +# 以下の合計値は剰余演算前の値で、半px単位 +# Return.Default.TextAdvance = $TextAdvance / 2 +# $TextWidth = floor($TextAdvance / 2) + ($TextAdvance mod 2) = ceil($TextAdvance / 2) + execute store result storage lib: Return.Default.TextAdvance double 0.5 run scoreboard players get $TextAdvance Temporary + scoreboard players operation $TextWidth Temporary = $TextAdvance Temporary + scoreboard players operation $TextWidth Temporary /= $2 Const + scoreboard players operation $TextAdvance Temporary %= $2 Const + execute if score $TextAdvance Temporary matches 1 run scoreboard players add $TextWidth Temporary 1 + execute store result storage lib: Return.Default.TextWidth int 1 run scoreboard players get $TextWidth Temporary + +# Unicodeフォント強制時の送り幅を保存して整数へ切り上げる +# 以下の合計値は剰余演算前の値で、半px単位 +# Return.Unifont.TextAdvance = $TextUniformAdvance / 2 +# $TextWidth = floor($TextUniformAdvance / 2) + ($TextUniformAdvance mod 2) = ceil($TextUniformAdvance / 2) + execute store result storage lib: Return.Unifont.TextAdvance double 0.5 run scoreboard players get $TextUniformAdvance Temporary + scoreboard players operation $TextWidth Temporary = $TextUniformAdvance Temporary + scoreboard players operation $TextWidth Temporary /= $2 Const + scoreboard players operation $TextUniformAdvance Temporary %= $2 Const + execute if score $TextUniformAdvance Temporary matches 1 run scoreboard players add $TextWidth Temporary 1 + execute store result storage lib: Return.Unifont.TextWidth int 1 run scoreboard players get $TextWidth Temporary + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/core/next.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/next.mcfunction new file mode 100644 index 0000000000..c161f7775a --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/next.mcfunction @@ -0,0 +1,78 @@ +#> lib:text/core/next +# +# @within function +# lib:text/core/next +# lib:text/core/measure + +# 先頭1コード単位を切り出し、引用符とバックスラッシュを検索キー用にエスケープする + execute if data storage lib:text Work{Text:""} run return 1 + data modify storage lib:text Work.Char set string storage lib:text Work.Text 0 1 + data modify storage lib:text Work.Escaped set from storage lib:text Work.Char + execute if data storage lib:text Work{Char:'"'} run data modify storage lib:text Work.Escaped set value '\\"' + execute if data storage lib:text Work{Char:'\\'} run data modify storage lib:text Work.Escaped set value '\\\\' + data modify storage lib:text Work.Key set from storage lib:text Work.Escaped + +# 文字幅を検索し、補助文字の先頭なら2コード単位で検索する +# 表から取得した146は先頭の目印で、通常の未収録文字にはこの後で146を補う +# spaceの未収録文字には既定の幅を使わず失敗する + data remove storage lib:text Work.Glyph + data remove storage lib:text Work.UniformGlyph + execute store success score $TextValid Temporary run function lib:text/core/glyph.m with storage lib:text Work + execute unless score $TextValid Temporary matches 1 run return fail + execute if data storage lib:text Work{UniformGlyph:146} run function lib:text/core/pair + execute if data storage lib:text Work{Font:"minecraft:space"} unless data storage lib:text Work.UniformGlyph run return fail + +# 未収録文字を9px・太字加算0.5px・1コード単位として補う +# 通常表示固有の幅がなければ、指定フォントの幅を使う + execute unless data storage lib:text Work.UniformGlyph run data modify storage lib:text Work.UniformGlyph set value 146 + execute unless data storage lib:text Work.Glyph run data modify storage lib:text Work.Glyph set from storage lib:text Work.UniformGlyph + +# 通常表示の幅を復号し、太字指定があれば太字分を加える +# 幅と太字加算は半px単位で、太字加算はBold:trueの場合だけ加える +# 符号化値 = 幅 × 8 + 太字加算 × 2 + コード単位数 - 1 +# $TextGlyph = floor($TextEncoded / 8) +# $TextBold = floor($TextEncoded / 2) mod 4 +# $TextGlyph(太字)= $TextGlyph + $TextBold + execute store result score $TextEncoded Temporary run data get storage lib:text Work.Glyph + scoreboard players operation $TextGlyph Temporary = $TextEncoded Temporary + scoreboard players operation $TextGlyph Temporary /= $8 Const + execute if data storage lib:text Work{Bold:true} run scoreboard players operation $TextBold Temporary = $TextEncoded Temporary + execute if data storage lib:text Work{Bold:true} run scoreboard players operation $TextBold Temporary /= $2 Const + execute if data storage lib:text Work{Bold:true} run scoreboard players operation $TextBold Temporary %= $4 Const + execute if data storage lib:text Work{Bold:true} run scoreboard players operation $TextGlyph Temporary += $TextBold Temporary + +# 通常表示の合計を更新し、オーバーフローを確認する + scoreboard players operation $TextOld Temporary = $TextAdvance Temporary + scoreboard players operation $TextAdvance Temporary += $TextGlyph Temporary + # 合計は半px単位のintで保持し、加算前後の大小関係からオーバーフローを検出する + # 例: default・Bold:falseでは、U+F300(+65,536px)を16,384文字で上限を超える + # U+F301(-65,536px)は16,385文字で下限を超える + execute if score $TextGlyph Temporary matches 0.. if score $TextAdvance Temporary < $TextOld Temporary run return fail + execute if score $TextGlyph Temporary matches ..-1 if score $TextAdvance Temporary > $TextOld Temporary run return fail + +# Unicodeフォント強制時の幅を復号し、太字指定があれば太字分を加える +# $TextUniformGlyph = floor($TextUniformEncoded / 8) +# $TextBold = floor($TextUniformEncoded / 2) mod 4 +# $TextUniformGlyph(太字)= $TextUniformGlyph + $TextBold + execute store result score $TextUniformEncoded Temporary run data get storage lib:text Work.UniformGlyph + scoreboard players operation $TextUniformGlyph Temporary = $TextUniformEncoded Temporary + scoreboard players operation $TextUniformGlyph Temporary /= $8 Const + execute if data storage lib:text Work{Bold:true} run scoreboard players operation $TextBold Temporary = $TextUniformEncoded Temporary + execute if data storage lib:text Work{Bold:true} run scoreboard players operation $TextBold Temporary /= $2 Const + execute if data storage lib:text Work{Bold:true} run scoreboard players operation $TextBold Temporary %= $4 Const + execute if data storage lib:text Work{Bold:true} run scoreboard players operation $TextUniformGlyph Temporary += $TextBold Temporary + +# Unicodeフォント強制時の合計を更新し、オーバーフローを確認する + scoreboard players operation $TextOld Temporary = $TextUniformAdvance Temporary + scoreboard players operation $TextUniformAdvance Temporary += $TextUniformGlyph Temporary + execute if score $TextUniformGlyph Temporary matches 0.. if score $TextUniformAdvance Temporary < $TextOld Temporary run return fail + execute if score $TextUniformGlyph Temporary matches ..-1 if score $TextUniformAdvance Temporary > $TextOld Temporary run return fail + +# 処理した UTF-16 コード単位を取り除いて次の文字へ進む +# Work.Units = ($TextEncoded mod 2) + 1 + scoreboard players operation $TextEncoded Temporary %= $2 Const + scoreboard players add $TextEncoded Temporary 1 + execute store result storage lib:text Work.Units int 1 run scoreboard players get $TextEncoded Temporary + execute if data storage lib:text Work{Units:1} run data modify storage lib:text Work.Text set string storage lib:text Work.Text 1 + execute if data storage lib:text Work{Units:2} run data modify storage lib:text Work.Text set string storage lib:text Work.Text 2 + return run function lib:text/core/next diff --git a/TheSkyBlessing/data/lib/functions/text/core/pair.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/pair.mcfunction new file mode 100644 index 0000000000..ba3f6c3a40 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/pair.mcfunction @@ -0,0 +1,15 @@ +#> lib:text/core/pair +# +# @within function +# lib:text/core/next + +# 先頭2コード単位を幅表のキーとして再検索する + execute store result score $TextLength Temporary run data get storage lib:text Work.Text + execute if score $TextLength Temporary matches ..1 run return fail + data modify storage lib:text Work.Char set string storage lib:text Work.Text 1 2 + # 引用符とバックスラッシュは後半サロゲートにならず、マクロのキーにも埋め込まない + execute if data storage lib:text Work{Char:'"'} run return fail + execute if data storage lib:text Work{Char:'\\'} run return fail + data modify storage lib:text Work.Tail set from storage lib:text Work.Char + function lib:text/core/pair_key.m with storage lib:text Work + function lib:text/core/glyph.m with storage lib:text Work diff --git a/TheSkyBlessing/data/lib/functions/text/core/pair_key.m.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/pair_key.m.mcfunction new file mode 100644 index 0000000000..61af9a3d4f --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/pair_key.m.mcfunction @@ -0,0 +1,6 @@ +#> lib:text/core/pair_key.m +# +# @within function +# lib:text/core/pair + +$data modify storage lib:text Work.Key set value "$(Key)$(Tail)" diff --git a/TheSkyBlessing/data/lib/functions/text/core/tables.m.mcfunction b/TheSkyBlessing/data/lib/functions/text/core/tables.m.mcfunction new file mode 100644 index 0000000000..0ee5ab80e8 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/core/tables.m.mcfunction @@ -0,0 +1,28 @@ +#> lib:text/core/tables.m +# +# Generated by scripts/text/generate_widths.cjs +# @within function lib:text/core/load + +# フォント別の文字幅表を読み込む + data modify storage lib_text_fonts: Fonts set value {} + data modify storage lib_text_fonts: Fonts."minecraft:default" set value {} + $data modify storage lib_text_fonts:$(_) Fonts."minecraft:default" merge value {"0":100,"1":100,"2":100,"3":100,"4":100,"5":100,"6":100,"7":100,"8":100,"9":100,"":4,"":4,"":1048580,"":-1048572,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":20,"":36,"":52,"":68,"":84,"":100,"":116,"":132,"":148,"":164,"":180,"":196,"":212,"":228,"":244,"":260,"":276,"":292,"":308,"":324,"":340,"":356,"":372,"":388,"":404,"":420,"":436,"":452,"":468,"":484,"":500,"":516,"":532,"":548,"":564,"":580,"":596,"":612,"":628,"":644,"":660,"":676,"":692,"":708,"":724,"":740,"":756,"":772,"":788,"":804,"":820,"":836,"":852,"":868,"":884,"":900,"":916,"":932,"":948,"":964,"":980,"":996,"":1012,"":1028,"":1044,"":1060,"":1076,"":1092,"":1108,"":1124,"":1140,"":1156,"":1172,"":1188,"":1204,"":1220,"":1236,"":1252,"":1268,"":1284,"":1300,"":1316,"":1332,"":1348,"":1364,"":1380,"":1396,"":1412,"":1428,"":1444,"":1460,"":1476,"":1492,"":1508,"":1524,"":1540,"":1556,"":1572,"":1588,"":1604,"":1620,"":1636,"":1652,"":1668,"":1684,"":1700,"":1716,"":1732,"":1748,"":1764,"":1780,"":1796,"":1812,"":1828,"":1844,"":1860,"":1876,"":1892,"":1908,"":1924,"":1940,"":1956,"":1972,"":1988,"":2004,"":2020,"":2036,"":2052,"":2068,"":2084,"":2100,"":2116,"":2132,"":2148,"":2164,"":2180,"":2196,"":2212,"":2228,"":2244,"":2260,"":2276,"":2292,"":2308,"":2324,"":2340,"":2356,"":2372,"":2388,"":2404,"":2420,"":2436,"":2452,"":2468,"":2484,"":2500,"":2516,"":2532,"":2548,"":2564,"":2580,"":2596,"":2612,"":2628,"":2644,"":2660,"":2676,"":2692,"":2708,"":2724,"":2740,"":2756,"":2772,"":2788,"":2804,"":2820,"":2836,"":2852,"":2868,"":2884,"":2900,"":2916,"":2932,"":2948,"":2964,"":2980,"":2996,"":3012,"":3028,"":3044,"":3060,"":3076,"":3092,"":3108,"":3124,"":3140,"":3156,"":3172,"":3188,"":3204,"":3220,"":3236,"":3252,"":3268,"":3284,"":3300,"":3316,"":3332,"":3348,"":3364,"":3380,"":3396,"":3412,"":3428,"":3444,"":3460,"":3476,"":3492,"":3508,"":3524,"":3540,"":3556,"":3572,"":3588,"":3604,"":3620,"":3636,"":3652,"":3668,"":3684,"":3700,"":3716,"":3732,"":3748,"":3764,"":3780,"":3796,"":3812,"":3828,"":3844,"":3860,"":3876,"":3892,"":3908,"":3924,"":3940,"":3956,"":3972,"":3988,"":4004,"":4020,"":4036,"":4052,"":4068,"":4084,"":4100,"¡":36,"‰":132,"·":36,"₴":132,"≠":100,"¿":100,"×":100,"Ø":100,"Þ":100,"һ":100,"ð":100,"ø":100,"þ":100,"Α":100,"Β":100,"Γ":100,"Δ":100,"Ε":100,"Ζ":100,"Η":100,"Θ":100,"Ι":68,"Κ":100,"Λ":100,"Μ":100,"Ν":100,"Ξ":100,"Ο":100,"Π":100,"Ρ":100,"Σ":100,"Τ":100,"Υ":100,"Φ":100,"Χ":100,"Ψ":100,"Ω":100,"α":100,"β":100,"γ":100,"δ":100,"ε":100,"ζ":100,"η":100,"θ":100,"ι":52,"κ":84,"λ":100,"μ":100,"ν":100,"ξ":100,"ο":100,"π":100,"ρ":100,"ς":100,"σ":116,"τ":100,"υ":100,"φ":100,"χ":100,"ψ":100,"ω":132,"Ђ":132,"Ѕ":100,"І":68,"Ј":100,"Љ":132,"Њ":116,"Ћ":116,"А":100,"Б":100,"В":100,"Г":100,"Д":116,"Е":100,"Ж":132,"З":100,"И":100,"К":100,"Л":100,"М":100,"Н":100,"О":100,"П":100,"Р":100,"С":100,"Т":100,"У":100,"Ф":132,"Х":100,"Ц":116,"Ч":100,"Ш":132,"Щ":148,"Ъ":116,"Ы":132,"Ь":100,"Э":100,"Ю":132,"Я":100,"а":100,"б":100,"в":100,"г":84,"д":116,"е":100,"ж":100,"з":100,"и":100,"к":84,"л":100,"м":100,"н":100,"о":100,"п":100,"р":100,"с":100,"т":100,"у":100,"ф":100,"х":100,"ц":100,"ч":100,"ш":100,"щ":116,"ъ":116,"ы":116,"ь":100,"э":100,"ю":132,"я":100,"є":100,"ѕ":100,"і":36,"ј":100,"љ":132,"њ":116,"–":116,"—":148,"‘":52,"’":52,"“":84,"”":84,"„":84,"…":132,"⁊":84,"←":132,"↑":100,"→":132,"↓":100,"⇄":132,"+":100,"Ə":100,"Ү":100,"ү":100,"Ө":100,"ө":100,";":36,"ĸ":84,"ẞ":100,"ß":100,"₽":116,"€":116,"Ѣ":116,"ѣ":116,"Ѵ":116,"ѵ":116,"Ӏ":68,"Ѳ":100,"ѳ":100,"⁰":84,"¹":68,"³":84,"⁴":84,"⁵":84,"⁶":84,"⁷":84,"⁸":84,"⁹":84,"⁺":68,"⁻":68,"⁼":68,"⁽":52,"⁾":52,"ⁱ":36,"™":148,"⧈":132,"⚔":132,"☠":132,"Қ":116,"қ":100,"Ғ":116,"ғ":100,"Ұ":100,"ұ":100,"Ә":100,"ә":100,"Җ":148,"җ":116,"Ң":116,"ң":116,"Һ":100,"¢":100,"¤":132,"¥":100,"©":132,"®":132,"µ":100,"¶":116,"¼":132,"½":132,"¾":132,"·":36,"‐":68,"‚":52,"†":100,"‡":100,"•":52,"‱":148,"′":52,"″":84,"‴":116,"‵":52,"‶":84,"‷":116,"‹":68,"›":68,"※":132,"‼":68,"‽":100,"⁂":132,"⁈":132,"⁉":132,"⁋":116,"⁎":68,"⁏":36,"⁑":68,"⁒":68,"⁗":148,"℗":132,"−":100,"∓":100,"∞":132,"☀":148,"☁":148,"☈":132,"Є":100,"☲":100,"☵":100,"☽":148,"♀":68,"♂":100,"⚥":100,"♠":100,"♣":100,"♥":100,"♦":100,"♩":68,"♪":100,"♫":132,"♬":132,"♭":68,"♮":68,"♯":100,"⚀":132,"⚁":132,"⚂":132,"⚃":132,"⚄":132,"⚅":132,"⚡":100,"⛏":148,"✔":116,"❄":132,"❌":116,"❤":132,"⭐":132,"⸘":100,"⸮":100,"⸵":36,"⸸":100,"⹁":36,"⹋":100,"⥝":100,"Ɛ":100,"ϛ":100,"Ɔ":100,"Ǝ":100,"Ⅎ":100,"⅁":100,"Ԁ":100,"⟘":100,"∩":100,"Ʌ":100,"⅄":100,"ǝ":100,"՚":52,"՛":52,"՜":68,"՝":52,"՞":68,"՟":100,"֏":100,"¯":100,"ſ":68,"Ʒ":100,"Ƿ":100,"ƿ":100,"Ȝ":100,"ȝ":100,"Ȥ":100,"ȥ":100,"˙":36,"‑":68,"⅋":100,"⏏":100,"⏩":116,"⏪":116,"⏭":132,"⏮":132,"⏯":116,"⏴":68,"⏵":68,"⏶":100,"⏷":100,"⏸":68,"⏹":100,"⏺":100,"⏻":132,"⏼":132,"⏽":36,"⭘":132,"▲":100,"▶":116,"▼":100,"◀":116,"●":84,"◦":68,"◘":68,"⚓":132,"⛨":132,"IJ":100,"ij":84,"lj":132,"�":132,"ᚠ":84,"ᚢ":100,"ᚣ":100,"ᚤ":100,"ᚥ":100,"ᚦ":84,"ᚧ":84,"ᚨ":68,"ᚩ":84,"ᚪ":84,"ᚫ":84,"ᚬ":100,"ᚭ":68,"ᚮ":68,"ᚯ":100,"ᚰ":100,"ᚱ":84,"ᚲ":68,"ᚳ":84,"ᚴ":84,"ᚶ":100,"ᚷ":100,"ᚸ":100,"ᚹ":84,"ᚺ":100,"ᚻ":100,"ᚼ":100,"ᚽ":68,"ᚾ":100,"ᚿ":68,"ᛀ":100,"ᛁ":36,"ᛂ":68,"ᛃ":116,"ᛄ":100,"ᛅ":100,"ᛆ":68,"ᛇ":100,"ᛈ":84,"ᛉ":100,"ᛊ":68,"ᛋ":100,"ᛌ":36,"ᛍ":68,"ᛎ":100,"ᛏ":100,"ᛐ":68,"ᛑ":84,"ᛒ":84,"ᛓ":68,"ᛔ":84,"ᛕ":84,"ᛖ":100,"ᛗ":100,"ᛘ":100,"ᛙ":68,"ᛚ":68,"ᛛ":84,"ᛜ":100,"ᛝ":100,"ᛞ":100,"ᛟ":116,"ᛠ":132,"ᛡ":100,"ᛢ":132,"ᛣ":100,"ᛤ":100,"ᛥ":100,"ᛦ":100,"ᛧ":36,"ᛨ":100,"ᛩ":84,"ᛪ":132,"᛫":52,"᛬":36,"᛭":100,"ᛮ":100,"ᛯ":100,"ᛰ":100,"ᛱ":100,"ᛲ":100,"ᛳ":132,"ᛴ":84,"ᛵ":52,"ᛶ":100,"ᛷ":100,"ᛸ":100,"☺":100,"☻":132,"¦":36,"☹":100,"׳":52,"״":84,"־":100,"׃":36,"׆":68,"´":52,"¨":68,"ǀ":36,"ǃ":36,"ǂ":100,"ǁ":68,"Ɓ":132,"Ɖ":116,"Ƒ":116,"Ʃ":100,"Ʋ":100,"჻":68,"₪":132,"₾":116,"֊":100,"⅛":148,"⅜":148,"⅝":148,"⅞":148,"⅓":148,"⅔":148,"✉":132,"☂":132,"☔":132,"☄":132,"⛄":116,"☃":132,"⌛":132,"⌚":132,"⚐":132,"✎":132,"❣":100,"♤":100,"♧":100,"♡":100,"♢":100,"⛈":148,"☰":100,"☱":100,"☳":100,"☴":100,"☶":100,"☷":100,"↔":148,"⇒":148,"⇏":148,"⇔":148,"⇵":116,"∀":132,"∃":100,"∄":100,"∉":100,"∋":100,"∌":100,"⊂":100,"⊃":100,"⊄":100,"⊅":100,"∧":100,"∨":100,"⊻":100,"⊼":100,"⊽":100,"∥":68,"≢":116,"⋆":68,"∑":100,"⊤":100,"⊥":100,"⊢":100,"⊨":100,"≔":132,"∁":84,"∴":100,"∵":100,"∛":132,"∜":132,"∂":100,"⋃":100,"⊆":100,"⊇":100,"□":100,"△":100,"▷":116,"▽":100,"◁":116,"◆":100,"◇":100,"○":100,"◎":132,"☆":132,"★":132,"✘":116,"₀":84,"₁":68,"₂":84,"₃":84,"₄":84,"₅":84,"₆":84,"₇":84,"₈":84,"₉":84,"₊":68,"₋":68,"₌":68,"₍":52,"₎":52,"∫":100,"∮":100,"∝":116,"⌀":132,"⌂":132,"⌘":132,"〒":100,"Ƅ":116,"ƅ":116,"ẟ":100,"Ƚ":116,"ƚ":68,"ƛ":100,"Ƞ":100,"ƞ":100,"Ɵ":100,"Ƨ":100,"ƨ":100,"ƪ":100,"Ƹ":100,"ƹ":100,"ƻ":100,"Ƽ":100,"ƽ":100,"ƾ":100,"ȡ":132,"ȴ":68,"ȵ":132,"ȶ":84,"Ⱥ":100,"Ȼ":100,"ȼ":100,"Ɇ":100,"ɇ":116,"Ⱦ":100,"Ɂ":100,"ɂ":100,"Ƀ":116,"Ʉ":132,"Ɉ":116,"ɉ":116,"Ɋ":116,"ɋ":116,"Ɍ":116,"ɍ":116,"Ɏ":132,"ɏ":132,"ẜ":84,"ẝ":84,"Ỽ":100,"ỽ":84,"Ỿ":100,"ỿ":116,"🌧":149,"🔥":117,"🌊":149,"⅐":148,"⅑":148,"⅕":148,"⅖":148,"⅗":148,"⅙":132,"⅚":132,"⅟":116,"↉":148,"🗡":149,"🏹":149,"🪓":117,"🔱":149,"🎣":149,"🧪":133,"⚗":132,"⯪":132,"⯫":132,"🛡":133,"✂":132,"🍖":149,"🪣":133,"🔔":133,"⏳":132,"⚑":132,"₠":100,"₡":100,"₢":100,"₣":116,"₤":100,"₥":100,"₦":132,"₩":132,"₫":116,"₭":116,"₮":100,"₰":100,"₱":132,"₲":100,"₳":132,"₵":100,"₶":100,"₷":132,"₸":100,"₹":100,"₺":116,"₻":132,"₼":100,"₿":100,"À":100,"Á":100,"Â":100,"Ã":100,"Ä":100,"Å":100,"Æ":164,"Ç":100,"È":100,"É":100,"Ê":100,"Ë":100,"Ì":68,"Í":68,"Î":68,"Ï":68,"Ð":116,"Ñ":100,"Ò":100,"Ó":100,"Ô":100,"Õ":100,"Ö":100,"Ù":100,"Ú":100,"Û":100,"Ü":100,"Ý":100,"à":100,"á":100,"â":100,"ã":100,"ä":100,"å":100,"æ":164,"ç":100,"ì":52,"í":52,"î":68,"ï":68,"ñ":100,"ò":100,"ó":100,"ô":100,"õ":100,"ö":100,"ù":100,"ú":100,"û":100,"ü":100,"ý":100,"ÿ":100,"Ā":100,"ā":100,"Ă":100,"ă":100,"Ą":100,"ą":100,"Ć":100,"ć":100,"Ĉ":100,"ĉ":100,"Ċ":100,"ċ":100,"Č":100,"č":100,"Ď":100,"ď":132,"Đ":116,"đ":116,"Ē":100,"ē":100,"Ĕ":100,"ĕ":100,"Ė":100,"ė":100,"Ę":100,"ę":100,"Ě":100,"ě":100,"Ĝ":100,"ĝ":100,"Ḡ":100,"ḡ":100,"Ğ":100,"ğ":100,"Ġ":100,"ġ":100,"Ģ":100,"ģ":100,"Ĥ":100,"ĥ":100,"Ħ":132,"ħ":116,"Ĩ":84,"ĩ":84,"Ī":68,"ī":68,"Ĭ":84,"ĭ":84,"Į":68,"į":52,"İ":68,"ı":36,"Ĵ":100,"ĵ":100,"Ķ":100,"ķ":84,"Ĺ":100,"ĺ":52,"Ļ":100,"ļ":52,"Ľ":100,"ľ":68,"Ŀ":100,"ŀ":68,"Ł":116,"ł":84,"Ń":100,"ń":100,"Ņ":100,"ņ":100,"Ň":100,"ň":100,"Ŋ":100,"ŋ":100,"Ō":100,"ō":100,"Ŏ":100,"ŏ":100,"Ő":100,"ő":100,"Œ":164,"œ":164,"Ŕ":100,"ŕ":100,"Ŗ":100,"ŗ":100,"Ř":100,"ř":100,"Ś":100,"ś":100,"Ŝ":100,"ŝ":100,"Ş":100,"ş":100,"Š":100,"š":100,"Ţ":100,"ţ":68,"Ť":100,"ť":84,"Ŧ":100,"ŧ":68,"Ũ":100,"ũ":100,"Ū":100,"ū":100,"Ŭ":100,"ŭ":100,"Ů":100,"ů":100,"Ű":100,"ű":100,"Ų":100,"ų":100,"Ŵ":100,"ŵ":100,"Ŷ":100,"ŷ":100,"Ÿ":100,"Ź":100,"ź":100,"Ż":100,"ż":100,"Ž":100,"ž":100,"Ǽ":164,"ǽ":164,"Ǿ":100,"ǿ":100,"Ș":100,"ș":100,"Ț":100,"ț":68,"Ά":132,"Έ":132,"Ή":132,"Ί":100,"Ό":132,"Ύ":132,"Ώ":132,"ΐ":100,"Ϊ":68,"Ϋ":100,"ά":100,"έ":100,"ή":100,"ί":52,"ΰ":100,"ϊ":68,"ϋ":100,"ό":100,"ύ":100,"ώ":132,"Ѐ":100,"Ё":100,"Ѓ":100,"Ї":68,"Ќ":100,"Ѝ":100,"Ў":100,"Й":100,"й":100,"ѐ":100,"ё":100,"ђ":116,"ѓ":84,"ї":68,"ћ":116,"ќ":84,"ѝ":100,"ў":100,"џ":100,"Ґ":100,"ґ":100,"Ḃ":100,"ḃ":100,"Ḋ":100,"ḋ":100,"Ḟ":100,"ḟ":84,"Ḣ":100,"ḣ":100,"Ḱ":100,"ḱ":84,"Ṁ":100,"ṁ":100,"Ṗ":100,"ṗ":100,"Ṡ":100,"ṡ":100,"Ṫ":100,"ṫ":68,"Ẁ":100,"ẁ":100,"Ẃ":100,"ẃ":100,"Ẅ":100,"ẅ":100,"Ỳ":100,"ỳ":100,"è":100,"é":100,"ê":100,"ë":100,"ʼn":132,"ǧ":100,"ǫ":100,"Џ":100,"ḍ":100,"ḥ":100,"ṛ":100,"ṭ":68,"Ẓ":100,"Ị":68,"ị":36,"Ọ":100,"ọ":100,"Ụ":100,"ụ":100,"№":164,"ȇ":100,"Ɣ":100,"⁇":164,"DZ":164,"Dz":164,"dz":164,"DŽ":164,"Dž":164,"dž":164,"LJ":164,"Lj":164,"NJ":164,"Nj":164,"nj":164,"ℹ":164,"ᚡ":84,"ᚵ":84,"Ơ":132,"ơ":132,"Ư":132,"ư":132,"Ắ":100,"ắ":100,"Ấ":100,"ấ":100,"Ế":100,"ế":100,"ố":100,"Ớ":132,"ớ":132,"Ứ":132,"ứ":132,"Ằ":100,"ằ":100,"Ầ":100,"ầ":100,"Ề":100,"ề":100,"ồ":100,"Ờ":132,"ờ":132,"Ừ":132,"ừ":132,"Ả":100,"ả":100,"Ẳ":100,"ẳ":100,"Ẩ":100,"ẩ":100,"Ẻ":100,"ẻ":100,"ổ":100,"Ở":132,"Ể":100,"ể":100,"Ỉ":68,"ỉ":68,"Ỏ":100,"ỏ":100,"Ổ":100,"ở":132,"Ủ":100,"ủ":100,"Ử":132,"ử":132,"Ỷ":100,"ỷ":100,"Ạ":100,"ạ":100,"Ặ":100,"ặ":100,"Ậ":100,"ậ":100,"Ẹ":100,"ẹ":100,"Ệ":100,"ệ":100,"Ộ":100,"ộ":100,"Ợ":132,"ợ":132,"Ự":132,"ự":132,"Ỵ":100,"ỵ":100,"Ố":100,"ƕ":148,"Ẫ":100,"ẫ":100,"Ỗ":100,"ỗ":100,"ữ":132,"☞":164,"☜":164,"☮":164,"Ẵ":100,"ẵ":100,"Ẽ":100,"ẽ":100,"Ễ":100,"ễ":100,"Ồ":100,"Ỡ":132,"ỡ":132,"Ữ":132,"Ỹ":100,"ỹ":100,"Ҙ":100,"ҙ":100,"Ҡ":116,"ҡ":100,"Ҫ":100,"ҫ":100,"Ƕ":148,"⚠":164,"⓪":164,"①":164,"②":164,"③":164,"④":164,"⑤":164,"⑥":164,"⑦":164,"⑧":164,"⑨":164,"⑩":164,"⑪":164,"⑫":164,"⑬":164,"⑭":164,"⑮":164,"⑯":164,"⑰":164,"⑱":164,"⑲":164,"⑳":164,"Ⓐ":164,"Ⓑ":164,"Ⓒ":164,"Ⓓ":164,"Ⓔ":164,"Ⓕ":164,"Ⓖ":164,"Ⓗ":164,"Ⓘ":164,"Ⓙ":164,"Ⓚ":164,"Ⓛ":164,"Ⓜ":164,"Ⓝ":164,"Ⓞ":164,"Ⓟ":164,"Ⓠ":164,"Ⓡ":164,"Ⓢ":164,"Ⓣ":164,"Ⓤ":164,"Ⓥ":164,"Ⓦ":164,"Ⓧ":164,"Ⓨ":164,"Ⓩ":164,"ⓐ":164,"ⓑ":164,"ⓒ":164,"ⓓ":164,"ⓔ":164,"ⓕ":164,"ⓖ":164,"ⓗ":164,"ⓘ":164,"ⓙ":164,"ⓚ":164,"ⓛ":164,"ⓜ":164,"ⓝ":164,"ⓞ":164,"ⓟ":164,"ⓠ":164,"ⓡ":164,"ⓢ":164,"ⓣ":164,"ⓤ":164,"ⓥ":164,"ⓦ":164,"ⓧ":164,"ⓨ":164,"ⓩ":164,"̧":52,"Ǎ":100,"ǎ":100,"Ǟ":100,"ǟ":100,"Ǻ":100,"ǻ":100,"Ȃ":100,"ȃ":100,"Ȧ":100,"ȧ":100,"Ǡ":100,"ǡ":100,"Ḁ":100,"ḁ":100,"Ȁ":100,"ȁ":100,"Ḇ":100,"ḇ":100,"Ḅ":100,"ḅ":100,"Ḉ":100,"ḉ":100,"Ḑ":100,"ḑ":100,"Ḓ":100,"ḓ":100,"Ḏ":100,"ḏ":100,"Ḍ":100,"Ḕ":100,"ḕ":100,"Ḗ":100,"ḗ":100,"Ḙ":100,"ḙ":100,"Ḝ":100,"ḝ":100,"Ȩ":100,"ȩ":100,"Ḛ":100,"ḛ":100,"Ȅ":100,"ȅ":100,"Ȇ":100,"Ǵ":100,"ǵ":100,"Ǧ":100,"Ḧ":100,"ḧ":100,"Ḩ":100,"ḩ":100,"Ḫ":100,"ḫ":100,"Ȟ":100,"ȟ":100,"Ḥ":100,"ẖ":100,"Ḯ":68,"ḯ":68,"Ȋ":84,"ȋ":84,"Ǐ":68,"ǐ":68,"Ȉ":100,"ȉ":100,"Ḭ":84,"ḭ":84,"ǰ":100,"ȷ":100,"Ǩ":100,"ǩ":84,"Ḳ":100,"ḳ":84,"Ḵ":100,"ḵ":84,"Ḻ":100,"ḻ":68,"Ḽ":100,"ḽ":68,"Ḷ":100,"ḷ":52,"Ḹ":100,"ḹ":68,"Ḿ":100,"ḿ":100,"Ṃ":100,"ṃ":100,"Ṅ":100,"ṅ":100,"Ṇ":100,"ṇ":100,"Ṋ":100,"ṋ":100,"Ǹ":100,"ǹ":100,"Ṉ":100,"ṉ":100,"Ǭ":100,"ǭ":100,"Ȭ":100,"ȭ":100,"Ṍ":100,"ṍ":100,"Ṏ":100,"ṏ":100,"Ṑ":100,"ṑ":100,"Ṓ":100,"ṓ":100,"Ȏ":100,"ȏ":100,"Ȫ":100,"ȫ":100,"Ǒ":100,"ǒ":100,"Ȯ":100,"ȯ":100,"Ȱ":100,"ȱ":100,"Ȍ":100,"ȍ":100,"Ǫ":100,"Ṕ":100,"ṕ":100,"Ȓ":100,"ȓ":100,"Ṙ":100,"ṙ":100,"Ṝ":100,"ṝ":100,"Ṟ":100,"ṟ":100,"Ȑ":100,"ȑ":100,"Ṛ":100,"Ṥ":100,"ṥ":100,"Ṧ":100,"ṧ":100,"Ṣ":100,"ṣ":100,"Ṩ":100,"ṩ":100,"Ṱ":100,"ṱ":68,"Ṯ":100,"ṯ":68,"Ṭ":100,"ẗ":68,"Ṳ":100,"ṳ":100,"Ṷ":100,"ṷ":100,"Ṹ":100,"ṹ":100,"Ṻ":100,"ṻ":100,"Ǔ":100,"ǔ":100,"Ǖ":100,"ǖ":100,"Ǘ":100,"ǘ":100,"Ǚ":100,"ǚ":100,"Ǜ":100,"ǜ":100,"Ṵ":100,"ṵ":100,"Ȕ":100,"ȕ":100,"Ȗ":100,"Ṿ":100,"ṿ":100,"Ṽ":100,"ṽ":100,"Ẇ":100,"ẇ":100,"Ẉ":100,"ẉ":100,"ẘ":100,"Ẍ":100,"ẍ":100,"Ẋ":100,"ẋ":100,"Ȳ":100,"ȳ":100,"Ẏ":100,"ẏ":100,"ẙ":100,"Ẕ":100,"ẕ":100,"Ẑ":100,"ẑ":100,"ẓ":100,"Ǯ":100,"ǯ":100,"ẛ":68,"Ǣ":164,"ǣ":164,"ỻ":116,"ȸ":164,"ȹ":164,"₧":164,"Ỻ":132,"ƀ":116,"Ƃ":100,"ƃ":100,"Ƈ":116,"ƈ":116,"Ɗ":132,"Ƌ":100,"ƌ":100,"Ɠ":116,"Ǥ":116,"ǥ":116,"Ɨ":68,"Ɩ":68,"Ƙ":100,"ƙ":84,"Ɲ":116,"Ƥ":132,"ƥ":100,"Ʀ":100,"Ƭ":116,"ƭ":68,"ƫ":68,"Ʈ":100,"ȗ":100,"Ʊ":100,"Ɯ":100,"Ƴ":116,"ƴ":132,"Ƶ":100,"ƶ":100,"Ƣ":132,"ƣ":132,"Ȣ":100,"ȣ":100,"Ӑ":100,"ӑ":100,"Ӓ":100,"ӓ":100,"Ӷ":100,"ӷ":84,"Ҕ":100,"ҕ":84,"Ӗ":100,"ӗ":100,"Ҽ":132,"ҽ":132,"Ҿ":132,"ҿ":132,"Ӛ":100,"ӛ":100,"Ӝ":132,"ӝ":100,"Ӂ":132,"ӂ":100,"Ӟ":100,"ӟ":100,"Ӣ":100,"ӣ":100,"Ӥ":100,"ӥ":100,"Ӧ":100,"ӧ":100,"Ӫ":100,"ӫ":100,"Ӱ":100,"ӱ":100,"Ӯ":100,"ӯ":100,"Ӳ":100,"ӳ":100,"Ӵ":100,"ӵ":100,"Ӹ":132,"ӹ":116,"Ӭ":100,"ӭ":100,"Ѷ":116,"ѷ":116,"Ӕ":164,"Ӻ":116,"Ԃ":148,"Ԫ":164,"Ԭ":116,"Ԅ":132,"Ԑ":100,"Ӡ":100,"Ԇ":116,"Ҋ":116,"Ӄ":100,"Ҟ":116,"Ҝ":100,"Ԟ":100,"Ԛ":100,"Ӆ":116,"Ԯ":116,"Ԓ":100,"Ԡ":148,"Ԉ":148,"Ԕ":148,"Ӎ":116,"Ӊ":116,"Ԩ":116,"Ӈ":100,"Ҥ":116,"Ԣ":148,"Ԋ":148,"Ҩ":116,"Ԥ":116,"Ҧ":148,"Ҏ":100,"Ԗ":148,"Ԍ":100,"Ҭ":100,"Ԏ":116,"Ҳ":116,"Ӽ":100,"Ӿ":100,"Ԧ":116,"Ҵ":132,"Ҷ":116,"Ӌ":100,"Ҹ":100,"Ҍ":116,"Ԙ":164,"Ԝ":100,"ӕ":164,"ӻ":100,"ԃ":148,"ԫ":164,"ԭ":116,"ԅ":132,"ԑ":100,"ӡ":100,"ԇ":116,"ҋ":116,"ӄ":84,"ҟ":100,"ҝ":100,"ԟ":100,"ԛ":100,"ӆ":116,"ԯ":116,"ԓ":100,"ԡ":148,"ԉ":148,"ԕ":148,"ӎ":116,"ӊ":116,"ԩ":116,"ӈ":100,"ҥ":116,"ԣ":148,"ԋ":148,"ҩ":116,"ԥ":116,"ҧ":148,"ҏ":100,"ԗ":148,"ԍ":100,"ҭ":100,"ԏ":116,"ҳ":116,"ӽ":100,"ӿ":100,"ԧ":116,"ҵ":116,"ҷ":116,"ӌ":100,"ҹ":100,"ҍ":116,"ԙ":164,"ԝ":100,"Ἀ":148,"ἀ":100,"Ἁ":148,"ἁ":100,"Ἂ":164,"ἂ":100,"Ἃ":164,"ἃ":100,"Ἄ":164,"ἄ":100,"Ἅ":164,"ἅ":116,"Ἆ":148,"ἆ":100,"Ἇ":148,"ἇ":100,"Ὰ":148,"ὰ":100,"Ᾰ":100,"ᾰ":100,"Ᾱ":100,"ᾱ":100,"Ά":148,"ά":100,"ᾈ":148,"ᾀ":100,"ᾉ":148,"ᾁ":100,"ᾊ":164,"ᾂ":100,"ᾋ":164,"ᾃ":100,"ᾌ":164,"ᾄ":100,"ᾍ":164,"ᾅ":100,"ᾎ":148,"ᾆ":100,"ᾏ":148,"ᾇ":100,"ᾼ":100,"ᾴ":100,"ᾶ":100,"ᾷ":100,"ᾲ":100,"ᾳ":100,"Ἐ":148,"ἐ":100,"Ἑ":148,"ἑ":100,"Ἒ":164,"ἒ":100,"Ἓ":164,"ἓ":100,"Ἔ":164,"ἔ":100,"Ἕ":164,"ἕ":100,"Ὲ":148,"Έ":148,"ὲ":100,"έ":100,"Ἠ":148,"ἠ":100,"Ὴ":148,"ὴ":100,"Ἡ":148,"ἡ":100,"Ἢ":164,"ἢ":100,"Ἣ":164,"ἣ":100,"Ἤ":164,"ἤ":100,"Ἥ":164,"ἥ":100,"Ἦ":148,"ἦ":100,"Ἧ":148,"ἧ":100,"ᾘ":148,"ᾐ":100,"ᾙ":148,"ᾑ":100,"ᾚ":164,"ᾒ":100,"ᾛ":164,"ᾓ":100,"ᾜ":164,"ᾔ":100,"ᾝ":164,"ᾕ":100,"ᾞ":148,"ᾖ":100,"ᾟ":148,"ᾗ":100,"Ή":148,"ή":100,"ῌ":100,"ῃ":100,"ῂ":100,"ῄ":100,"ῆ":100,"ῇ":100,"Ὶ":116,"ὶ":68,"Ί":116,"ί":52,"Ἰ":116,"ἰ":68,"Ἱ":164,"ἱ":52,"Ἲ":148,"ἲ":100,"Ἳ":132,"ἳ":100,"Ἴ":148,"ἴ":100,"Ἵ":132,"ἵ":100,"Ἶ":116,"ἶ":84,"Ἷ":116,"ἷ":84,"Ῐ":84,"ῐ":84,"Ῑ":68,"ῑ":68,"ῒ":68,"ΐ":68,"ῖ":84,"ῗ":84,"Ὸ":148,"ὸ":100,"Ό":148,"ό":100,"Ὀ":148,"ὀ":100,"Ὁ":148,"ὁ":100,"Ὂ":164,"ὂ":100,"Ὃ":164,"ὃ":100,"Ὄ":164,"ὄ":100,"Ὅ":164,"ὅ":100,"Ῥ":148,"ῤ":100,"ῥ":100,"Ὺ":148,"ὺ":100,"Ύ":148,"ύ":100,"Ὑ":148,"ὑ":100,"Ὓ":164,"ὓ":100,"Ὕ":164,"ὕ":100,"Ὗ":148,"ὗ":100,"Ῠ":100,"ῠ":100,"Ῡ":100,"ῡ":100,"ϓ":164,"ϔ":116,"ῢ":100,"ΰ":100,"ῧ":100,"ὐ":100,"ὒ":100,"ὔ":100,"ῦ":100,"ὖ":100,"Ὼ":148,"ὼ":132,"Ώ":148,"ώ":132,"Ὠ":148,"ὠ":132,"Ὡ":148,"ὡ":132,"Ὢ":164,"ὢ":132,"Ὣ":164,"ὣ":132,"Ὤ":164,"ὤ":132,"Ὥ":164,"ὥ":132,"Ὦ":148,"ὦ":132,"Ὧ":164,"ὧ":132,"ᾨ":148,"ᾠ":132,"ᾩ":148,"ᾡ":132,"ᾪ":164,"ᾢ":132,"ᾫ":164,"ᾣ":132,"ᾬ":164,"ᾤ":132,"ᾭ":164,"ᾥ":132,"ᾮ":148,"ᾦ":132,"ᾯ":164,"ᾧ":132,"ῼ":100,"ῳ":132,"ῲ":132,"ῴ":132,"ῶ":132,"ῷ":132,"☯":164,"☐":164,"☑":164,"☒":164,"ƍ":100,"ƺ":100,"ȿ":100,"ɀ":100,"ẚ":100,"⅒":164,"⅘":164,"₨":164,"₯":164,"!":36,"\"":68,"#":100,"$":100,"%":100,"&":100,"'":36,"(":68,")":68,"*":68,"+":100,",":36,"-":100,".":36,"/":100,":":36,";":36,"<":84,"=":100,">":84,"?":100,"@":116,"A":100,"B":100,"C":100,"D":100,"E":100,"F":100,"G":100,"H":100,"I":68,"J":100,"K":100,"L":100,"M":100,"N":100,"O":100,"P":100,"Q":100,"R":100,"S":100,"T":100,"U":100,"V":100,"W":100,"X":100,"Y":100,"Z":100,"[":68,"\\":100,"]":68,"^":100,"_":100,"`":52,"a":100,"b":100,"c":100,"d":100,"e":100,"f":84,"g":100,"h":100,"i":36,"j":100,"k":84,"l":52,"m":100,"n":100,"o":100,"p":100,"q":100,"r":100,"s":100,"t":68,"u":100,"v":100,"w":100,"x":100,"y":100,"z":100,"{":68,"|":36,"}":68,"~":116,"£":100,"ƒ":100,"ª":84,"º":84,"¬":100,"«":116,"»":116,"░":132,"▒":148,"▓":148,"│":100,"┤":100,"╡":100,"╢":132,"╖":132,"╕":100,"╣":132,"║":132,"╗":132,"╝":132,"╜":132,"╛":100,"┐":100,"└":148,"┴":148,"┬":148,"├":148,"─":148,"┼":148,"╞":148,"╟":148,"╚":148,"╔":148,"╩":148,"╦":148,"╠":148,"═":148,"╬":148,"╧":148,"╨":148,"╤":148,"╥":148,"╙":148,"╘":148,"╒":148,"╓":148,"╫":148,"╪":148,"┘":100,"┌":148,"█":148,"▄":148,"▌":84,"▐":148,"▀":148,"∅":132,"∈":100,"≡":116,"±":100,"≥":100,"≤":100,"⌠":132,"⌡":84,"÷":100,"≈":116,"°":84,"∙":100,"√":116,"ⁿ":84,"²":84,"■":100} + data modify storage lib_text_fonts: Fonts."minecraft:space" set value {} + $data modify storage lib_text_fonts:$(_) Fonts."minecraft:space" merge value {"0":484,"1":500,"2":516,"3":532,"4":548,"5":564,"6":580,"7":596,"8":612,"9":628,"":4,"":20,"":36,"":52,"":68,"":84,"":100,"":116,"":132," ":148,"":164,"":180,"":196,"":212,"":228,"":244,"":260,"":276,"":292,"":308," ":324,"!":340,"\"":356,"#":372,"$":388,"%":404,"&":420,"'":436,"(":452,")":468,"@":644,"A":660,"B":676,"C":692,"D":708,"E":724,"F":740,"G":756,"H":772,"I":788,"P":804,"Q":820,"R":836,"S":852,"T":868,"U":884,"V":900,"W":916,"X":932,"Y":948,"`":964,"a":980,"b":996,"c":1012,"d":1028,"e":1044,"f":1060,"g":1076,"h":1092,"i":1108,"p":1124,"q":1140,"r":1156,"s":1172,"t":1188,"u":1204,"v":1220,"w":1236,"x":1252,"y":1268,"€":1284,"":1300,"‚":1316,"ƒ":1332,"„":1348,"…":1364,"†":1380,"‡":1396,"ˆ":1412,"‰":1428,"":1444,"‘":1460,"’":1476,"“":1492,"”":1508,"•":1524,"–":1540,"—":1556,"˜":1572,"™":1588,"Ā":1604,"ā":1620,"Ă":1636,"ă":1652,"Ą":1668,"ą":1684,"Ć":1700,"ć":1716,"Ĉ":1732,"ĉ":1748,"Đ":1764,"đ":1780,"Ē":1796,"ē":1812,"Ĕ":1828,"ĕ":1844,"Ė":1860,"ė":1876,"Ę":1892,"ę":1908,"Ġ":1924,"ġ":1940,"Ģ":1956,"ģ":1972,"Ĥ":1988,"ĥ":2004,"Ħ":2020,"ħ":2036,"Ĩ":2052,"ĩ":2068,"İ":2084,"ı":2100,"IJ":2116,"ij":2132,"Ĵ":2148,"ĵ":2164,"Ķ":2180,"ķ":2196,"ĸ":2212,"Ĺ":2228,"ŀ":2244,"Ł":2260,"ł":2276,"Ń":2292,"ń":2308,"Ņ":2324,"ņ":2340,"Ň":2356,"ň":2372,"ʼn":2388,"Ő":2404,"ő":2420,"Œ":2436,"œ":2452,"Ŕ":2468,"ŕ":2484,"Ŗ":2500,"ŗ":2516,"Ř":2532,"ř":2548,"Š":2564,"š":2580,"Ţ":2596,"ţ":2612,"Ť":2628,"ť":2644,"Ŧ":2660,"ŧ":2676,"Ũ":2692,"ũ":2708,"Ű":2724,"ű":2740,"Ų":2756,"ų":2772,"Ŵ":2788,"ŵ":2804,"Ŷ":2820,"ŷ":2836,"Ÿ":2852,"Ź":2868,"ƀ":2884,"Ɓ":2900,"Ƃ":2916,"ƃ":2932,"Ƅ":2948,"ƅ":2964,"Ɔ":2980,"Ƈ":2996,"ƈ":3012,"Ɖ":3028,"Ɛ":3044,"Ƒ":3060,"ƒ":3076,"Ɠ":3092,"Ɣ":3108,"ƕ":3124,"Ɩ":3140,"Ɨ":3156,"Ƙ":3172,"ƙ":3188,"Ȁ":3204,"ȁ":3220,"Ȃ":3236,"ȃ":3252,"Ȅ":3268,"ȅ":3284,"Ȇ":3300,"ȇ":3316,"Ȉ":3332,"ȉ":3348,"Ȑ":3364,"ȑ":3380,"Ȓ":3396,"ȓ":3412,"Ȕ":3428,"ȕ":3444,"Ȗ":3460,"ȗ":3476,"Ș":3492,"ș":3508,"Ƞ":3524,"ȡ":3540,"Ȣ":3556,"ȣ":3572,"Ȥ":3588,"ȥ":3604,"Ȧ":3620,"ȧ":3636,"Ȩ":3652,"ȩ":3668,"Ȱ":3684,"ȱ":3700,"Ȳ":3716,"ȳ":3732,"ȴ":3748,"ȵ":3764,"ȶ":3780,"ȷ":3796,"ȸ":3812,"ȹ":3828,"ɀ":3844,"Ɂ":3860,"ɂ":3876,"Ƀ":3892,"Ʉ":3908,"Ʌ":3924,"Ɇ":3940,"ɇ":3956,"Ɉ":3972,"ɉ":3988,"ɐ":4004,"ɑ":4020,"ɒ":4036,"ɓ":4052,"ɔ":4068,"ɕ":4084,"ɖ":4100,"쀀":4,"쀁":-12,"쀂":-28,"쀃":-44,"쀄":-60,"쀅":-76,"쀆":-92,"쀇":-108,"쀈":-124,"쀉":-140,"쀐":-156,"쀑":-172,"쀒":-188,"쀓":-204,"쀔":-220,"쀕":-236,"쀖":-252,"쀗":-268,"쀘":-284,"쀙":-300,"쀠":-316,"쀡":-332,"쀢":-348,"쀣":-364,"쀤":-380,"쀥":-396,"쀦":-412,"쀧":-428,"쀨":-444,"쀩":-460,"쀰":-476,"쀱":-492,"쀲":-508,"쀳":-524,"쀴":-540,"쀵":-556,"쀶":-572,"쀷":-588,"쀸":-604,"쀹":-620,"쁀":-636,"쁁":-652,"쁂":-668,"쁃":-684,"쁄":-700,"쁅":-716,"쁆":-732,"쁇":-748,"쁈":-764,"쁉":-780,"쁐":-796,"쁑":-812,"쁒":-828,"쁓":-844,"쁔":-860,"쁕":-876,"쁖":-892,"쁗":-908,"쁘":-924,"쁙":-940,"쁠":-956,"쁡":-972,"쁢":-988,"쁣":-1004,"쁤":-1020,"쁥":-1036,"쁦":-1052,"쁧":-1068,"쁨":-1084,"쁩":-1100,"쁰":-1116,"쁱":-1132,"쁲":-1148,"쁳":-1164,"쁴":-1180,"쁵":-1196,"쁶":-1212,"쁷":-1228,"쁸":-1244,"쁹":-1260,"삀":-1276,"삁":-1292,"삂":-1308,"삃":-1324,"삄":-1340,"삅":-1356,"삆":-1372,"삇":-1388,"삈":-1404,"삉":-1420,"삐":-1436,"삑":-1452,"삒":-1468,"삓":-1484,"삔":-1500,"삕":-1516,"삖":-1532,"삗":-1548,"삘":-1564,"삙":-1580,"섀":-1596,"섁":-1612,"섂":-1628,"섃":-1644,"섄":-1660,"섅":-1676,"섆":-1692,"섇":-1708,"섈":-1724,"섉":-1740,"섐":-1756,"섑":-1772,"섒":-1788,"섓":-1804,"섔":-1820,"섕":-1836,"섖":-1852,"섗":-1868,"섘":-1884,"섙":-1900,"선":-1916,"섡":-1932,"섢":-1948,"섣":-1964,"설":-1980,"섥":-1996,"섦":-2012,"섧":-2028,"섨":-2044,"섩":-2060,"섰":-2076,"성":-2092,"섲":-2108,"섳":-2124,"섴":-2140,"섵":-2156,"섶":-2172,"섷":-2188,"세":-2204,"섹":-2220,"셀":-2236,"셁":-2252,"셂":-2268,"셃":-2284,"셄":-2300,"셅":-2316,"셆":-2332,"셇":-2348,"셈":-2364,"셉":-2380,"셐":-2396,"셑":-2412,"셒":-2428,"셓":-2444,"셔":-2460,"셕":-2476,"셖":-2492,"셗":-2508,"션":-2524,"셙":-2540,"셠":-2556,"셡":-2572,"셢":-2588,"셣":-2604,"셤":-2620,"셥":-2636,"셦":-2652,"셧":-2668,"셨":-2684,"셩":-2700,"셰":-2716,"셱":-2732,"셲":-2748,"셳":-2764,"셴":-2780,"셵":-2796,"셶":-2812,"셷":-2828,"셸":-2844,"셹":-2860,"솀":-2876,"솁":-2892,"솂":-2908,"솃":-2924,"솄":-2940,"솅":-2956,"솆":-2972,"솇":-2988,"솈":-3004,"솉":-3020,"손":-3036,"솑":-3052,"솒":-3068,"솓":-3084,"솔":-3100,"솕":-3116,"솖":-3132,"솗":-3148,"솘":-3164,"솙":-3180,"숀":-3196,"숁":-3212,"숂":-3228,"숃":-3244,"숄":-3260,"숅":-3276,"숆":-3292,"숇":-3308,"숈":-3324,"숉":-3340,"숐":-3356,"숑":-3372,"숒":-3388,"숓":-3404,"숔":-3420,"숕":-3436,"숖":-3452,"숗":-3468,"수":-3484,"숙":-3500,"술":-3516,"숡":-3532,"숢":-3548,"숣":-3564,"숤":-3580,"숥":-3596,"숦":-3612,"숧":-3628,"숨":-3644,"숩":-3660,"숰":-3676,"숱":-3692,"숲":-3708,"숳":-3724,"숴":-3740,"숵":-3756,"숶":-3772,"숷":-3788,"숸":-3804,"숹":-3820,"쉀":-3836,"쉁":-3852,"쉂":-3868,"쉃":-3884,"쉄":-3900,"쉅":-3916,"쉆":-3932,"쉇":-3948,"쉈":-3964,"쉉":-3980,"쉐":-3996,"쉑":-4012,"쉒":-4028,"쉓":-4044,"쉔":-4060,"쉕":-4076,"쉖":-4092} + data modify storage lib_text_fonts: Fonts."minecraft:uniform" set value {} + $data modify storage lib_text_fonts:$(_) Fonts."minecraft:uniform" merge value {"0":66,"1":50,"2":66,"3":66,"4":66,"5":66,"6":66,"7":66,"8":66,"9":66,"":1048580,"":-1048572,"":4,"":4,"":4,"":4,"":20,"":36,"":52,"":68,"":84,"":100,"":116,"":132,"":148,"":164,"":180,"":196,"":212,"":228,"":244,"":260,"":276,"":292,"":308,"":324,"":340,"":356,"":372,"":388,"":404,"":420,"":436,"":452,"":468,"":484,"":500,"":516,"":532,"":548,"":564,"":580,"":596,"":612,"":628,"":644,"":660,"":676,"":692,"":708,"":724,"":740,"":756,"":772,"":788,"":804,"":820,"":836,"":852,"":868,"":884,"":900,"":916,"":932,"":948,"":964,"":980,"":996,"":1012,"":1028,"":1044,"":1060,"":1076,"":1092,"":1108,"":1124,"":1140,"":1156,"":1172,"":1188,"":1204,"":1220,"":1236,"":1252,"":1268,"":1284,"":1300,"":1316,"":1332,"":1348,"":1364,"":1380,"":1396,"":1412,"":1428,"":1444,"":1460,"":1476,"":1492,"":1508,"":1524,"":1540,"":1556,"":1572,"":1588,"":1604,"":1620,"":1636,"":1652,"":1668,"":1684,"":1700,"":1716,"":1732,"":1748,"":1764,"":1780,"":1796,"":1812,"":1828,"":1844,"":1860,"":1876,"":1892,"":1908,"":1924,"":1940,"":1956,"":1972,"":1988,"":2004,"":2020,"":2036,"":2052,"":2068,"":2084,"":2100,"":2116,"":2132,"":2148,"":2164,"":2180,"":2196,"":2212,"":2228,"":2244,"":2260,"":2276,"":2292,"":2308,"":2324,"":2340,"":2356,"":2372,"":2388,"":2404,"":2420,"":2436,"":2452,"":2468,"":2484,"":2500,"":2516,"":2532,"":2548,"":2564,"":2580,"":2596,"":2612,"":2628,"":2644,"":2660,"":2676,"":2692,"":2708,"":2724,"":2740,"":2756,"":2772,"":2788,"":2804,"":2820,"":2836,"":2852,"":2868,"":2884,"":2900,"":2916,"":2932,"":2948,"":2964,"":2980,"":2996,"":3012,"":3028,"":3044,"":3060,"":3076,"":3092,"":3108,"":3124,"":3140,"":3156,"":3172,"":3188,"":3204,"":3220,"":3236,"":3252,"":3268,"":3284,"":3300,"":3316,"":3332,"":3348,"":3364,"":3380,"":3396,"":3412,"":3428,"":3444,"":3460,"":3476,"":3492,"":3508,"":3524,"":3540,"":3556,"":3572,"":3588,"":3604,"":3620,"":3636,"":3652,"":3668,"":3684,"":3700,"":3716,"":3732,"":3748,"":3764,"":3780,"":3796,"":3812,"":3828,"":3844,"":3860,"":3876,"":3892,"":3908,"":3924,"":3940,"":3956,"":3972,"":3988,"":4004,"":4020,"":4036,"":4052,"":4068,"":4084,"":4100,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4,"":4," ":68,"‌":4,"!":18,"\"":50,"#":66,"$":66,"%":66,"&":66,"'":18,"(":34,")":34,"*":66,"+":66,",":34,"-":50,".":34,"/":66,":":34,";":34,"<":50,"=":66,">":50,"?":66,"@":66,"A":66,"B":66,"C":66,"D":66,"E":66,"F":66,"G":66,"H":66,"I":50,"J":66,"K":66,"L":66,"M":66,"N":66,"O":66,"P":66,"Q":66,"R":66,"S":66,"T":66,"U":66,"V":66,"W":66,"X":66,"Y":66,"Z":66,"[":34,"\\":66,"]":34,"^":66,"_":66,"`":34,"a":66,"b":66,"c":66,"d":66,"e":66,"f":50,"g":66,"h":66,"i":50,"j":50,"k":66,"l":50,"m":66,"n":66,"o":66,"p":66,"q":66,"r":66,"s":66,"t":50,"u":66,"v":66,"w":66,"x":66,"y":66,"z":66,"{":50,"|":18,"}":50,"~":66," ":82,"¡":18,"¢":66,"£":66,"¤":66,"¥":66,"¦":18,"¨":50,"©":82,"ª":50,"«":66,"¬":66,"®":82,"¯":66,"°":50,"±":66,"²":50,"³":50,"´":34,"µ":82,"¶":66,"·":34,"¸":34,"¹":50,"º":50,"»":66,"¼":66,"½":66,"¾":66,"¿":66,"À":66,"Á":66,"Â":66,"Ã":66,"Ä":66,"Å":66,"Æ":66,"Ç":66,"È":66,"É":66,"Ê":66,"Ë":66,"Ì":50,"Í":50,"Î":50,"Ï":50,"Ð":66,"Ñ":66,"Ò":66,"Ó":66,"Ô":66,"Õ":66,"Ö":66,"×":66,"Ø":66,"Ù":66,"Ú":66,"Û":66,"Ü":66,"Ý":66,"Þ":66,"ß":66,"à":66,"á":66,"â":66,"ã":66,"ä":66,"å":66,"æ":66,"ç":66,"è":66,"é":66,"ê":66,"ë":66,"ì":50,"í":50,"î":50,"ï":50,"ð":66,"ñ":66,"ò":66,"ó":66,"ô":66,"õ":66,"ö":66,"÷":66,"ø":66,"ù":66,"ú":66,"û":66,"ü":66,"ý":66,"þ":66,"ÿ":66,"Ā":66,"ā":66,"Ă":66,"ă":66,"Ą":66,"ą":66,"Ć":66,"ć":66,"Ĉ":66,"ĉ":66,"Ċ":66,"ċ":66,"Č":66,"č":66,"Ď":66,"ď":66,"Đ":66,"đ":66,"Ē":66,"ē":66,"Ĕ":66,"ĕ":66,"Ė":66,"ė":66,"Ę":66,"ę":66,"Ě":66,"ě":66,"Ĝ":66,"ĝ":66,"Ğ":66,"ğ":66,"Ġ":66,"ġ":66,"Ģ":66,"ģ":66,"Ĥ":66,"ĥ":66,"Ħ":82,"ħ":66,"Ĩ":66,"ĩ":66,"Ī":50,"ī":50,"Ĭ":66,"ĭ":66,"Į":50,"į":50,"İ":50,"ı":50,"IJ":66,"ij":66,"Ĵ":66,"ĵ":66,"Ķ":66,"ķ":66,"ĸ":66,"Ĺ":66,"ĺ":50,"Ļ":66,"ļ":50,"Ľ":66,"ľ":66,"Ŀ":66,"ŀ":50,"Ł":66,"ł":50,"Ń":66,"ń":66,"Ņ":66,"ņ":66,"Ň":66,"ň":66,"ʼn":66,"Ŋ":66,"ŋ":66,"Ō":66,"ō":66,"Ŏ":66,"ŏ":66,"Ő":66,"ő":66,"Œ":66,"œ":66,"Ŕ":66,"ŕ":66,"Ŗ":66,"ŗ":66,"Ř":66,"ř":66,"Ś":66,"ś":66,"Ŝ":66,"ŝ":66,"Ş":66,"ş":66,"Š":66,"š":66,"Ţ":66,"ţ":50,"Ť":66,"ť":66,"Ŧ":66,"ŧ":50,"Ũ":66,"ũ":66,"Ū":66,"ū":66,"Ŭ":66,"ŭ":66,"Ů":66,"ů":66,"Ű":66,"ű":66,"Ų":66,"ų":66,"Ŵ":66,"ŵ":66,"Ŷ":66,"ŷ":66,"Ÿ":66,"Ź":66,"ź":66,"Ż":66,"ż":66,"Ž":66,"ž":66,"ſ":50,"ƀ":66,"Ɓ":66,"Ƃ":66,"ƃ":66,"Ƅ":66,"ƅ":66,"Ɔ":66,"Ƈ":66,"ƈ":66,"Ɖ":66,"Ɗ":66,"Ƌ":66,"ƌ":66,"ƍ":66,"Ǝ":66,"Ə":66,"Ɛ":66,"Ƒ":66,"ƒ":50,"Ɠ":66,"Ɣ":66,"ƕ":66,"Ɩ":50,"Ɨ":50,"Ƙ":66,"ƙ":66,"ƚ":50,"ƛ":66,"Ɯ":66,"Ɲ":66,"ƞ":66,"Ɵ":66,"Ơ":66,"ơ":66,"Ƣ":66,"ƣ":66,"Ƥ":66,"ƥ":66,"Ʀ":66,"Ƨ":66,"ƨ":66,"Ʃ":66,"ƪ":50,"ƫ":50,"Ƭ":66,"ƭ":50,"Ʈ":66,"Ư":66,"ư":66,"Ʊ":66,"Ʋ":66,"Ƴ":66,"ƴ":66,"Ƶ":66,"ƶ":66,"Ʒ":66,"Ƹ":66,"ƹ":66,"ƺ":66,"ƻ":66,"Ƽ":66,"ƽ":66,"ƾ":50,"ƿ":66,"ǀ":18,"ǁ":34,"ǂ":50,"ǃ":18,"DŽ":66,"Dž":66,"dž":66,"LJ":66,"Lj":66,"lj":82,"NJ":66,"Nj":66,"nj":66,"Ǎ":66,"ǎ":66,"Ǐ":50,"ǐ":50,"Ǒ":66,"ǒ":66,"Ǔ":66,"ǔ":66,"Ǖ":66,"ǖ":66,"Ǘ":66,"ǘ":66,"Ǚ":66,"ǚ":66,"Ǜ":66,"ǜ":66,"ǝ":66,"Ǟ":66,"ǟ":66,"Ǡ":66,"ǡ":66,"Ǣ":66,"ǣ":66,"Ǥ":66,"ǥ":66,"Ǧ":66,"ǧ":66,"Ǩ":66,"ǩ":66,"Ǫ":66,"ǫ":66,"Ǭ":66,"ǭ":66,"Ǯ":66,"ǯ":66,"ǰ":66,"DZ":66,"Dz":66,"dz":66,"Ǵ":66,"ǵ":66,"Ƕ":66,"Ƿ":66,"Ǹ":66,"ǹ":66,"Ǻ":66,"ǻ":66,"Ǽ":66,"ǽ":66,"Ǿ":66,"ǿ":66,"Ȁ":66,"ȁ":66,"Ȃ":66,"ȃ":66,"Ȅ":66,"ȅ":66,"Ȇ":66,"ȇ":66,"Ȉ":66,"ȉ":66,"Ȋ":66,"ȋ":66,"Ȍ":66,"ȍ":66,"Ȏ":66,"ȏ":66,"Ȑ":66,"ȑ":66,"Ȓ":66,"ȓ":66,"Ȕ":66,"ȕ":66,"Ȗ":66,"ȗ":66,"Ș":66,"ș":66,"Ț":66,"ț":50,"Ȝ":66,"ȝ":66,"Ȟ":66,"ȟ":66,"Ƞ":66,"ȡ":66,"Ȣ":66,"ȣ":50,"Ȥ":66,"ȥ":66,"Ȧ":66,"ȧ":66,"Ȩ":66,"ȩ":66,"Ȫ":66,"ȫ":66,"Ȭ":66,"ȭ":66,"Ȯ":66,"ȯ":66,"Ȱ":66,"ȱ":66,"Ȳ":66,"ȳ":66,"ȴ":50,"ȵ":66,"ȶ":66,"ȷ":50,"ȸ":66,"ȹ":66,"Ⱥ":66,"Ȼ":66,"ȼ":66,"Ƚ":66,"Ⱦ":66,"ȿ":66,"ɀ":66,"Ɂ":66,"ɂ":66,"Ƀ":66,"Ʉ":66,"Ʌ":66,"Ɇ":66,"ɇ":66,"Ɉ":66,"ɉ":66,"Ɋ":66,"ɋ":66,"Ɍ":66,"ɍ":66,"Ɏ":66,"ɏ":66,"˙":34,"̀":50,"́":50,"̂":50,"̃":66,"̄":66,"̅":82,"̆":66,"̇":34,"̈":66,"̉":50,"̊":50,"̋":66,"̌":66,"̍":18,"̎":50,"̏":66,"̐":66,"̑":66,"̒":34,"̓":34,"̔":34,"̕":34,"̖":34,"̗":34,"̘":34,"̙":34,"̚":50,"̛":34,"̜":34,"̝":34,"̞":34,"̟":34,"̠":50,"̡":50,"̢":50,"̣":34,"̤":66,"̥":50,"̦":34,"̧":50,"̨":34,"̩":18,"̪":66,"̫":66,"̬":66,"̭":66,"̮":66,"̯":66,"̰":66,"̱":66,"̲":82,"̳":82,"̴":66,"̵":50,"̶":82,"̷":50,"̸":66,"̹":34,"̺":66,"̻":50,"̼":66,"̽":66,"̾":34,"̿":82,"̀":34,"́":34,"͂":50,"̓":34,"̈́":50,"ͅ":34,"͆":66,"͇":66,"͈":50,"͉":34,"͊":66,"͋":82,"͌":66,"͍":66,"͎":34,"͐":34,"͑":34,"͒":66,"͓":50,"͔":34,"͕":34,"͖":82,"͗":34,"͘":34,"͙":50,"͚":66,"͛":50,"͜":130,"͝":130,"͞":98,"͟":98,"͠":130,"͡":130,"͢":130,"ͣ":50,"ͤ":50,"ͥ":34,"ͦ":50,"ͧ":50,"ͨ":50,"ͩ":50,"ͪ":50,"ͫ":66,"ͬ":50,"ͭ":50,"ͮ":50,"ͯ":50,"Ͱ":50,"ͱ":66,"Ͳ":66,"ͳ":50,"ʹ":50,"͵":50,"Ͷ":66,"ͷ":50,"ͺ":34,"ͻ":66,"ͼ":66,"ͽ":66,";":34,"Ϳ":66,"΄":34,"΅":50,"Ά":66,"·":34,"Έ":82,"Ή":82,"Ί":66,"Ό":66,"Ύ":82,"Ώ":82,"ΐ":50,"Α":66,"Β":66,"Γ":66,"Δ":66,"Ε":66,"Ζ":66,"Η":66,"Θ":66,"Ι":50,"Κ":66,"Λ":66,"Μ":66,"Ν":66,"Ξ":66,"Ο":66,"Π":66,"Ρ":66,"Σ":66,"Τ":66,"Υ":66,"Φ":66,"Χ":66,"Ψ":66,"Ω":66,"Ϊ":50,"Ϋ":66,"ά":66,"έ":66,"ή":66,"ί":50,"ΰ":66,"α":66,"β":66,"γ":66,"δ":66,"ε":66,"ζ":66,"η":66,"θ":66,"ι":50,"κ":50,"λ":66,"μ":66,"ν":66,"ξ":66,"ο":66,"π":66,"ρ":66,"ς":66,"σ":66,"τ":66,"υ":66,"φ":66,"χ":82,"ψ":66,"ω":66,"ϊ":50,"ϋ":66,"ό":66,"ύ":66,"ώ":66,"Ϗ":66,"ϐ":66,"ϑ":66,"ϒ":66,"ϓ":82,"ϔ":66,"ϕ":66,"ϖ":66,"ϗ":82,"Ϙ":66,"ϙ":66,"Ϛ":66,"ϛ":66,"Ϝ":66,"ϝ":50,"Ϟ":66,"ϟ":66,"Ϡ":66,"ϡ":50,"Ϣ":66,"ϣ":66,"Ϥ":66,"ϥ":50,"Ϧ":66,"ϧ":66,"Ϩ":66,"ϩ":66,"Ϫ":82,"ϫ":66,"Ϭ":66,"ϭ":66,"Ϯ":66,"ϯ":66,"ϰ":82,"ϱ":66,"ϲ":66,"ϳ":50,"ϴ":66,"ϵ":50,"϶":50,"Ϸ":66,"ϸ":66,"Ϲ":66,"Ϻ":66,"ϻ":66,"ϼ":66,"Ͻ":66,"Ͼ":66,"Ͽ":66,"Ѐ":66,"Ё":66,"Ђ":66,"Ѓ":66,"Є":66,"Ѕ":66,"І":50,"Ї":50,"Ј":66,"Љ":82,"Њ":66,"Ћ":66,"Ќ":66,"Ѝ":66,"Ў":66,"Џ":66,"А":66,"Б":66,"В":66,"Г":66,"Д":82,"Е":66,"Ж":66,"З":66,"И":66,"Й":66,"К":66,"Л":66,"М":66,"Н":66,"О":66,"П":66,"Р":66,"С":66,"Т":66,"У":66,"Ф":66,"Х":66,"Ц":66,"Ч":66,"Ш":66,"Щ":82,"Ъ":66,"Ы":66,"Ь":66,"Э":66,"Ю":66,"Я":66,"а":66,"б":66,"в":66,"г":66,"д":66,"е":66,"ж":66,"з":66,"и":66,"й":66,"к":66,"л":66,"м":66,"н":66,"о":66,"п":66,"р":66,"с":66,"т":66,"у":66,"ф":66,"х":66,"ц":66,"ч":66,"ш":66,"щ":82,"ъ":66,"ы":66,"ь":66,"э":66,"ю":66,"я":66,"ѐ":66,"ё":66,"ђ":66,"ѓ":66,"є":66,"ѕ":66,"і":50,"ї":50,"ј":50,"љ":82,"њ":66,"ћ":66,"ќ":66,"ѝ":66,"ў":66,"џ":50,"Ѡ":66,"ѡ":66,"Ѣ":66,"ѣ":66,"Ѥ":66,"ѥ":66,"Ѧ":66,"ѧ":66,"Ѩ":66,"ѩ":66,"Ѫ":66,"ѫ":66,"Ѭ":66,"ѭ":66,"Ѯ":66,"ѯ":66,"Ѱ":66,"ѱ":66,"Ѳ":66,"ѳ":66,"Ѵ":66,"ѵ":66,"Ѷ":66,"ѷ":66,"Ѹ":66,"ѹ":66,"Ѻ":66,"ѻ":66,"Ѽ":66,"ѽ":66,"Ѿ":66,"ѿ":66,"Ҁ":66,"ҁ":66,"҂":66,"҃":50,"҄":50,"҅":50,"҆":50,"҇":82,"҈":130,"҉":130,"Ҋ":66,"ҋ":66,"Ҍ":66,"ҍ":66,"Ҏ":66,"ҏ":66,"Ґ":66,"ґ":66,"Ғ":66,"ғ":66,"Ҕ":66,"ҕ":66,"Җ":66,"җ":66,"Ҙ":66,"ҙ":66,"Қ":66,"қ":66,"Ҝ":66,"ҝ":66,"Ҟ":66,"ҟ":66,"Ҡ":82,"ҡ":82,"Ң":66,"ң":66,"Ҥ":66,"ҥ":66,"Ҧ":66,"ҧ":66,"Ҩ":66,"ҩ":66,"Ҫ":66,"ҫ":66,"Ҭ":66,"ҭ":66,"Ү":66,"ү":50,"Ұ":66,"ұ":50,"Ҳ":66,"ҳ":66,"Ҵ":82,"ҵ":82,"Ҷ":66,"ҷ":66,"Ҹ":66,"ҹ":66,"Һ":66,"һ":66,"Ҽ":66,"ҽ":66,"Ҿ":66,"ҿ":66,"Ӏ":50,"Ӂ":66,"ӂ":66,"Ӄ":66,"ӄ":66,"Ӆ":66,"ӆ":66,"Ӈ":66,"ӈ":66,"Ӊ":66,"ӊ":66,"Ӌ":66,"ӌ":66,"Ӎ":66,"ӎ":66,"ӏ":34,"Ӑ":66,"ӑ":66,"Ӓ":66,"ӓ":66,"Ӕ":66,"ӕ":66,"Ӗ":66,"ӗ":66,"Ә":66,"ә":66,"Ӛ":66,"ӛ":66,"Ӝ":66,"ӝ":66,"Ӟ":66,"ӟ":66,"Ӡ":66,"ӡ":66,"Ӣ":66,"ӣ":66,"Ӥ":66,"ӥ":66,"Ӧ":66,"ӧ":66,"Ө":66,"ө":66,"Ӫ":66,"ӫ":66,"Ӭ":66,"ӭ":66,"Ӯ":66,"ӯ":66,"Ӱ":66,"ӱ":66,"Ӳ":66,"ӳ":66,"Ӵ":66,"ӵ":66,"Ӷ":66,"ӷ":66,"Ӹ":66,"ӹ":66,"Ӻ":66,"ӻ":66,"Ӽ":66,"ӽ":66,"Ӿ":66,"ӿ":66,"Ԁ":66,"ԁ":66,"Ԃ":66,"ԃ":66,"Ԅ":66,"ԅ":66,"Ԇ":66,"ԇ":66,"Ԉ":82,"ԉ":82,"Ԋ":66,"ԋ":66,"Ԍ":66,"ԍ":66,"Ԏ":66,"ԏ":66,"Ԑ":66,"ԑ":66,"Ԓ":66,"ԓ":66,"Ԕ":82,"ԕ":82,"Ԗ":82,"ԗ":82,"Ԙ":82,"ԙ":82,"Ԛ":66,"ԛ":66,"Ԝ":66,"ԝ":66,"Ԟ":66,"ԟ":66,"Ԡ":82,"ԡ":82,"Ԣ":82,"ԣ":82,"Ԥ":66,"ԥ":66,"Ԧ":66,"ԧ":66,"Ԩ":66,"ԩ":66,"Ԫ":130,"ԫ":130,"Ԭ":66,"ԭ":66,"Ԯ":66,"ԯ":66,"՚":34,"՛":34,"՜":50,"՝":34,"՞":50,"՟":50,"֊":66,"֏":66,"־":66,"׃":34,"׆":50,"׳":34,"״":66,"჻":66,"ᚠ":66,"ᚡ":66,"ᚢ":66,"ᚣ":66,"ᚤ":66,"ᚥ":66,"ᚦ":50,"ᚧ":50,"ᚨ":50,"ᚩ":66,"ᚪ":66,"ᚫ":50,"ᚬ":66,"ᚭ":50,"ᚮ":50,"ᚯ":66,"ᚰ":66,"ᚱ":66,"ᚲ":50,"ᚳ":66,"ᚴ":66,"ᚵ":66,"ᚶ":66,"ᚷ":66,"ᚸ":66,"ᚹ":50,"ᚺ":66,"ᚻ":66,"ᚼ":66,"ᚽ":34,"ᚾ":66,"ᚿ":50,"ᛀ":66,"ᛁ":18,"ᛂ":34,"ᛃ":66,"ᛄ":66,"ᛅ":66,"ᛆ":50,"ᛇ":66,"ᛈ":66,"ᛉ":66,"ᛊ":50,"ᛋ":50,"ᛌ":18,"ᛍ":34,"ᛎ":66,"ᛏ":66,"ᛐ":50,"ᛑ":66,"ᛒ":50,"ᛓ":50,"ᛔ":50,"ᛕ":66,"ᛖ":66,"ᛗ":66,"ᛘ":66,"ᛙ":34,"ᛚ":66,"ᛛ":66,"ᛜ":66,"ᛝ":66,"ᛞ":66,"ᛟ":66,"ᛠ":114,"ᛡ":66,"ᛢ":114,"ᛣ":66,"ᛤ":66,"ᛥ":66,"ᛦ":66,"ᛧ":18,"ᛨ":66,"ᛩ":50,"ᛪ":66,"᛫":34,"᛬":34,"᛭":66,"ᛮ":66,"ᛯ":66,"ᛰ":66,"ᛱ":66,"ᛲ":50,"ᛳ":66,"ᛴ":66,"ᛵ":34,"ᛶ":66,"ᛷ":66,"ᛸ":66,"Ḁ":66,"ḁ":66,"Ḃ":66,"ḃ":66,"Ḅ":66,"ḅ":66,"Ḇ":66,"ḇ":66,"Ḉ":66,"ḉ":66,"Ḋ":66,"ḋ":66,"Ḍ":66,"ḍ":66,"Ḏ":66,"ḏ":66,"Ḑ":66,"ḑ":66,"Ḓ":66,"ḓ":66,"Ḕ":66,"ḕ":66,"Ḗ":66,"ḗ":66,"Ḙ":66,"ḙ":66,"Ḛ":66,"ḛ":66,"Ḝ":66,"ḝ":66,"Ḟ":66,"ḟ":50,"Ḡ":66,"ḡ":66,"Ḣ":50,"ḣ":66,"Ḥ":50,"ḥ":66,"Ḧ":66,"ḧ":66,"Ḩ":66,"ḩ":66,"Ḫ":66,"ḫ":66,"Ḭ":66,"ḭ":66,"Ḯ":50,"ḯ":50,"Ḱ":66,"ḱ":66,"Ḳ":66,"ḳ":66,"Ḵ":66,"ḵ":66,"Ḷ":66,"ḷ":50,"Ḹ":66,"ḹ":50,"Ḻ":66,"ḻ":50,"Ḽ":66,"ḽ":50,"Ḿ":66,"ḿ":66,"Ṁ":66,"ṁ":66,"Ṃ":66,"ṃ":66,"Ṅ":66,"ṅ":66,"Ṇ":66,"ṇ":66,"Ṉ":66,"ṉ":66,"Ṋ":66,"ṋ":66,"Ṍ":66,"ṍ":66,"Ṏ":66,"ṏ":66,"Ṑ":66,"ṑ":66,"Ṓ":66,"ṓ":66,"Ṕ":66,"ṕ":66,"Ṗ":66,"ṗ":66,"Ṙ":66,"ṙ":66,"Ṛ":66,"ṛ":66,"Ṝ":66,"ṝ":66,"Ṟ":66,"ṟ":66,"Ṡ":66,"ṡ":66,"Ṣ":66,"ṣ":66,"Ṥ":66,"ṥ":66,"Ṧ":66,"ṧ":66,"Ṩ":66,"ṩ":66,"Ṫ":66,"ṫ":50,"Ṭ":66,"ṭ":50,"Ṯ":66,"ṯ":50,"Ṱ":66,"ṱ":66,"Ṳ":66,"ṳ":66,"Ṵ":66,"ṵ":66,"Ṷ":66,"ṷ":66,"Ṹ":66,"ṹ":66,"Ṻ":66,"ṻ":66,"Ṽ":66,"ṽ":66,"Ṿ":66,"ṿ":50,"Ẁ":66,"ẁ":66,"Ẃ":66,"ẃ":66,"Ẅ":66,"ẅ":66,"Ẇ":50,"ẇ":66,"Ẉ":50,"ẉ":66,"Ẋ":50,"ẋ":50,"Ẍ":66,"ẍ":66,"Ẏ":66,"ẏ":66,"Ẑ":66,"ẑ":66,"Ẓ":66,"ẓ":66,"Ẕ":66,"ẕ":66,"ẖ":66,"ẗ":50,"ẘ":66,"ẙ":66,"ẚ":66,"ẛ":50,"ẜ":50,"ẝ":50,"ẞ":66,"ẟ":66,"Ạ":50,"ạ":66,"Ả":66,"ả":66,"Ấ":66,"ấ":66,"Ầ":66,"ầ":66,"Ẩ":66,"ẩ":66,"Ẫ":66,"ẫ":66,"Ậ":50,"ậ":66,"Ắ":50,"ắ":66,"Ằ":50,"ằ":66,"Ẳ":66,"ẳ":66,"Ẵ":66,"ẵ":66,"Ặ":50,"ặ":66,"Ẹ":66,"ẹ":66,"Ẻ":66,"ẻ":66,"Ẽ":66,"ẽ":66,"Ế":66,"ế":66,"Ề":66,"ề":66,"Ể":66,"ể":66,"Ễ":66,"ễ":66,"Ệ":66,"ệ":66,"Ỉ":50,"ỉ":50,"Ị":50,"ị":50,"Ọ":66,"ọ":66,"Ỏ":66,"ỏ":66,"Ố":66,"ố":66,"Ồ":66,"ồ":66,"Ổ":66,"ổ":66,"Ỗ":66,"ỗ":66,"Ộ":66,"ộ":66,"Ớ":66,"ớ":66,"Ờ":66,"ờ":66,"Ở":66,"ở":66,"Ỡ":66,"ỡ":66,"Ợ":66,"ợ":66,"Ụ":66,"ụ":66,"Ủ":66,"ủ":66,"Ứ":66,"ứ":66,"Ừ":66,"ừ":66,"Ử":66,"ử":66,"Ữ":66,"ữ":66,"Ự":66,"ự":66,"Ỳ":66,"ỳ":66,"Ỵ":66,"ỵ":66,"Ỷ":66,"ỷ":66,"Ỹ":66,"ỹ":66,"Ỻ":66,"ỻ":82,"Ỽ":66,"ỽ":50,"Ỿ":66,"ỿ":66,"ἀ":66,"ἁ":66,"ἂ":66,"ἃ":66,"ἄ":66,"ἅ":66,"ἆ":66,"ἇ":66,"Ἀ":66,"Ἁ":66,"Ἂ":66,"Ἃ":66,"Ἄ":66,"Ἅ":66,"Ἆ":66,"Ἇ":66,"ἐ":66,"ἑ":66,"ἒ":66,"ἓ":66,"ἔ":66,"ἕ":66,"Ἐ":66,"Ἑ":66,"Ἒ":66,"Ἓ":66,"Ἔ":66,"Ἕ":66,"ἠ":66,"ἡ":66,"ἢ":66,"ἣ":66,"ἤ":66,"ἥ":66,"ἦ":66,"ἧ":66,"Ἠ":66,"Ἡ":66,"Ἢ":66,"Ἣ":66,"Ἤ":66,"Ἥ":66,"Ἦ":66,"Ἧ":66,"ἰ":50,"ἱ":50,"ἲ":50,"ἳ":50,"ἴ":50,"ἵ":50,"ἶ":66,"ἷ":66,"Ἰ":66,"Ἱ":66,"Ἲ":66,"Ἳ":66,"Ἴ":66,"Ἵ":66,"Ἶ":66,"Ἷ":66,"ὀ":66,"ὁ":66,"ὂ":66,"ὃ":66,"ὄ":66,"ὅ":66,"Ὀ":66,"Ὁ":66,"Ὂ":66,"Ὃ":66,"Ὄ":66,"Ὅ":66,"ὐ":66,"ὑ":66,"ὒ":66,"ὓ":66,"ὔ":66,"ὕ":66,"ὖ":66,"ὗ":66,"Ὑ":82,"Ὓ":82,"Ὕ":82,"Ὗ":82,"ὠ":66,"ὡ":66,"ὢ":66,"ὣ":66,"ὤ":66,"ὥ":66,"ὦ":66,"ὧ":66,"Ὠ":82,"Ὡ":82,"Ὢ":82,"Ὣ":82,"Ὤ":82,"Ὥ":82,"Ὦ":66,"Ὧ":66,"ὰ":66,"ά":66,"ὲ":66,"έ":66,"ὴ":66,"ή":66,"ὶ":50,"ί":50,"ὸ":66,"ό":66,"ὺ":66,"ύ":66,"ὼ":66,"ώ":66,"ᾀ":66,"ᾁ":66,"ᾂ":66,"ᾃ":66,"ᾄ":66,"ᾅ":66,"ᾆ":66,"ᾇ":66,"ᾈ":66,"ᾉ":66,"ᾊ":66,"ᾋ":66,"ᾌ":66,"ᾍ":66,"ᾎ":66,"ᾏ":66,"ᾐ":66,"ᾑ":66,"ᾒ":66,"ᾓ":66,"ᾔ":66,"ᾕ":66,"ᾖ":66,"ᾗ":66,"ᾘ":66,"ᾙ":66,"ᾚ":66,"ᾛ":66,"ᾜ":66,"ᾝ":66,"ᾞ":66,"ᾟ":66,"ᾠ":66,"ᾡ":66,"ᾢ":66,"ᾣ":66,"ᾤ":66,"ᾥ":66,"ᾦ":66,"ᾧ":66,"ᾨ":82,"ᾩ":82,"ᾪ":82,"ᾫ":82,"ᾬ":82,"ᾭ":82,"ᾮ":82,"ᾯ":82,"ᾰ":66,"ᾱ":66,"ᾲ":66,"ᾳ":66,"ᾴ":66,"ᾶ":66,"ᾷ":66,"Ᾰ":66,"Ᾱ":66,"Ὰ":66,"Ά":66,"ᾼ":66,"᾽":34,"ι":34,"᾿":34,"῀":66,"῁":66,"ῂ":66,"ῃ":66,"ῄ":66,"ῆ":66,"ῇ":66,"Ὲ":66,"Έ":66,"Ὴ":66,"Ή":66,"ῌ":66,"῍":50,"῎":50,"῏":66,"ῐ":50,"ῑ":50,"ῒ":66,"ΐ":66,"ῖ":66,"ῗ":66,"Ῐ":50,"Ῑ":50,"Ὶ":66,"Ί":66,"῝":50,"῞":50,"῟":66,"ῠ":66,"ῡ":66,"ῢ":66,"ΰ":66,"ῤ":66,"ῥ":66,"ῦ":66,"ῧ":66,"Ῠ":66,"Ῡ":66,"Ὺ":82,"Ύ":82,"Ῥ":66,"῭":66,"΅":66,"`":34,"ῲ":66,"ῳ":66,"ῴ":66,"ῶ":66,"ῷ":66,"Ὸ":66,"Ό":66,"Ὼ":82,"Ώ":82,"ῼ":66,"´":34,"῾":34," ":82," ":82," ":82," ":82," ":82," ":82," ":82," ":82," ":82," ":82," ":82,"‐":50,"‑":50,"‒":66,"–":66,"—":82,"―":82,"‖":34,"‗":82,"‘":34,"’":34,"‚":34,"‛":34,"“":66,"”":66,"„":66,"‟":66,"†":66,"‡":66,"•":50,"‣":50,"․":34,"‥":50,"…":66,"‧":34," ":82,"‰":82,"‱":82,"′":50,"″":82,"‴":82,"‵":50,"‶":82,"‷":82,"‸":50,"‹":34,"›":34,"※":66,"‼":50,"‽":66,"‾":66,"‿":66,"⁀":66,"⁁":66,"⁂":66,"⁃":50,"⁄":66,"⁅":34,"⁆":34,"⁇":82,"⁈":66,"⁉":66,"⁊":66,"⁋":66,"⁌":50,"⁍":50,"⁎":66,"⁏":34,"⁐":66,"⁑":66,"⁒":66,"⁓":82,"⁔":66,"⁕":66,"⁖":66,"⁘":66,"⁙":66,"⁚":34,"⁛":66,"⁜":50,"⁝":34,"⁞":18," ":82,"⁰":66,"ⁱ":50,"⁴":66,"⁵":50,"⁶":50,"⁷":50,"⁸":50,"⁹":50,"⁺":50,"⁻":50,"⁼":50,"⁽":34,"⁾":34,"ⁿ":50,"₀":66,"₁":50,"₂":50,"₃":50,"₄":66,"₅":50,"₆":50,"₇":50,"₈":50,"₉":50,"₊":50,"₋":50,"₌":50,"₍":34,"₎":34,"ₐ":50,"ₑ":50,"ₒ":50,"ₓ":50,"ₔ":50,"ₕ":50,"ₖ":50,"ₗ":50,"ₘ":66,"ₙ":50,"ₚ":50,"ₛ":50,"ₜ":50,"₠":66,"₡":66,"₢":66,"₣":82,"₤":66,"₥":66,"₦":66,"₧":66,"₨":66,"₩":66,"₪":66,"₫":66,"€":66,"₭":66,"₮":66,"₯":66,"₰":66,"₱":82,"₲":66,"₳":82,"₴":82,"₵":66,"₶":66,"₷":66,"₸":66,"₹":82,"₺":66,"₻":66,"₼":50,"₽":66,"₾":66,"₿":66,"⃀":66,"⃁":130,"⃐":66,"⃑":66,"⃒":18,"⃓":18,"⃔":66,"⃕":66,"⃖":66,"⃗":66,"⃘":50,"⃙":50,"⃚":50,"⃛":50,"⃜":66,"⃝":130,"⃞":130,"⃟":130,"⃠":130,"⃡":82,"⃢":130,"⃣":130,"⃤":114,"⃥":34,"⃦":34,"⃧":114,"⃨":50,"⃩":82,"⃪":98,"⃫":50,"⃬":66,"⃭":66,"⃮":66,"⃯":66,"⃰":66,"℀":66,"℁":66,"ℂ":66,"℃":66,"℄":66,"℅":66,"℆":66,"ℇ":66,"℈":66,"℉":66,"ℊ":66,"ℋ":82,"ℌ":66,"ℍ":66,"ℎ":82,"ℏ":82,"ℐ":50,"ℑ":82,"ℒ":82,"ℓ":66,"℔":82,"ℕ":66,"№":82,"℗":82,"℘":66,"ℙ":66,"ℚ":66,"ℛ":66,"ℜ":82,"ℝ":66,"℞":66,"℟":66,"℠":82,"℡":82,"™":82,"℣":82,"ℤ":66,"℥":66,"Ω":66,"℧":66,"ℨ":66,"℩":50,"K":66,"Å":66,"ℬ":66,"ℭ":66,"℮":98,"ℯ":50,"ℰ":66,"ℱ":66,"Ⅎ":66,"ℳ":82,"ℴ":66,"ℵ":66,"ℶ":66,"ℷ":66,"ℸ":66,"ℹ":66,"℺":98,"℻":130,"ℼ":98,"ℽ":98,"ℾ":66,"ℿ":98,"⅀":98,"⅁":66,"⅂":66,"⅃":66,"⅄":66,"ⅅ":98,"ⅆ":98,"ⅇ":82,"ⅈ":66,"ⅉ":82,"⅊":66,"⅋":66,"⅌":114,"⅍":82,"ⅎ":50,"⅏":114,"⅐":66,"⅑":66,"⅒":82,"⅓":66,"⅔":66,"⅕":66,"⅖":66,"⅗":66,"⅘":66,"⅙":66,"⅚":66,"⅛":66,"⅜":66,"⅝":66,"⅞":66,"⅟":66,"Ⅰ":34,"Ⅱ":66,"Ⅲ":66,"Ⅳ":66,"Ⅴ":66,"Ⅵ":82,"Ⅶ":82,"Ⅷ":82,"Ⅸ":66,"Ⅹ":66,"Ⅺ":66,"Ⅻ":66,"Ⅼ":66,"Ⅽ":66,"Ⅾ":66,"Ⅿ":66,"ⅰ":34,"ⅱ":66,"ⅲ":66,"ⅳ":66,"ⅴ":66,"ⅵ":66,"ⅶ":66,"ⅷ":82,"ⅸ":66,"ⅹ":66,"ⅺ":66,"ⅻ":66,"ⅼ":34,"ⅽ":66,"ⅾ":66,"ⅿ":66,"ↀ":66,"ↁ":66,"ↂ":82,"Ↄ":66,"ↄ":66,"ↅ":66,"ↆ":66,"ↇ":82,"ↈ":114,"↉":66,"↊":66,"↋":66,"←":66,"↑":50,"→":66,"↓":50,"↔":82,"↕":50,"↖":66,"↗":66,"↘":66,"↙":66,"↚":66,"↛":66,"↜":130,"↝":130,"↞":82,"↟":50,"↠":82,"↡":50,"↢":66,"↣":66,"↤":66,"↥":50,"↦":66,"↧":50,"↨":50,"↩":66,"↪":66,"↫":66,"↬":66,"↭":82,"↮":82,"↯":66,"↰":50,"↱":50,"↲":50,"↳":50,"↴":82,"↵":50,"↶":82,"↷":82,"↸":66,"↹":66,"↺":66,"↻":66,"↼":66,"↽":66,"↾":34,"↿":34,"⇀":66,"⇁":66,"⇂":34,"⇃":34,"⇄":66,"⇅":82,"⇆":66,"⇇":66,"⇈":82,"⇉":66,"⇊":82,"⇋":66,"⇌":66,"⇍":66,"⇎":82,"⇏":66,"⇐":66,"⇑":50,"⇒":66,"⇓":50,"⇔":82,"⇕":50,"⇖":66,"⇗":66,"⇘":66,"⇙":66,"⇚":66,"⇛":66,"⇜":82,"⇝":82,"⇞":50,"⇟":50,"⇠":66,"⇡":50,"⇢":82,"⇣":50,"⇤":66,"⇥":66,"⇦":82,"⇧":66,"⇨":82,"⇩":66,"⇪":66,"⇫":66,"⇬":66,"⇭":66,"⇮":66,"⇯":66,"⇰":66,"⇱":66,"⇲":66,"⇳":50,"⇴":130,"⇵":82,"⇶":82,"⇷":82,"⇸":82,"⇹":98,"⇺":130,"⇻":130,"⇼":114,"⇽":82,"⇾":82,"⇿":114,"∀":66,"∁":50,"∂":66,"∃":66,"∄":66,"∅":66,"∆":66,"∇":66,"∈":66,"∉":66,"∊":66,"∋":66,"∌":66,"∍":66,"∎":66,"∏":66,"∐":66,"∑":66,"−":66,"∓":66,"∔":66,"∕":66,"∖":66,"∗":50,"∘":50,"∙":50,"√":66,"∛":66,"∜":66,"∝":66,"∞":66,"∟":66,"∠":66,"∡":66,"∢":66,"∣":34,"∤":66,"∥":50,"∦":66,"∧":66,"∨":66,"∩":66,"∪":66,"∫":50,"∬":66,"∭":82,"∮":50,"∯":66,"∰":82,"∱":66,"∲":66,"∳":66,"∴":66,"∵":66,"∶":34,"∷":66,"∸":66,"∹":66,"∺":66,"∻":66,"∼":66,"∽":66,"∾":66,"∿":66,"≀":34,"≁":66,"≂":66,"≃":66,"≄":66,"≅":66,"≆":66,"≇":66,"≈":66,"≉":66,"≊":66,"≋":66,"≌":66,"≍":66,"≎":66,"≏":66,"≐":66,"≑":66,"≒":66,"≓":66,"≔":66,"≕":66,"≖":66,"≗":66,"≘":66,"≙":66,"≚":66,"≛":66,"≜":66,"≝":66,"≞":66,"≟":66,"≠":66,"≡":66,"≢":66,"≣":66,"≤":66,"≥":66,"≦":66,"≧":66,"≨":66,"≩":66,"≪":82,"≫":82,"≬":50,"≭":82,"≮":50,"≯":50,"≰":66,"≱":66,"≲":66,"≳":66,"≴":66,"≵":66,"≶":66,"≷":66,"≸":66,"≹":66,"≺":66,"≻":66,"≼":66,"≽":66,"≾":66,"≿":66,"⊀":66,"⊁":66,"⊂":66,"⊃":66,"⊄":66,"⊅":66,"⊆":66,"⊇":66,"⊈":66,"⊉":66,"⊊":66,"⊋":66,"⊌":66,"⊍":66,"⊎":66,"⊏":66,"⊐":66,"⊑":66,"⊒":66,"⊓":66,"⊔":66,"⊕":66,"⊖":66,"⊗":66,"⊘":66,"⊙":66,"⊚":66,"⊛":66,"⊜":66,"⊝":66,"⊞":66,"⊟":66,"⊠":66,"⊡":66,"⊢":66,"⊣":66,"⊤":66,"⊥":66,"⊦":50,"⊧":50,"⊨":66,"⊩":66,"⊪":66,"⊫":66,"⊬":66,"⊭":66,"⊮":66,"⊯":66,"⊰":66,"⊱":66,"⊲":66,"⊳":66,"⊴":66,"⊵":66,"⊶":130,"⊷":130,"⊸":114,"⊹":66,"⊺":50,"⊻":50,"⊼":50,"⊽":50,"⊾":66,"⊿":66,"⋀":66,"⋁":66,"⋂":66,"⋃":66,"⋄":50,"⋅":34,"⋆":50,"⋇":66,"⋈":66,"⋉":66,"⋊":66,"⋋":50,"⋌":50,"⋍":66,"⋎":66,"⋏":66,"⋐":66,"⋑":66,"⋒":66,"⋓":66,"⋔":50,"⋕":66,"⋖":50,"⋗":50,"⋘":114,"⋙":114,"⋚":66,"⋛":66,"⋜":66,"⋝":66,"⋞":66,"⋟":66,"⋠":66,"⋡":66,"⋢":66,"⋣":66,"⋤":66,"⋥":66,"⋦":66,"⋧":66,"⋨":66,"⋩":66,"⋪":66,"⋫":66,"⋬":66,"⋭":66,"⋮":34,"⋯":82,"⋰":82,"⋱":82,"⋲":98,"⋳":82,"⋴":66,"⋵":82,"⋶":82,"⋷":66,"⋸":66,"⋹":82,"⋺":98,"⋻":82,"⋼":66,"⋽":82,"⋾":66,"⋿":98,"⌀":98,"⌁":66,"⌂":66,"⌃":50,"⌄":50,"⌅":50,"⌆":50,"⌇":34,"⌈":50,"⌉":50,"⌊":50,"⌋":50,"⌌":50,"⌍":50,"⌎":50,"⌏":50,"⌐":66,"⌑":66,"⌒":66,"⌓":66,"⌔":66,"⌕":82,"⌖":130,"⌗":82,"⌘":66,"⌙":66,"⌚":82,"⌛":66,"⌜":50,"⌝":50,"⌞":50,"⌟":50,"⌠":34,"⌡":34,"⌢":66,"⌣":66,"⌤":66,"⌥":66,"⌦":82,"⌧":66,"⌨":66,"〈":50,"〉":50,"⌫":82,"⌬":82,"⌭":130,"⌮":114,"⌯":130,"⌲":130,"⌳":130,"⌴":130,"⌵":130,"⌶":66,"⌷":50,"⌸":66,"⌹":66,"⌺":66,"⌻":66,"⌼":66,"⌽":66,"⌾":66,"⌿":82,"⍀":82,"⍁":66,"⍂":66,"⍃":66,"⍄":66,"⍅":66,"⍆":66,"⍇":66,"⍈":66,"⍉":66,"⍊":66,"⍋":50,"⍌":66,"⍍":66,"⍎":66,"⍏":66,"⍐":66,"⍑":50,"⍒":50,"⍓":66,"⍔":66,"⍕":66,"⍖":66,"⍗":66,"⍘":50,"⍙":50,"⍚":66,"⍛":50,"⍜":66,"⍝":66,"⍞":66,"⍟":66,"⍠":66,"⍡":66,"⍢":50,"⍣":50,"⍤":50,"⍥":66,"⍦":66,"⍧":66,"⍨":66,"⍩":66,"⍪":50,"⍫":66,"⍬":66,"⍭":66,"⍮":50,"⍯":66,"⍰":66,"⍱":66,"⍲":66,"⍳":50,"⍴":66,"⍵":66,"⍶":66,"⍷":66,"⍸":50,"⍹":66,"⍺":66,"⍻":130,"⍼":130,"⍽":114,"⍾":98,"⍿":50,"⎀":66,"⎁":114,"⎂":114,"⎃":114,"⎄":114,"⎅":82,"⎆":130,"⎇":130,"⎈":98,"⎉":114,"⎊":114,"⎋":114,"⎌":130,"⎍":114,"⎎":114,"⎏":82,"⎐":82,"⎑":82,"⎒":82,"⎓":114,"⎔":130,"⎕":66,"⎖":50,"⎗":114,"⎘":114,"⎙":130,"⎚":114,"⎛":50,"⎜":34,"⎝":50,"⎞":50,"⎟":34,"⎠":50,"⎡":50,"⎢":34,"⎣":50,"⎤":50,"⎥":34,"⎦":50,"⎧":50,"⎨":50,"⎩":50,"⎪":34,"⎫":50,"⎬":50,"⎭":50,"⎮":18,"⎯":82,"⎰":66,"⎱":66,"⎲":130,"⎳":130,"⎴":130,"⎵":130,"⎶":130,"⎷":50,"⎸":18,"⎹":18,"⎺":82,"⎻":82,"⎼":82,"⎽":82,"⎾":66,"⎿":66,"⏀":98,"⏃":98,"⏆":98,"⏋":66,"⏌":66,"⏍":114,"⏎":130,"⏏":66,"⏐":18,"⏑":66,"⏒":66,"⏓":66,"⏔":130,"⏕":130,"⏖":130,"⏗":130,"⏘":130,"⏙":130,"⏚":66,"⏞":130,"⏟":130,"⏠":130,"⏡":130,"⏢":114,"⏣":82,"⏤":130,"⏥":114,"⏦":114,"⏧":130,"⏨":66,"⏩":98,"⏪":98,"⏫":82,"⏬":82,"⏭":114,"⏮":114,"⏯":98,"⏰":98,"⏱":98,"⏲":98,"⏳":114,"⏴":66,"⏵":66,"⏶":98,"⏷":98,"⏸":66,"⏹":98,"⏺":98,"⏻":130,"⏼":130,"⏽":50,"⏾":98,"⏿":130,"①":130,"②":130,"③":130,"④":130,"⑤":130,"⑥":130,"⑦":130,"⑧":130,"⑨":130,"⑩":130,"⑪":130,"⑫":130,"⑬":130,"⑭":130,"⑮":130,"⑯":130,"⑰":130,"⑱":130,"⑲":130,"⑳":130,"⑴":130,"⑵":130,"⑶":130,"⑷":130,"⑸":130,"⑹":130,"⑺":130,"⑻":130,"⑼":130,"⒈":66,"⒉":82,"⒊":82,"⒋":82,"⒌":82,"⒍":82,"⒎":82,"⒏":82,"⒐":82,"⒑":130,"⒒":130,"⒓":130,"⒔":130,"⒕":130,"⒖":130,"⒗":130,"⒘":130,"⒙":130,"⒚":130,"⒛":130,"⒜":130,"⒝":130,"⒞":130,"⒟":130,"⒠":130,"⒡":130,"⒢":130,"⒣":130,"⒤":114,"⒥":114,"⒦":130,"⒧":114,"⒨":130,"⒩":130,"⒪":130,"⒫":130,"⒬":130,"⒭":130,"⒮":130,"⒯":130,"⒰":130,"⒱":130,"⒲":130,"⒳":130,"⒴":130,"⒵":130,"Ⓐ":130,"Ⓑ":130,"Ⓒ":130,"Ⓓ":130,"Ⓔ":130,"Ⓕ":130,"Ⓖ":130,"Ⓗ":130,"Ⓘ":130,"Ⓙ":130,"Ⓚ":130,"Ⓛ":130,"Ⓜ":130,"Ⓝ":130,"Ⓞ":130,"Ⓟ":130,"Ⓠ":130,"Ⓡ":130,"Ⓢ":130,"Ⓣ":130,"Ⓤ":130,"Ⓥ":130,"Ⓦ":130,"Ⓧ":130,"Ⓨ":130,"Ⓩ":130,"ⓐ":130,"ⓑ":130,"ⓒ":130,"ⓓ":130,"ⓔ":130,"ⓕ":130,"ⓖ":130,"ⓗ":130,"ⓘ":130,"ⓙ":130,"ⓚ":130,"ⓛ":130,"ⓜ":130,"ⓝ":130,"ⓞ":130,"ⓟ":130,"ⓠ":130,"ⓡ":130,"ⓢ":130,"ⓣ":130,"ⓤ":130,"ⓥ":130,"ⓦ":130,"ⓧ":130,"ⓨ":130,"ⓩ":130,"⓪":130,"⓫":130,"⓬":130,"⓭":130,"⓮":130,"⓯":130,"⓰":114,"⓱":114,"⓲":114,"⓳":130,"⓴":130,"⓿":130,"─":82,"━":82,"│":18,"┃":34,"┄":82,"┅":82,"┆":18,"┇":34,"┈":66,"┉":66,"┊":18,"┋":34,"┌":50,"┍":50,"┎":50,"┏":50,"┐":50,"┑":50,"┒":50,"┓":50,"└":50,"┕":50,"┖":50,"┗":50,"┘":50,"┙":50,"┚":50,"┛":50,"├":50,"┝":50,"┞":50,"┟":50,"┠":50,"┡":50,"┢":50,"┣":50,"┤":50,"┥":50,"┦":50,"┧":50,"┨":50,"┩":50,"┪":50,"┫":50,"┬":82,"┭":82,"┮":82,"┯":82,"┰":82,"┱":82,"┲":82,"┳":82,"┴":82,"┵":82,"┶":82,"┷":82,"┸":82,"┹":82,"┺":82,"┻":82,"┼":82,"┽":82,"┾":82,"┿":82,"╀":82,"╁":82,"╂":82,"╃":82,"╄":82,"╅":82,"╆":82,"╇":82,"╈":82,"╉":82,"╊":82,"╋":82,"╌":66,"╍":66,"╎":18,"╏":34,"═":82,"║":34,"╒":50,"╓":50,"╔":50,"╕":50,"╖":66,"╗":66,"╘":50,"╙":50,"╚":50,"╛":50,"╜":66,"╝":66,"╞":50,"╟":50,"╠":50,"╡":50,"╢":66,"╣":66,"╤":82,"╥":82,"╦":82,"╧":82,"╨":82,"╩":82,"╪":82,"╫":82,"╬":82,"╭":50,"╮":50,"╯":50,"╰":50,"╱":82,"╲":82,"╳":82,"╴":50,"╵":18,"╶":50,"╷":18,"╸":50,"╹":34,"╺":50,"╻":34,"╼":82,"╽":34,"╾":82,"╿":34,"▀":82,"▁":82,"▂":82,"▃":82,"▄":82,"▅":82,"▆":82,"▇":82,"█":82,"▉":66,"▊":66,"▋":50,"▌":50,"▍":34,"▎":34,"▏":18,"▐":50,"░":66,"▒":82,"▓":82,"▔":82,"▕":18,"▖":50,"▗":50,"▘":50,"▙":82,"▚":82,"▛":82,"▜":82,"▝":50,"▞":82,"▟":82,"■":66,"□":66,"▢":66,"▣":66,"▤":66,"▥":66,"▦":66,"▧":66,"▨":66,"▩":66,"▪":50,"▫":50,"▬":66,"▭":66,"▮":50,"▯":50,"▰":82,"▱":82,"▲":66,"△":66,"▴":66,"▵":66,"▶":66,"▷":66,"▸":50,"▹":50,"►":66,"▻":66,"▼":66,"▽":66,"▾":66,"▿":66,"◀":66,"◁":66,"◂":50,"◃":50,"◄":66,"◅":66,"◆":66,"◇":66,"◈":66,"◉":66,"◊":66,"○":66,"◌":66,"◍":66,"◎":66,"●":66,"◐":66,"◑":66,"◒":66,"◓":66,"◔":66,"◕":66,"◖":50,"◗":50,"◘":82,"◙":82,"◚":82,"◛":82,"◜":50,"◝":50,"◞":50,"◟":50,"◠":66,"◡":66,"◢":82,"◣":82,"◤":82,"◥":82,"◦":50,"◧":66,"◨":66,"◩":66,"◪":66,"◫":66,"◬":66,"◭":66,"◮":66,"◯":114,"◰":66,"◱":66,"◲":66,"◳":66,"◴":82,"◵":82,"◶":82,"◷":82,"◸":82,"◹":82,"◺":82,"◻":66,"◼":66,"◽":50,"◾":50,"◿":82,"☀":66,"☁":82,"☂":66,"☄":66,"★":130,"☆":114,"☇":50,"☈":66,"☉":82,"☊":82,"☋":82,"☌":50,"☍":66,"☎":66,"☏":66,"☐":98,"☑":98,"☒":114,"☓":50,"☔":66,"☕":114,"☖":98,"☗":98,"☘":114,"☙":114,"☚":66,"☛":66,"☜":66,"☝":50,"☞":66,"☟":50,"☠":82,"☡":50,"☣":130,"☤":114,"☥":50,"☦":66,"☧":66,"☨":66,"☩":66,"☪":82,"☫":98,"☬":98,"☭":82,"☮":66,"☰":114,"☱":114,"☲":114,"☳":114,"☴":114,"☵":114,"☶":114,"☷":114,"☸":66,"☹":82,"☺":82,"☻":82,"☼":66,"☽":66,"☾":66,"☿":50,"♀":50,"♁":50,"♂":66,"♃":66,"♄":66,"♅":66,"♆":82,"♇":66,"♈":66,"♉":66,"♊":66,"♋":66,"♌":82,"♍":66,"♎":66,"♏":66,"♐":66,"♑":82,"♒":66,"♓":66,"♔":66,"♕":66,"♖":66,"♗":66,"♘":66,"♙":66,"♚":66,"♛":66,"♜":66,"♝":66,"♞":66,"♟":66,"♠":66,"♡":66,"♢":50,"♣":66,"♤":66,"♥":66,"♦":50,"♧":66,"♨":82,"♩":50,"♪":66,"♫":82,"♬":82,"♭":66,"♮":66,"♯":66,"♰":66,"♱":66,"♳":130,"♴":130,"♵":130,"♶":130,"♷":130,"♸":130,"♹":130,"♺":130,"♾":114,"♿":114,"⚀":82,"⚁":82,"⚂":82,"⚃":82,"⚄":82,"⚅":82,"⚆":114,"⚇":114,"⚈":114,"⚉":114,"⚊":114,"⚋":114,"⚌":114,"⚍":114,"⚎":114,"⚏":114,"⚐":66,"⚑":66,"⚓":114,"⚔":114,"⚕":82,"⚖":130,"⚗":98,"⚘":98,"⚙":114,"⚚":130,"⚜":130,"⚝":130,"⚞":114,"⚟":114,"⚠":114,"⚡":66,"⚢":98,"⚣":98,"⚤":98,"⚥":82,"⚦":98,"⚧":130,"⚨":66,"⚩":130,"⚪":66,"⚫":66,"⚬":50,"⚭":98,"⚮":98,"⚯":114,"⚰":130,"⚱":98,"⚲":50,"⚳":66,"⚴":66,"⚵":66,"⚶":114,"⚷":66,"⚸":66,"⚹":82,"⚺":66,"⚻":66,"⚼":66,"⚽":114,"⚾":114,"⚿":114,"⛀":114,"⛁":114,"⛂":130,"⛃":130,"⛄":130,"⛅":114,"⛆":130,"⛈":130,"⛉":98,"⛊":98,"⛋":98,"⛌":82,"⛍":130,"⛎":98,"⛏":130,"⛐":98,"⛑":114,"⛒":114,"⛓":114,"⛔":114,"⛕":114,"⛖":130,"⛘":114,"⛙":130,"⛚":130,"⛛":82,"⛝":98,"⛞":114,"⛟":130,"⛠":130,"⛡":130,"⛢":66,"⛣":82,"⛤":114,"⛥":114,"⛦":114,"⛧":114,"⛨":98,"⛩":130,"⛪":114,"⛫":98,"⛬":82,"⛭":98,"⛮":114,"⛯":98,"⛰":130,"⛱":130,"⛲":114,"⛳":130,"⛴":130,"⛵":130,"⛶":130,"⛷":114,"⛸":98,"⛹":114,"⛺":130,"⛻":98,"⛼":114,"⛽":130,"⛾":130,"⛿":114,"✀":130,"✁":130,"✂":130,"✃":130,"✄":130,"✅":130,"✆":130,"✇":130,"✈":130,"✉":130,"✊":114,"✋":130,"✌":130,"✍":130,"✎":114,"✏":130,"✐":114,"✑":130,"✒":130,"✓":114,"✔":130,"✕":98,"✖":130,"✗":114,"✘":114,"✙":130,"✚":130,"✛":130,"✜":130,"✝":82,"✞":114,"✟":114,"✠":114,"✡":114,"✢":130,"✣":130,"✤":130,"✦":130,"✧":130,"✨":130,"✩":130,"✪":130,"✫":130,"✬":130,"✭":130,"✮":130,"✯":130,"✱":130,"✲":130,"✳":130,"✴":130,"✵":130,"✶":114,"✷":130,"✸":130,"✹":130,"✺":130,"✻":130,"✼":130,"✽":130,"✾":130,"✿":130,"❀":130,"❁":130,"❂":130,"❃":130,"❄":130,"❅":130,"❆":130,"❇":130,"❈":130,"❉":130,"❊":130,"❋":130,"❌":98,"❍":114,"❎":114,"❏":114,"❐":114,"❑":114,"❒":114,"❓":82,"❔":82,"❕":66,"❖":114,"❗":50,"❘":34,"❙":50,"❚":82,"❛":66,"❜":66,"❝":130,"❞":130,"❟":66,"❠":130,"❡":130,"❢":82,"❣":82,"❤":130,"❥":114,"❦":114,"❧":114,"❨":50,"❩":50,"❪":50,"❫":50,"❬":50,"❭":50,"❮":66,"❯":66,"❰":66,"❱":66,"❲":34,"❳":34,"❴":66,"❵":66,"❶":130,"❷":130,"❸":130,"❹":130,"❺":130,"❻":130,"❼":130,"❽":130,"❾":130,"❿":130,"➀":130,"➁":130,"➂":130,"➃":130,"➄":130,"➅":130,"➆":130,"➇":130,"➈":130,"➉":130,"➊":130,"➋":130,"➌":130,"➍":130,"➎":130,"➏":130,"➐":130,"➑":130,"➒":130,"➓":130,"➔":130,"➕":98,"➖":114,"➗":114,"➘":98,"➙":130,"➚":98,"➛":130,"➜":130,"➝":130,"➞":130,"➟":130,"➠":130,"➡":130,"➢":130,"➣":130,"➤":130,"➥":130,"➦":130,"➧":66,"➨":130,"➩":130,"➪":130,"➫":130,"➬":130,"➭":130,"➮":130,"➰":66,"➲":130,"➳":130,"➴":98,"➵":130,"➶":98,"➷":98,"➸":130,"➹":98,"➺":130,"➻":130,"➼":130,"➽":130,"➾":130,"⟀":66,"⟁":98,"⟂":50,"⟃":98,"⟄":98,"⟅":50,"⟆":50,"⟇":66,"⟈":130,"⟉":130,"⟊":34,"⟋":82,"⟌":114,"⟍":82,"⟎":98,"⟏":98,"⟐":82,"⟑":66,"⟒":82,"⟓":66,"⟔":66,"⟕":114,"⟖":114,"⟗":130,"⟘":82,"⟙":82,"⟚":114,"⟛":114,"⟜":114,"⟝":130,"⟞":130,"⟟":50,"⟠":66,"⟡":114,"⟢":130,"⟣":130,"⟤":130,"⟥":130,"⟦":50,"⟧":50,"⟨":50,"⟩":50,"⟪":66,"⟫":66,"⟬":50,"⟭":50,"⟮":34,"⟯":34,"⟰":98,"⟱":98,"⟲":114,"⟳":114,"⟴":130,"⟵":130,"⟶":130,"⟷":130,"⟸":130,"⟹":130,"⟺":130,"⟻":130,"⟼":130,"⟽":130,"⟾":130,"⟿":130,"⤀":130,"⤁":130,"⤂":130,"⤃":130,"⤄":114,"⤅":130,"⤆":130,"⤇":130,"⤈":50,"⤉":50,"⤊":82,"⤋":82,"⤌":130,"⤍":130,"⤎":130,"⤏":130,"⤐":130,"⤑":130,"⤒":66,"⤓":66,"⤔":130,"⤕":130,"⤖":130,"⤗":130,"⤘":130,"⤙":130,"⤚":130,"⤛":130,"⤜":130,"⤝":130,"⤞":130,"⤟":130,"⤠":130,"⤡":114,"⤢":114,"⤣":114,"⤤":114,"⤥":114,"⤦":114,"⤧":130,"⤨":114,"⤩":130,"⤪":114,"⤫":114,"⤬":114,"⤭":114,"⤮":114,"⤯":114,"⤰":114,"⤱":130,"⤲":130,"⤳":130,"⤴":130,"⤵":130,"⤶":98,"⤷":98,"⤸":50,"⤹":50,"⤺":114,"⤻":114,"⤼":114,"⤽":114,"⤾":114,"⤿":114,"⥀":98,"⥁":98,"⥂":130,"⥃":130,"⥄":130,"⥅":130,"⥇":130,"⥈":130,"⥉":50,"⥊":130,"⥋":130} + $data modify storage lib_text_fonts:$(_) Fonts."minecraft:uniform" merge value {"⥌":50,"⥍":50,"⥎":130,"⥏":34,"⥐":130,"⥑":34,"⥒":130,"⥓":130,"⥔":50,"⥕":50,"⥖":130,"⥗":130,"⥘":50,"⥙":50,"⥚":114,"⥛":114,"⥜":50,"⥝":50,"⥞":114,"⥟":114,"⥠":50,"⥡":50,"⥢":130,"⥣":82,"⥤":130,"⥥":82,"⥦":130,"⥧":130,"⥨":130,"⥩":130,"⥪":130,"⥫":130,"⥬":130,"⥭":130,"⥮":82,"⥯":82,"⥰":130,"⥱":130,"⥲":130,"⥳":130,"⥴":130,"⥵":130,"⥶":82,"⥷":130,"⥸":82,"⥹":82,"⥺":130,"⥻":82,"⥼":66,"⥽":66,"⥾":82,"⥿":82,"⦀":50,"⦁":66,"⦂":50,"⦃":66,"⦄":66,"⦅":50,"⦆":50,"⦇":50,"⦈":50,"⦉":50,"⦊":50,"⦋":34,"⦌":34,"⦍":50,"⦎":50,"⦏":50,"⦐":50,"⦑":50,"⦒":50,"⦓":98,"⦔":98,"⦕":98,"⦖":98,"⦗":50,"⦘":50,"⦙":18,"⦚":34,"⦛":66,"⦜":66,"⦝":66,"⦞":114,"⦟":66,"⦠":66,"⦡":66,"⦢":66,"⦣":66,"⦤":66,"⦥":66,"⦦":66,"⦧":66,"⦨":114,"⦩":114,"⦪":114,"⦫":114,"⦬":114,"⦭":114,"⦮":114,"⦯":114,"⦰":82,"⦱":82,"⦲":82,"⦳":82,"⦴":82,"⦵":98,"⦶":82,"⦷":82,"⦸":82,"⦹":82,"⦺":82,"⦻":82,"⦼":98,"⦽":82,"⦾":98,"⦿":98,"⧀":98,"⧁":98,"⧂":114,"⧃":114,"⧄":98,"⧅":98,"⧆":98,"⧇":98,"⧈":98,"⧉":114,"⧊":114,"⧋":114,"⧌":130,"⧍":130,"⧎":82,"⧏":98,"⧐":98,"⧑":66,"⧒":66,"⧓":66,"⧔":66,"⧕":66,"⧖":66,"⧗":66,"⧘":34,"⧙":34,"⧚":66,"⧛":66,"⧜":66,"⧝":66,"⧞":66,"⧟":130,"⧠":114,"⧡":66,"⧢":98,"⧣":130,"⧤":130,"⧥":130,"⧦":130,"⧧":82,"⧨":114,"⧩":114,"⧪":82,"⧫":66,"⧬":66,"⧭":66,"⧮":66,"⧯":66,"⧰":66,"⧱":66,"⧲":66,"⧳":66,"⧴":130,"⧵":50,"⧶":50,"⧷":50,"⧸":66,"⧹":66,"⧺":66,"⧻":66,"⧼":66,"⧽":66,"⧾":114,"⧿":114,"⨀":98,"⨁":98,"⨂":98,"⨃":82,"⨄":82,"⨅":82,"⨆":82,"⨇":130,"⨈":130,"⨉":98,"⨊":82,"⨋":66,"⨌":130,"⨍":50,"⨎":50,"⨏":50,"⨐":50,"⨑":66,"⨒":50,"⨓":50,"⨔":66,"⨕":50,"⨖":50,"⨗":82,"⨘":66,"⨙":50,"⨚":50,"⨛":50,"⨜":50,"⨝":98,"⨞":50,"⨟":50,"⨠":98,"⨡":50,"⨢":66,"⨣":66,"⨤":66,"⨥":66,"⨦":66,"⨧":82,"⨨":66,"⨩":66,"⨪":66,"⨫":66,"⨬":66,"⨭":82,"⨮":82,"⨯":50,"⨰":66,"⨱":66,"⨲":66,"⨳":82,"⨴":82,"⨵":82,"⨶":114,"⨸":82,"⨹":114,"⨺":114,"⨻":114,"⨼":66,"⨽":66,"⨾":34,"⨿":66,"⩀":66,"⩁":66,"⩂":66,"⩃":66,"⩄":66,"⩅":66,"⩆":50,"⩇":50,"⩈":50,"⩉":50,"⩊":66,"⩋":66,"⩌":82,"⩍":82,"⩎":82,"⩏":82,"⩐":114,"⩑":82,"⩒":82,"⩓":98,"⩔":98,"⩕":114,"⩖":114,"⩗":98,"⩘":98,"⩙":114,"⩚":98,"⩛":98,"⩜":98,"⩝":98,"⩞":82,"⩟":82,"⩠":82,"⩡":82,"⩢":82,"⩣":82,"⩤":98,"⩥":98,"⩦":66,"⩧":66,"⩨":98,"⩩":98,"⩪":66,"⩫":66,"⩬":66,"⩭":66,"⩮":66,"⩯":66,"⩰":66,"⩱":50,"⩲":50,"⩳":66,"⩴":98,"⩵":130,"⩶":130,"⩷":66,"⩸":114,"⩹":82,"⩺":82,"⩻":98,"⩼":98,"⩽":66,"⩾":66,"⩿":66,"⪀":66,"⪁":66,"⪂":66,"⪃":66,"⪄":66,"⪅":82,"⪆":82,"⪇":66,"⪈":66,"⪉":82,"⪊":82,"⪋":66,"⪌":66,"⪍":82,"⪎":82,"⪏":66,"⪐":66,"⪑":50,"⪒":50,"⪓":66,"⪔":66,"⪕":66,"⪖":66,"⪗":66,"⪘":66,"⪙":66,"⪚":66,"⪛":66,"⪜":66,"⪝":82,"⪞":82,"⪟":82,"⪠":82,"⪡":82,"⪢":82,"⪣":114,"⪤":82,"⪥":114,"⪦":82,"⪧":82,"⪨":82,"⪩":82,"⪪":82,"⪫":82,"⪬":82,"⪭":82,"⪮":98,"⪯":82,"⪰":82,"⪱":82,"⪲":82,"⪳":82,"⪴":82,"⪵":82,"⪶":82,"⪷":82,"⪸":82,"⪹":82,"⪺":82,"⪻":130,"⪼":130,"⪽":98,"⪾":98,"⪿":66,"⫀":66,"⫁":66,"⫂":66,"⫃":66,"⫄":66,"⫅":66,"⫆":66,"⫇":66,"⫈":66,"⫉":66,"⫊":66,"⫋":66,"⫌":66,"⫍":130,"⫎":130,"⫏":82,"⫐":82,"⫑":82,"⫒":82,"⫓":66,"⫔":66,"⫕":66,"⫖":66,"⫗":114,"⫘":114,"⫙":82,"⫚":82,"⫛":82,"⫝̸":82,"⫝":82,"⫞":50,"⫟":82,"⫠":82,"⫡":98,"⫢":98,"⫣":114,"⫤":98,"⫥":114,"⫦":114,"⫧":82,"⫨":82,"⫩":82,"⫪":82,"⫫":82,"⫬":98,"⫭":98,"⫮":66,"⫯":50,"⫰":50,"⫱":50,"⫲":66,"⫳":82,"⫴":66,"⫵":98,"⫶":34,"⫷":98,"⫸":98,"⫹":66,"⫺":66,"⫻":98,"⫼":66,"⫽":82,"⫾":34,"⫿":34,"⬀":98,"⬁":98,"⬂":98,"⬃":98,"⬄":130,"⬅":114,"⬆":66,"⬇":66,"⬈":98,"⬉":98,"⬊":98,"⬋":98,"⬌":130,"⬍":66,"⬎":130,"⬏":130,"⬐":130,"⬑":130,"⬒":98,"⬓":98,"⬔":98,"⬕":98,"⬖":98,"⬗":98,"⬘":98,"⬙":98,"⬚":98,"⬛":130,"⬜":130,"⬝":50,"⬞":50,"⬟":114,"⬠":114,"⬡":98,"⬢":98,"⬣":130,"⬤":114,"⬥":66,"⬦":66,"⬧":66,"⬨":66,"⬩":50,"⬪":50,"⬫":50,"⬬":130,"⬭":130,"⬮":66,"⬯":66,"⬰":130,"⬱":82,"⬲":130,"⬳":130,"⬴":130,"⬵":130,"⬶":130,"⬷":130,"⬸":130,"⬹":130,"⬺":130,"⬻":130,"⬼":130,"⬽":130,"⬾":130,"⬿":130,"⭀":130,"⭁":130,"⭂":130,"⭃":130,"⭄":130,"⭅":130,"⭆":130,"⭇":130,"⭈":130,"⭉":130,"⭊":130,"⭋":130,"⭌":130,"⭍":98,"⭎":50,"⭏":50,"⭐":114,"⭑":98,"⭒":98,"⭓":98,"⭔":98,"⭕":114,"⭖":114,"⭗":114,"⭘":82,"⭙":114,"⭚":98,"⭛":98,"⭜":82,"⭝":82,"⭞":82,"⭟":82,"⭠":130,"⭡":50,"⭢":130,"⭣":50,"⭤":130,"⭥":50,"⭦":98,"⭧":98,"⭨":98,"⭩":98,"⭪":130,"⭫":50,"⭬":130,"⭭":50,"⭮":114,"⭯":114,"⭰":130,"⭱":50,"⭲":130,"⭳":50,"⭶":82,"⭷":82,"⭸":82,"⭹":82,"⭺":130,"⭻":66,"⭼":130,"⭽":66,"⭾":130,"⭿":98,"⮀":130,"⮁":98,"⮂":130,"⮃":98,"⮄":130,"⮅":98,"⮆":130,"⮇":98,"⮈":114,"⮉":114,"⮊":114,"⮋":114,"⮌":114,"⮍":114,"⮎":114,"⮏":114,"⮐":130,"⮑":130,"⮒":130,"⮓":130,"⮕":114,"⮖":130,"⮗":114,"⮘":114,"⮙":114,"⮚":114,"⮛":114,"⮜":114,"⮝":114,"⮞":114,"⮟":114,"⮠":130,"⮡":130,"⮢":130,"⮣":130,"⮤":82,"⮥":82,"⮦":82,"⮧":82,"⮨":130,"⮩":130,"⮪":130,"⮫":130,"⮬":82,"⮭":82,"⮮":82,"⮯":82,"⮰":130,"⮱":130,"⮲":130,"⮳":130,"⮴":130,"⮵":130,"⮶":130,"⮷":130,"⮸":82,"⮹":114,"⮺":114,"⮻":114,"⮼":114,"⮽":114,"⮾":114,"⮿":114,"⯀":114,"⯁":98,"⯂":114,"⯃":114,"⯄":130,"⯅":114,"⯆":114,"⯇":114,"⯈":114,"⯉":66,"⯊":114,"⯋":114,"⯌":130,"⯍":98,"⯎":130,"⯏":98,"⯐":114,"⯑":114,"⯒":66,"⯓":98,"⯔":98,"⯕":114,"⯖":98,"⯗":66,"⯘":114,"⯙":98,"⯚":98,"⯛":66,"⯜":66,"⯝":66,"⯞":82,"⯟":98,"⯠":98,"⯡":98,"⯢":82,"⯣":98,"⯤":98,"⯥":50,"⯦":98,"⯧":98,"⯨":66,"⯩":66,"⯪":114,"⯫":114,"⯬":130,"⯭":98,"⯮":130,"⯯":98,"⯰":98,"⯱":66,"⯲":82,"⯳":98,"⯴":114,"⯵":114,"⯶":98,"⯷":98,"⯸":98,"⯹":98,"⯺":98,"⯻":130,"⯼":50,"⯽":50,"⯾":66,"⯿":50,"⸘":66,"⸮":66,"⸵":34,"⸸":66,"⹁":34,"⹋":66,"ㇰ":66,"ㇱ":66,"ㇲ":66,"ㇳ":50,"ㇴ":66,"ㇵ":82,"ㇶ":66,"ㇷ":66,"ㇸ":82,"ㇹ":66,"ㇺ":98,"ㇻ":66,"ㇼ":66,"ㇽ":98,"ㇾ":66,"ㇿ":82,"︐":34,"︑":34,"︒":50,"︓":34,"︔":34,"︕":18,"︖":66,"︗":130,"︘":130,"︙":34,"︰":34,"︱":18,"︲":18,"︳":18,"︴":34,"︵":130,"︶":130,"︷":130,"︸":130,"︹":130,"︺":130,"︻":130,"︼":130,"︽":130,"︾":130,"︿":130,"﹀":130,"﹁":98,"﹂":98,"﹃":98,"﹄":98,"﹅":50,"﹆":50,"﹇":130,"﹈":130,"﹉":114,"﹊":130,"﹍":114,"﹎":130,"﹐":34,"﹑":34,"﹒":34,"﹔":34,"﹕":34,"﹖":34,"﹗":18,"﹘":50,"﹙":34,"﹚":34,"﹛":34,"﹜":34,"﹝":34,"﹞":34,"﹟":50,"﹠":50,"﹡":34,"﹢":50,"﹣":50,"﹤":34,"﹥":34,"﹦":50,"﹨":50,"﹩":50,"﹪":50,"﹫":50,"⦅":82,"⦆":82,"。":50,"「":50,"」":50,"、":50,"・":34,"ヲ":66,"ァ":66,"ィ":66,"ゥ":66,"ェ":66,"ォ":66,"ャ":66,"ュ":66,"ョ":66,"ッ":66,"ー":66,"ア":66,"イ":66,"ウ":66,"エ":66,"オ":66,"カ":66,"キ":66,"ク":66,"ケ":66,"コ":66,"サ":66,"シ":66,"ス":66,"セ":66,"ソ":66,"タ":66,"チ":66,"ツ":66,"テ":66,"ト":50,"ナ":66,"ニ":66,"ヌ":66,"ネ":66,"ノ":66,"ハ":66,"ヒ":66,"フ":66,"ヘ":66,"ホ":66,"マ":66,"ミ":66,"ム":66,"メ":66,"モ":66,"ヤ":66,"ユ":66,"ヨ":66,"ラ":66,"リ":50,"ル":66,"レ":66,"ロ":66,"ワ":66,"ン":66,"゙":50,"゚":50,"ᅠ":82,"ᄀ":66,"ᄁ":50,"ᆪ":66,"ᄂ":66,"ᆬ":66,"ᆭ":66,"ᄃ":66,"ᄄ":50,"ᄅ":50,"ᆰ":66,"ᆱ":66,"ᆲ":66,"ᆳ":66,"ᆴ":66,"ᆵ":82,"ᄚ":66,"ᄆ":50,"ᄇ":66,"ᄈ":66,"ᄡ":66,"ᄉ":50,"ᄊ":82,"ᄋ":50,"ᄌ":50,"ᄍ":82,"ᄎ":50,"ᄏ":66,"ᄐ":66,"ᄑ":66,"ᄒ":66,"ᅡ":34,"ᅢ":34,"ᅣ":34,"ᅤ":34,"ᅥ":34,"ᅦ":50,"ᅧ":34,"ᅨ":50,"ᅩ":50,"ᅪ":66,"ᅫ":66,"ᅬ":50,"ᅭ":50,"ᅮ":50,"ᅯ":50,"ᅰ":66,"ᅱ":50,"ᅲ":50,"ᅳ":66,"ᅴ":34,"ᅵ":18,"¢":82,"£":114,"¬":98," ̄":130,"¦":18,"¥":98,"₩":114,"│":18,"←":66,"↑":50,"→":66,"↓":50,"■":66,"○":66,"�":66,"🌊":147,"🌧":115,"🍖":115,"🎣":131,"🏹":115,"🔔":115,"🔥":99,"🔱":115,"🗡":99,"🛡":115,"🧪":67,"🪓":83,"🪣":115} + data modify storage lib_text_fonts: Rejected set value {"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1," ":1," ":1," ":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"":1,"§":1,"
":1,"
":1} + +# 収録した補助文字の先頭コード単位に、2コード単位検索の目印を付ける + data modify storage lib:text PairLead set value {"Font":"minecraft:uniform","Key":"🏹"} + data modify storage lib:text PairLead.Key set string storage lib:text PairLead.Key 0 1 + function lib:text/core/mark_pair_lead.m with storage lib:text PairLead + data modify storage lib:text PairLead set value {"Font":"minecraft:uniform","Key":"🛡"} + data modify storage lib:text PairLead.Key set string storage lib:text PairLead.Key 0 1 + function lib:text/core/mark_pair_lead.m with storage lib:text PairLead + data modify storage lib:text PairLead set value {"Font":"minecraft:uniform","Key":"🪣"} + data modify storage lib:text PairLead.Key set string storage lib:text PairLead.Key 0 1 + function lib:text/core/mark_pair_lead.m with storage lib:text PairLead + data remove storage lib:text PairLead + return 1 diff --git a/TheSkyBlessing/data/lib/functions/text/measure.mcfunction b/TheSkyBlessing/data/lib/functions/text/measure.mcfunction new file mode 100644 index 0000000000..2e5f6224e0 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/measure.mcfunction @@ -0,0 +1,38 @@ +#> lib:text/measure +# +# 通常表示とUnicodeフォント強制時の、単一行の送り幅を測る +# 入力は消費する +# +# @input storage lib: +# Text : string +# 単一行の文字列で、空文字列は幅0で成功する +# LF・CRを含めないことは呼出側で保証する +# 未収録文字は1コード単位あたり9px・太字加算0.5pxで補う +# 未対応の制御文字・行や段落の区切り文字・§は失敗する +# Bold : bool +# 太字なら true +# 引数の型は呼出側で保証する +# @output storage lib: +# Return.Default.TextAdvance : double +# Return.Unifont.TextAdvance : double +# 通常表示・Unicodeフォント強制時の送り幅 +# 複数部分を合算する場合はこの値を使い、合計後に一度だけ丸める +# Return.Default.TextWidth : int +# Return.Unifont.TextWidth : int +# 送り幅を切り上げた整数 +# 計算範囲超過は失敗し、失敗時は両設定の結果を削除する +# @api + +# 文字列と太字指定を取り込み、前回の結果を消す + data remove storage lib: Return.Default + data remove storage lib: Return.Unifont + data modify storage lib:text Work set value {} + data modify storage lib:text Work.Text set from storage lib: Text + data modify storage lib:text Work.Bold set from storage lib: Bold + data remove storage lib: Text + data remove storage lib: Bold + +# 両フォントの幅を計測し、成否を返す + scoreboard players set $TextResult Temporary 0 + execute store success score $TextResult Temporary run function lib:text/core/measure + return run function lib:text/core/finish diff --git a/TheSkyBlessing/data/lib/functions/text/measure_component.mcfunction b/TheSkyBlessing/data/lib/functions/text/measure_component.mcfunction new file mode 100644 index 0000000000..d8e44cd865 --- /dev/null +++ b/TheSkyBlessing/data/lib/functions/text/measure_component.mcfunction @@ -0,0 +1,39 @@ +#> lib:text/measure_component +# +# 静的なTextComponentの単一行の送り幅を、通常表示とUnicodeフォント強制時について測る +# 入力は消費する +# +# @input storage lib: +# Component : compound | list | string +# NBTで渡すTextComponent +# 文字列はJSONとして解析せず、本文として扱う +# 引数の型と、LF・CRを含めないことは呼出側で保証する +# NBTリスト内の要素は同じ型で渡す +# text・extra・入れ子配列・配列先頭からの装飾継承・boldを扱う +# fontはdefault・uniform・spaceに対応し、defaultだけがフォント強制設定に追従する +# translateは文章の %s・%N$s・%% とwithの文字列・compound、入れ子に対応する +# 翻訳辞書は検索せず、selector・NBT・score・keybindの動的参照は失敗する +# default・uniformの未収録文字は1コード単位あたり9px・太字加算0.5pxで補う +# spaceの未収録文字・未対応の制御文字・§・不正入力・未対応フォントや書式は失敗する +# 色・斜体・下線・取り消し線は送り幅を増やさない +# @output storage lib: +# Return.Default.TextAdvance : double +# Return.Unifont.TextAdvance : double +# 通常表示・Unicodeフォント強制時の送り幅 +# Return.Default.TextWidth : int +# Return.Unifont.TextWidth : int +# 部分ごとの送り幅を合計してから切り上げた整数 +# 計算範囲超過は失敗し、失敗時は両設定の結果を削除する +# @api + +# 入力を消費し、前回の結果を消す + data remove storage lib: Return.Default + data remove storage lib: Return.Unifont + data modify storage lib:text Component set value {Nodes:[{Style:{Bold:false,Font:"minecraft:default"}}],Parts:[]} + data modify storage lib:text Component.Nodes[0].Value set from storage lib: Component + data remove storage lib: Component + +# 本文を分解して両設定の幅を測り、失敗時も作業領域を片付ける + scoreboard players set $TextResult Temporary 0 + execute if function lib:text/core/component/collect store success score $TextResult Temporary run function lib:text/core/component/measure + return run function lib:text/core/finish diff --git a/docs/knowledge/api-and-storage.md b/docs/knowledge/api-and-storage.md index 70d0263554..dcad0308a0 100644 --- a/docs/knowledge/api-and-storage.md +++ b/docs/knowledge/api-and-storage.md @@ -115,3 +115,11 @@ execute if data storage api: Return.Absorption run data get storage api: Return. 吸収体力追加は [absorption/add.mcfunction](../../TheSkyBlessing/data/api/functions/entity/player/absorption/add.mcfunction) の通り、`Argument.Amount`と`Argument.UUID`が必須で、`Priority`の既定値は0。成功経路は `Amount`、`UUID`、`Priority`、`WipedCallback` を削除する。必須値不足の失敗経路は早期returnするので、呼出側で残値を次の呼出しへ持ち越さない。 heal補正の [heal/modifier.mcfunction](../../TheSkyBlessing/data/api/functions/heal/modifier.mcfunction) は `as entity` で `Argument.Heal` をその場で更新するAPIである。これは独立したReturnを返す例ではない。呼出側が補正前の値も必要なら、呼出前に別pathへ複製する。このように「入力を消す」「入力を書き換える」「Returnを作る」はAPIごとに異なるため、共通の後始末規則へまとめない。 + +## フォント設定が異なる文字列を計測する + +文字列の送り幅はフォントと太字指定に依存する。配置計算では通常表示とUnicodeフォント強制時を分け、配布するリソースパックと一致する幅表を使う。明示的なuniform・space指定は両設定で同じ幅になる。文字列は [measure](../../TheSkyBlessing/data/lib/functions/text/measure.mcfunction)、装飾を含む静的なTextComponentは [measure_component](../../TheSkyBlessing/data/lib/functions/text/measure_component.mcfunction) を使い、入出力と対応範囲は各関数のIMP Docを参照する。 + +複数部分を配置するときは、小数の送り幅を合計してから一度だけ整数へ切り上げる。部分ごとに丸めると、その数だけ誤差が積み上がる。default・uniformの表にない文字は、1 UTF-16コード単位あたり送り幅9px・太字加算0.5pxとして計算する。対応範囲外でこの値と異なる文字を使う場合は表の拡張が必要になる。spaceの未収録文字や未対応の書式は失敗するため、呼出側は明示幅を用意するか表示を中止する。 + +幅表はクライアント独自のフォント置換を追跡しない。配布フォントの文字・送り幅を変えたら [生成手順](../../scripts/text/README.md) に従って表も更新する。現在の表現精度は0.5pxであり、異なる精度やproviderを導入する場合は生成処理と実行時の計算を併せて見直す。 diff --git a/docs/knowledge/ci-and-generation.md b/docs/knowledge/ci-and-generation.md index 6b6aba0c39..2c81a161c0 100644 --- a/docs/knowledge/ci-and-generation.md +++ b/docs/knowledge/ci-and-generation.md @@ -1,6 +1,6 @@ # CI・生成物・検証 -GitHub Actions の `.github/workflows/datapack-linter.yml` はpush/PRで `ChenCMD/datapack-linter@v2` を実行し、`animated_java:**` と `core:define_gamerule` を除外する。 +GitHub Actions の `.github/workflows/datapack-linter.yml` はpush/PRで `ChenCMD/datapack-linter@v2` を実行し、`animated_java:**`、`core:define_gamerule`、生成済みの文字幅表 `lib:text/core/tables.m` を除外する。文字幅表は、引用符が必須のキーにも引用符の警告が出るため除外している。 Node.js 24 の標準TypeScript実行で `.github/workflows/make-declares-mcf.mts` を動かす。linterの `.cache/dls.json` を読み、可視性フィルタに合う定義を `Asset2/Asset/data/minecraft/functions/declares.d.mcfunction` に生成する。生成はpush/PRでも実行し、ProjectTSB/Assetのcheckoutとpushだけをmasterに限定する。したがって公開範囲やdeclareを変えたら生成結果への影響を確認する。 diff --git a/docs/verification/text-measure.md b/docs/verification/text-measure.md new file mode 100644 index 0000000000..18d422e7fc --- /dev/null +++ b/docs/verification/text-measure.md @@ -0,0 +1,110 @@ +# 文字幅表と静的 TextComponent の検証 + +2026-10-07、文字幅表の収録範囲を日本語・英数字・記号と位置調整用スペースへ絞り、`lib:text/measure_component` を追加した。§ 書式コードの対応は採用していない。 + +## 静的な照合 + +生成表は1,208,338バイトから398,758バイトへ縮小した。default/uniform の共通文字を共有し、space の表を追加した結果、保存するエントリは117,423件から39,829件になった。 + +Asset の `artifact/*/give/*.mcfunction` にある Lore を抽出し、JSON として解析できた544定義・1,297行を照合した。default/uniform/space で描く本文には文字の欠落がなかった。翻訳キー5箇所と § 書式コードは計測対象から除いた。Fatal Error の専用フォント2種類は今回の対応範囲外である。 + +「雀の涙」の1定義は `color:gray` が引用符なしのため、標準 JSON パーサーでは解析できなかった。この定義まで自動検査済みとは扱わない。神器名は今回の文字範囲確認の対象にしていない。 + +既存ボス名の生成と `Asset/tests/bossbar-name-padding.py` は34件・両フォント設定で成功した。Asset 側の生成処理は、必要な default/uniform の表だけを読むように変更した。 + +## 実サーバー検証 + +シナリオは `tests/scenarios/text-measure.json`。静的な NBT TextComponent と文字列を公開ライブラリへ渡し、通常表示・Unicode 強制表示の送り幅と整数幅を確認する。クライアントの画素と翻訳辞書の検索は検証対象外である。 + +初回の `run-woogbyju` は、space 表の制御文字を JSON の Unicode エスケープで出力しており、SNBT として読めずデータパックの読込みで失敗した。生成元を修正し、改行・復帰を除く制御文字を実際の文字で出力する形にした。 + +`run-z57lresf/result.json` の25項目は成功した。本文、太字の継承と解除、配列、文章直接指定の translate、番号指定・出現順・パーセント記号、入れ子、space の正負幅、明示 uniform、独自スペース、範囲外文字・入力の失敗、作業状態の後始末を確認した。終了コード0、全ディメンション保存、検証中の参照コード不変を確認した。 + + +`run-_2u0ov95/result.json` では、§ を未対応として返すことと、9.5pxの部分2つを合計して19pxとする検査を追加し、27項目すべて成功した。終了コード0、全ディメンション保存、検証中の参照コード不変を確認した。 + +生成表は別ディレクトリへ再生成し、tables/load の両ファイルが一致した。最終の静的解析と公開宣言の生成も確認した。公開宣言に新しい measure_component が含まれ、内部関数は公開されない。 + + +通常バー側の回帰検査は `run-eesco__a/result.json` で42項目すべて成功した。終了コード0、全ディメンション保存、検証中の参照コード不変を確認した。この後、ローマ数字などの追加だけを行い、既存の幅は変更していない。Mob の名前に関係するコードの非 ASCII 文字も照合し、縮小後の default/uniform 表に欠落がないことを確認した。 + + +最終の `run-dc0e9hna/result.json` は28項目すべて成功した。Mob 名に使われるローマ数字Ⅱの幅を両設定で確認した。終了コード0、全ディメンション保存、検証中の参照コード不変を確認した。検証後は入力説明コメントの句点を改行へ直し、実行コマンドは変更していない。 + + +## 内部関数の配置修正 + +2026-10-07、component の内部関数、初期化用 load、生成表 tables を `lib:text/core/` 配下へ移した。公開入口 measure / measure_component と宣言は直下に残す。生成元・生成表を読む Asset のスクリプト・呼出元・IMP Doc の参照先も更新した。 + +21ファイルの実行コマンドを照合し、参照パスと生成表の版番号を除いて一致することを確認した。静的解析は本体102ファイル・Asset20ファイルでエラー0件。既存ボス名34件の両フォント設定での位置調整も成功した。起動中の通常サーバーへ reload し、公開入口から translate の ABC を測って通常18px・Unicode12pxを確認した。 + + +`run-zgxid8as` の専用ワールド検証は、RCON の初期応答待ちで timeout し、28項目の開始前に失敗した。サーバーログには60秒の tick 停滞と watchdog の停止要求が残っている。runner は stop・TERM・KILL で終了処理を行い、終了コードは-9、全ディメンション保存は未確認だった。検証中の参照コード不変は確認した。この試行を回帰検証の成功とは扱わず、配置変更後の確認範囲は静的解析・コマンドの一致・通常サーバーでの reload と公開入口の幅計算である。 + + +## 会話履歴を渡さないレビューと修正 + +2026-10-07、テキストLibを独立した担当にレビューさせた。配列の兄弟・extra・translateの展開結果を一つのNBTリストへ結合すると、リスト間の要素型の違いによって文字を落とした幅で成功する経路が見つかった。各リストを別々に既存の処理スタックへ積む形へ修正した。 + +入れ子配列が失敗する点も修正した。最内側の先頭要素から装飾を取得して外側の兄弟へ継承し、配列の深さによらず同じcollectで処理する。追加したhead関数はこの先頭探索の再帰だけを担当する。 + +修正前の再検証 `run-z_q5yt5e` は、初期RCONの応答待ちでtimeoutし、項目実行前に失敗した。終了コード0・全ディメンション保存・参照コード不変は確認した。通常サーバーの接続者が0人であることを確認して停止し、修正後に再試行した。停止とコード変更の両方を行っているため、失敗の原因は断定しない。 + +`run-zzvch8i6` はリスト結合の修正後の30項目、`run-lhmu6_10` は入れ子配列の修正を含む34項目がすべて成功した。追加ケースはstringのextraとcompoundの兄弟の併用、translateとstringのextra、入れ子配列、外側への太字・フォント継承、空の入れ子配列の失敗である。どちらも終了コード0・全ディメンション保存・参照コード不変を確認した。 + +最終の静的解析は本体103ファイル・Asset20ファイルでエラー0件。既存の生成幅表は変更していない。クライアントの画素は今回も検証対象外である。 + + +## 文字幅Libだけを残した構成 + +2026-10-07、ボスバー・UI・フライテキストをstashし、文字幅Lib・core:loadの文字幅初期化・生成スクリプト・公開宣言・文書・テストだけを残した。`run-d7b7yvcq/result.json` の34項目がすべて成功し、終了コード0・全ディメンション保存・検証中の参照コード不変を確認した。通常サーバーは起動していない。幅表は既存の生成物を維持し、リソースパックの作業ブランチも変更していない。 + +## 生成スクリプトの規約対応 + +2026-10-07、取得・幅表生成を `scripts/text/` へ移し、pngjsの依存を同ディレクトリのpackage-lockで管理する形にした。圧縮された処理を展開し、入力を検証してから出力する順序へ整理した。生成手順と上書き範囲は [文字幅表の再生成](../../scripts/text/README.md) に記載した。 + +PythonとJavaScriptの構文を検査した。固定済みのキャッシュから新旧の取得処理を実行し、出力37ファイルが一致した。ハッシュ不一致のキャッシュでは失敗し、既存の出力を変更しないことも確認した。 + +幅表39,829エントリの内容は変更前と一致した。生成物の差分は生成元パスのコメントと、それに伴う版番号だけである。再生成した2ファイルのバイト一致と、フォント定義が欠けた入力で失敗して既存出力を保持することを確認した。ローカルの結果は `.runtime/text-script-rules/result.json` に保存した。今回、実サーバー検証は再実行していない。 + + +## 初期化の配置修正 + +2026-10-07、TextMeasureのobjective定義と文字幅表の初期化を `core:load_once` へ移した。既存のobjective定義と同じ場所に置き、Asset側のloadより前に表を用意する。生成元の呼出し許可も変更し、表の数値と版番号が変わらないことを確認した。静的解析は本体23ファイル・Asset1ファイルでエラー0件。実サーバー検証は再実行していない。 + + +同日、文字幅計算の専用objective `TextMeasure` を廃止し、既存の `Temporary` へ統合した。計算は関数の呼出し中に完結し、tickをまたいだ保存は不要である。`$Text...` スコアホルダーが他の処理と重複しないことを確認した。初期化呼出しは `core:load_once` に残し、objectiveの追加定義と宣言を削除した。静的解析は本体23ファイル・Asset1ファイルでエラー0件。実サーバー検証は再実行していない。 + + +## 型検証と一時スコアの見直し + +2026-10-11、単一文字列の型検証と、分解済みの太字指定の型検証を削除した。引数の型は呼出側で保証する契約を公開入口に記載した。TextComponentの本文を取り出す型判別、未対応の文字・書式の検出は維持している。太字加算の復号はBold:trueの場合だけ実行する。 + +両公開入口の終了処理をcore/finishへまとめ、成功・失敗時とも16個の一時スコアをリセットする。途中まで作られた戻り値は失敗時に削除する。検証では各計測の前に一時スコアへ値を置き、呼出後にすべて消えることと、呼出側の別スコアが維持されることを確認した。 + +初回のrun-1095livcは起動後のRCON応答待ちでタイムアウトし、テスト開始前に失敗した。コードを変更せず再試行したrun-y0t_l6yaでは36項目すべて成功した。終了コード0、全ディメンション保存、検証中の参照コード不変を確認した。静的解析は23ファイルでエラー0件だった。クライアントの画素と巨大文字列のオーバーフローの実行は検証対象外である。 + + +## 一度の走査・幅表縮小・storage分離 + +2026-10-12、DefaultとUnifontを一度の走査で計算し、共通値146の省略と文字範囲の整理を行った。表は39,829件から7,935件、生成mcfunctionは398,768から73,995バイトになった。値はLF・UTF-8のファイルサイズであり、Javaのヒープ使用量ではない。位置調整用スペースを保持し、defaultの記号差分には対応するuniformの値も残した。生成元を再実行して2ファイルのバイト一致を確認した。 + +Assetのcommit `4ea15e7674d83785f8e6da309b15bda909d06724` から抽出した、神器Lore・Mob名・Effect名と説明の静的な1,358文字を元フォントと照合した。space用制御文字を除いたdefault・uniformの送り幅・太字加算・コード単位数に差はなかった。動的参照・翻訳キー・カスタムフォントはこの照合の対象外で、任意の実行時文章を検証したものではない。継続検査は [Issue #2312](https://github.com/ProjectTSB/TheSkyBlessing/issues/2312) で扱う。 + +実サーバーの `run-8vt6x0vb` は53項目すべて成功した。生成表がGitでテキストとして比較できるよう制御文字の定義を末尾へ移した後、最終版の `run-k41_i1ad` でも53項目が成功した。±65,536px、負の小数の切り上げ、補助文字の2コード単位消費、各設定の文字列内・部分間の正負オーバーフロー、途中失敗時のReturn削除を確認した。補助文字とオーバーフローには、一時的に幅表を差し替えるfixtureを使い、各呼出し後に復元した。各公開呼出しで19個のTemporaryスコアとWork・Componentが消え、呼出側の別スコアが残ることも確認した。終了コード0・全ディメンション保存・参照コード不変だった。 + +先行試行 `run-0cm15gxb` はシナリオ編集の失敗に気づいて起動準備中に中断した。`run-0tyxq64p` と `run-plng1t8q` は初期処理中のRCON応答が15秒を超え、テスト開始前に失敗した。前者のログでmacro呼出しの構文エラーを確認して修正し、同試行ではscripts/text/README.mdも変更したためコード不変の判定は失敗している。最終検証では通常runnerの処理を使い、ローカルのwrapperでRCONコマンドの待ち時間だけ60秒へ延ばした。wrapperと条件は実行記録へ保存している。`run-vy5d9rnw` はNBTキーの表示順に依存する旧テストで失敗したため、キーと値を直接照合する判定へ変更して再試行した。 + +静的解析のエラーは0件。クライアントの画素、実ヒープ量、tick時間は測定していない。 + +## 補助文字の検索と表の展開失敗(2026-10-19) + +収録した補助文字から先頭のUTF-16コード単位を抽出し、表の展開時に146の目印を登録する方式へ変更した。通常の日本語など、目印のない未収録文字では2コード単位の再検索を行わない。先頭コード単位に続く文字が引用符やバックスラッシュの場合は、後半サロゲートにならないため、マクロのキーへ連結する前に再検索を終了する。計測時間の短縮量は未測定である。 + +表の展開は `store success` で成否を受け取り、成功時だけVersionを保存する。失敗した場合は以前のVersionを保持し、未設定なら未設定のままにする。計測ごとのVersion確認は追加していない。生成表は7,935件の文字幅と3つの先頭目印を持ち、LF・UTF-8で74,918バイトになった。再生成したload・tablesの2ファイルが一致することを確認した。 + +通常シナリオの初回 `run-b4n8ix2i` はRCON応答待ちでタイムアウトし、テスト開始前に終了した。終了処理はstop後にTERMを使用し、終了コード143、検証中の参照コードは不変だった。初期化の成否取得を `store success` に変更し、RCONのコマンド待ち時間を60秒に延ばした `run-ke9r8u67` では58項目すべて成功した。既存の境界条件に加え、日本語・未収録の補助文字に続く引用符とバックスラッシュ、補助文字の太字補完、同じVersionでの表の維持を確認した。終了コード0・全ディメンション保存・参照コード不変を確認した。 + +展開失敗の検証は `tests/text/load_failure.py` で初期化コマンドを取り出し、表のマクロ引数だけを不正なresource locationに置き換えた。Version未設定時の維持、以前のVersionの維持、一時scoreの削除、正常な再試行を確認する。ファイル自体を壊した検証ではない。 + +`run-zyvuzlrx` は4項目の照合には成功したが、watchdogで終了コード1となり全体では失敗した。RCONの出力を減らした `run-djaiasus` は起動時のタイムアウトでテストを開始できなかった。`run-sxv16xvy` は隔離サーバーだけRCON待ち時間を180秒、watchdogを180,000msへ延ばし、4項目すべての照合に成功した。ただし終了時のワールド保存が待ち時間を超え、stop後にTERMで終了した。終了コード143・全ディメンション保存未確認のため、全体では失敗として扱う。3回とも参照コードは不変だった。ローカルwrapperと変更した検証条件は実行記録へ保存し、通常サーバーの設定は変更していない。 diff --git a/scripts/text/.gitignore b/scripts/text/.gitignore new file mode 100644 index 0000000000..4b7a81db08 --- /dev/null +++ b/scripts/text/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +__pycache__/ diff --git a/scripts/text/README.md b/scripts/text/README.md new file mode 100644 index 0000000000..40af90f2f2 --- /dev/null +++ b/scripts/text/README.md @@ -0,0 +1,41 @@ +# 文字幅表の再生成 + +Minecraft 1.20.4と指定したTSB-ResourcePackから、文字幅Libが使うdefault・uniform・spaceの表を生成する。配布フォントの文字・送り幅を変更したときに実行する。 + +生成にはPython 3、Node.js 24、npm、unzipを使う。画像解析用のpngjsは `scripts/text/package-lock.json` で版を固定し、同じディレクトリへインストールする。Minecraft 1.20.4の入力は取得スクリプト内のURLとSHA-1で固定する。リソースパックは引数で作業コピーを指定する。 + +DevSpaceから次を実行する。入力のリソースパックと出力先が、更新したい作業コピーを指していることを確認する。 + +```sh +python3 TheSkyBlessing/scripts/text/fetch_font_assets.py .cache/bossbar-font-input +npm ci --ignore-scripts --prefix TheSkyBlessing/scripts/text +node TheSkyBlessing/scripts/text/generate_widths.cjs TSB-ResourcePack .cache/bossbar-font-input TheSkyBlessing/TheSkyBlessing/data/lib/functions/text +sh scripts/verify.sh TheSkyBlessing/tests/scenarios/text-measure.json +``` + +取得処理はキャッシュを含む3つの入力をすべて検証してから、指定ディレクトリへ入力本体・フォント定義・画像・ボスバー画像・取得元の `sources.json` を上書きする。キャッシュのハッシュが不一致なら失敗するため、対象ファイルを確認して取り除いてから再実行する。取得素材はローカルのキャッシュに置き、repoには同梱しない。 + +幅表の生成は入力を検証してから、出力先の `core/tables.m.mcfunction` と `core/load.mcfunction` だけを上書きする。表のハッシュを初期化用の版番号に使う。同じMinecraft入力とリソースパックからは同じ成果物を生成でき、再実行しても追記や他ファイルの削除は行わない。書込み途中で失敗した場合は、この2ファイルの差分を確認して再生成する。 + +表の生成はbitmapの画素幅、spaceの送り幅、referenceの優先順位、unihexの範囲補正を読む。bitmapの太字加算は1px、unihexは0.5px。共通文字はuniformへ集約し、defaultは差分を持つ。収録範囲は日本語、ラテン文字・結合アクセント、ギリシャ文字・キリル文字・ルーン、句読点・数字・単位・矢印・数学記号・図形・装飾記号・全半角互換形である。defaultの既存記号差分と位置調整用スペースも保持する。コードポイントの範囲は生成元の `textRanges` にある。 + +共通の送り幅9px・太字加算0.5px・UTF-16の1コード単位を表す146はuniform表へ保存しない。表の展開時に、収録した補助文字の先頭コード単位へ146を目印として登録する。実行時はこの目印を取得した場合だけ2コード単位で検索し、通常の未収録文字には検索後に146を補う。対応範囲外の文字も成功するため、146と異なる幅の文字を追加するときは収録範囲を広げて再生成する。未収録の補助文字は2つのコード単位として補われる。space表の未収録文字は失敗する。 + +SNBTはJSONのUnicodeエスケープを受け付けないため、生成表には実際の文字を出力する。space表には改行・復帰以外の位置調整用制御文字も含まれる。§は未対応である。 + +検証結果は [文字幅の検証記録](../../docs/verification/text-measure.md) を参照する。検証はコマンド結果を対象とし、クライアントの画素は判定しない。 + +## 表の保存と初期化 + +表は `lib_text_fonts:` に保存する。同じnamespaceのstorageは一つの保存データにまとめられるため、日常的に更新する `lib:` の一時値と分離する。 + +`core:load_once` から版を照合し、異なるときだけ表を展開する。大量のSNBTを含む行は空文字の引数 `_` を取るmacroで、表を展開しないreloadではその行の解析済みcompoundを作らない。展開した直後はmacroキャッシュに残り、次のreloadで解放される。全期間のヒープ削減を保証する方式ではない。既存worldへの導入・表の更新時点は [loadの変更手順](../../docs/knowledge/runtime-and-assets.md#変更手順) に従う。 + +表の展開に成功した場合だけVersionを保存する。失敗した場合は以前のVersionを保持し、未設定なら未設定のままにする。計測ごとのVersion確認は行わない。 + +展開失敗時の記録と正常な再試行は、次のシナリオで確認する。初期化関数の版照合後のコマンドを取り出し、表のマクロ引数だけを不正な値に置き換えて展開を失敗させる。生成したシナリオと実測値は共通runnerの実行記録に保存される。 + +```sh +python3 TheSkyBlessing/tests/text/load_failure.py > .runtime/text-load-failure.json +sh scripts/verify.sh .runtime/text-load-failure.json +``` diff --git a/scripts/text/fetch_font_assets.py b/scripts/text/fetch_font_assets.py new file mode 100644 index 0000000000..dce553883c --- /dev/null +++ b/scripts/text/fetch_font_assets.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +"""Fetch pinned Minecraft 1.20.4 inputs; see scripts/text/README.md for usage.""" + +import argparse +import hashlib +import io +import json +import urllib.request +import zipfile +from pathlib import Path + +FILES = { + "client.jar": ( + "fd19469fed4a4b4c15b2d5133985f0e3e7816a8a", + "https://piston-data.mojang.com/v1/objects/fd19469fed4a4b4c15b2d5133985f0e3e7816a8a/client.jar", + ), + "minecraft/font/include/unifont.json": ( + "f8d4768707b20359f2f7660346bd3a84b6ee27b1", + "https://resources.download.minecraft.net/f8/f8d4768707b20359f2f7660346bd3a84b6ee27b1", + ), + "minecraft/font/unifont.zip": ( + "109663114d0099c48a703626c8462e07d802e08b", + "https://resources.download.minecraft.net/10/109663114d0099c48a703626c8462e07d802e08b", + ), +} +ASSET_PREFIXES = ( + "assets/minecraft/font/", + "assets/minecraft/textures/font/", + "assets/minecraft/textures/gui/sprites/boss_bar/", +) + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument("output", type=Path) +args = parser.parse_args() + +# Validate all downloads and cached inputs before writing to the output directory. +inputs = {} +for name, (sha, url) in FILES.items(): + target = args.output / name + if target.exists(): + data = target.read_bytes() + else: + with urllib.request.urlopen(url) as response: + data = response.read() + if hashlib.sha1(data).hexdigest() != sha: + raise ValueError(f"Hash mismatch: {name}") + inputs[name] = data + +# Asset-index files replace placeholders shipped in the client jar. +with zipfile.ZipFile(io.BytesIO(inputs["client.jar"])) as archive: + for info in archive.infolist(): + if info.is_dir() or not info.filename.startswith(ASSET_PREFIXES): + continue + relative = Path(info.filename).relative_to("assets") + if relative.as_posix() not in FILES: + inputs[relative.as_posix()] = archive.read(info) + +for name, data in inputs.items(): + target = args.output / name + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(data) + +(args.output / "sources.json").write_text(json.dumps(FILES, indent=2) + "\n") +print(args.output.resolve()) diff --git a/scripts/text/generate_widths.cjs b/scripts/text/generate_widths.cjs new file mode 100644 index 0000000000..df075f972e --- /dev/null +++ b/scripts/text/generate_widths.cjs @@ -0,0 +1,311 @@ +// Font inputs, output paths, dependencies and regeneration: scripts/text/README.md +const fs = require("node:fs"), + path = require("node:path"), + crypto = require("node:crypto"); +const { execFileSync } = require("node:child_process"); +const [pack, vanilla, output] = process.argv.slice(2); +if (process.argv.length !== 5) + throw Error( + "Usage: node scripts/text/generate_widths.cjs ", + ); +const { PNG } = require("pngjs"); +const roots = [path.resolve(pack, "assets"), path.resolve(vanilla)]; +const canonical = (id) => (id.includes(":") ? id : `minecraft:${id}`); +function file(root, id, prefix = "") { + const [ns, name] = canonical(id).split(":"); + return path.join(root, ns, prefix, name); +} +function asset(id, prefix = "") { + for (const root of roots) { + const p = file(root, id, prefix); + if (fs.existsSync(p)) return p; + } + throw Error(`Missing asset ${id}`); +} +// Keep common name/description characters; entries encoded as 146 need no per-character storage. +const textRanges = [ + [0x20, 0x7e], // ASCII + [0xa0, 0x24f], [0x1e00, 0x1eff], // Latin + [0x300, 0x36f], // Combining accents + [0x370, 0x52f], [0x1f00, 0x1fff], // Greek and Cyrillic + [0x16a0, 0x16ff], // Runes + [0x2000, 0x23ff], // Punctuation, numbers, units, arrows, mathematics, technical symbols + [0x2460, 0x27ff], [0x2900, 0x2bff], // Enclosed numbers, shapes, ornaments and arrows + [0x3000, 0x30ff], [0x31f0, 0x33ff], // Kana, CJK punctuation, enclosed forms and units + [0x3400, 0x4dbf], [0x4e00, 0x9fff], // Kanji (entries encoded as 146 are omitted) + [0xfe10, 0xfe1f], [0xfe30, 0xfe6f], [0xff00, 0xffef], // Compatibility and width forms +]; +const spacingGlyphs = new Set(); +function snbt(value) { + // SNBT has no JSON Unicode escapes; line breaks are not supported in a single-line label. + return ( + "{" + + Object.entries(value) + .map( + ([c, v]) => + '"' + + c.replaceAll("\\", "\\\\").replaceAll('"', '\\"') + + '":' + + v, + ) + .join(",") + + "}" + ); +} +function supportedCharacter(c, id) { + const cp = c.codePointAt(0); + if (c === "§") return false; + if (spacingGlyphs.has(c)) return true; + if (/[\p{Cc}\p{Cf}\p{Cs}\p{Cn}\p{Zl}\p{Zp}]/u.test(c)) return false; + if (textRanges.some(([from, to]) => cp >= from && cp <= to)) return true; + // Keep default symbol overrides and their uniform baseline together. + return /[\p{P}\p{S}\p{Zs}]/u.test(c) && ( + id === "minecraft:default" || + JSON.stringify(font("minecraft:default").get(c)) !== JSON.stringify(font("minecraft:uniform").get(c)) + ); +} +const cache = new Map(), + active = new Set(), + images = new Map(), + hexes = new Map(); +// Resolve providers in pack priority order; glyphs store half-pixel advance, bold offset, and UTF-16 length. +function font(id) { + id = canonical(id); + if (cache.has(id)) return cache.get(id); + if (active.has(id)) throw Error(`Font reference cycle ${id}`); + active.add(id); + const result = new Map(); + if (!roots.some((root) => fs.existsSync(file(root, id + ".json", "font")))) + throw Error(`Missing font definition: ${id}`); + for (const root of roots) { + const p = file(root, id + ".json", "font"); + if (!fs.existsSync(p)) continue; + for (const provider of JSON.parse(fs.readFileSync(p)).providers) { + let glyphs = new Map(); + const type = provider.type.replace("minecraft:", ""); + if (type === "reference") glyphs = font(provider.id); + else if (type === "space") { + for (const [c, a] of Object.entries(provider.advances)) { + if (id !== "minecraft:space") spacingGlyphs.add(c); + glyphs.set(c, [a * 2, 2, c.length]); + } + } else if (type === "bitmap") { + const f = asset(provider.file, "textures"); + if (!images.has(f)) + images.set(f, PNG.sync.read(fs.readFileSync(f))); + // Find the rightmost opaque pixel in each cell and scale its advance to the provider height. + const image = images.get(f), + rows = provider.chars.map((r) => [...r]); + const w = image.width / rows[0].length, + h = image.height / rows.length, + scale = Math.fround((provider.height ?? 8) / h); + rows.forEach((row, y) => + row.forEach((c, x) => { + if (c === "\0") return; + let ink = 0; + for (let dx = w - 1; dx >= 0; dx--) { + let found = false; + for (let dy = 0; dy < h; dy++) + if ( + image.data[ + ((y * h + dy) * image.width + + x * w + + dx) * + 4 + + 3 + ] + ) { + found = true; + break; + } + if (found) { + ink = dx + 1; + break; + } + } + // Round the scaled ink width as a float, then add the one-pixel gap. + const advance = + Math.trunc( + Math.fround(Math.fround(ink * scale) + 0.5), + ) + 1; + glyphs.set(c, [advance * 2, 2, c.length]); + }), + ); + } else if (type === "unihex") { + // Read and cache the HEX entries from the provider archive. + const f = asset(provider.hex_file); + if (!hexes.has(f)) { + const names = execFileSync("unzip", ["-Z1", f], { + encoding: "utf8", + }) + .trim() + .split("\n") + .filter((n) => n.endsWith(".hex")); + hexes.set( + f, + names + .map((n) => + execFileSync("unzip", ["-p", f, n], { + encoding: "utf8", + maxBuffer: 32 * 1024 * 1024, + }), + ) + .join("\n"), + ); + } + // Use explicit bounds where provided; otherwise derive bounds from the union of all 16 rows. + for (const line of hexes.get(f).trim().split("\n")) { + if (!line) continue; + const [code, bitmap] = line.split(":"), + cp = parseInt(code, 16), + c = String.fromCodePoint(cp), + bits = bitmap.length / 4; + let left = 0, + right = bits; + const override = (provider.size_overrides ?? []).find( + (o) => + cp >= o.from.codePointAt(0) && + cp <= o.to.codePointAt(0), + ); + if (override) { + left = override.left; + right = override.right; + } else { + let union = 0n; + const digits = bitmap.length / 16; + for (let i = 0; i < 16; i++) + union |= BigInt( + "0x" + + bitmap.slice(i * digits, (i + 1) * digits), + ); + if (union) { + left = 0; + while (!(union & (1n << BigInt(bits - left - 1)))) + left++; + right = bits - 1; + while (!(union & (1n << BigInt(bits - right - 1)))) + right--; + } + } + // Convert inclusive bounds to the advance; unihex adds half a pixel for bold. + glyphs.set(c, [ + (Math.trunc((right - left + 1) / 2) + 1) * 2, + 1, + c.length, + ]); + } + } else + throw Error(`Unsupported provider ${provider.type} in ${id}`); + // Earlier providers win when more than one provider defines the same character. + for (const [c, g] of glyphs) if (!result.has(c)) result.set(c, g); + } + } + active.delete(id); + cache.set(id, result); + return result; +} +const ids = new Set([ + "minecraft:default", + "minecraft:uniform", + "minecraft:space", +]); +for (const c of font("minecraft:uniform").keys()) + if (!font("minecraft:default").has(c)) + throw Error("Default font cannot share this uniform fallback"); +const lines = [ + "#> lib:text/core/tables.m", + "#", + "# Generated by scripts/text/generate_widths.cjs", + "# @within function lib:text/core/load", + "", + "# フォント別の文字幅表を読み込む", + " data modify storage lib_text_fonts: Fonts set value {}", +]; +const pairLeads = new Map(); +let count = 0, + skipped = 0; +// Emit per-font overrides in chunks; shared default/uniform widths and encoded-146 uniform widths are omitted. +for (const id of [...ids].sort()) { + let chunk = {}; + let n = 0; + const emit = () => { + if (!n) return; + lines.push( + ` $data modify storage lib_text_fonts:$(_) Fonts.${JSON.stringify(id)} merge value ${snbt(chunk)}`, + ); + chunk = {}; + n = 0; + }; + lines.push( + ` data modify storage lib_text_fonts: Fonts.${JSON.stringify(id)} set value {}`, + ); + for (const [c, g] of font(id)) { + if ( + c === "\n" || + c === "\r" || + c === "§" || + (id !== "minecraft:space" && !supportedCharacter(c, id)) + ) { + skipped++; + continue; + } + if (g.some((v) => !Number.isInteger(v)) || Math.abs(g[0]) > 1000000000) + throw Error(`Unsupported glyph advance in ${id}`); + if ( + id === "minecraft:default" && + JSON.stringify(font("minecraft:uniform").get(c)) === + JSON.stringify(g) + ) + continue; + if (g[0] < -268435456 || g[0] > 268435455 || g[1] > 3) + throw Error("Unsupported packed advance"); + // Pack half-pixel advance, bold offset, and UTF-16 length into one int. + const encoded = g[0] * 8 + g[1] * 2 + g[2] - 1; + if (id === "minecraft:uniform" && encoded === 146) continue; + if (c.length === 2) { + const target = id === "minecraft:default" ? "minecraft:uniform" : id; + pairLeads.set(`${target}:${c.charCodeAt(0)}`, {Font: target, Key: c}); + } + chunk[c] = encoded; + n++; + count++; + if (n === 4096) emit(); + } + emit(); +} +// Write only after every font and packed advance has been validated. +lines.push( + " data modify storage lib_text_fonts: Rejected set value " + + snbt(Object.fromEntries( + [...Array.from({ length: 32 }, (_, i) => String.fromCharCode(i)), "§", "\u2028", "\u2029"] + .filter(c => c !== "\n" && c !== "\r") + .map(c => [c, 1]), + )), +); +// Mark leading UTF-16 units only for supplementary characters stored in the tables. +lines.push("", "# 収録した補助文字の先頭コード単位に、2コード単位検索の目印を付ける"); +for (const marker of pairLeads.values()) { + lines.push( + ` data modify storage lib:text PairLead set value ${JSON.stringify(marker)}`, + " data modify storage lib:text PairLead.Key set string storage lib:text PairLead.Key 0 1", + " function lib:text/core/mark_pair_lead.m with storage lib:text PairLead", + ); +} +lines.push(" data remove storage lib:text PairLead", " return 1"); +const body = lines.join("\n") + "\n", + hash = crypto.createHash("sha256").update(body).digest("hex"); +fs.mkdirSync(path.join(output, "core"), { recursive: true }); +fs.writeFileSync(path.join(output, "core", "tables.m.mcfunction"), body); +fs.writeFileSync( + path.join(output, "core", "load.mcfunction"), + `#> lib:text/core/load\n# Generated by scripts/text/generate_widths.cjs\n# @within function core:load_once\n\n# 版が変わった場合だけ文字幅表を更新する\n execute if data storage lib_text_fonts: {Version:"${hash}"} run return 1\n execute store success score $TextResult Temporary run function lib:text/core/tables.m {_:""}\n execute if score $TextResult Temporary matches 1 run data modify storage lib_text_fonts: Version set value "${hash}"\n scoreboard players reset $TextResult Temporary\n`, +); +console.log( + JSON.stringify({ + fonts: ids.size, + glyphs: count, + unsupported: skipped, + bytes: Buffer.byteLength(body), + version: hash, + }), +); diff --git a/scripts/text/package-lock.json b/scripts/text/package-lock.json new file mode 100644 index 0000000000..7068e1bf24 --- /dev/null +++ b/scripts/text/package-lock.json @@ -0,0 +1,25 @@ +{ + "name": "tsb-text-width-generator", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tsb-text-width-generator", + "dependencies": { + "pngjs": "7.0.0" + }, + "engines": { + "node": "24.x" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + } + } +} diff --git a/scripts/text/package.json b/scripts/text/package.json new file mode 100644 index 0000000000..b7d35a05ca --- /dev/null +++ b/scripts/text/package.json @@ -0,0 +1,10 @@ +{ + "name": "tsb-text-width-generator", + "private": true, + "engines": { + "node": "24.x" + }, + "dependencies": { + "pngjs": "7.0.0" + } +} diff --git a/tests/scenarios/text-measure.json b/tests/scenarios/text-measure.json new file mode 100644 index 0000000000..f789d3f41c --- /dev/null +++ b/tests/scenarios/text-measure.json @@ -0,0 +1,3750 @@ +{ + "name": "text-measure", + "scope": { + "purpose": "Static component, literal translate, formatting and filtered font tables", + "fixture": "Native NBT components and strings through public library functions; one-pass Default/Unifont; missing BMP uses 146; supplementary and arithmetic overflow use temporary table fixtures restored after each call; every public call verifies 19 scratch scores and Work/Component cleanup", + "notVerified": [ + "Client pixels", + "Translation key lookup", + "Dynamic component references" + ] + }, + "players": [], + "steps": [ + { + "name": "Initialize measurement checks", + "commands": [ + "scoreboard objectives add TextVerify dummy", + "execute store success score tableLoaded TextVerify run data get storage lib_text_fonts: Fonts.\"minecraft:uniform\"{A:66}", + "scoreboard players get tableLoaded TextVerify" + ], + "expect": [ + "TextVerify", + "tableLoaded has 1" + ] + }, + { + "name": "Plain empty string succeeds", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "data get storage lib: Return.Default", + "data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:0.0d,TextWidth:0}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:0.0d,TextWidth:0}", + "scoreboard players get validUnifont TextVerify" + ], + "expect": [ + "ok has 1", + "residue has 0", + "textCallerSentinel has 73", + "validDefault has 1", + "validUnifont has 1" + ] + }, + { + "name": "Bold plain string", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"ABC\"", + "data modify storage lib: Bold set value true", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "data get storage lib: Return.Default", + "data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:21.0d,TextWidth:21}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:13.5d,TextWidth:14}", + "scoreboard players get validUnifont TextVerify" + ], + "expect": [ + "ok has 1", + "residue has 0", + "textCallerSentinel has 73", + "validDefault has 1", + "validUnifont has 1" + ] + }, + { + "name": "Unlisted BMP character uses 146: 3", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"한\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:9.0d,TextWidth:9}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:9.0d,TextWidth:9}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Removed line separator fails", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"
\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Unlisted BMP character uses 146: 5", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"͸\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:9.0d,TextWidth:9}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:9.0d,TextWidth:9}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Symbols remain supported", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"∞\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:8.0d,TextWidth:8}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:4.0d,TextWidth:4}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Roman numeral used in Mob names remains supported", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"Ⅱ\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "data get storage lib: Return.Default", + "data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:4.0d,TextWidth:4}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:4.0d,TextWidth:4}", + "scoreboard players get validUnifont TextVerify" + ], + "expect": [ + "ok has 1", + "residue has 0", + "textCallerSentinel has 73", + "validDefault has 1", + "validUnifont has 1" + ] + }, + { + "name": "Structured text", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"text\":\"ABC\"}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:18.0d,TextWidth:18}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "String extra and compound array siblings", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value [{text:\"A\",extra:[\"B\"]},{text:\"C\"}]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:18.0d,TextWidth:18}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Translate pieces and string extra", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {translate:\"A%s\",with:[\"B\"],extra:[\"C\"]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:18.0d,TextWidth:18}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Nested component arrays", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value [[{text:\"A\"}],[{text:\"B\"}]]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:8.0d,TextWidth:8}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Nested array head style reaches outer siblings", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value [[{text:\"A\",bold:true}],[{text:\"B\"},{text:\"C\",bold:false}]]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:20.0d,TextWidth:20}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:13.0d,TextWidth:13}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Nested array head font reaches outer siblings", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value [[{text:\"A\",font:\"uniform\"}],[{text:\"B\"}]]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:8.0d,TextWidth:8}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:8.0d,TextWidth:8}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Inherited and cleared bold", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"text\":\"A\",\"bold\":true,\"extra\":[{\"text\":\"B\",\"bold\":false},{\"text\":\"C\"}]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:20.0d,TextWidth:20}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:13.0d,TextWidth:13}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Array head style is inherited", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value [{\"text\":\"A\",\"bold\":true},{\"text\":\"B\"}]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:14.0d,TextWidth:14}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:9.0d,TextWidth:9}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Plain component string", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value \"ABC\"", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:18.0d,TextWidth:18}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Direct translate placeholders", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"translate\":\"%2$s%s%1$s%%\",\"with\":[{\"text\":\"A\"},{\"text\":\"B\",\"bold\":true}]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:25.0d,TextWidth:25}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:16.5d,TextWidth:17}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "String with arguments", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"translate\":\"%s%s\",\"with\":[\"A\",\"B\"]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:8.0d,TextWidth:8}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Multi digit argument", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"translate\":\"%10$s\",\"with\":[\"A\",\"A\",\"A\",\"A\",\"A\",\"A\",\"A\",\"A\",\"A\",\"B\"]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:6.0d,TextWidth:6}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:4.0d,TextWidth:4}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Nested translate", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"translate\":\"%sC\",\"bold\":true,\"with\":[{\"translate\":\"A%s\",\"with\":[{\"text\":\"B\",\"bold\":false}]}]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:20.0d,TextWidth:20}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:13.0d,TextWidth:13}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Space font positive and negative", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"text\":\"A\",\"extra\":[{\"text\":\"\u0002쀁\",\"font\":\"space\"},{\"text\":\"B\"}]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:13.0d,TextWidth:13}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:9.0d,TextWidth:9}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Explicit uniform does not follow settings", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"text\":\"ABC\",\"font\":\"uniform\"}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Private padding tracks settings", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"text\":\"\"}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:6.0d,TextWidth:6}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:3.0d,TextWidth:3}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Unsupported font fails", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"text\":\"A\",\"font\":\"effect/inline/icon\"}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Dynamic nbt fails", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"nbt\":\"Text\",\"storage\":\"lib:\"}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Invalid placeholder fails", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"translate\":\"%d\",\"with\":[\"A\"]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Missing argument fails", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"translate\":\"%2$s\",\"with\":[\"A\"]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Zero index fails", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"translate\":\"%0$s\",\"with\":[\"A\"]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Missing dollar fails", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"translate\":\"%1s\",\"with\":[\"A\"]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Invalid empty component fails", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Empty nested arrays fail and clear results", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value [[],[]]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Default", + "scoreboard players get retained TextVerify", + "execute store success score retained TextVerify run data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "retained has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Empty literal succeeds", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {\"text\":\"\"}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score defaultValid TextVerify run data get storage lib: Return.Default{TextAdvance:0.0d,TextWidth:0}", + "scoreboard players get defaultValid TextVerify", + "execute store success score uniformValid TextVerify run data get storage lib: Return.Unifont{TextAdvance:0.0d,TextWidth:0}", + "scoreboard players get uniformValid TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "defaultValid has 1", + "uniformValid has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Section formatting remains unsupported", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"A§lB\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Round only after adding fractional advances", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {text:\"\",extra:[{text:\"日\",bold:true},{text:\"日\",bold:true}]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "data get storage lib: Return.Default", + "data get storage lib: Return.Unifont", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:19.0d,TextWidth:19}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:19.0d,TextWidth:19}", + "scoreboard players get validUnifont TextVerify" + ], + "expect": [ + "ok has 1", + "residue has 0", + "textCallerSentinel has 73", + "validDefault has 1", + "validUnifont has 1" + ] + }, + { + "name": "Work state is cleared", + "commands": [ + "execute store success score remains TextVerify run data get storage lib:text Component", + "scoreboard players get remains TextVerify", + "execute store success score remains TextVerify run data get storage lib:text Work", + "scoreboard players get remains TextVerify" + ], + "expect": [ + "remains has 0" + ] + }, + { + "name": "Omitted Japanese glyph uses 146 with bold", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"日\"", + "data modify storage lib: Bold set value true", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:9.5d,TextWidth:10}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:9.5d,TextWidth:10}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Negative space includes bold increment", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {text:\"쀁\",font:\"space\",bold:true}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:0.0d,TextWidth:0}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:0.0d,TextWidth:0}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Negative fractional sum rounds up only at the end", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {text:\"\",extra:[{text:\"日\",bold:true},{text:\"쀖\",font:\"space\"}]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:-6.5d,TextWidth:-6}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:-6.5d,TextWidth:-6}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Positive 65536 padding tracks font setting", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:65536.0d,TextWidth:65536}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:0.0d,TextWidth:0}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Negative 65536 padding tracks font setting", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:-65536.0d,TextWidth:-65536}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:0.0d,TextWidth:0}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Failure after one measured component removes both results", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {text:\"A\",extra:[{text:\"B\",font:\"unsupported\"}]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Missing space glyph fails after preceding character", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Component set value {text:\"A\",extra:[{text:\"日\",font:\"space\"}]}", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Supplementary lookup fixture consumes two units before A", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"😀\" set value 131", + "data modify storage lib: Text set value \"😀A\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:14.0d,TextWidth:14}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:12.0d,TextWidth:12}", + "scoreboard players get validUnifont TextVerify", + "data remove storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"😀\"", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Quote and backslash lookup", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value '\"\\\\'", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:10.0d,TextWidth:10}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:7.0d,TextWidth:7}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "default positive overflow within a string (table fixture)", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage devspace_verify:text Saved set from storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set value 2147483640", + "data modify storage lib: Text set value \"~~~~~~~~~\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set from storage devspace_verify:text Saved", + "data remove storage devspace_verify:text Saved", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "default positive overflow across components (table fixture)", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage devspace_verify:text Saved set from storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set value 2147483640", + "data modify storage lib: Component set value [{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"}]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set from storage devspace_verify:text Saved", + "data remove storage devspace_verify:text Saved", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "default negative overflow within a string (table fixture)", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage devspace_verify:text Saved set from storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set value -2147483648", + "data modify storage lib: Text set value \"~~~~~~~~~\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set from storage devspace_verify:text Saved", + "data remove storage devspace_verify:text Saved", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "default negative overflow across components (table fixture)", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage devspace_verify:text Saved set from storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set value -2147483648", + "data modify storage lib: Component set value [{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"}]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set from storage devspace_verify:text Saved", + "data remove storage devspace_verify:text Saved", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "uniform positive overflow within a string (table fixture)", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage devspace_verify:text Saved set from storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\" set value 2147483640", + "data modify storage devspace_verify:text DefaultSaved set from storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set value 100", + "data modify storage lib: Text set value \"~~~~~~~~~\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\" set from storage devspace_verify:text Saved", + "data remove storage devspace_verify:text Saved", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set from storage devspace_verify:text DefaultSaved", + "data remove storage devspace_verify:text DefaultSaved", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "uniform positive overflow across components (table fixture)", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage devspace_verify:text Saved set from storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\" set value 2147483640", + "data modify storage devspace_verify:text DefaultSaved set from storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set value 100", + "data modify storage lib: Component set value [{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"}]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\" set from storage devspace_verify:text Saved", + "data remove storage devspace_verify:text Saved", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set from storage devspace_verify:text DefaultSaved", + "data remove storage devspace_verify:text DefaultSaved", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "uniform negative overflow within a string (table fixture)", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage devspace_verify:text Saved set from storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\" set value -2147483648", + "data modify storage devspace_verify:text DefaultSaved set from storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set value 100", + "data modify storage lib: Text set value \"~~~~~~~~~\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\" set from storage devspace_verify:text Saved", + "data remove storage devspace_verify:text Saved", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set from storage devspace_verify:text DefaultSaved", + "data remove storage devspace_verify:text DefaultSaved", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "uniform negative overflow across components (table fixture)", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage devspace_verify:text Saved set from storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\" set value -2147483648", + "data modify storage devspace_verify:text DefaultSaved set from storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\"", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set value 100", + "data modify storage lib: Component set value [{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"},{text:\"~\"}]", + "execute store result score ok TextVerify run function lib:text/measure_component", + "scoreboard players get ok TextVerify", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify", + "data modify storage lib_text_fonts: Fonts.\"minecraft:uniform\".\"~\" set from storage devspace_verify:text Saved", + "data remove storage devspace_verify:text Saved", + "data modify storage lib_text_fonts: Fonts.\"minecraft:default\".\"~\" set from storage devspace_verify:text DefaultSaved", + "data remove storage devspace_verify:text DefaultSaved", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary", + "execute store success score keptDefault TextVerify run data get storage lib: Return.Default", + "execute store success score keptUnifont TextVerify run data get storage lib: Return.Unifont", + "scoreboard players get keptDefault TextVerify", + "scoreboard players get keptUnifont TextVerify" + ], + "expect": [ + "ok has 0", + "keptDefault has 0", + "keptUnifont has 0", + "residue has 0", + "textCallerSentinel has 73", + "keptDefault has 0", + "keptUnifont has 0" + ] + }, + { + "name": "Japanese before quote and backslash", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"あ\\\"\\\\\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:19.0d,TextWidth:19}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:16.0d,TextWidth:16}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Unlisted supplementary before quote and backslash", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"😀\\\"\\\\\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:28.0d,TextWidth:28}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:25.0d,TextWidth:25}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Unlisted supplementary bold fallback", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"😀\"", + "data modify storage lib: Bold set value true", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:19.0d,TextWidth:19}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:19.0d,TextWidth:19}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Japanese mixed with ASCII", + "commands": [ + "scoreboard players set $TextResult Temporary 37", + "scoreboard players set $TextValid Temporary 37", + "scoreboard players set $TextAdvance Temporary 37", + "scoreboard players set $TextUniformAdvance Temporary 37", + "scoreboard players set $TextUniformGlyph Temporary 37", + "scoreboard players set $TextUniformEncoded Temporary 37", + "scoreboard players set $TextWidth Temporary 37", + "scoreboard players set $TextGlyph Temporary 37", + "scoreboard players set $TextBold Temporary 37", + "scoreboard players set $TextOld Temporary 37", + "scoreboard players set $TextLength Temporary 37", + "scoreboard players set $TextEncoded Temporary 37", + "scoreboard players set $TextCursor Temporary 37", + "scoreboard players set $TextStart Temporary 37", + "scoreboard players set $TextAuto Temporary 37", + "scoreboard players set $TextArg Temporary 37", + "scoreboard players set $TextDigit Temporary 37", + "scoreboard players set $TextDefaultTotal Temporary 37", + "scoreboard players set $TextUniformTotal Temporary 37", + "scoreboard players set textCallerSentinel Temporary 73", + "data modify storage lib: Text set value \"あA\"", + "data modify storage lib: Bold set value false", + "execute store result score ok TextVerify run function lib:text/measure", + "scoreboard players get ok TextVerify", + "execute store success score validDefault TextVerify run data get storage lib: Return.Default{TextAdvance:15.0d,TextWidth:15}", + "scoreboard players get validDefault TextVerify", + "execute store success score validUnifont TextVerify run data get storage lib: Return.Unifont{TextAdvance:13.0d,TextWidth:13}", + "scoreboard players get validUnifont TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextValid Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformAdvance Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextWidth Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextGlyph Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextBold Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextOld Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextLength Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextEncoded Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextCursor Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextStart Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextAuto Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextArg Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDigit Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextDefaultTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if score $TextUniformTotal Temporary matches -2147483648..2147483647 run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Work run scoreboard players add residue TextVerify 1", + "execute if data storage lib:text Component run scoreboard players add residue TextVerify 1", + "scoreboard players get residue TextVerify", + "scoreboard players get textCallerSentinel Temporary", + "scoreboard players reset textCallerSentinel Temporary" + ], + "expect": [ + "ok has 1", + "validDefault has 1", + "validUnifont has 1", + "residue has 0", + "textCallerSentinel has 73" + ] + }, + { + "name": "Unchanged version keeps the existing table", + "commands": [ + "data modify storage lib_text_fonts: Fonts.TestSentinel set value 73", + "function lib:text/core/load", + "execute store success score kept TextVerify run data get storage lib_text_fonts: Fonts{TestSentinel:73}", + "scoreboard players get kept TextVerify", + "data remove storage lib_text_fonts: Fonts.TestSentinel", + "execute store success score leaked TextVerify run data get storage lib:text PairLead", + "scoreboard players get leaked TextVerify" + ], + "expect": [ + "kept has 1", + "leaked has 0" + ] + } + ] +} diff --git a/tests/text/load_failure.py b/tests/text/load_failure.py new file mode 100644 index 0000000000..906fa0f481 --- /dev/null +++ b/tests/text/load_failure.py @@ -0,0 +1,41 @@ +"""Emit a load-failure scenario for DevSpace's verification runner as JSON.""" +import json +from pathlib import Path + +root = Path(__file__).resolve().parents[2] +source = root / "TheSkyBlessing/data/lib/functions/text/core/load.mcfunction" +commands = [line.strip() for line in source.read_text().splitlines() if line.startswith(" ")] +# Run the actual initialization commands after the version check, injecting a bad macro argument. +assert commands[0].startswith("execute if data storage lib_text_fonts:") +commands = commands[1:] +assert commands[0].endswith('function lib:text/core/tables.m {_:""}') +commands[0] = commands[0].replace('{_:""}', '{_:"::invalid"}') +steps = [{"name": "Initialize fault checks", "commands": ["scoreboard objectives add TextVerify dummy"], "expect": ["TextVerify"]}] +for name, setup, query, expected in [ + ("Missing version stays absent", "data remove storage lib_text_fonts: Version", "Version", 0), + ("Old version stays unchanged", 'data modify storage lib_text_fonts: Version set value "previous"', '{Version:"previous"}', 1), +]: + steps.append({ + "name": name, + "commands": [setup, *commands, + f"execute store success score kept TextVerify if data storage lib_text_fonts: {query}", + "scoreboard players get kept TextVerify", + "scoreboard players set residue TextVerify 0", + "execute if score $TextResult Temporary matches -2147483648..2147483647 run scoreboard players set residue TextVerify 1", + "scoreboard players get residue TextVerify"], + "expect": [f"kept has {expected}", "residue has 0"], + }) +steps.append({ + "name": "Valid retry loads and records a version", + "commands": ["function lib:text/core/load", + "execute store success score loaded TextVerify run data get storage lib_text_fonts: Version", + "scoreboard players get loaded TextVerify", + 'execute store success score valid TextVerify if data storage lib_text_fonts: Fonts."minecraft:uniform"{A:66}', + "scoreboard players get valid TextVerify"], + "expect": ["loaded has 1", "valid has 1"], +}) +print(json.dumps({ + "name": "text-load-failure", + "scope": "Actual initialization commands after the version check, with only the tables macro argument replaced by an invalid resource location. Tests expansion failure and a normal retry; not a corrupt file on disk.", + "players": [], "steps": steps, +}, indent=2))