ochre-sdk 1.0.13 → 1.0.14
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.
- package/dist/constants.d.mts +17 -0
- package/dist/constants.mjs +85 -0
- package/dist/fetchers/gallery.d.mts +38 -0
- package/dist/fetchers/gallery.mjs +91 -0
- package/dist/fetchers/item-links.d.mts +32 -0
- package/dist/fetchers/item-links.mjs +120 -0
- package/dist/fetchers/item.d.mts +74 -0
- package/dist/fetchers/item.mjs +146 -0
- package/dist/fetchers/set/items.d.mts +48 -0
- package/dist/fetchers/set/items.mjs +268 -0
- package/dist/fetchers/set/property-values.d.mts +46 -0
- package/dist/fetchers/set/property-values.mjs +514 -0
- package/dist/fetchers/website.d.mts +25 -0
- package/dist/fetchers/website.mjs +38 -0
- package/dist/getters.d.mts +193 -0
- package/dist/getters.mjs +341 -0
- package/dist/helpers.d.mts +18 -0
- package/dist/helpers.mjs +33 -0
- package/dist/index.d.mts +12 -1971
- package/dist/index.mjs +9 -7236
- package/dist/parsers/helpers.d.mts +27 -0
- package/dist/parsers/helpers.mjs +53 -0
- package/dist/parsers/index.d.mts +65 -0
- package/dist/parsers/index.mjs +1338 -0
- package/dist/parsers/mdx.d.mts +4 -0
- package/dist/parsers/mdx.mjs +9 -0
- package/dist/parsers/multilingual.d.mts +189 -0
- package/dist/parsers/multilingual.mjs +410 -0
- package/dist/parsers/string.d.mts +29 -0
- package/dist/parsers/string.mjs +477 -0
- package/dist/parsers/website/index.d.mts +20 -0
- package/dist/parsers/website/index.mjs +1245 -0
- package/dist/parsers/website/reader.d.mts +29 -0
- package/dist/parsers/website/reader.mjs +75 -0
- package/dist/query.d.mts +13 -0
- package/dist/query.mjs +827 -0
- package/dist/schemas.d.mts +84 -0
- package/dist/schemas.mjs +232 -0
- package/dist/types/index.d.mts +840 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/website.d.mts +501 -0
- package/dist/types/website.mjs +1 -0
- package/dist/utils.d.mts +34 -0
- package/dist/utils.mjs +172 -0
- package/dist/xml/metadata.d.mts +5 -0
- package/dist/xml/metadata.mjs +30 -0
- package/dist/xml/schemas.d.mts +13 -0
- package/dist/xml/schemas.mjs +849 -0
- package/dist/xml/types.d.mts +901 -0
- package/dist/xml/types.mjs +1 -0
- package/package.json +19 -17
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/parsers/mdx.ts
|
|
2
|
+
const MDX_LITERAL_EXPRESSION_REGEX = /[!#*<>[\]_`{|}~]/;
|
|
3
|
+
const MDX_LITERAL_BLOCK_REGEX = /(?:^|\n)[\t ]*(?:import|export|[+>-]|\d+[).])(?:[\t ]|$)/;
|
|
4
|
+
function serializeMDXText(value) {
|
|
5
|
+
if (value === "" || !MDX_LITERAL_EXPRESSION_REGEX.test(value) && !MDX_LITERAL_BLOCK_REGEX.test(value)) return value;
|
|
6
|
+
return `{${JSON.stringify(value)}}`;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { serializeMDXText };
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
//#region src/parsers/multilingual.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* One text entry for a language. When OCHRE exposes multiple entries for the
|
|
4
|
+
* same language, the first one is primary.
|
|
5
|
+
*/
|
|
6
|
+
type MultilingualStringEntry = {
|
|
7
|
+
text: string;
|
|
8
|
+
richText: string;
|
|
9
|
+
isPrimary: boolean;
|
|
10
|
+
};
|
|
11
|
+
type MultilingualStringText = {
|
|
12
|
+
text: string;
|
|
13
|
+
richText: string;
|
|
14
|
+
};
|
|
15
|
+
type MultilingualStringInput = string | {
|
|
16
|
+
text: string;
|
|
17
|
+
richText?: string;
|
|
18
|
+
};
|
|
19
|
+
type MultilingualStringJSON<T extends ReadonlyArray<string> = ReadonlyArray<string>> = {
|
|
20
|
+
content: Partial<Record<T[number], Array<MultilingualStringEntry>>>;
|
|
21
|
+
aliases: Array<string>;
|
|
22
|
+
};
|
|
23
|
+
type MultilingualStringObject<T extends ReadonlyArray<string> = ReadonlyArray<string>> = Partial<Record<T[number], MultilingualStringInput>>;
|
|
24
|
+
type MultilingualStringEntries<T extends ReadonlyArray<string> = ReadonlyArray<string>> = Partial<Record<T[number], ReadonlyArray<MultilingualStringInput>>>;
|
|
25
|
+
/**
|
|
26
|
+
* Options for creating and working with multilingual strings
|
|
27
|
+
*/
|
|
28
|
+
type MultilingualOptions = {
|
|
29
|
+
/** Default language to use for fallbacks */defaultLanguage?: string; /** Available languages for this string */
|
|
30
|
+
availableLanguages?: ReadonlyArray<string>; /** Alias values carried by OCHRE as zxx content */
|
|
31
|
+
aliases?: ReadonlyArray<string>;
|
|
32
|
+
};
|
|
33
|
+
type MultilingualContent<T extends ReadonlyArray<string>> = Partial<Record<T[number], ReadonlyArray<MultilingualStringEntry>>>;
|
|
34
|
+
declare const MULTILINGUAL_STRING_INTERNAL_INIT: unique symbol;
|
|
35
|
+
type MultilingualStringInternalInit<T extends ReadonlyArray<string>> = {
|
|
36
|
+
readonly [MULTILINGUAL_STRING_INTERNAL_INIT]: true;
|
|
37
|
+
content: MultilingualContent<T>;
|
|
38
|
+
options: Required<MultilingualOptions>;
|
|
39
|
+
availableLanguages: ReadonlyArray<T[number]>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Multilingual string
|
|
43
|
+
*/
|
|
44
|
+
declare class MultilingualString<T extends ReadonlyArray<string> = ReadonlyArray<string>> {
|
|
45
|
+
private readonly _content;
|
|
46
|
+
private readonly _options;
|
|
47
|
+
private readonly _availableLanguages;
|
|
48
|
+
private readonly _aliases;
|
|
49
|
+
/**
|
|
50
|
+
* Create a new multilingual string from an object of language codes to text.
|
|
51
|
+
*/
|
|
52
|
+
/** @internal */
|
|
53
|
+
constructor(init: MultilingualStringInternalInit<T>);
|
|
54
|
+
constructor(content: MultilingualStringObject<T>, languages: T, options?: MultilingualOptions);
|
|
55
|
+
constructor(content?: Partial<Record<string, MultilingualStringInput>>, languages?: undefined, options?: MultilingualOptions);
|
|
56
|
+
private static fromNormalized;
|
|
57
|
+
/**
|
|
58
|
+
* Create a new multilingual string from an object of language codes to text
|
|
59
|
+
*/
|
|
60
|
+
static fromObject<U extends ReadonlyArray<string>>(content: MultilingualStringObject<U>, languages: U, options?: MultilingualOptions): MultilingualString<U>;
|
|
61
|
+
static fromObject(content: Partial<Record<string, MultilingualStringInput>>, languages?: undefined, options?: MultilingualOptions): MultilingualString<ReadonlyArray<string>>;
|
|
62
|
+
/**
|
|
63
|
+
* Create a new multilingual string from language entries.
|
|
64
|
+
*/
|
|
65
|
+
static fromEntries<U extends ReadonlyArray<string>>(content: MultilingualStringEntries<U>, languages: U, options?: MultilingualOptions): MultilingualString<U>;
|
|
66
|
+
static fromEntries(content: Partial<Record<string, ReadonlyArray<MultilingualStringInput>>>, languages?: undefined, options?: MultilingualOptions): MultilingualString<ReadonlyArray<string>>;
|
|
67
|
+
/**
|
|
68
|
+
* Create a new multilingual string for a single language
|
|
69
|
+
*/
|
|
70
|
+
static create<U extends ReadonlyArray<string>>(language: U[number], text: MultilingualStringInput, languages: U, options?: MultilingualOptions): MultilingualString<U>;
|
|
71
|
+
static create(language: string, text: MultilingualStringInput, languages?: undefined, options?: MultilingualOptions): MultilingualString<ReadonlyArray<string>>;
|
|
72
|
+
/**
|
|
73
|
+
* Create an empty multilingual string
|
|
74
|
+
*/
|
|
75
|
+
static empty<U extends ReadonlyArray<string>>(languages: U, options?: MultilingualOptions): MultilingualString<U>;
|
|
76
|
+
static empty(languages?: undefined, options?: MultilingualOptions): MultilingualString<ReadonlyArray<string>>;
|
|
77
|
+
/**
|
|
78
|
+
* Recreate a multilingual string from its JSON representation.
|
|
79
|
+
*/
|
|
80
|
+
static fromJSON<U extends ReadonlyArray<string>>(json: MultilingualStringJSON<U>, languages: U, options?: Omit<MultilingualOptions, "aliases">): MultilingualString<U>;
|
|
81
|
+
static fromJSON(json: MultilingualStringJSON, languages?: undefined, options?: Omit<MultilingualOptions, "aliases">): MultilingualString<ReadonlyArray<string>>;
|
|
82
|
+
private getPrimaryEntry;
|
|
83
|
+
/**
|
|
84
|
+
* Get text in a specific language with automatic fallback
|
|
85
|
+
*/
|
|
86
|
+
getText(language?: T[number]): string;
|
|
87
|
+
/**
|
|
88
|
+
* Get rich text in a specific language with automatic fallback
|
|
89
|
+
*/
|
|
90
|
+
getRichText(language?: T[number]): string;
|
|
91
|
+
/**
|
|
92
|
+
* Get primary text in a specific language without fallback
|
|
93
|
+
*/
|
|
94
|
+
getExactText(language: T[number]): string | null;
|
|
95
|
+
/**
|
|
96
|
+
* Get primary rich text in a specific language without fallback
|
|
97
|
+
*/
|
|
98
|
+
getExactRichText(language: T[number]): string | null;
|
|
99
|
+
/**
|
|
100
|
+
* Get all text entries in a specific language without fallback
|
|
101
|
+
*/
|
|
102
|
+
getExactTexts(language: T[number]): Array<string>;
|
|
103
|
+
/**
|
|
104
|
+
* Get all rich text entries in a specific language without fallback
|
|
105
|
+
*/
|
|
106
|
+
getExactRichTexts(language: T[number]): Array<string>;
|
|
107
|
+
/**
|
|
108
|
+
* Get all text entries in a specific language with fallback
|
|
109
|
+
*/
|
|
110
|
+
getTexts(language?: T[number]): Array<string>;
|
|
111
|
+
/**
|
|
112
|
+
* Get all rich text entries in a specific language with fallback
|
|
113
|
+
*/
|
|
114
|
+
getRichTexts(language?: T[number]): Array<string>;
|
|
115
|
+
/**
|
|
116
|
+
* Get all entries in a specific language without fallback
|
|
117
|
+
*/
|
|
118
|
+
getExactEntries(language: T[number]): Array<MultilingualStringEntry>;
|
|
119
|
+
/**
|
|
120
|
+
* Get all entries in a specific language with fallback
|
|
121
|
+
*/
|
|
122
|
+
getEntries(language?: T[number]): Array<MultilingualStringEntry>;
|
|
123
|
+
/**
|
|
124
|
+
* Get aliases carried by OCHRE as zxx content
|
|
125
|
+
*/
|
|
126
|
+
getAliases(): Array<string>;
|
|
127
|
+
/**
|
|
128
|
+
* Check if text exists for a specific language
|
|
129
|
+
*/
|
|
130
|
+
hasLanguage(language: T[number]): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Check if aliases exist
|
|
133
|
+
*/
|
|
134
|
+
hasAliases(): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Get all available languages
|
|
137
|
+
*/
|
|
138
|
+
getAvailableLanguages(): ReadonlyArray<T[number]>;
|
|
139
|
+
/**
|
|
140
|
+
* Get all supported languages (the full language array passed to constructor)
|
|
141
|
+
*/
|
|
142
|
+
getSupportedLanguages(): T;
|
|
143
|
+
/**
|
|
144
|
+
* Check if the multilingual string is empty (no content in any language)
|
|
145
|
+
*/
|
|
146
|
+
isEmpty(): boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Check if the multilingual string has any content
|
|
149
|
+
*/
|
|
150
|
+
hasContent(): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Get the default language
|
|
153
|
+
*/
|
|
154
|
+
getDefaultLanguage(): T[number];
|
|
155
|
+
/**
|
|
156
|
+
* Add or update the primary text for a language (returns new instance)
|
|
157
|
+
*/
|
|
158
|
+
withText(language: T[number], text: MultilingualStringInput): MultilingualString<T>;
|
|
159
|
+
/**
|
|
160
|
+
* Add another text entry for a language (returns new instance)
|
|
161
|
+
*/
|
|
162
|
+
withEntry(language: T[number], text: MultilingualStringInput): MultilingualString<T>;
|
|
163
|
+
/**
|
|
164
|
+
* Replace aliases (returns new instance)
|
|
165
|
+
*/
|
|
166
|
+
withAliases(aliases: ReadonlyArray<string>): MultilingualString<T>;
|
|
167
|
+
/**
|
|
168
|
+
* Remove text for a language (returns new instance)
|
|
169
|
+
*/
|
|
170
|
+
withoutLanguage(language: T[number]): MultilingualString<T>;
|
|
171
|
+
/**
|
|
172
|
+
* Transform all language versions (returns new instance)
|
|
173
|
+
*/
|
|
174
|
+
map(fn: (text: string, language: T[number]) => string): MultilingualString<T>;
|
|
175
|
+
/**
|
|
176
|
+
* Filter languages based on predicate (returns new instance)
|
|
177
|
+
*/
|
|
178
|
+
filter(predicate: (text: string, language: T[number]) => boolean): MultilingualString<T>;
|
|
179
|
+
/**
|
|
180
|
+
* Get the string representation (uses default language)
|
|
181
|
+
*/
|
|
182
|
+
toString(): string;
|
|
183
|
+
/**
|
|
184
|
+
* Get JSON representation
|
|
185
|
+
*/
|
|
186
|
+
toJSON(): MultilingualStringJSON<T>;
|
|
187
|
+
}
|
|
188
|
+
//#endregion
|
|
189
|
+
export { MultilingualOptions, MultilingualString, MultilingualStringEntries, MultilingualStringEntry, MultilingualStringInput, MultilingualStringJSON, MultilingualStringObject, MultilingualStringText };
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
import { DEFAULT_LANGUAGES } from "../constants.mjs";
|
|
2
|
+
import { serializeMDXText } from "./mdx.mjs";
|
|
3
|
+
//#region src/parsers/multilingual.ts
|
|
4
|
+
const MULTILINGUAL_STRING_INTERNAL_INIT = Symbol("MultilingualString.internalInit");
|
|
5
|
+
function normalizeInputText(text) {
|
|
6
|
+
return typeof text === "string" ? {
|
|
7
|
+
text,
|
|
8
|
+
richText: serializeMDXText(text)
|
|
9
|
+
} : {
|
|
10
|
+
text: text.text,
|
|
11
|
+
richText: text.richText ?? serializeMDXText(text.text)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function normalizeAliases(aliases) {
|
|
15
|
+
const normalizedAliases = [];
|
|
16
|
+
for (const alias of aliases ?? []) if (alias !== "") normalizedAliases.push(alias);
|
|
17
|
+
return normalizedAliases;
|
|
18
|
+
}
|
|
19
|
+
function entriesFromTexts(texts) {
|
|
20
|
+
const entries = [];
|
|
21
|
+
for (const text of texts) entries.push({
|
|
22
|
+
...normalizeInputText(text),
|
|
23
|
+
isPrimary: entries.length === 0
|
|
24
|
+
});
|
|
25
|
+
return entries;
|
|
26
|
+
}
|
|
27
|
+
function cloneContent(content) {
|
|
28
|
+
const clonedContent = {};
|
|
29
|
+
const entriesByLanguage = Object.entries(content);
|
|
30
|
+
for (const [language, entries] of entriesByLanguage) {
|
|
31
|
+
const clonedEntries = [];
|
|
32
|
+
for (const entry of entries ?? []) clonedEntries.push({
|
|
33
|
+
text: entry.text,
|
|
34
|
+
richText: entry.richText,
|
|
35
|
+
isPrimary: entry.isPrimary
|
|
36
|
+
});
|
|
37
|
+
clonedContent[language] = normalizePrimary(clonedEntries);
|
|
38
|
+
}
|
|
39
|
+
return clonedContent;
|
|
40
|
+
}
|
|
41
|
+
function normalizePrimary(entries) {
|
|
42
|
+
const normalizedEntries = [];
|
|
43
|
+
for (const entry of entries) normalizedEntries.push({
|
|
44
|
+
text: entry.text,
|
|
45
|
+
richText: entry.richText,
|
|
46
|
+
isPrimary: normalizedEntries.length === 0
|
|
47
|
+
});
|
|
48
|
+
return normalizedEntries;
|
|
49
|
+
}
|
|
50
|
+
function getLanguagesWithEntries(content, languages) {
|
|
51
|
+
const availableLanguages = [];
|
|
52
|
+
for (const language of languages) if ((content[language]?.length ?? 0) > 0) availableLanguages.push(language);
|
|
53
|
+
return availableLanguages;
|
|
54
|
+
}
|
|
55
|
+
function getImplicitLanguages(content, options) {
|
|
56
|
+
const languages = [];
|
|
57
|
+
for (const language of options.availableLanguages ?? []) if (!languages.includes(language)) languages.push(language);
|
|
58
|
+
for (const language of Object.keys(content)) if (!languages.includes(language)) languages.push(language);
|
|
59
|
+
return languages.length > 0 ? languages : [...DEFAULT_LANGUAGES];
|
|
60
|
+
}
|
|
61
|
+
function isInternalInit(value) {
|
|
62
|
+
return typeof value === "object" && value != null && MULTILINGUAL_STRING_INTERNAL_INIT in value;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Multilingual string
|
|
66
|
+
*/
|
|
67
|
+
var MultilingualString = class MultilingualString {
|
|
68
|
+
_content;
|
|
69
|
+
_options;
|
|
70
|
+
_availableLanguages;
|
|
71
|
+
_aliases;
|
|
72
|
+
constructor(content = {}, languages, options = {}) {
|
|
73
|
+
if (isInternalInit(content)) {
|
|
74
|
+
this._content = Object.freeze(cloneContent(content.content));
|
|
75
|
+
this._options = Object.freeze({ ...content.options });
|
|
76
|
+
this._availableLanguages = Object.freeze([...content.availableLanguages]);
|
|
77
|
+
this._aliases = Object.freeze([...content.options.aliases]);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const parsed = languages === void 0 ? MultilingualString.fromObject(content, void 0, options) : MultilingualString.fromObject(content, languages, options);
|
|
81
|
+
this._content = parsed._content;
|
|
82
|
+
this._options = parsed._options;
|
|
83
|
+
this._availableLanguages = parsed._availableLanguages;
|
|
84
|
+
this._aliases = parsed._aliases;
|
|
85
|
+
}
|
|
86
|
+
static fromNormalized(content, options, availableLanguages) {
|
|
87
|
+
return new MultilingualString({
|
|
88
|
+
[MULTILINGUAL_STRING_INTERNAL_INIT]: true,
|
|
89
|
+
content,
|
|
90
|
+
options,
|
|
91
|
+
availableLanguages
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
static fromObject(content, languages, options = {}) {
|
|
95
|
+
const entries = {};
|
|
96
|
+
for (const [language, text] of Object.entries(content)) if (text != null) entries[language] = [text];
|
|
97
|
+
if (languages === void 0) return MultilingualString.fromEntries(entries, void 0, options);
|
|
98
|
+
return MultilingualString.fromEntries(entries, languages, options);
|
|
99
|
+
}
|
|
100
|
+
static fromEntries(content, languages, options = {}) {
|
|
101
|
+
if (languages === void 0) {
|
|
102
|
+
const actualLanguages = getImplicitLanguages(content, options);
|
|
103
|
+
const normalizedContent = {};
|
|
104
|
+
for (const language of actualLanguages) normalizedContent[language] = entriesFromTexts(content[language] ?? []);
|
|
105
|
+
const availableLanguages = getLanguagesWithEntries(normalizedContent, actualLanguages);
|
|
106
|
+
const defaultOptions = {
|
|
107
|
+
defaultLanguage: options.defaultLanguage ?? availableLanguages[0] ?? actualLanguages[0],
|
|
108
|
+
availableLanguages: actualLanguages,
|
|
109
|
+
aliases: normalizeAliases(options.aliases)
|
|
110
|
+
};
|
|
111
|
+
return MultilingualString.fromNormalized(normalizedContent, defaultOptions, availableLanguages);
|
|
112
|
+
}
|
|
113
|
+
const normalizedContent = {};
|
|
114
|
+
for (const language of languages) {
|
|
115
|
+
const typedLanguage = language;
|
|
116
|
+
normalizedContent[typedLanguage] = entriesFromTexts(content[typedLanguage] ?? []);
|
|
117
|
+
}
|
|
118
|
+
const availableLanguages = getLanguagesWithEntries(normalizedContent, languages);
|
|
119
|
+
const defaultOptions = {
|
|
120
|
+
defaultLanguage: options.defaultLanguage ?? availableLanguages[0] ?? languages[0],
|
|
121
|
+
availableLanguages: languages,
|
|
122
|
+
aliases: normalizeAliases(options.aliases)
|
|
123
|
+
};
|
|
124
|
+
return MultilingualString.fromNormalized(normalizedContent, defaultOptions, availableLanguages);
|
|
125
|
+
}
|
|
126
|
+
static create(language, text, languages, options = {}) {
|
|
127
|
+
if (languages === void 0) return MultilingualString.fromObject({ [language]: text }, void 0, {
|
|
128
|
+
...options,
|
|
129
|
+
defaultLanguage: language
|
|
130
|
+
});
|
|
131
|
+
return MultilingualString.fromObject({ [language]: text }, languages, {
|
|
132
|
+
...options,
|
|
133
|
+
defaultLanguage: language
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
static empty(languages, options = {}) {
|
|
137
|
+
if (languages === void 0) return MultilingualString.fromObject({}, void 0, options);
|
|
138
|
+
return MultilingualString.fromObject({}, languages, options);
|
|
139
|
+
}
|
|
140
|
+
static fromJSON(json, languages, options = {}) {
|
|
141
|
+
const content = json.content;
|
|
142
|
+
const mergedOptions = {
|
|
143
|
+
...options,
|
|
144
|
+
aliases: json.aliases
|
|
145
|
+
};
|
|
146
|
+
if (languages === void 0) return MultilingualString.fromEntries(content, void 0, mergedOptions);
|
|
147
|
+
return MultilingualString.fromEntries(content, languages, mergedOptions);
|
|
148
|
+
}
|
|
149
|
+
getPrimaryEntry(language) {
|
|
150
|
+
const entries = this._content[language] ?? [];
|
|
151
|
+
for (const entry of entries) if (entry.isPrimary) return entry;
|
|
152
|
+
return entries[0] ?? null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get text in a specific language with automatic fallback
|
|
156
|
+
*/
|
|
157
|
+
getText(language) {
|
|
158
|
+
if (language == null) {
|
|
159
|
+
const defaultEntry = this.getPrimaryEntry(this._options.defaultLanguage);
|
|
160
|
+
if (defaultEntry != null) return defaultEntry.text;
|
|
161
|
+
}
|
|
162
|
+
if (language != null) {
|
|
163
|
+
const requestedEntry = this.getPrimaryEntry(language);
|
|
164
|
+
if (requestedEntry != null) return requestedEntry.text;
|
|
165
|
+
}
|
|
166
|
+
const defaultEntry = this.getPrimaryEntry(this._options.defaultLanguage);
|
|
167
|
+
if (defaultEntry != null) return defaultEntry.text;
|
|
168
|
+
for (const availableLanguage of this._availableLanguages) {
|
|
169
|
+
const entry = this.getPrimaryEntry(availableLanguage);
|
|
170
|
+
if (entry != null) return entry.text;
|
|
171
|
+
}
|
|
172
|
+
return "";
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get rich text in a specific language with automatic fallback
|
|
176
|
+
*/
|
|
177
|
+
getRichText(language) {
|
|
178
|
+
if (language == null) {
|
|
179
|
+
const defaultEntry = this.getPrimaryEntry(this._options.defaultLanguage);
|
|
180
|
+
if (defaultEntry != null) return defaultEntry.richText;
|
|
181
|
+
}
|
|
182
|
+
if (language != null) {
|
|
183
|
+
const requestedEntry = this.getPrimaryEntry(language);
|
|
184
|
+
if (requestedEntry != null) return requestedEntry.richText;
|
|
185
|
+
}
|
|
186
|
+
const defaultEntry = this.getPrimaryEntry(this._options.defaultLanguage);
|
|
187
|
+
if (defaultEntry != null) return defaultEntry.richText;
|
|
188
|
+
for (const availableLanguage of this._availableLanguages) {
|
|
189
|
+
const entry = this.getPrimaryEntry(availableLanguage);
|
|
190
|
+
if (entry != null) return entry.richText;
|
|
191
|
+
}
|
|
192
|
+
return "";
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get primary text in a specific language without fallback
|
|
196
|
+
*/
|
|
197
|
+
getExactText(language) {
|
|
198
|
+
return this.getPrimaryEntry(language)?.text ?? null;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get primary rich text in a specific language without fallback
|
|
202
|
+
*/
|
|
203
|
+
getExactRichText(language) {
|
|
204
|
+
return this.getPrimaryEntry(language)?.richText ?? null;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get all text entries in a specific language without fallback
|
|
208
|
+
*/
|
|
209
|
+
getExactTexts(language) {
|
|
210
|
+
const texts = [];
|
|
211
|
+
for (const entry of this._content[language] ?? []) texts.push(entry.text);
|
|
212
|
+
return texts;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get all rich text entries in a specific language without fallback
|
|
216
|
+
*/
|
|
217
|
+
getExactRichTexts(language) {
|
|
218
|
+
const texts = [];
|
|
219
|
+
for (const entry of this._content[language] ?? []) texts.push(entry.richText);
|
|
220
|
+
return texts;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get all text entries in a specific language with fallback
|
|
224
|
+
*/
|
|
225
|
+
getTexts(language) {
|
|
226
|
+
if (language != null && (this._content[language]?.length ?? 0) > 0) return this.getExactTexts(language);
|
|
227
|
+
const defaultLanguage = this._options.defaultLanguage;
|
|
228
|
+
if ((this._content[defaultLanguage]?.length ?? 0) > 0) return this.getExactTexts(defaultLanguage);
|
|
229
|
+
const firstLanguage = this._availableLanguages[0];
|
|
230
|
+
return firstLanguage == null ? [] : this.getExactTexts(firstLanguage);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get all rich text entries in a specific language with fallback
|
|
234
|
+
*/
|
|
235
|
+
getRichTexts(language) {
|
|
236
|
+
if (language != null && (this._content[language]?.length ?? 0) > 0) return this.getExactRichTexts(language);
|
|
237
|
+
const defaultLanguage = this._options.defaultLanguage;
|
|
238
|
+
if ((this._content[defaultLanguage]?.length ?? 0) > 0) return this.getExactRichTexts(defaultLanguage);
|
|
239
|
+
const firstLanguage = this._availableLanguages[0];
|
|
240
|
+
return firstLanguage == null ? [] : this.getExactRichTexts(firstLanguage);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get all entries in a specific language without fallback
|
|
244
|
+
*/
|
|
245
|
+
getExactEntries(language) {
|
|
246
|
+
const entries = [];
|
|
247
|
+
for (const entry of this._content[language] ?? []) entries.push({
|
|
248
|
+
text: entry.text,
|
|
249
|
+
richText: entry.richText,
|
|
250
|
+
isPrimary: entry.isPrimary
|
|
251
|
+
});
|
|
252
|
+
return entries;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get all entries in a specific language with fallback
|
|
256
|
+
*/
|
|
257
|
+
getEntries(language) {
|
|
258
|
+
if (language != null && (this._content[language]?.length ?? 0) > 0) return this.getExactEntries(language);
|
|
259
|
+
const defaultLanguage = this._options.defaultLanguage;
|
|
260
|
+
if ((this._content[defaultLanguage]?.length ?? 0) > 0) return this.getExactEntries(defaultLanguage);
|
|
261
|
+
const firstLanguage = this._availableLanguages[0];
|
|
262
|
+
return firstLanguage == null ? [] : this.getExactEntries(firstLanguage);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get aliases carried by OCHRE as zxx content
|
|
266
|
+
*/
|
|
267
|
+
getAliases() {
|
|
268
|
+
return [...this._aliases];
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Check if text exists for a specific language
|
|
272
|
+
*/
|
|
273
|
+
hasLanguage(language) {
|
|
274
|
+
return (this._content[language]?.length ?? 0) > 0;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Check if aliases exist
|
|
278
|
+
*/
|
|
279
|
+
hasAliases() {
|
|
280
|
+
return this._aliases.length > 0;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get all available languages
|
|
284
|
+
*/
|
|
285
|
+
getAvailableLanguages() {
|
|
286
|
+
return this._availableLanguages;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get all supported languages (the full language array passed to constructor)
|
|
290
|
+
*/
|
|
291
|
+
getSupportedLanguages() {
|
|
292
|
+
return this._options.availableLanguages;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Check if the multilingual string is empty (no content in any language)
|
|
296
|
+
*/
|
|
297
|
+
isEmpty() {
|
|
298
|
+
return this._availableLanguages.length === 0;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Check if the multilingual string has any content
|
|
302
|
+
*/
|
|
303
|
+
hasContent() {
|
|
304
|
+
const contentEntries = Object.values(this._content);
|
|
305
|
+
for (const entries of contentEntries) for (const entry of entries ?? []) if (entry.text.trim().length > 0 || entry.richText.trim().length > 0) return true;
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Get the default language
|
|
310
|
+
*/
|
|
311
|
+
getDefaultLanguage() {
|
|
312
|
+
return this._options.defaultLanguage;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Add or update the primary text for a language (returns new instance)
|
|
316
|
+
*/
|
|
317
|
+
withText(language, text) {
|
|
318
|
+
const newContent = cloneContent(this._content);
|
|
319
|
+
newContent[language] = entriesFromTexts([text]);
|
|
320
|
+
const newAvailableLanguages = getLanguagesWithEntries(newContent, this._options.availableLanguages);
|
|
321
|
+
return MultilingualString.fromNormalized(newContent, this._options, newAvailableLanguages);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Add another text entry for a language (returns new instance)
|
|
325
|
+
*/
|
|
326
|
+
withEntry(language, text) {
|
|
327
|
+
const newContent = cloneContent(this._content);
|
|
328
|
+
newContent[language] = normalizePrimary([...newContent[language] ?? [], {
|
|
329
|
+
...normalizeInputText(text),
|
|
330
|
+
isPrimary: false
|
|
331
|
+
}]);
|
|
332
|
+
const newAvailableLanguages = getLanguagesWithEntries(newContent, this._options.availableLanguages);
|
|
333
|
+
return MultilingualString.fromNormalized(newContent, this._options, newAvailableLanguages);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Replace aliases (returns new instance)
|
|
337
|
+
*/
|
|
338
|
+
withAliases(aliases) {
|
|
339
|
+
return MultilingualString.fromNormalized(this._content, {
|
|
340
|
+
...this._options,
|
|
341
|
+
aliases: normalizeAliases(aliases)
|
|
342
|
+
}, this._availableLanguages);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Remove text for a language (returns new instance)
|
|
346
|
+
*/
|
|
347
|
+
withoutLanguage(language) {
|
|
348
|
+
const newContent = {};
|
|
349
|
+
const currentContent = cloneContent(this._content);
|
|
350
|
+
for (const supportedLanguage of this._options.availableLanguages) if (supportedLanguage !== language) newContent[supportedLanguage] = normalizePrimary(currentContent[supportedLanguage] ?? []);
|
|
351
|
+
const newAvailableLanguages = getLanguagesWithEntries(newContent, this._options.availableLanguages);
|
|
352
|
+
const newDefaultLanguage = this._options.defaultLanguage === language ? newAvailableLanguages[0] ?? this._options.availableLanguages[0] : this._options.defaultLanguage;
|
|
353
|
+
return MultilingualString.fromNormalized(newContent, {
|
|
354
|
+
...this._options,
|
|
355
|
+
defaultLanguage: newDefaultLanguage
|
|
356
|
+
}, newAvailableLanguages);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Transform all language versions (returns new instance)
|
|
360
|
+
*/
|
|
361
|
+
map(fn) {
|
|
362
|
+
const newContent = {};
|
|
363
|
+
for (const language of this._availableLanguages) {
|
|
364
|
+
const mappedEntries = [];
|
|
365
|
+
for (const entry of this._content[language] ?? []) mappedEntries.push({
|
|
366
|
+
text: fn(entry.text, language),
|
|
367
|
+
richText: fn(entry.richText, language),
|
|
368
|
+
isPrimary: entry.isPrimary
|
|
369
|
+
});
|
|
370
|
+
newContent[language] = normalizePrimary(mappedEntries);
|
|
371
|
+
}
|
|
372
|
+
return MultilingualString.fromNormalized(newContent, this._options, this._availableLanguages);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Filter languages based on predicate (returns new instance)
|
|
376
|
+
*/
|
|
377
|
+
filter(predicate) {
|
|
378
|
+
const newContent = {};
|
|
379
|
+
for (const language of this._availableLanguages) {
|
|
380
|
+
const entries = [];
|
|
381
|
+
for (const entry of this._content[language] ?? []) if (predicate(entry.text, language)) entries.push(entry);
|
|
382
|
+
newContent[language] = normalizePrimary(entries);
|
|
383
|
+
}
|
|
384
|
+
const newAvailableLanguages = getLanguagesWithEntries(newContent, this._options.availableLanguages);
|
|
385
|
+
const newDefaultLanguage = (newContent[this._options.defaultLanguage]?.length ?? 0) > 0 ? this._options.defaultLanguage : newAvailableLanguages[0] ?? this._options.availableLanguages[0];
|
|
386
|
+
return MultilingualString.fromNormalized(newContent, {
|
|
387
|
+
...this._options,
|
|
388
|
+
defaultLanguage: newDefaultLanguage
|
|
389
|
+
}, newAvailableLanguages);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Get the string representation (uses default language)
|
|
393
|
+
*/
|
|
394
|
+
toString() {
|
|
395
|
+
return this.getText();
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Get JSON representation
|
|
399
|
+
*/
|
|
400
|
+
toJSON() {
|
|
401
|
+
const content = {};
|
|
402
|
+
for (const language of this._availableLanguages) content[language] = this.getExactEntries(language);
|
|
403
|
+
return {
|
|
404
|
+
content,
|
|
405
|
+
aliases: this.getAliases()
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
//#endregion
|
|
410
|
+
export { MultilingualString };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { MultilingualString, MultilingualStringText } from "./multilingual.mjs";
|
|
2
|
+
import { XMLContent, XMLString } from "../xml/types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/parsers/string.d.ts
|
|
5
|
+
declare function transformPermanentIdentificationUrl(url: string): string;
|
|
6
|
+
declare function parseXMLString(string: XMLString): MultilingualStringText;
|
|
7
|
+
/**
|
|
8
|
+
* Parses rich text content into a formatted string with links and annotations
|
|
9
|
+
*
|
|
10
|
+
* @param item - XML-based rich text item to parse
|
|
11
|
+
* @param options - Options for parsing
|
|
12
|
+
* @param options.languages - Languages of the content
|
|
13
|
+
* @returns Plain and rich formatted strings
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
declare function parseXMLContent<V extends ReadonlyArray<string>>(item: XMLContent, options: {
|
|
18
|
+
languages: V;
|
|
19
|
+
}): MultilingualString<V>;
|
|
20
|
+
/**
|
|
21
|
+
* Extracts alias strings from XMLContent where lang="zxx"
|
|
22
|
+
* @param content - The XMLContent to extract aliases from
|
|
23
|
+
* @returns Array of alias strings, or null if none found
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
declare function extractAliases(content: XMLContent | undefined): Array<string> | null;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { extractAliases, parseXMLContent, parseXMLString, transformPermanentIdentificationUrl };
|