aboutsummaryrefslogtreecommitdiff
path: root/webAO/utils
diff options
context:
space:
mode:
Diffstat (limited to 'webAO/utils')
-rw-r--r--webAO/utils/__tests__/aoml.test.ts113
-rw-r--r--webAO/utils/aoml.ts51
2 files changed, 131 insertions, 33 deletions
diff --git a/webAO/utils/__tests__/aoml.test.ts b/webAO/utils/__tests__/aoml.test.ts
new file mode 100644
index 0000000..fa8ade4
--- /dev/null
+++ b/webAO/utils/__tests__/aoml.test.ts
@@ -0,0 +1,113 @@
+import request from '../../services/request'
+import mlConfig from '../aoml';
+
+jest.mock('../../services/request')
+const networkRequest = `
+c0 = 247, 247, 247
+c0_name = White
+c0_talking = 1
+
+c2 = 247, 0, 57
+c2_name = Red
+c2_start = ~
+c2_end = ~
+c2_remove = 1
+c2_talking = 1
+
+c4 = 107, 198, 247
+c4_name = Blue
+c4_start = (
+c4_end = )
+c4_remove = 0
+c4_talking = 0
+
+c5 = 107, 198, 247
+c5_name = Blue
+c5_start = [
+c5_end = ]
+c5_remove = 1
+c5_talking = 0
+
+c6 = 107, 198, 247
+c6_name = Blue
+c6_start = |
+c6_end = |
+c6_remove = 0
+c6_talking = 0
+`
+
+const mockRequest = request as jest.MockedFunction<typeof request>;
+mockRequest.mockReturnValue(Promise.resolve(networkRequest))
+
+ describe('mlConfig', () => {
+ beforeEach(() => {
+ // Clear all instances and calls to constructor and all methods:
+ mockRequest.mockClear();
+
+ });
+
+ it('Should make a network request', () => {
+ mlConfig('localhost')
+ expect(mockRequest).toHaveBeenCalledTimes(1);
+ });
+ })
+ describe('applyMarkdown', () => {
+ const config = mlConfig('localhost')
+
+ beforeEach(() => {
+ // Clear all instances and calls to constructor and all methods:
+ mockRequest.mockClear();
+
+ });
+
+ it('Should create an array of spans containing letters', async () => {
+ const word = `hello`
+ const actual = await config.applyMarkdown(`hello`, `blue`)
+ let index = 0
+ for (const element of actual) {
+ expect(element.innerHTML).toBe(word[index])
+ index++
+ }
+ })
+ it('Should add colors based on settings', async () => {
+ const config = mlConfig('localhost')
+ const actual = await config.applyMarkdown(`(heya)`, `blue`)
+ expect(actual[0].getAttribute('style')).toBe('color: rgb(107, 198, 247);')
+ })
+ it('Should keep a letter if remove = 0', async () => {
+ const config = mlConfig('localhost')
+
+ const actual = await config.applyMarkdown(`(What())Hey!`, `white`)
+ const expected = `(`
+ expect(actual[5].innerHTML).toBe(expected)
+ })
+ it('Should remove a letter if remove = 1', async () => {
+ const config = mlConfig('localhost')
+
+ const actual = await config.applyMarkdown(`~What~()Hey!`, `white`)
+ const expected = ``
+ expect(actual[0].innerHTML).toBe(expected)
+ })
+ it('Should remove a letter if remove = 1', async () => {
+ const config = mlConfig('localhost')
+
+ const actual = await config.applyMarkdown(`~What~()Hey!`, `white`)
+ const expected = ``
+ expect(actual[0].innerHTML).toBe(expected)
+ })
+ it('Should keep a closing letter if remove = 0', async () => {
+ const config = mlConfig('localhost')
+
+ const actual = await config.applyMarkdown(`~NO[]~!`, `white`)
+ const expected = `]`
+ expect(actual[4].innerHTML).toBe(expected)
+ })
+ it('Should remove a closing letter if remove = 1', async () => {
+ const config = mlConfig('localhost')
+ const actual = await config.applyMarkdown(`~NO||~!`, `white`)
+ const expected = ``
+ expect(actual[5].innerHTML).toBe(expected)
+ })
+
+ })
+
diff --git a/webAO/utils/aoml.ts b/webAO/utils/aoml.ts
index 898d8fb..fb26db8 100644
--- a/webAO/utils/aoml.ts
+++ b/webAO/utils/aoml.ts
@@ -32,46 +32,34 @@ const aomlParser = (text: string) => {
return parsed
}
-
-
-
const mlConfig = (AO_HOST) => {
const defaultUrl = `${AO_HOST}themes/default/chat_config.ini`
- let aomlParsed: {[key: string]: Aoml} = {}
+ let aomlParsed: Promise<{[key: string]: Aoml}> = request(defaultUrl).then((data) => aomlParser(data));
- request(defaultUrl).then((data) => {
- aomlParsed = aomlParser(data)
- }
- );
+
- const createIdentifiers = () => {
+ const createIdentifiers = async () => {
const identifiers = new Map<string, Aoml>()
- for (const [ruleName, value] of Object.entries(aomlParsed)) {
- if (identifiers.has(value.start)) {
- throw new Error()
- }
- else if (value.start && value.end) {
+ for (const [ruleName, value] of Object.entries(await aomlParsed)) {
+ if (value.start && value.end) {
identifiers.set(value.start, value)
identifiers.set(value.end, value)
- }
-
-
+ }
}
return identifiers
}
- const createStartIdentifiers = () => {
+ const createStartIdentifiers = async () => {
const startingIdentifiers = new Set<string>()
- for (const [ruleName, value] of Object.entries(aomlParsed)) {
+ for (const [ruleName, value] of Object.entries(await aomlParsed)) {
if (value?.start && value?.end) {
startingIdentifiers.add(value.start)
}
}
return startingIdentifiers
}
-
- const applyMarkdown = (text: string, defaultColor: string) => {
- const identifiers = createIdentifiers()
- const startIdentifiers = createStartIdentifiers()
+ const applyMarkdown = async (text: string, defaultColor: string) => {
+ const identifiers = await createIdentifiers()
+ const startIdentifiers = await createStartIdentifiers()
const closingStack = []
const colorStack = []
// each value in output will be an html element
@@ -81,7 +69,8 @@ const mlConfig = (AO_HOST) => {
let currentIdentifier = identifiers.get(letter)
const currentClosingLetter = closingStack[closingStack.length-1]
const keepChar = Number(currentIdentifier?.remove) === 0
- console.log(startIdentifiers)
+ console.log(currentClosingLetter, letter, keepChar)
+
if (startIdentifiers.has(letter)) {
const color = identifiers.get(letter).color.split(',')
const r = color[0]
@@ -95,15 +84,11 @@ const mlConfig = (AO_HOST) => {
currentSelector.innerHTML = letter
}
} else if (currentClosingLetter === letter) {
- if (colorStack.length === 0) {
- currentSelector.className = `test_${defaultColor}`
- } else {
- const r = colorStack[colorStack.length-1][0]
- const g = colorStack[colorStack.length-1][1]
- const b = colorStack[colorStack.length-1][2]
- const currentColor = `color: rgb(${r},${g},${b});`
- currentSelector.setAttribute('style', currentColor)
- }
+ const r = colorStack[colorStack.length-1][0]
+ const g = colorStack[colorStack.length-1][1]
+ const b = colorStack[colorStack.length-1][2]
+ const currentColor = `color: rgb(${r},${g},${b});`
+ currentSelector.setAttribute('style', currentColor)
closingStack.pop()
colorStack.pop()
if (keepChar) {