Parse and format a property value for display.
Handles:
TypedValues like [IFCIDENTIFIER, '100 x 150mm'] -> display '100 x 150mm', tooltip 'Identifier'
Boolean enums like '.T.' -> 'True'
Null/undefined -> '\u2014'
Regular values -> string conversion
It deliberately does NOT decode STEP escapes. Every producer of a property
value decodes exactly once, at parse time: the TypeScript path via
EntityExtractor.parseAttributeValue / columnar-parser-attributes.ts, the
Rust/WASM and server paths via AttributeValue::from_token. The input here
is therefore already literal text, and decoding a second time is not a no-op
\u2014 since #2394 decodeIfcString collapses \\ to \, so an authored UNC
path \\server\share would render as \server\share. C:\temp is a fixed
point of the decoder, which is why the defect hides on the common case.
Making the decoder idempotent instead would not work: idempotence requires
treating an already-decoded \ and an authored, still-doubled \ the same
way, which is exactly the ambiguity the one-decode rule removes. The
invariant to hold is "decode once, at the parse boundary", not "decode
defensively wherever a string is displayed".
Parse and format a property value for display. Handles:
It deliberately does NOT decode STEP escapes. Every producer of a property value decodes exactly once, at parse time: the TypeScript path via
EntityExtractor.parseAttributeValue/columnar-parser-attributes.ts, the Rust/WASM and server paths viaAttributeValue::from_token. The input here is therefore already literal text, and decoding a second time is not a no-op \u2014 since #2394decodeIfcStringcollapses\\to\, so an authored UNC path\\server\sharewould render as\server\share.C:\tempis a fixed point of the decoder, which is why the defect hides on the common case.Making the decoder idempotent instead would not work: idempotence requires treating an already-decoded
\and an authored, still-doubled\the same way, which is exactly the ambiguity the one-decode rule removes. The invariant to hold is "decode once, at the parse boundary", not "decode defensively wherever a string is displayed".