diff --git a/components.d.ts b/components.d.ts index f2c3146f..571713e8 100644 --- a/components.d.ts +++ b/components.d.ts @@ -3,11 +3,9 @@ // @ts-nocheck // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 -import '@vue/runtime-core' - export {} -declare module '@vue/runtime-core' { +declare module 'vue' { export interface GlobalComponents { '404.page': typeof import('./src/pages/404.page.vue')['default'] About: typeof import('./src/pages/About.vue')['default'] @@ -179,6 +177,7 @@ declare module '@vue/runtime-core' { 'Tool.layout': typeof import('./src/layouts/tool.layout.vue')['default'] ToolCard: typeof import('./src/components/ToolCard.vue')['default'] UlidGenerator: typeof import('./src/tools/ulid-generator/ulid-generator.vue')['default'] + UnicodeCharactersToJavaEntities: typeof import('./src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.vue')['default'] UrlEncoder: typeof import('./src/tools/url-encoder/url-encoder.vue')['default'] UrlParser: typeof import('./src/tools/url-parser/url-parser.vue')['default'] UserAgentParser: typeof import('./src/tools/user-agent-parser/user-agent-parser.vue')['default'] diff --git a/locales/en.yml b/locales/en.yml index d09d435a..23a4bb89 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -391,3 +391,7 @@ tools: text-to-binary: title: Text to ASCII binary description: Convert text to its ASCII binary representation and vice-versa. + + unicode-to-java-entities: + title: Unicode Characters to Java Entities Converter + description: Unicode Characters to Java Entities Converter and vice-versa \ No newline at end of file diff --git a/locales/vi.yml b/locales/vi.yml index 9eb16bf0..6698502b 100644 --- a/locales/vi.yml +++ b/locales/vi.yml @@ -380,3 +380,7 @@ tools: text-to-binary: title: Chuyển đổi văn bản thành nhị phân ASCII description: Chuyển đổi văn bản thành biểu diễn nhị phân ASCII của nó và ngược lại. + + unicode-to-java-entities: + title: Chuyển đổi ký tự Unicode sang thực thể Java + description: Chuyển đổi ký tự Unicode sang thực thể Java và ngược lại \ No newline at end of file diff --git a/src/tools/index.ts b/src/tools/index.ts index aa861c93..dda8cbf0 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -81,6 +81,7 @@ import { tool as uuidGenerator } from './uuid-generator'; import { tool as macAddressLookup } from './mac-address-lookup'; import { tool as xmlFormatter } from './xml-formatter'; import { tool as yamlViewer } from './yaml-viewer'; +import { tool as unicodeToJavaEntities } from './unicode-characters-to-java-entities-converter'; export const toolsByCategory: ToolCategory[] = [ { @@ -107,6 +108,7 @@ export const toolsByCategory: ToolCategory[] = [ listConverter, tomlToJson, tomlToYaml, + unicodeToJavaEntities, ], }, { diff --git a/src/tools/unicode-characters-to-java-entities-converter/index.ts b/src/tools/unicode-characters-to-java-entities-converter/index.ts new file mode 100644 index 00000000..8adebcf3 --- /dev/null +++ b/src/tools/unicode-characters-to-java-entities-converter/index.ts @@ -0,0 +1,13 @@ +import { TextWrapDisabled } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.unicode-to-java-entities.title'), + path: '/unicode-to-java-entities', + description: translate('tools.unicode-to-java-entities.description'), + keywords: ['java-entities', 'to', 'unicode', 'text'], + component: () => import('./unicode-characters-to-java-entities.vue'), + icon: TextWrapDisabled, + createdAt: new Date('2024-05-16'), +}); diff --git a/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.service.ts b/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.service.ts new file mode 100644 index 00000000..6acd6b37 --- /dev/null +++ b/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.service.ts @@ -0,0 +1,63 @@ +function strlenFix(str: string): string { + while (str.length < 4) { + str = `0${str}`; + } + return str; +} + +function parseUnicodeToJavaEntities(source: string): string { + let result = ''; + + for (let i = 0; i < source.length; i++) { + const charCode = source.charCodeAt(i); + if (charCode <= 127) { + result += source.charAt(i); + } + else { + result += `\\u${strlenFix(charCode.toString(16).toUpperCase())}`; + } + } + return result; +} + +function parseJavaEntitiesToUnicode(source: string): string { + let result = ''; + let state: 0 | 1 | 2 = 0; + let chars = 0; + let value = ''; + for (let i = 0; i < source.length; i++) { + switch (state) { + case 0: + if (source.charAt(i) === '\\') { + state = 1; + } + else { + result += source.charAt(i); + } + break; + case 1: + if (source.charAt(i) === 'u') { + state = 2; + chars = 0; + value = ''; + } + else { + result += `\\${source.charAt(i)}`; + state = 0; + } + break; + case 2: + chars++; + value += source.charAt(i); + if (chars >= 4) { + result += String.fromCharCode(Number.parseInt(value, 16)); + state = 0; + } + break; + } + } + + return result; +} + +export { parseUnicodeToJavaEntities, parseJavaEntitiesToUnicode }; diff --git a/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.test.ts b/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.test.ts new file mode 100644 index 00000000..88c617bc --- /dev/null +++ b/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from 'vitest'; +import { parseJavaEntitiesToUnicode, parseUnicodeToJavaEntities } from './unicode-characters-to-java-entities.service'; + +describe('unicode-to-entities', () => { + describe('convertTextToUnicode', () => { + it('a unicode string is converted to java entities representation', () => { + expect(parseUnicodeToJavaEntities('là')).toBe('l\\u00E0'); + expect(parseUnicodeToJavaEntities('sơn tùng MTP')).toBe('s\\u01A1n t\\u00F9ng MTP'); + expect(parseUnicodeToJavaEntities('')).toBe(''); + }); + }); + + describe('entities-to-unicode', () => { + it('java entities string is converted to its unicode representation', () => { + expect(parseJavaEntitiesToUnicode('l\u00E0')).toBe('là'); + expect(parseJavaEntitiesToUnicode('s\u01A1n t\u00F9ng MTP')).toBe('sơn tùng MTP'); + expect(parseJavaEntitiesToUnicode('')).toBe(''); + }); + }); +}); diff --git a/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.vue b/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.vue new file mode 100644 index 00000000..817f437a --- /dev/null +++ b/src/tools/unicode-characters-to-java-entities-converter/unicode-characters-to-java-entities.vue @@ -0,0 +1,34 @@ + + +