mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-17 16:50:30 +03:00
feat(mxl-compile,mxl-decompile): пустой тег текста ячейки
У текста ячейки три состояния, а выражались два: тега нет вовсе, тег с пустым
текстом на каждый язык — и третье, <tl/>, которое мы теряли. Это не редкость:
38 075 ячеек на 1200 макетов, встречается в 57% макетов корпуса.
Выражается пустым объектом: "text": {}. Не новый ключ и не новое понятие, а
вырожденный случай уже принятой записи «язык → текст» — языков нет вовсе.
В позиционной строке двусмысленности не создаёт: {} не несёт ключей ячейки,
значит по общему правилу читается как текст, а null там по-прежнему «пропустить
колонку».
В описании DSL записи нет намеренно. Для авторинга она бесполезна — визуально
это тот же пустой текст, что и "", — а документировать две пустые формы рядом
значило бы завести развилку, у которой нет правильного ответа.
Платформа пишет такой тег самозакрывающимся, поэтому эмиссия отдельной веткой.
На пилоте потери в категории row[].cell[].tl упали с 12 488 до 2, заодно
row[].cell[].fmt с 41 645 до 30 088; совпадение строк документа 17.6% → 18.5%.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
6619a4e7ad
commit
0a8671a166
@@ -1,4 +1,4 @@
|
|||||||
# mxl-compile v1.38 — Compile 1C spreadsheet from JSON
|
# mxl-compile v1.39 — Compile 1C spreadsheet from JSON
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
@@ -800,6 +800,13 @@ function Emit-CellText {
|
|||||||
} else {
|
} else {
|
||||||
foreach ($l in $textLanguages) { $pairs += @{ Lang = $l; Text = "$value" } }
|
foreach ($l in $textLanguages) { $pairs += @{ Lang = $l; Text = "$value" } }
|
||||||
}
|
}
|
||||||
|
# Пустой объект — отдельное состояние: тег текста есть, языков в нём нет. Платформа
|
||||||
|
# пишет его самозакрывающимся. Для авторинга бесполезно (визуально это тот же пустой
|
||||||
|
# текст, что и ""), поэтому в описании DSL записи нет — она нужна раундтрипу.
|
||||||
|
if ($pairs.Count -eq 0) {
|
||||||
|
X "`t`t`t`t`t<tl/>"
|
||||||
|
return
|
||||||
|
}
|
||||||
X "`t`t`t`t`t<tl>"
|
X "`t`t`t`t`t<tl>"
|
||||||
foreach ($p in $pairs) {
|
foreach ($p in $pairs) {
|
||||||
X "`t`t`t`t`t`t<v8:item>"
|
X "`t`t`t`t`t`t<v8:item>"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# mxl-compile v1.37 — Compile 1C spreadsheet from JSON
|
# mxl-compile v1.38 — Compile 1C spreadsheet from JSON
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import hashlib
|
import hashlib
|
||||||
@@ -850,6 +850,12 @@ def main():
|
|||||||
pairs = [(str(k), str(v)) for k, v in value.items()]
|
pairs = [(str(k), str(v)) for k, v in value.items()]
|
||||||
else:
|
else:
|
||||||
pairs = [(lang, str(value)) for lang in text_languages]
|
pairs = [(lang, str(value)) for lang in text_languages]
|
||||||
|
# Пустой объект — отдельное состояние: тег текста есть, языков в нём нет. Платформа
|
||||||
|
# пишет его самозакрывающимся. Для авторинга бесполезно (визуально это тот же пустой
|
||||||
|
# текст, что и ""), поэтому в описании DSL записи нет — она нужна раундтрипу.
|
||||||
|
if not pairs:
|
||||||
|
lines.append('\t\t\t\t\t<tl/>')
|
||||||
|
return
|
||||||
lines.append('\t\t\t\t\t<tl>')
|
lines.append('\t\t\t\t\t<tl>')
|
||||||
for lang, content in pairs:
|
for lang, content in pairs:
|
||||||
lines.append('\t\t\t\t\t\t<v8:item>')
|
lines.append('\t\t\t\t\t\t<v8:item>')
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# mxl-decompile v1.18 — Decompile 1C spreadsheet to JSON
|
# mxl-decompile v1.19 — Decompile 1C spreadsheet to JSON
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
@@ -314,8 +314,14 @@ foreach ($riNode in $root.SelectNodes("d:rowsItem", $ns)) {
|
|||||||
# известен набор языков всего макета (Get-DslText).
|
# известен набор языков всего макета (Get-DslText).
|
||||||
$text = $null
|
$text = $null
|
||||||
$hasText = $false
|
$hasText = $false
|
||||||
|
# Пустой <tl/> — отдельное состояние: тег текста есть, языков в нём нет. Без
|
||||||
|
# этого ветвления такая ячейка теряла текст вовсе (1 из 15 ячеек с тегом текста).
|
||||||
|
$tlNode = $cContent.SelectSingleNode("d:tl", $ns)
|
||||||
$items = $cContent.SelectNodes("d:tl/v8:item", $ns)
|
$items = $cContent.SelectNodes("d:tl/v8:item", $ns)
|
||||||
if ($items -and $items.Count -gt 0) {
|
if ($tlNode -and (-not $items -or $items.Count -eq 0)) {
|
||||||
|
$text = [ordered]@{}
|
||||||
|
$hasText = $true
|
||||||
|
} elseif ($items -and $items.Count -gt 0) {
|
||||||
$byLang = [ordered]@{}
|
$byLang = [ordered]@{}
|
||||||
foreach ($it in $items) {
|
foreach ($it in $items) {
|
||||||
$langNode = $it.SelectSingleNode("v8:lang", $ns)
|
$langNode = $it.SelectSingleNode("v8:lang", $ns)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# mxl-decompile v1.18 — Decompile 1C spreadsheet to JSON
|
# mxl-decompile v1.19 — Decompile 1C spreadsheet to JSON
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
@@ -483,8 +483,14 @@ def main():
|
|||||||
# известен набор языков всего макета (get_dsl_text).
|
# известен набор языков всего макета (get_dsl_text).
|
||||||
text = None
|
text = None
|
||||||
has_text = False
|
has_text = False
|
||||||
|
# Пустой <tl/> — отдельное состояние: тег текста есть, языков в нём нет. Без
|
||||||
|
# этого ветвления такая ячейка теряла текст вовсе (1 из 15 ячеек с тегом текста).
|
||||||
|
tl_node = find(c_content, "d:tl")
|
||||||
items = findall(c_content, "d:tl/v8:item")
|
items = findall(c_content, "d:tl/v8:item")
|
||||||
if items:
|
if tl_node is not None and not items:
|
||||||
|
text = OrderedDict()
|
||||||
|
has_text = True
|
||||||
|
elif items:
|
||||||
by_lang = OrderedDict()
|
by_lang = OrderedDict()
|
||||||
for it in items:
|
for it in items:
|
||||||
lang_node = find(it, "v8:lang")
|
lang_node = find(it, "v8:lang")
|
||||||
|
|||||||
Reference in New Issue
Block a user