UNPKG

@sap-ux/i18n

Version:

Library for i18n

106 lines 3.75 kB
import { csvPath, discoverLineEnding, getI18nConfiguration, doesExist, readFile, writeFile } from '../../utils/index.js'; import { TextDocument } from 'vscode-languageserver-textdocument'; import { Range, Position } from '@sap-ux/text-document-utils'; import { parseCsv } from '../../parser/csv/parser/index.js'; /** * Add CSV text for fallback. * * @param text csv text * @param eol end of line * @param newEntries new i18n entries * @param headerFields header fields of csv * @param fallbackLocale fallback local * @returns csv text */ function addFallbackCsvText(text, eol, newEntries, headerFields, fallbackLocale) { let newText = ''; for (const entry of newEntries) { newText += `${entry.key};`; for (let column = 1; column < headerFields.length; column++) { const columnHeader = headerFields[column]; if (columnHeader.value === fallbackLocale) { newText += `${entry.value}`; } if (column + 1 !== headerFields.length) { newText += ';'; } } newText += eol; } if (text.endsWith(eol)) { return text + newText; } return text + eol + newText; } /** * Add csv text. * * @param text csv text * @param fallbackLocale fallback local * @param newEntries new i18n entries that will be maintained * @returns csv text */ export function addCsvTexts(text, fallbackLocale, newEntries) { const { ast } = parseCsv(text); const eol = discoverLineEnding(text); const headerFields = ast.header.fields; if (headerFields.length === 0) { let newText = `key;${fallbackLocale}${eol}`; for (const entry of newEntries) { newText += `${entry.key};${entry.value}${eol}`; } return text + newText; } const fallbackFieldIndex = headerFields.findIndex((field) => field.value === fallbackLocale); if (fallbackFieldIndex !== -1) { return addFallbackCsvText(text, eol, newEntries, headerFields, fallbackLocale); } const document = TextDocument.create('', '', 0, text); const edits = []; edits.push({ newText: `;${fallbackLocale}`, range: Range.create(0, ast.header.range.end.character, 0, ast.header.range.end.character) }); for (const row of ast.rows) { edits.push({ newText: `;`, range: Range.create(row.range.end, row.range.end) }); } let newText = `${eol}`; for (const entry of newEntries) { newText += `${entry.key};`; for (let column = 1; column < headerFields.length; column++) { newText += ';'; } newText += `${entry.value}${eol}`; } const lastRow = ast.rows.slice(-1)[0]; const position = lastRow ? lastRow.range.end : Position.create(1, 0); edits.push({ newText, range: Range.create(position, position) }); return TextDocument.applyEdits(document, edits); } /** * Try add new i18n entries to csv file. * * @param env cds environment * @param path file path * @param newI18nEntries new i18n entries that will be maintained * @param fs optional `mem-fs-editor` instance. If provided, `mem-fs-editor` api is used instead of `fs` of node * @returns boolean */ export async function tryAddCsvTexts(env, path, newI18nEntries, fs) { const i18nFilePath = csvPath(path); if (!(await doesExist(i18nFilePath))) { return false; } const { defaultLanguage } = getI18nConfiguration(env); const content = await readFile(i18nFilePath, fs); const newContent = addCsvTexts(content, defaultLanguage, newI18nEntries); await writeFile(i18nFilePath, newContent, fs); return true; } //# sourceMappingURL=csv.js.map