Merge pull request #874 from pano9000/refactor_sanitizeAttributeName

refactor(sanitizeAttributeName): simplify function and export
This commit is contained in:
Elian Doran 2025-01-02 20:01:50 +02:00 committed by GitHub
commit 6a9c8ff8dd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 55 additions and 22 deletions

View File

@ -0,0 +1,43 @@
import sanitizeAttributeName from "../src/services/sanitize_attribute_name"
import { describe, it, execute, expect } from "./mini_test";
// fn value, expected value
const testCases: [fnValue: string, expectedValue: string][] = [
["testName", "testName"],
["test_name", "test_name"],
["test with space", "test_with_space"],
["test:with:colon", "test:with:colon"],
// numbers
["123456", "123456"],
["123:456", "123:456"],
["123456 abc", "123456_abc"],
// non-latin characters
["ε", "ε"],
["attribute ε", "attribute_ε"],
// special characters
["test/name", "test_name"],
["test%name", "test_name"],
["\/", "_"],
// empty string
["", "unnamed"],
]
describe("sanitizeAttributeName unit tests", () => {
testCases.forEach(testCase => {
return it(`'${testCase[0]}' should return '${testCase[1]}'`, () => {
const [value, expected] = testCase;
const actual = sanitizeAttributeName(value);
expect(actual).toEqual(expected);
})
})
})
execute()

View File

@ -174,7 +174,7 @@ class BAttribute extends AbstractBeccaEntity<BAttribute> {
this.validate();
}
this.name = sanitizeAttributeName.sanitizeAttributeName(this.name);
this.name = sanitizeAttributeName(this.name);
if (!this.value) {
// null value isn't allowed

View File

@ -3,7 +3,7 @@
import imageType from "image-type";
import imageService from "../../services/image.js";
import noteService from "../../services/notes.js";
import sanitize_attribute_name from "../../services/sanitize_attribute_name.js";
import sanitizeAttributeName from "../../services/sanitize_attribute_name.js";
import specialNotesService from "../../services/special_notes.js";
import { Request } from 'express';
@ -44,7 +44,7 @@ async function uploadImage(req: Request) {
const labels = JSON.parse(labelsStr);
for (const { name, value } of labels) {
note.setLabel(sanitize_attribute_name.sanitizeAttributeName(name), value);
note.setLabel(sanitizeAttributeName(name), value);
}
}
@ -73,7 +73,7 @@ function saveNote(req: Request) {
if (req.body.labels) {
for (const { name, value } of req.body.labels) {
note.setLabel(sanitize_attribute_name.sanitizeAttributeName(name), value);
note.setLabel(sanitizeAttributeName(name), value);
}
}

View File

@ -754,7 +754,7 @@ class ConsistencyChecks {
const attrNames = sql.getColumn<string>(`SELECT DISTINCT name FROM attributes`);
for (const origName of attrNames) {
const fixedName = sanitizeAttributeName.sanitizeAttributeName(origName);
const fixedName = sanitizeAttributeName(origName);
if (fixedName !== origName) {
if (this.autoFix) {

View File

@ -151,7 +151,7 @@ function importEnex(taskContext: TaskContext, file: File, parentNote: BNote): Pr
labelName = 'pageUrl';
}
labelName = sanitizeAttributeName.sanitizeAttributeName(labelName || "");
labelName = sanitizeAttributeName(labelName || "");
if (note.attributes) {
note.attributes.push({
@ -202,7 +202,7 @@ function importEnex(taskContext: TaskContext, file: File, parentNote: BNote): Pr
} else if (currentTag === 'tag' && note.attributes) {
note.attributes.push({
type: 'label',
name: sanitizeAttributeName.sanitizeAttributeName(text),
name: sanitizeAttributeName(text),
value: ''
})
}

View File

@ -1,18 +1,8 @@
function sanitizeAttributeName(origName: string) {
let fixedName: string;
if (origName === '') {
fixedName = "unnamed";
}
else {
export default function sanitizeAttributeName(origName: string) {
const fixedName = (origName === '')
? "unnamed"
: origName.replace(/[^\p{L}\p{N}_:]/ug, "_");
// any not allowed character should be replaced with underscore
fixedName = origName.replace(/[^\p{L}\p{N}_:]/ug, "_");
}
return fixedName;
}
export default {
sanitizeAttributeName
};
}