@@ -3,7 +3,7 @@ import { daFetch } from '../../../../utils/daFetch.js';
33
44const BLOCK_SCHEMA_PATH = '/.da/block-schema.json' ;
55
6- let BLOCK_SCHEMA_CACHE ;
6+ let blockSchemaCache ;
77
88export 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+
2426export 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
3238export function languageNameToCode ( languageName , projectLangs ) {
@@ -72,14 +78,14 @@ export function parseBlockSchema(schemaData) {
7278}
7379
7480export 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 */
131137function 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) {
207205export 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