@digitalwalletcorp/utils 0.13.0 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ "use strict";const s=require("./json-util-CKnsxu1e.cjs"),c=/(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i,a={'"':"&quot;","&":"&amp;","'":"&#39;","<":"&lt;",">":"&gt;"},f=t=>t.replace(/["&'<>]/g,n=>a[n]);function i(t,n){if(!t)return"";const o=r=>r.replace(/\r\n|\r|\n/g,"<br>").replace(/\t/g,"&nbsp;&nbsp;").replace(/ /g,"&nbsp;");return n?.html?t.split(c).map((r,e)=>e%2===1?r:o(r)).join(""):o(f(t))}function l(t,n){const{html:o,...r}=n??{},e=s.formatJsonString(t,r);return e==null?"":i(String(e),{html:o})}const m=Object.freeze(Object.defineProperty({__proto__:null,formatJsonStringForWeb:l,formatStringForWeb:i},Symbol.toStringTag,{value:"Module"}));exports.formatJsonStringForWeb=l;exports.formatStringForWeb=i;exports.htmlUtil=m;
2
+ //# sourceMappingURL=html-util-DAqLW2ol.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-util-DAqLW2ol.cjs","sources":["../src/html-util.ts"],"sourcesContent":["import { formatJsonString } from './json-util';\nimport type { FormatJsonStringOptions } from './json-util';\n\nconst HTML_TOKEN = /(<!--[\\s\\S]*?-->|<[^>]*>|&(?:#\\d+|#x[\\da-f]+|\\w+);)/i;\n\nconst HTML_ESCAPE_CHARS: Record<string, string> = {\n '\"': '&quot;',\n '&': '&amp;',\n '\\'': '&#39;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeHtml = (str: string): string => str.replace(/[\"&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);\n\n/**\n * 文字列をWEB表示用にフォーマットする\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * @param {string | null | undefined} str\n * @param {*} [options]\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatStringForWeb(str: string | null | undefined, options?: {\n html?: boolean;\n}): string {\n if (!str) {\n return '';\n }\n\n const formatText = (text: string): string => text\n .replace(/\\r\\n|\\r|\\n/g, '<br>')\n .replace(/\\t/g, '&nbsp;&nbsp;')\n .replace(/ /g, '&nbsp;');\n\n if (options?.html) {\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをフォーマットする\n return str\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : formatText(segment))\n .join('');\n }\n\n return formatText(escapeHtml(str));\n}\n\n/**\n * 値を整形したJSON文字列にしてWEB表示用にフォーマットする\n * formatJsonStringで整形した文字列をformatStringForWebで変換する\n *\n * @param {any} value\n * @param {*} [options] formatJsonStringのオプションに以下を加えたもの\n * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {\n html?: boolean;\n}): string {\n const { html, ...formatOptions } = options ?? {};\n const json = formatJsonString(value, formatOptions);\n return json == null ? '' : formatStringForWeb(String(json), { html });\n}\n"],"names":["HTML_TOKEN","HTML_ESCAPE_CHARS","escapeHtml","str","c","formatStringForWeb","options","formatText","text","segment","i","formatJsonStringForWeb","value","html","formatOptions","json","formatJsonString"],"mappings":"yDAGMA,EAAa,uDAEbC,EAA4C,CAChD,IAAK,SACL,IAAK,QACL,IAAM,QACN,IAAK,OACL,IAAK,MACP,EAEMC,EAAcC,GAAwBA,EAAI,QAAQ,WAAaC,GAAMH,EAAkBG,CAAC,CAAC,EAWxF,SAASC,EAAmBF,EAAgCG,EAExD,CACT,GAAI,CAACH,EACH,MAAO,GAGT,MAAMI,EAAcC,GAAyBA,EAC1C,QAAQ,cAAe,MAAM,EAC7B,QAAQ,MAAO,cAAc,EAC7B,QAAQ,KAAM,QAAQ,EAEzB,OAAIF,GAAS,KAEJH,EACJ,MAAMH,CAAU,EAChB,IAAI,CAACS,EAASC,IAAMA,EAAI,IAAM,EAAID,EAAUF,EAAWE,CAAO,CAAC,EAC/D,KAAK,EAAE,EAGLF,EAAWL,EAAWC,CAAG,CAAC,CACnC,CAWO,SAASQ,EAAuBC,EAAYN,EAExC,CACT,KAAM,CAAE,KAAAO,EAAM,GAAGC,CAAA,EAAkBR,GAAW,CAAA,EACxCS,EAAOC,EAAAA,iBAAiBJ,EAAOE,CAAa,EAClD,OAAOC,GAAQ,KAAO,GAAKV,EAAmB,OAAOU,CAAI,EAAG,CAAE,KAAAF,EAAM,CACtE"}
@@ -0,0 +1,29 @@
1
+ import { f as l } from "./json-util-C_Pm1BpJ.js";
2
+ const s = /(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i, c = {
3
+ '"': "&quot;",
4
+ "&": "&amp;",
5
+ "'": "&#39;",
6
+ "<": "&lt;",
7
+ ">": "&gt;"
8
+ }, i = (t) => t.replace(/["&'<>]/g, (r) => c[r]);
9
+ function a(t, r) {
10
+ if (!t)
11
+ return "";
12
+ const o = (n) => n.replace(/\r\n|\r|\n/g, "<br>").replace(/\t/g, "&nbsp;&nbsp;").replace(/ /g, "&nbsp;");
13
+ return r?.html ? t.split(s).map((n, e) => e % 2 === 1 ? n : o(n)).join("") : o(i(t));
14
+ }
15
+ function p(t, r) {
16
+ const { html: o, ...n } = r ?? {}, e = l(t, n);
17
+ return e == null ? "" : a(String(e), { html: o });
18
+ }
19
+ const m = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
20
+ __proto__: null,
21
+ formatJsonStringForWeb: p,
22
+ formatStringForWeb: a
23
+ }, Symbol.toStringTag, { value: "Module" }));
24
+ export {
25
+ a,
26
+ p as f,
27
+ m as h
28
+ };
29
+ //# sourceMappingURL=html-util-EI6f5f8f.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-util-EI6f5f8f.js","sources":["../src/html-util.ts"],"sourcesContent":["import { formatJsonString } from './json-util';\nimport type { FormatJsonStringOptions } from './json-util';\n\nconst HTML_TOKEN = /(<!--[\\s\\S]*?-->|<[^>]*>|&(?:#\\d+|#x[\\da-f]+|\\w+);)/i;\n\nconst HTML_ESCAPE_CHARS: Record<string, string> = {\n '\"': '&quot;',\n '&': '&amp;',\n '\\'': '&#39;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeHtml = (str: string): string => str.replace(/[\"&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);\n\n/**\n * 文字列をWEB表示用にフォーマットする\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * @param {string | null | undefined} str\n * @param {*} [options]\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatStringForWeb(str: string | null | undefined, options?: {\n html?: boolean;\n}): string {\n if (!str) {\n return '';\n }\n\n const formatText = (text: string): string => text\n .replace(/\\r\\n|\\r|\\n/g, '<br>')\n .replace(/\\t/g, '&nbsp;&nbsp;')\n .replace(/ /g, '&nbsp;');\n\n if (options?.html) {\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをフォーマットする\n return str\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : formatText(segment))\n .join('');\n }\n\n return formatText(escapeHtml(str));\n}\n\n/**\n * 値を整形したJSON文字列にしてWEB表示用にフォーマットする\n * formatJsonStringで整形した文字列をformatStringForWebで変換する\n *\n * @param {any} value\n * @param {*} [options] formatJsonStringのオプションに以下を加えたもの\n * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {\n html?: boolean;\n}): string {\n const { html, ...formatOptions } = options ?? {};\n const json = formatJsonString(value, formatOptions);\n return json == null ? '' : formatStringForWeb(String(json), { html });\n}\n"],"names":["HTML_TOKEN","HTML_ESCAPE_CHARS","escapeHtml","str","c","formatStringForWeb","options","formatText","text","segment","i","formatJsonStringForWeb","value","html","formatOptions","json","formatJsonString"],"mappings":";AAGA,MAAMA,IAAa,wDAEbC,IAA4C;AAAA,EAChD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AACP,GAEMC,IAAa,CAACC,MAAwBA,EAAI,QAAQ,YAAY,CAACC,MAAMH,EAAkBG,CAAC,CAAC;AAWxF,SAASC,EAAmBF,GAAgCG,GAExD;AACT,MAAI,CAACH;AACH,WAAO;AAGT,QAAMI,IAAa,CAACC,MAAyBA,EAC1C,QAAQ,eAAe,MAAM,EAC7B,QAAQ,OAAO,cAAc,EAC7B,QAAQ,MAAM,QAAQ;AAEzB,SAAIF,GAAS,OAEJH,EACJ,MAAMH,CAAU,EAChB,IAAI,CAACS,GAASC,MAAMA,IAAI,MAAM,IAAID,IAAUF,EAAWE,CAAO,CAAC,EAC/D,KAAK,EAAE,IAGLF,EAAWL,EAAWC,CAAG,CAAC;AACnC;AAWO,SAASQ,EAAuBC,GAAYN,GAExC;AACT,QAAM,EAAE,MAAAO,GAAM,GAAGC,EAAA,IAAkBR,KAAW,CAAA,GACxCS,IAAOC,EAAiBJ,GAAOE,CAAa;AAClD,SAAOC,KAAQ,OAAO,KAAKV,EAAmB,OAAOU,CAAI,GAAG,EAAE,MAAAF,GAAM;AACtE;;;;;;"}
package/lib/html-util.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("diff");require("./json-util-CKnsxu1e.cjs");const r=require("./html-util--mpzaYuJ.cjs");exports.diffForWeb=r.diffForWeb;exports.formatJsonStringForWeb=r.formatJsonStringForWeb;exports.formatStringForWeb=r.formatStringForWeb;exports.highlightWord=r.highlightWord;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("./json-util-CKnsxu1e.cjs");const r=require("./html-util-DAqLW2ol.cjs");exports.formatJsonStringForWeb=r.formatJsonStringForWeb;exports.formatStringForWeb=r.formatStringForWeb;
2
2
  //# sourceMappingURL=html-util.cjs.map
@@ -1,21 +1,4 @@
1
1
  import { FormatJsonStringOptions } from './json-util.cjs';
2
- /**
3
- * class属性に指定する値
4
- * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する
5
- */
6
- export type HtmlClassValue = string | string[] | Record<string, boolean>;
7
- /**
8
- * style属性に指定する値
9
- * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない
10
- */
11
- export type HtmlStyleValue = string | Record<string, string | number>;
12
- /**
13
- * 生成するタグに付与する属性
14
- */
15
- export interface HtmlTagOptions {
16
- class?: HtmlClassValue;
17
- style?: HtmlStyleValue;
18
- }
19
2
  /**
20
3
  * 文字列をWEB表示用にフォーマットする
21
4
  * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
@@ -40,48 +23,3 @@ export declare function formatStringForWeb(str: string | null | undefined, optio
40
23
  export declare function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {
41
24
  html?: boolean;
42
25
  }): string;
43
- /**
44
- * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す
45
- * markタグは既定の背景色・文字色を持つ。色はCSS変数(--dwui-background-highlight / --dwui-color-text-highlight)で変更できる
46
- * styleは既定の背景色・文字色より後に出力する
47
- * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
48
- *
49
- * 例)
50
- * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });
51
- * → 'This is a <mark class="highlight" style="background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)">test</mark> message'
52
- *
53
- * @param {string | null | undefined} value
54
- * @param {string | null | undefined} word
55
- * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる
56
- * ├ class string | string[] | Record<string, boolean>
57
- * ├ style string | Record<string, string | number>
58
- * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない
59
- * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う
60
- * @returns {string}
61
- */
62
- export declare function highlightWord(value: string | null | undefined, word: string | null | undefined, options?: HtmlTagOptions & {
63
- caseInsensitive?: boolean;
64
- html?: boolean;
65
- }): string;
66
- /**
67
- * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す
68
- * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる
69
- * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する
70
- * 入力文字列はプレーンなテキストであるとみなす
71
- * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる
72
- *
73
- * @param {string | null | undefined} text1 比較元の文字列
74
- * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)
75
- * @param {*} [options]
76
- * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない
77
- * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性
78
- * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性
79
- * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性
80
- * @returns {string}
81
- */
82
- export declare function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {
83
- ignoreCase?: boolean;
84
- added?: HtmlTagOptions;
85
- removed?: HtmlTagOptions;
86
- same?: HtmlTagOptions;
87
- }): string;
@@ -1,21 +1,4 @@
1
1
  import { FormatJsonStringOptions } from './json-util';
2
- /**
3
- * class属性に指定する値
4
- * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する
5
- */
6
- export type HtmlClassValue = string | string[] | Record<string, boolean>;
7
- /**
8
- * style属性に指定する値
9
- * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない
10
- */
11
- export type HtmlStyleValue = string | Record<string, string | number>;
12
- /**
13
- * 生成するタグに付与する属性
14
- */
15
- export interface HtmlTagOptions {
16
- class?: HtmlClassValue;
17
- style?: HtmlStyleValue;
18
- }
19
2
  /**
20
3
  * 文字列をWEB表示用にフォーマットする
21
4
  * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
@@ -40,48 +23,3 @@ export declare function formatStringForWeb(str: string | null | undefined, optio
40
23
  export declare function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {
41
24
  html?: boolean;
42
25
  }): string;
43
- /**
44
- * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す
45
- * markタグは既定の背景色・文字色を持つ。色はCSS変数(--dwui-background-highlight / --dwui-color-text-highlight)で変更できる
46
- * styleは既定の背景色・文字色より後に出力する
47
- * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
48
- *
49
- * 例)
50
- * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });
51
- * → 'This is a <mark class="highlight" style="background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)">test</mark> message'
52
- *
53
- * @param {string | null | undefined} value
54
- * @param {string | null | undefined} word
55
- * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる
56
- * ├ class string | string[] | Record<string, boolean>
57
- * ├ style string | Record<string, string | number>
58
- * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない
59
- * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う
60
- * @returns {string}
61
- */
62
- export declare function highlightWord(value: string | null | undefined, word: string | null | undefined, options?: HtmlTagOptions & {
63
- caseInsensitive?: boolean;
64
- html?: boolean;
65
- }): string;
66
- /**
67
- * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す
68
- * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる
69
- * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する
70
- * 入力文字列はプレーンなテキストであるとみなす
71
- * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる
72
- *
73
- * @param {string | null | undefined} text1 比較元の文字列
74
- * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)
75
- * @param {*} [options]
76
- * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない
77
- * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性
78
- * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性
79
- * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性
80
- * @returns {string}
81
- */
82
- export declare function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {
83
- ignoreCase?: boolean;
84
- added?: HtmlTagOptions;
85
- removed?: HtmlTagOptions;
86
- same?: HtmlTagOptions;
87
- }): string;
package/lib/html-util.js CHANGED
@@ -1,10 +1,7 @@
1
- import "diff";
2
1
  import "./json-util-C_Pm1BpJ.js";
3
- import { d as i, f, a as m, b as s } from "./html-util-B8sdLw9I.js";
2
+ import { f as a, a as f } from "./html-util-EI6f5f8f.js";
4
3
  export {
5
- i as diffForWeb,
6
- f as formatJsonStringForWeb,
7
- m as formatStringForWeb,
8
- s as highlightWord
4
+ a as formatJsonStringForWeb,
5
+ f as formatStringForWeb
9
6
  };
10
7
  //# sourceMappingURL=html-util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-util.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
1
+ {"version":3,"file":"html-util.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
package/lib/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),e=require("./zoned-date-time.cjs"),i=require("./date-util-CZmiQEYH.cjs"),l=require("./decimal.cjs"),r=require("./file-util-Dqiw5tBQ.cjs"),o=require("./html-util--mpzaYuJ.cjs"),U=require("./json-util-CKnsxu1e.cjs"),n=require("./number-util-BrDEKYJo.cjs"),c=require("./object-util-BHg61ifG.cjs"),s=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.ZonedDateTime=e.ZonedDateTime;exports.DateUtil=i.dateUtil;exports.Decimal=l.Decimal;exports.FileUtil=r.fileUtil;exports.HtmlUtil=o.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=n.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=s.stringUtil;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),e=require("./zoned-date-time.cjs"),i=require("./date-util-CZmiQEYH.cjs"),l=require("./decimal.cjs"),r=require("./file-util-Dqiw5tBQ.cjs"),o=require("./html-util-DAqLW2ol.cjs"),U=require("./json-util-CKnsxu1e.cjs"),n=require("./number-util-BrDEKYJo.cjs"),c=require("./object-util-BHg61ifG.cjs"),s=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.ZonedDateTime=e.ZonedDateTime;exports.DateUtil=i.dateUtil;exports.Decimal=l.Decimal;exports.FileUtil=r.fileUtil;exports.HtmlUtil=o.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=n.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=s.stringUtil;
2
2
  //# sourceMappingURL=index.cjs.map
package/lib/index.js CHANGED
@@ -3,7 +3,7 @@ import { ZonedDateTime as m } from "./zoned-date-time.js";
3
3
  import { d as a } from "./date-util-BNe2E-tA.js";
4
4
  import { Decimal as l } from "./decimal.js";
5
5
  import { f as s } from "./file-util-CO5vjmkO.js";
6
- import { h as U } from "./html-util-B8sdLw9I.js";
6
+ import { h as U } from "./html-util-EI6f5f8f.js";
7
7
  import { j as c } from "./json-util-C_Pm1BpJ.js";
8
8
  import { n as b } from "./number-util-Wpubbqr4.js";
9
9
  import { o as j } from "./object-util-wOMJtGK3.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitalwalletcorp/utils",
3
- "version": "0.13.0",
3
+ "version": "0.13.1",
4
4
  "description": "A javascript utility.",
5
5
  "type": "module",
6
6
  "main": "lib/index.cjs",
@@ -66,7 +66,6 @@
66
66
  "dependencies": {
67
67
  "big.js": "7.0.1",
68
68
  "crypto-js": "4.2.0",
69
- "diff": "8.0.2",
70
69
  "luxon": "3.7.2"
71
70
  },
72
71
  "devDependencies": {
package/src/html-util.ts CHANGED
@@ -1,27 +1,6 @@
1
- import { diffChars } from 'diff';
2
1
  import { formatJsonString } from './json-util';
3
2
  import type { FormatJsonStringOptions } from './json-util';
4
3
 
5
- /**
6
- * class属性に指定する値
7
- * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する
8
- */
9
- export type HtmlClassValue = string | string[] | Record<string, boolean>;
10
-
11
- /**
12
- * style属性に指定する値
13
- * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない
14
- */
15
- export type HtmlStyleValue = string | Record<string, string | number>;
16
-
17
- /**
18
- * 生成するタグに付与する属性
19
- */
20
- export interface HtmlTagOptions {
21
- class?: HtmlClassValue;
22
- style?: HtmlStyleValue;
23
- }
24
-
25
4
  const HTML_TOKEN = /(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i;
26
5
 
27
6
  const HTML_ESCAPE_CHARS: Record<string, string> = {
@@ -34,61 +13,6 @@ const HTML_ESCAPE_CHARS: Record<string, string> = {
34
13
 
35
14
  const escapeHtml = (str: string): string => str.replace(/["&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);
36
15
 
37
- const toClassString = (value: HtmlClassValue): string => {
38
- if (typeof value === 'string') {
39
- return value;
40
- }
41
- if (Array.isArray(value)) {
42
- return value.filter(Boolean).join(' ');
43
- }
44
- return Object.keys(value).filter(key => value[key]).join(' ');
45
- };
46
-
47
- const toStyleString = (value: HtmlStyleValue): string => {
48
- if (typeof value === 'string') {
49
- return value;
50
- }
51
- return Object.entries(value)
52
- .map(([key, v]) => {
53
- // カスタムプロパティ(--xxx)は大文字小文字を区別するため変換しない
54
- const property = key.startsWith('--') ? key : key.replace(/[A-Z]/g, c => `-${c.toLowerCase()}`);
55
- return `${property}: ${v}`;
56
- })
57
- .join('; ');
58
- };
59
-
60
- /** diffForWebの既定の文字色 */
61
- const DIFF_STYLES = {
62
- added: 'color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))',
63
- removed: 'color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))',
64
- same: 'color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))'
65
- };
66
-
67
- /** highlightWordの既定の背景色・文字色。markタグのブラウザ標準の色をフォールバックにする */
68
- const HIGHLIGHT_STYLE = 'background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)';
69
-
70
- /**
71
- * 値をエスケープしたタグを返す
72
- *
73
- * @param {string} tagName
74
- * @param {string} value
75
- * @param {HtmlTagOptions} [options]
76
- * @param {string} [defaultStyle] optionsのstyleより前に出力するstyle
77
- * @returns {string}
78
- */
79
- const toElement = (tagName: string, value: string, options?: HtmlTagOptions, defaultStyle?: string): string => {
80
- let attributes = '';
81
- const className = options?.class == null ? '' : toClassString(options.class);
82
- if (className) {
83
- attributes += ` class="${escapeHtml(className)}"`;
84
- }
85
- const style = [defaultStyle, options?.style == null ? '' : toStyleString(options.style)].filter(Boolean).join('; ');
86
- if (style) {
87
- attributes += ` style="${escapeHtml(style)}"`;
88
- }
89
- return `<${tagName}${attributes}>${escapeHtml(value)}</${tagName}>`;
90
- };
91
-
92
16
  /**
93
17
  * 文字列をWEB表示用にフォーマットする
94
18
  * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
@@ -137,94 +61,3 @@ export function formatJsonStringForWeb(value: any, options?: FormatJsonStringOpt
137
61
  const json = formatJsonString(value, formatOptions);
138
62
  return json == null ? '' : formatStringForWeb(String(json), { html });
139
63
  }
140
-
141
- /**
142
- * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す
143
- * markタグは既定の背景色・文字色を持つ。色はCSS変数(--dwui-background-highlight / --dwui-color-text-highlight)で変更できる
144
- * styleは既定の背景色・文字色より後に出力する
145
- * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
146
- *
147
- * 例)
148
- * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });
149
- * → 'This is a <mark class="highlight" style="background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)">test</mark> message'
150
- *
151
- * @param {string | null | undefined} value
152
- * @param {string | null | undefined} word
153
- * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる
154
- * ├ class string | string[] | Record<string, boolean>
155
- * ├ style string | Record<string, string | number>
156
- * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない
157
- * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う
158
- * @returns {string}
159
- */
160
- export function highlightWord(
161
- value: string | null | undefined,
162
- word: string | null | undefined,
163
- options?: HtmlTagOptions & {
164
- caseInsensitive?: boolean;
165
- html?: boolean;
166
- }
167
- ): string {
168
- if (!value) {
169
- return '';
170
- }
171
-
172
- const toHtml = (text: string): string => options?.html ? text : escapeHtml(text);
173
- if (!word) {
174
- return toHtml(value);
175
- }
176
-
177
- const pattern = word.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d');
178
- const regex = new RegExp(`(${pattern})`, options?.caseInsensitive ? 'i' : '');
179
- // キャプチャグループで分割すると、奇数番目の要素が一致した部分になる
180
- const highlight = (text: string): string => text
181
- .split(regex)
182
- .map((part, i) => i % 2 === 0 ? toHtml(part) : toElement('mark', part, options, HIGHLIGHT_STYLE))
183
- .join('');
184
-
185
- if (!options?.html) {
186
- return highlight(value);
187
- }
188
-
189
- // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをハイライトする
190
- return value
191
- .split(HTML_TOKEN)
192
- .map((segment, i) => i % 2 === 1 ? segment : highlight(segment))
193
- .join('');
194
- }
195
-
196
- /**
197
- * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す
198
- * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる
199
- * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する
200
- * 入力文字列はプレーンなテキストであるとみなす
201
- * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる
202
- *
203
- * @param {string | null | undefined} text1 比較元の文字列
204
- * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)
205
- * @param {*} [options]
206
- * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない
207
- * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性
208
- * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性
209
- * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性
210
- * @returns {string}
211
- */
212
- export function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {
213
- ignoreCase?: boolean;
214
- added?: HtmlTagOptions;
215
- removed?: HtmlTagOptions;
216
- same?: HtmlTagOptions;
217
- }): string {
218
- const changes = diffChars(text1 ?? '', text2 ?? '', { ignoreCase: options?.ignoreCase });
219
- let html = '';
220
- for (const change of changes) {
221
- if (change.added) {
222
- html += toElement('span', change.value, options?.added, DIFF_STYLES.added);
223
- } else if (change.removed) {
224
- html += toElement('span', change.value, options?.removed, DIFF_STYLES.removed);
225
- } else {
226
- html += toElement('span', change.value, options?.same, DIFF_STYLES.same);
227
- }
228
- }
229
- return html;
230
- }
@@ -1,2 +0,0 @@
1
- "use strict";const S=require("diff"),j=require("./json-util-CKnsxu1e.cjs"),m=/(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i,y={'"':"&quot;","&":"&amp;","'":"&#39;","<":"&lt;",">":"&gt;"},a=r=>r.replace(/["&'<>]/g,e=>y[e]),$=r=>typeof r=="string"?r:Array.isArray(r)?r.filter(Boolean).join(" "):Object.keys(r).filter(e=>r[e]).join(" "),x=r=>typeof r=="string"?r:Object.entries(r).map(([e,t])=>`${e.startsWith("--")?e:e.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}: ${t}`).join("; "),d={added:"color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))",removed:"color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))",same:"color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))"},T="background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)",f=(r,e,t,o)=>{let n="";const i=t?.class==null?"":$(t.class);i&&(n+=` class="${a(i)}"`);const l=[o,t?.style==null?"":x(t.style)].filter(Boolean).join("; ");return l&&(n+=` style="${a(l)}"`),`<${r}${n}>${a(e)}</${r}>`};function g(r,e){if(!r)return"";const t=o=>o.replace(/\r\n|\r|\n/g,"<br>").replace(/\t/g,"&nbsp;&nbsp;").replace(/ /g,"&nbsp;");return e?.html?r.split(m).map((o,n)=>n%2===1?o:t(o)).join(""):t(a(r))}function u(r,e){const{html:t,...o}=e??{},n=j.formatJsonString(r,o);return n==null?"":g(String(n),{html:t})}function h(r,e,t){if(!r)return"";const o=s=>t?.html?s:a(s);if(!e)return o(r);const n=e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d"),i=new RegExp(`(${n})`,t?.caseInsensitive?"i":""),l=s=>s.split(i).map((c,b)=>b%2===0?o(c):f("mark",c,t,T)).join("");return t?.html?r.split(m).map((s,c)=>c%2===1?s:l(s)).join(""):l(r)}function p(r,e,t){const o=S.diffChars(r??"",e??"",{ignoreCase:t?.ignoreCase});let n="";for(const i of o)i.added?n+=f("span",i.value,t?.added,d.added):i.removed?n+=f("span",i.value,t?.removed,d.removed):n+=f("span",i.value,t?.same,d.same);return n}const W=Object.freeze(Object.defineProperty({__proto__:null,diffForWeb:p,formatJsonStringForWeb:u,formatStringForWeb:g,highlightWord:h},Symbol.toStringTag,{value:"Module"}));exports.diffForWeb=p;exports.formatJsonStringForWeb=u;exports.formatStringForWeb=g;exports.highlightWord=h;exports.htmlUtil=W;
2
- //# sourceMappingURL=html-util--mpzaYuJ.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"html-util--mpzaYuJ.cjs","sources":["../src/html-util.ts"],"sourcesContent":["import { diffChars } from 'diff';\nimport { formatJsonString } from './json-util';\nimport type { FormatJsonStringOptions } from './json-util';\n\n/**\n * class属性に指定する値\n * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する\n */\nexport type HtmlClassValue = string | string[] | Record<string, boolean>;\n\n/**\n * style属性に指定する値\n * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない\n */\nexport type HtmlStyleValue = string | Record<string, string | number>;\n\n/**\n * 生成するタグに付与する属性\n */\nexport interface HtmlTagOptions {\n class?: HtmlClassValue;\n style?: HtmlStyleValue;\n}\n\nconst HTML_TOKEN = /(<!--[\\s\\S]*?-->|<[^>]*>|&(?:#\\d+|#x[\\da-f]+|\\w+);)/i;\n\nconst HTML_ESCAPE_CHARS: Record<string, string> = {\n '\"': '&quot;',\n '&': '&amp;',\n '\\'': '&#39;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeHtml = (str: string): string => str.replace(/[\"&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);\n\nconst toClassString = (value: HtmlClassValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.filter(Boolean).join(' ');\n }\n return Object.keys(value).filter(key => value[key]).join(' ');\n};\n\nconst toStyleString = (value: HtmlStyleValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, v]) => {\n // カスタムプロパティ(--xxx)は大文字小文字を区別するため変換しない\n const property = key.startsWith('--') ? key : key.replace(/[A-Z]/g, c => `-${c.toLowerCase()}`);\n return `${property}: ${v}`;\n })\n .join('; ');\n};\n\n/** diffForWebの既定の文字色 */\nconst DIFF_STYLES = {\n added: 'color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))',\n removed: 'color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))',\n same: 'color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))'\n};\n\n/** highlightWordの既定の背景色・文字色。markタグのブラウザ標準の色をフォールバックにする */\nconst HIGHLIGHT_STYLE = 'background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)';\n\n/**\n * 値をエスケープしたタグを返す\n *\n * @param {string} tagName\n * @param {string} value\n * @param {HtmlTagOptions} [options]\n * @param {string} [defaultStyle] optionsのstyleより前に出力するstyle\n * @returns {string}\n */\nconst toElement = (tagName: string, value: string, options?: HtmlTagOptions, defaultStyle?: string): string => {\n let attributes = '';\n const className = options?.class == null ? '' : toClassString(options.class);\n if (className) {\n attributes += ` class=\"${escapeHtml(className)}\"`;\n }\n const style = [defaultStyle, options?.style == null ? '' : toStyleString(options.style)].filter(Boolean).join('; ');\n if (style) {\n attributes += ` style=\"${escapeHtml(style)}\"`;\n }\n return `<${tagName}${attributes}>${escapeHtml(value)}</${tagName}>`;\n};\n\n/**\n * 文字列をWEB表示用にフォーマットする\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * @param {string | null | undefined} str\n * @param {*} [options]\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatStringForWeb(str: string | null | undefined, options?: {\n html?: boolean;\n}): string {\n if (!str) {\n return '';\n }\n\n const formatText = (text: string): string => text\n .replace(/\\r\\n|\\r|\\n/g, '<br>')\n .replace(/\\t/g, '&nbsp;&nbsp;')\n .replace(/ /g, '&nbsp;');\n\n if (options?.html) {\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをフォーマットする\n return str\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : formatText(segment))\n .join('');\n }\n\n return formatText(escapeHtml(str));\n}\n\n/**\n * 値を整形したJSON文字列にしてWEB表示用にフォーマットする\n * formatJsonStringで整形した文字列をformatStringForWebで変換する\n *\n * @param {any} value\n * @param {*} [options] formatJsonStringのオプションに以下を加えたもの\n * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {\n html?: boolean;\n}): string {\n const { html, ...formatOptions } = options ?? {};\n const json = formatJsonString(value, formatOptions);\n return json == null ? '' : formatStringForWeb(String(json), { html });\n}\n\n/**\n * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す\n * markタグは既定の背景色・文字色を持つ。色はCSS変数(--dwui-background-highlight / --dwui-color-text-highlight)で変更できる\n * styleは既定の背景色・文字色より後に出力する\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * 例)\n * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });\n * → 'This is a <mark class=\"highlight\" style=\"background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)\">test</mark> message'\n *\n * @param {string | null | undefined} value\n * @param {string | null | undefined} word\n * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる\n * ├ class string | string[] | Record<string, boolean>\n * ├ style string | Record<string, string | number>\n * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function highlightWord(\n value: string | null | undefined,\n word: string | null | undefined,\n options?: HtmlTagOptions & {\n caseInsensitive?: boolean;\n html?: boolean;\n }\n): string {\n if (!value) {\n return '';\n }\n\n const toHtml = (text: string): string => options?.html ? text : escapeHtml(text);\n if (!word) {\n return toHtml(value);\n }\n\n const pattern = word.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n const regex = new RegExp(`(${pattern})`, options?.caseInsensitive ? 'i' : '');\n // キャプチャグループで分割すると、奇数番目の要素が一致した部分になる\n const highlight = (text: string): string => text\n .split(regex)\n .map((part, i) => i % 2 === 0 ? toHtml(part) : toElement('mark', part, options, HIGHLIGHT_STYLE))\n .join('');\n\n if (!options?.html) {\n return highlight(value);\n }\n\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをハイライトする\n return value\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : highlight(segment))\n .join('');\n}\n\n/**\n * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す\n * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる\n * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する\n * 入力文字列はプレーンなテキストであるとみなす\n * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる\n *\n * @param {string | null | undefined} text1 比較元の文字列\n * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)\n * @param {*} [options]\n * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない\n * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性\n * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性\n * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性\n * @returns {string}\n */\nexport function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {\n ignoreCase?: boolean;\n added?: HtmlTagOptions;\n removed?: HtmlTagOptions;\n same?: HtmlTagOptions;\n}): string {\n const changes = diffChars(text1 ?? '', text2 ?? '', { ignoreCase: options?.ignoreCase });\n let html = '';\n for (const change of changes) {\n if (change.added) {\n html += toElement('span', change.value, options?.added, DIFF_STYLES.added);\n } else if (change.removed) {\n html += toElement('span', change.value, options?.removed, DIFF_STYLES.removed);\n } else {\n html += toElement('span', change.value, options?.same, DIFF_STYLES.same);\n }\n }\n return html;\n}\n"],"names":["HTML_TOKEN","HTML_ESCAPE_CHARS","escapeHtml","str","c","toClassString","value","key","toStyleString","v","DIFF_STYLES","HIGHLIGHT_STYLE","toElement","tagName","options","defaultStyle","attributes","className","style","formatStringForWeb","formatText","text","segment","i","formatJsonStringForWeb","html","formatOptions","json","formatJsonString","highlightWord","word","toHtml","pattern","regex","highlight","part","diffForWeb","text1","text2","changes","diffChars","change"],"mappings":"2EAwBMA,EAAa,uDAEbC,EAA4C,CAChD,IAAK,SACL,IAAK,QACL,IAAM,QACN,IAAK,OACL,IAAK,MACP,EAEMC,EAAcC,GAAwBA,EAAI,QAAQ,WAAaC,GAAMH,EAAkBG,CAAC,CAAC,EAEzFC,EAAiBC,GACjB,OAAOA,GAAU,SACZA,EAEL,MAAM,QAAQA,CAAK,EACdA,EAAM,OAAO,OAAO,EAAE,KAAK,GAAG,EAEhC,OAAO,KAAKA,CAAK,EAAE,OAAOC,GAAOD,EAAMC,CAAG,CAAC,EAAE,KAAK,GAAG,EAGxDC,EAAiBF,GACjB,OAAOA,GAAU,SACZA,EAEF,OAAO,QAAQA,CAAK,EACxB,IAAI,CAAC,CAACC,EAAKE,CAAC,IAGJ,GADUF,EAAI,WAAW,IAAI,EAAIA,EAAMA,EAAI,QAAQ,SAAUH,GAAK,IAAIA,EAAE,YAAA,CAAa,EAAE,CAC5E,KAAKK,CAAC,EACzB,EACA,KAAK,IAAI,EAIRC,EAAc,CAClB,MAAO,oFACP,QAAS,sFACT,KAAM,uEACR,EAGMC,EAAkB,wGAWlBC,EAAY,CAACC,EAAiBP,EAAeQ,EAA0BC,IAAkC,CAC7G,IAAIC,EAAa,GACjB,MAAMC,EAAYH,GAAS,OAAS,KAAO,GAAKT,EAAcS,EAAQ,KAAK,EACvEG,IACFD,GAAc,WAAWd,EAAWe,CAAS,CAAC,KAEhD,MAAMC,EAAQ,CAACH,EAAcD,GAAS,OAAS,KAAO,GAAKN,EAAcM,EAAQ,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,EAClH,OAAII,IACFF,GAAc,WAAWd,EAAWgB,CAAK,CAAC,KAErC,IAAIL,CAAO,GAAGG,CAAU,IAAId,EAAWI,CAAK,CAAC,KAAKO,CAAO,GAClE,EAWO,SAASM,EAAmBhB,EAAgCW,EAExD,CACT,GAAI,CAACX,EACH,MAAO,GAGT,MAAMiB,EAAcC,GAAyBA,EAC1C,QAAQ,cAAe,MAAM,EAC7B,QAAQ,MAAO,cAAc,EAC7B,QAAQ,KAAM,QAAQ,EAEzB,OAAIP,GAAS,KAEJX,EACJ,MAAMH,CAAU,EAChB,IAAI,CAACsB,EAASC,IAAMA,EAAI,IAAM,EAAID,EAAUF,EAAWE,CAAO,CAAC,EAC/D,KAAK,EAAE,EAGLF,EAAWlB,EAAWC,CAAG,CAAC,CACnC,CAWO,SAASqB,EAAuBlB,EAAYQ,EAExC,CACT,KAAM,CAAE,KAAAW,EAAM,GAAGC,CAAA,EAAkBZ,GAAW,CAAA,EACxCa,EAAOC,EAAAA,iBAAiBtB,EAAOoB,CAAa,EAClD,OAAOC,GAAQ,KAAO,GAAKR,EAAmB,OAAOQ,CAAI,EAAG,CAAE,KAAAF,EAAM,CACtE,CAqBO,SAASI,EACdvB,EACAwB,EACAhB,EAIQ,CACR,GAAI,CAACR,EACH,MAAO,GAGT,MAAMyB,EAAUV,GAAyBP,GAAS,KAAOO,EAAOnB,EAAWmB,CAAI,EAC/E,GAAI,CAACS,EACH,OAAOC,EAAOzB,CAAK,EAGrB,MAAM0B,EAAUF,EAAK,QAAQ,sBAAuB,MAAM,EAAE,QAAQ,KAAM,OAAO,EAC3EG,EAAQ,IAAI,OAAO,IAAID,CAAO,IAAKlB,GAAS,gBAAkB,IAAM,EAAE,EAEtEoB,EAAab,GAAyBA,EACzC,MAAMY,CAAK,EACX,IAAI,CAACE,EAAMZ,IAAMA,EAAI,IAAM,EAAIQ,EAAOI,CAAI,EAAIvB,EAAU,OAAQuB,EAAMrB,EAASH,CAAe,CAAC,EAC/F,KAAK,EAAE,EAEV,OAAKG,GAAS,KAKPR,EACJ,MAAMN,CAAU,EAChB,IAAI,CAACsB,EAASC,IAAMA,EAAI,IAAM,EAAID,EAAUY,EAAUZ,CAAO,CAAC,EAC9D,KAAK,EAAE,EAPDY,EAAU5B,CAAK,CAQ1B,CAkBO,SAAS8B,EAAWC,EAAkCC,EAAkCxB,EAKpF,CACT,MAAMyB,EAAUC,EAAAA,UAAUH,GAAS,GAAIC,GAAS,GAAI,CAAE,WAAYxB,GAAS,WAAY,EACvF,IAAIW,EAAO,GACX,UAAWgB,KAAUF,EACfE,EAAO,MACThB,GAAQb,EAAU,OAAQ6B,EAAO,MAAO3B,GAAS,MAAOJ,EAAY,KAAK,EAChE+B,EAAO,QAChBhB,GAAQb,EAAU,OAAQ6B,EAAO,MAAO3B,GAAS,QAASJ,EAAY,OAAO,EAE7Ee,GAAQb,EAAU,OAAQ6B,EAAO,MAAO3B,GAAS,KAAMJ,EAAY,IAAI,EAG3E,OAAOe,CACT"}
@@ -1,60 +0,0 @@
1
- import { diffChars as h } from "diff";
2
- import { f as p } from "./json-util-C_Pm1BpJ.js";
3
- const g = /(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i, b = {
4
- '"': "&quot;",
5
- "&": "&amp;",
6
- "'": "&#39;",
7
- "<": "&lt;",
8
- ">": "&gt;"
9
- }, l = (r) => r.replace(/["&'<>]/g, (e) => b[e]), S = (r) => typeof r == "string" ? r : Array.isArray(r) ? r.filter(Boolean).join(" ") : Object.keys(r).filter((e) => r[e]).join(" "), j = (r) => typeof r == "string" ? r : Object.entries(r).map(([e, t]) => `${e.startsWith("--") ? e : e.replace(/[A-Z]/g, (n) => `-${n.toLowerCase()}`)}: ${t}`).join("; "), d = {
10
- added: "color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))",
11
- removed: "color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))",
12
- same: "color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))"
13
- }, y = "background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)", f = (r, e, t, o) => {
14
- let n = "";
15
- const i = t?.class == null ? "" : S(t.class);
16
- i && (n += ` class="${l(i)}"`);
17
- const a = [o, t?.style == null ? "" : j(t.style)].filter(Boolean).join("; ");
18
- return a && (n += ` style="${l(a)}"`), `<${r}${n}>${l(e)}</${r}>`;
19
- };
20
- function m(r, e) {
21
- if (!r)
22
- return "";
23
- const t = (o) => o.replace(/\r\n|\r|\n/g, "<br>").replace(/\t/g, "&nbsp;&nbsp;").replace(/ /g, "&nbsp;");
24
- return e?.html ? r.split(g).map((o, n) => n % 2 === 1 ? o : t(o)).join("") : t(l(r));
25
- }
26
- function $(r, e) {
27
- const { html: t, ...o } = e ?? {}, n = p(r, o);
28
- return n == null ? "" : m(String(n), { html: t });
29
- }
30
- function x(r, e, t) {
31
- if (!r)
32
- return "";
33
- const o = (s) => t?.html ? s : l(s);
34
- if (!e)
35
- return o(r);
36
- const n = e.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"), i = new RegExp(`(${n})`, t?.caseInsensitive ? "i" : ""), a = (s) => s.split(i).map((c, u) => u % 2 === 0 ? o(c) : f("mark", c, t, y)).join("");
37
- return t?.html ? r.split(g).map((s, c) => c % 2 === 1 ? s : a(s)).join("") : a(r);
38
- }
39
- function T(r, e, t) {
40
- const o = h(r ?? "", e ?? "", { ignoreCase: t?.ignoreCase });
41
- let n = "";
42
- for (const i of o)
43
- i.added ? n += f("span", i.value, t?.added, d.added) : i.removed ? n += f("span", i.value, t?.removed, d.removed) : n += f("span", i.value, t?.same, d.same);
44
- return n;
45
- }
46
- const k = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
47
- __proto__: null,
48
- diffForWeb: T,
49
- formatJsonStringForWeb: $,
50
- formatStringForWeb: m,
51
- highlightWord: x
52
- }, Symbol.toStringTag, { value: "Module" }));
53
- export {
54
- m as a,
55
- x as b,
56
- T as d,
57
- $ as f,
58
- k as h
59
- };
60
- //# sourceMappingURL=html-util-B8sdLw9I.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"html-util-B8sdLw9I.js","sources":["../src/html-util.ts"],"sourcesContent":["import { diffChars } from 'diff';\nimport { formatJsonString } from './json-util';\nimport type { FormatJsonStringOptions } from './json-util';\n\n/**\n * class属性に指定する値\n * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する\n */\nexport type HtmlClassValue = string | string[] | Record<string, boolean>;\n\n/**\n * style属性に指定する値\n * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない\n */\nexport type HtmlStyleValue = string | Record<string, string | number>;\n\n/**\n * 生成するタグに付与する属性\n */\nexport interface HtmlTagOptions {\n class?: HtmlClassValue;\n style?: HtmlStyleValue;\n}\n\nconst HTML_TOKEN = /(<!--[\\s\\S]*?-->|<[^>]*>|&(?:#\\d+|#x[\\da-f]+|\\w+);)/i;\n\nconst HTML_ESCAPE_CHARS: Record<string, string> = {\n '\"': '&quot;',\n '&': '&amp;',\n '\\'': '&#39;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeHtml = (str: string): string => str.replace(/[\"&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);\n\nconst toClassString = (value: HtmlClassValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.filter(Boolean).join(' ');\n }\n return Object.keys(value).filter(key => value[key]).join(' ');\n};\n\nconst toStyleString = (value: HtmlStyleValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, v]) => {\n // カスタムプロパティ(--xxx)は大文字小文字を区別するため変換しない\n const property = key.startsWith('--') ? key : key.replace(/[A-Z]/g, c => `-${c.toLowerCase()}`);\n return `${property}: ${v}`;\n })\n .join('; ');\n};\n\n/** diffForWebの既定の文字色 */\nconst DIFF_STYLES = {\n added: 'color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))',\n removed: 'color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))',\n same: 'color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))'\n};\n\n/** highlightWordの既定の背景色・文字色。markタグのブラウザ標準の色をフォールバックにする */\nconst HIGHLIGHT_STYLE = 'background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)';\n\n/**\n * 値をエスケープしたタグを返す\n *\n * @param {string} tagName\n * @param {string} value\n * @param {HtmlTagOptions} [options]\n * @param {string} [defaultStyle] optionsのstyleより前に出力するstyle\n * @returns {string}\n */\nconst toElement = (tagName: string, value: string, options?: HtmlTagOptions, defaultStyle?: string): string => {\n let attributes = '';\n const className = options?.class == null ? '' : toClassString(options.class);\n if (className) {\n attributes += ` class=\"${escapeHtml(className)}\"`;\n }\n const style = [defaultStyle, options?.style == null ? '' : toStyleString(options.style)].filter(Boolean).join('; ');\n if (style) {\n attributes += ` style=\"${escapeHtml(style)}\"`;\n }\n return `<${tagName}${attributes}>${escapeHtml(value)}</${tagName}>`;\n};\n\n/**\n * 文字列をWEB表示用にフォーマットする\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * @param {string | null | undefined} str\n * @param {*} [options]\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatStringForWeb(str: string | null | undefined, options?: {\n html?: boolean;\n}): string {\n if (!str) {\n return '';\n }\n\n const formatText = (text: string): string => text\n .replace(/\\r\\n|\\r|\\n/g, '<br>')\n .replace(/\\t/g, '&nbsp;&nbsp;')\n .replace(/ /g, '&nbsp;');\n\n if (options?.html) {\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをフォーマットする\n return str\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : formatText(segment))\n .join('');\n }\n\n return formatText(escapeHtml(str));\n}\n\n/**\n * 値を整形したJSON文字列にしてWEB表示用にフォーマットする\n * formatJsonStringで整形した文字列をformatStringForWebで変換する\n *\n * @param {any} value\n * @param {*} [options] formatJsonStringのオプションに以下を加えたもの\n * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {\n html?: boolean;\n}): string {\n const { html, ...formatOptions } = options ?? {};\n const json = formatJsonString(value, formatOptions);\n return json == null ? '' : formatStringForWeb(String(json), { html });\n}\n\n/**\n * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す\n * markタグは既定の背景色・文字色を持つ。色はCSS変数(--dwui-background-highlight / --dwui-color-text-highlight)で変更できる\n * styleは既定の背景色・文字色より後に出力する\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * 例)\n * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });\n * → 'This is a <mark class=\"highlight\" style=\"background: var(--dwui-background-highlight, Mark); color: var(--dwui-color-text-highlight, MarkText)\">test</mark> message'\n *\n * @param {string | null | undefined} value\n * @param {string | null | undefined} word\n * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる\n * ├ class string | string[] | Record<string, boolean>\n * ├ style string | Record<string, string | number>\n * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function highlightWord(\n value: string | null | undefined,\n word: string | null | undefined,\n options?: HtmlTagOptions & {\n caseInsensitive?: boolean;\n html?: boolean;\n }\n): string {\n if (!value) {\n return '';\n }\n\n const toHtml = (text: string): string => options?.html ? text : escapeHtml(text);\n if (!word) {\n return toHtml(value);\n }\n\n const pattern = word.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n const regex = new RegExp(`(${pattern})`, options?.caseInsensitive ? 'i' : '');\n // キャプチャグループで分割すると、奇数番目の要素が一致した部分になる\n const highlight = (text: string): string => text\n .split(regex)\n .map((part, i) => i % 2 === 0 ? toHtml(part) : toElement('mark', part, options, HIGHLIGHT_STYLE))\n .join('');\n\n if (!options?.html) {\n return highlight(value);\n }\n\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをハイライトする\n return value\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : highlight(segment))\n .join('');\n}\n\n/**\n * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す\n * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる\n * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する\n * 入力文字列はプレーンなテキストであるとみなす\n * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる\n *\n * @param {string | null | undefined} text1 比較元の文字列\n * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)\n * @param {*} [options]\n * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない\n * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性\n * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性\n * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性\n * @returns {string}\n */\nexport function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {\n ignoreCase?: boolean;\n added?: HtmlTagOptions;\n removed?: HtmlTagOptions;\n same?: HtmlTagOptions;\n}): string {\n const changes = diffChars(text1 ?? '', text2 ?? '', { ignoreCase: options?.ignoreCase });\n let html = '';\n for (const change of changes) {\n if (change.added) {\n html += toElement('span', change.value, options?.added, DIFF_STYLES.added);\n } else if (change.removed) {\n html += toElement('span', change.value, options?.removed, DIFF_STYLES.removed);\n } else {\n html += toElement('span', change.value, options?.same, DIFF_STYLES.same);\n }\n }\n return html;\n}\n"],"names":["HTML_TOKEN","HTML_ESCAPE_CHARS","escapeHtml","str","c","toClassString","value","key","toStyleString","v","DIFF_STYLES","HIGHLIGHT_STYLE","toElement","tagName","options","defaultStyle","attributes","className","style","formatStringForWeb","formatText","text","segment","i","formatJsonStringForWeb","html","formatOptions","json","formatJsonString","highlightWord","word","toHtml","pattern","regex","highlight","part","diffForWeb","text1","text2","changes","diffChars","change"],"mappings":"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"}