SVG:textAreaエレメントとテキストの改行

Product :4D - 4D Server
4D : v16.5
OS : Windows

v12からv16へアップグレードしたストラクチャなのですが、
SVGのtextAreaエレメントを使っているものがあったのですがテキスト内の改行が反映されないと言う問題が発生しました。

調べてみたところ、v12の頃はCR及びCRLFを認識してくれていたので気にしていなかったのですが
v16ではCRLFが認識してくれない状態でした。
SVGの仕様を確認したところ、正式には< tBreak/>が改行だと言うことがわかりました。
CRやCRLFが認識されるのは偶然の仕様?の様です。

微妙な仕様変更なのですがコンポーネントのSVG_New_textAreaで作成しているので
本来はCR及びCRLFを< tBreak/>変換する必要があると思います。

SVGコンポーネントのソースコードを確認したところ(17.x),

SVG_SET_TEXTAREA_TEXT
SVG_APPEND_TEXT_TO_TEXTAREA
SVG_New_textArea

いずれも

スタイル付きテキストの場合:

$Txt_Buffer:=Replace string($Txt_Buffer;"
";"")

標準テキストの場合:

$Lon_x:=Position("\r";$Txt_text)

If ($Lon_x=0)
$Lon_x:=Position("\n";$Txt_text)
End if

(Delete stringで少しずつテキストを消化するコード)

・・・と

DOM Append XML child nodeでを挿入する仕組みはあるようです。

しかし

実際に試してみると

$dom:=SVG_New
$textArea:=SVG_New_textArea ($dom;“あああ\r\nいいい”)
$xml:=""
DOM EXPORT TO VAR($textArea;$xml)
DOM CLOSE XML($dom)
SET TEXT TO PASTEBOARD($xml)

あああ
いいい

と\rになっていました。

何がいけないのか,TRACEしてみたところ,

スタイルテキストかどうかを判別するロジックが

ST Get plain text($Txt_textIn)の入出力を比較する仕組みになっており,

そこでCRLFはCRに正規化されてしまうため,

標準テキストなのにスタイルテキスト扱いとなり,


をReplace stringする流れに進んでいることが原因のようでした。

CR単独であれば,通常の処理に進みます。

調査いただきありがとうございます。
理由が違ったんですね。

結局のところ不具合と言うことでよいのでしょうか? :mrgreen:

ACI0099523

で登録いたしました。 :pray:

17R5のNightly Buildで修正されていました。

本件のためではなく,コンポーネントメソッドをスレッドセーフにするため,

ST Get plain text

を回避したことの副作用で結果的に修正されているようです。

(新しいコードは,正規表現でスタイル付きか否かを判別していました)

個人的には,<タグ>を誤認識することが容易に想像できるので,
こうした「自動判別」はやめてほしいのですが,
少なくとも以前のようにCRLFがCRに正規化されることで誤認識されることはなくなりました。

SVGコンポーネントは,XML/SVGが苦手なレベルのデベロッパー向けに提供されているものなので,
自分で開発できるのであれば,自前でルーチンを用意したほうが良いのかもしれません。

V16及び、v17へのバックポートは?

https://forums.4d.com/4DBB_Main/x_User/298210/files/31706543.zip

コンポーネントの修正版は,諸般の事情により,
v16最終アップデートには収録されませんでした。

上記リンクからダウンロードいただけるようにしました。
お手数ですがよろしくお願い申し上げます。