Skip to content

Commit 50ea75b

Browse files
author
janaki-r-bhagwath
committed
Addressed Review comments.
1 parent cc2b5f0 commit 50ea75b

File tree

1 file changed

+40
-36
lines changed

1 file changed

+40
-36
lines changed

nx/blocks/loc/connectors/glaas/translationMetadata.js

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { daFetch } from '../../../../utils/daFetch.js';
33

44
const BLOCK_SCHEMA_PATH = '/.da/block-schema.json';
55

6-
let BLOCK_SCHEMA_CACHE;
6+
let blockSchemaCache;
77

88
export function processSchemaKey(schemaKey) {
99
const match = schemaKey.match(/^([\w-]+)\s*\((.*)\)$/);
@@ -21,12 +21,18 @@ export function processSchemaKey(schemaKey) {
2121
};
2222
}
2323

24+
const fieldKeyCache = new Map();
25+
2426
export function fieldNameToKey(fieldName) {
25-
return fieldName
27+
let key = fieldKeyCache.get(fieldName);
28+
if (key !== undefined) return key;
29+
key = fieldName
2630
.toLowerCase()
2731
.replace(/[^\w\s-]/g, '') // Remove special chars except word chars, spaces, hyphens
2832
.replace(/\s+/g, '-') // Replace spaces with hyphens
2933
.replace(/-+/g, '-'); // Collapse multiple hyphens
34+
fieldKeyCache.set(fieldName, key);
35+
return key;
3036
}
3137

3238
export function languageNameToCode(languageName, projectLangs) {
@@ -72,14 +78,14 @@ export function parseBlockSchema(schemaData) {
7278
}
7379

7480
export async function fetchBlockSchema(org, site, { reset = false } = {}) {
75-
if (BLOCK_SCHEMA_CACHE && !reset) return BLOCK_SCHEMA_CACHE;
81+
if (blockSchemaCache && !reset) return blockSchemaCache;
7682
const url = `${DA_ORIGIN}/source/${org}/${site}${BLOCK_SCHEMA_PATH}`;
7783
try {
7884
const resp = await daFetch(url);
7985
if (!resp.ok) return null;
8086
const schemaData = await resp.json();
8187
const parsedSchema = parseBlockSchema(schemaData);
82-
BLOCK_SCHEMA_CACHE = parsedSchema;
88+
blockSchemaCache = parsedSchema;
8389
return parsedSchema;
8490
} catch (error) {
8591
// eslint-disable-next-line no-console
@@ -129,17 +135,11 @@ export async function fetchKeywordsFile(org, site, pagePath) {
129135
* @param {Document} doc - Parsed HTML document
130136
*/
131137
function unwrapSoleParagraphs(doc) {
132-
doc.querySelectorAll('div[class]').forEach((block) => {
133-
const rows = block.querySelectorAll(':scope > div');
134-
rows.forEach((row) => {
135-
const columns = row.querySelectorAll(':scope > div');
136-
columns.forEach((div) => {
137-
if (div.children.length === 1 && div.children[0].tagName === 'P') {
138-
const pTag = div.children[0];
139-
div.replaceChildren(...pTag.childNodes);
140-
}
141-
});
142-
});
138+
doc.querySelectorAll('div[class] > div > div').forEach((div) => {
139+
if (div.children.length === 1 && div.children[0].tagName === 'P') {
140+
const pTag = div.children[0];
141+
div.replaceChildren(...pTag.childNodes);
142+
}
143143
});
144144
}
145145

@@ -174,19 +174,17 @@ export function annotateHTML(htmlContent, parsedSchema) {
174174
if (!parsedSchema || Object.keys(parsedSchema).length === 0) {
175175
return doc.body.innerHTML;
176176
}
177-
Object.values(parsedSchema).forEach((block) => {
177+
Object.entries(parsedSchema).forEach(([blockId, block]) => {
178178
const { selector, fields } = block;
179179
const blockElements = doc.querySelectorAll(selector);
180-
181180
blockElements.forEach((blockElement, blockIndex) => {
182-
const blockId = Object.keys(parsedSchema).find(
183-
(id) => parsedSchema[id].selector === selector,
184-
);
185181
const rows = blockElement.querySelectorAll(':scope > div');
186182
rows.forEach((row) => {
187-
const labelDiv = row.querySelector(':scope > div:nth-child(1)');
188-
const contentDiv = row.querySelector(':scope > div:nth-child(2)');
189-
if (!labelDiv || !contentDiv) return;
183+
const labelDiv = row.children[0];
184+
const contentDiv = row.children[1];
185+
if (!labelDiv || !contentDiv || labelDiv.tagName !== 'DIV' || contentDiv.tagName !== 'DIV') {
186+
return;
187+
}
190188
const field = fields.find((f) => isExactMatch(labelDiv, f.fieldName));
191189
if (!field) return;
192190
const { fieldName, fieldKey, charCount, keywordsInjection } = field;
@@ -207,11 +205,19 @@ export function annotateHTML(htmlContent, parsedSchema) {
207205
export function buildLanguageMetadata(keywordsData, langs) {
208206
if (!keywordsData || !langs) return {};
209207
const targetLangCodes = new Set(langs.map((lang) => lang.code));
208+
const langCodeByName = new Map();
209+
const getLangCode = (languageName) => {
210+
const normalizedName = languageName.toLowerCase();
211+
let code = langCodeByName.get(normalizedName);
212+
if (code === undefined) {
213+
code = languageNameToCode(languageName, langs);
214+
langCodeByName.set(normalizedName, code);
215+
}
216+
return code;
217+
};
210218
const langMetadata = {};
211-
Object.keys(keywordsData).forEach((key) => {
212-
if (key.startsWith(':')) return;
213-
const blockData = keywordsData[key];
214-
if (!blockData.data) return;
219+
Object.entries(keywordsData).forEach(([key, blockData]) => {
220+
if (key.startsWith(':') || !blockData?.data) return;
215221
// Parse the key: "aso-app (apple, listing) (1)" -> blockId + index
216222
const indexMatch = key.match(/\((\d+)\)$/);
217223
if (!indexMatch) return;
@@ -222,7 +228,7 @@ export function buildLanguageMetadata(keywordsData, langs) {
222228
blockData.data.forEach((entry) => {
223229
const languageName = entry.language;
224230
if (!languageName) return;
225-
const langCode = languageNameToCode(languageName, langs);
231+
const langCode = getLangCode(languageName);
226232
if (!langCode || !targetLangCodes.has(langCode)) return;
227233
if (!langMetadata[langCode]) {
228234
langMetadata[langCode] = {};
@@ -262,14 +268,12 @@ export async function addTranslationMetadata(org, site, langs, urls) {
262268
if (url.content && typeof url.content === 'string') {
263269
url.content = annotateHTML(url.content, blockSchema);
264270
}
265-
if (hasKeywords) {
266-
const keywordsData = await fetchKeywordsFile(org, site, url.suppliedPath);
267-
if (keywordsData) {
268-
const langMetadata = buildLanguageMetadata(keywordsData, langs);
269-
if (langMetadata && Object.keys(langMetadata).length > 0) {
270-
url.translationMetadata = langMetadata;
271-
}
272-
}
271+
if (!hasKeywords) return;
272+
const keywordsData = await fetchKeywordsFile(org, site, url.suppliedPath);
273+
if (!keywordsData) return;
274+
const langMetadata = buildLanguageMetadata(keywordsData, langs);
275+
if (langMetadata && Object.keys(langMetadata).length > 0) {
276+
url.translationMetadata = langMetadata;
273277
}
274278
}));
275279
}

0 commit comments

Comments
 (0)