@csvw-rdf-convertor/core
Version:
This library was generated with [Nx](https://nx.dev).
147 lines (146 loc) • 6.05 kB
JavaScript
export function findFormatedColumns(allColumns) {
const castedColumns = [];
for (const column of allColumns){
castedColumns.push(convertColumnToNumberFormattedColumn(column));
}
return castedColumns;
}
export function isNumberColumn(column) {
if (column.datatype) {
const dataType = column.datatype;
if (dataType.format) {
const format = dataType.format;
if (format.pattern) {
return true;
}
}
}
return false;
}
export function convertColumnToNumberFormattedColumn(column) {
if (column.datatype) {
const dataType = column.datatype;
if (dataType.format) {
const format = dataType.format;
if (format.pattern) {
return column;
}
}
}
}
function patternIsValid(pattern) {
//This probably doesnt encapsulate all the rules of a valid pattern.
let hasDecimal = false;
let hasGrouping = false;
for (const char of pattern){
if (char !== '#' && char != '0' && char != '.' && char != ',') {
return false;
}
if (char === '.') {
if (hasDecimal) {
return false;
}
hasDecimal = true;
} else if (char === ',') {
if (hasGrouping) {
return false;
}
hasGrouping = true;
}
}
return true;
}
export function transformNumber(value, columnDescription, issueTracker) {
if (columnDescription.datatype.format.pattern) {
if (!patternIsValid(columnDescription.datatype.format.pattern)) {
issueTracker.addError(`Invalid pattern: ${columnDescription.datatype.format.pattern} take a look at https://www.unicode.org/reports/tr35/tr35-39/tr35-numbers.html#Number_Patterns`, true);
return value;
}
const splitted = value.split('.');
if (splitted.length == 1) {
return value;
} else if (splitted.length == 2) {
const decimalChar = columnDescription.datatype.format.decimalChar || '.';
const groupChar = columnDescription.datatype.format.groupChar || ',';
const pattern = columnDescription.datatype.format.pattern;
const decimalPart = splitted[1];
const integerPart = splitted[0];
const splittedPattern = pattern.split('.');
const integerPattern = splittedPattern[0];
const decimalPattern = splittedPattern[1];
const reversedIntegerPart = integerPart.split('').reverse().join('');
const reversedIntegerPattern = integerPattern.split('').reverse().join('');
const transformedNumber = transformNumberInner(reversedIntegerPattern, reversedIntegerPart, groupChar).split('').reverse().join('') + decimalChar + transformNumberInner(decimalPattern, decimalPart, groupChar); //merging the integer and decimal parts on decimalChar
const stringTransformedNumber = +transformedNumber;
return stringTransformedNumber.toString();
} else {
issueTracker.addError(`Too many decimal characters in value: ${value}`, true);
return value;
}
}
return value;
}
function transformNumberInner(pattern, number, groupChar) {
let transformedPart = '';
let patternLongerThanNumber = false;
let numberIndex = 0;
for(let i = 0; i < pattern.length; i++){
if (numberIndex == number.length) {
patternLongerThanNumber = true;
}
if (pattern[i] == '0') {
transformedPart += patternLongerThanNumber ? '0' : number[numberIndex];
numberIndex++;
} else if (pattern[i] == '#' && !patternLongerThanNumber) {
transformedPart += number[numberIndex] || '';
numberIndex++;
} else if (pattern[i] == ',' && !patternLongerThanNumber) {
transformedPart += groupChar;
} else if (pattern[i] == 'E' || pattern[i] == 'e') {
transformedPart += 'E'; //this will be taken care later using + operation at let stringTransformedNumber = +transformedNumber;
}
}
/*
if (!patternLongerThanNumber) {
//add the rest of the number
//maybe this should not happend in case of decimal part, as shown in the table https://www.unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns
transformedPart += number.substring(pattern.length);
}*/ return transformedPart;
} /**
* Transforms numeric values in a JSON table string based on the column formatting
* specified in the provided descriptor. The transformation is applied to columns
* that are identified as requiring formatting.
*
* @param jsonTable - The JSON table as a string where numeric values need to be transformed.
* @param descriptor - The descriptor wrapper containing metadata about the table schema and columns.
* @param issueTracker - An issue tracker instance to log any issues encountered during transformation.
* @returns The transformed JSON table as a string with formatted numeric values.
*/ /*
export function transformNumbersInTable(
jsonTable: string,
descriptor: DescriptorWrapper,
issueTracker: IssueTracker
): string {
const rgxForNumberRowInJson = `\\s*:\\s*"\\d*\\.*\\d*"`;
const regexForNumberInJson = /"(\d*\.?\d*)"/;
const colums = descriptor.descriptor.tableSchema?.columns;
if (colums) {
const formatedColumns = findFormatedColumns(colums);
for (const column of formatedColumns) {
if (column.name) {
const regex = new RegExp(
`"${column.name}"${rgxForNumberRowInJson}`,
'g'
);
jsonTable = jsonTable.replace(regex, (match) => {
const value = match.match(regexForNumberInJson)?.[1] || '';
const transformedValue = transformNumber(value, column, issueTracker);
return match.replace(value, transformedValue);
});
}
}
}
return jsonTable;
}
*/
//# sourceMappingURL=number-formating.js.map