Skip to content

Commit

Permalink
Merge 542c2a7 into 90c09fd
Browse files Browse the repository at this point in the history
  • Loading branch information
justinwilaby committed May 18, 2021
2 parents 90c09fd + 542c2a7 commit 5845f81
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 4 deletions.
Binary file modified lib/sax-wasm.wasm
Binary file not shown.
20 changes: 18 additions & 2 deletions src/js/__test__/cdada.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ describe('When parsing XML, the SaxWasm', () => {
let _data: Text[];

before(async () => {
parser = new SAXParser(SaxEventType.Cdata | SaxEventType.Cdata);
parser = new SAXParser(SaxEventType.Cdata);
_data = [];
_event = 0;

Expand All @@ -29,11 +29,27 @@ describe('When parsing XML, the SaxWasm', () => {
parser.end();
});

it('should report CDATA correctly', () => {
it('should report CDATA (upper case) correctly', () => {
parser.write(Buffer.from('<div><![CDATA[ did you know "x < y" & "z > y"? so I guess that means that z > x ]]></div>'));
const {start, end, value} = _data[0];
deepStrictEqual(JSON.parse(JSON.stringify(start)), { line: 0, character: 7 });
deepStrictEqual(JSON.parse(JSON.stringify(end)), { line: 0, character: 82 });
strictEqual(value, ' did you know "x < y" & "z > y"? so I guess that means that z > x ');
});

it('should report cdata (lower case) correctly', () => {
parser.write(Buffer.from('<div><![cdata[ did you know "x < y" & "z > y"? so I guess that means that z > x ]]></div>'));
const {start, end, value} = _data[0];
deepStrictEqual(JSON.parse(JSON.stringify(start)), { line: 0, character: 7 });
deepStrictEqual(JSON.parse(JSON.stringify(end)), { line: 0, character: 82 });
strictEqual(value, ' did you know "x < y" & "z > y"? so I guess that means that z > x ');
});

it('should report cDaTa (mixed case) correctly', () => {
parser.write(Buffer.from('<div><![cDaTa[ did you know "x < y" & "z > y"? so I guess that means that z > x ]]></div>'));
const {start, end, value} = _data[0];
deepStrictEqual(JSON.parse(JSON.stringify(start)), { line: 0, character: 7 });
deepStrictEqual(JSON.parse(JSON.stringify(end)), { line: 0, character: 82 });
strictEqual(value, ' did you know "x < y" & "z > y"? so I guess that means that z > x ');
});
});
55 changes: 55 additions & 0 deletions src/js/__test__/doctype.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { SaxEventType, SAXParser, Text } from '../saxWasm';
import { readFileSync } from 'fs';
import { resolve } from 'path';
import { deepStrictEqual, strictEqual } from 'assert';

const saxWasm = readFileSync(resolve(__dirname, '../../../lib/sax-wasm.wasm'));
describe('When parsing XML, the SaxWasm', () => {
let parser: SAXParser;
let _event: SaxEventType;
let _data: Text[];

before(async () => {
parser = new SAXParser(SaxEventType.Doctype);
_data = [];
_event = 0;

parser.eventHandler = function (event, data) {
_event = event;
_data.push(data as Text);
};
return parser.prepareWasm(saxWasm);
});

beforeEach(() => {
_data = [];
});

afterEach(() => {
parser.end();
});

it('should report DOCTYPE (upper case) correctly', () => {
parser.write(Buffer.from('<!DOCTYPE html>\n<body><div>Hello HTML!</div></body>'));
const {start, end, value} = _data[0];
deepStrictEqual(JSON.parse(JSON.stringify(start)), { line: 0, character: 2 });
deepStrictEqual(JSON.parse(JSON.stringify(end)), { line: 0, character: 14 });
strictEqual(value, 'html');
});

it('should report doctype (lower case) correctly', () => {
parser.write(Buffer.from('<!doctype html>\n<body><div>Hello HTML!</div></body>'));
const {start, end, value} = _data[0];
deepStrictEqual(JSON.parse(JSON.stringify(start)), { line: 0, character: 2 });
deepStrictEqual(JSON.parse(JSON.stringify(end)), { line: 0, character: 14 });
strictEqual(value, 'html');
});

it('should report DocType (mixed case) correctly', () => {
parser.write(Buffer.from('<!DocType html>\n<body><div>Hello HTML!</div></body>'));
const {start, end, value} = _data[0];
deepStrictEqual(JSON.parse(JSON.stringify(start)), { line: 0, character: 2 });
deepStrictEqual(JSON.parse(JSON.stringify(end)), { line: 0, character: 14 });
strictEqual(value, 'html');
});
});
8 changes: 6 additions & 2 deletions src/sax/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use std::str;

use sax::names::*;
use sax::tag::*;
use sax::utils::ascii_icompare;

static BOM: &'static [u8; 3] = &[0xef, 0xbb, 0xbf];

Expand Down Expand Up @@ -245,22 +246,25 @@ impl SAXParser {

fn sgml_decl(&mut self, grapheme: &str) {
let is_sgml_char = match &self.sgml_decl.value as &str {
"[CDATA[" => {
sgml if ascii_icompare("[cdata[", sgml) == true => {
self.state = State::Cdata;
self.cdata.value.push_str(grapheme);
self.cdata.start = (self.line, self.character - 8);
false
}

"--" => {
self.state = State::Comment;
self.comment.start = (self.line, self.character - 4);
false
}
"DOCTYPE" => {

sgml if ascii_icompare("doctype", sgml) == true => {
self.state = State::Doctype;
self.doctype.start = (self.line, self.character - 8);
false
}

_ => true,
};

Expand Down
13 changes: 13 additions & 0 deletions src/sax/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,19 @@ pub fn uint_to_string(mut uint: u32) -> String {
s
}

pub fn ascii_icompare(expected: &str, test: &str) -> bool {
if expected.len() != test.len() {
return false;
}
for (e, t) in expected.chars().zip(test.chars()) {
let char_diff = (e as i8) - (t as i8);
if !(char_diff == 0 || char_diff == 32) {
return false;
}
}
true
}

pub fn to_char_code(grapheme: &str) -> u32 {
let bytes = grapheme.as_bytes();
let len = bytes.len();
Expand Down

0 comments on commit 5845f81

Please sign in to comment.