Skip to content

Commit

Permalink
JSX Support
Browse files Browse the repository at this point in the history
  • Loading branch information
justinwilaby committed Aug 17, 2018
1 parent af1da21 commit ba63508
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 16 deletions.
27 changes: 17 additions & 10 deletions src/js/__test__/attribute.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,25 @@ describe('SaxWasm', () => {
let parser: SAXParser;
let _event: number;
let _data: Attribute[];
beforeEach(async () => {

beforeAll(async () => {
parser = new SAXParser(SaxEventType.Attribute);
_data = [] as Attribute[];
_event = 0;

parser.eventHandler = function (event:SaxEventType, data:Attribute) {
_event |= event as number;
parser.eventHandler = function (event: SaxEventType, data: Attribute) {
_event = event as number;
_data.push(data);
};
return parser.prepareWasm(saxWasm);
});

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

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

it('should recognize attribute names', () => {
parser.write('<body class="main"></body>');
expect(_event).toBe(SaxEventType.Attribute);
Expand Down Expand Up @@ -67,13 +74,13 @@ describe('SaxWasm', () => {

parser.write(html);
expect(_event).toBe(SaxEventType.Attribute);
expect(_data[0].start).toEqual({ line: 2, character: 2 });
expect(_data[0].end).toEqual({ line: 2, character: 16 });
expect(_data[1].start).toEqual({ line: 3, character: 2 });
expect(_data[1].end).toEqual({ line: 3, character: 26 });
expect(_data[0].start).toEqual({line: 2, character: 2});
expect(_data[0].end).toEqual({line: 2, character: 16});
expect(_data[1].start).toEqual({line: 3, character: 2});
expect(_data[1].end).toEqual({line: 3, character: 26});
});

it ('should report namespaces as attributes', () => {
it('should report namespaces as attributes', () => {
parser.write(`<x xmlns:edi='http://ecommerce.example.org/schema'></x>`);
expect(_event).toBe(SaxEventType.Attribute);
expect(_data[0].name).toBe('xmlns:edi');
Expand Down
8 changes: 8 additions & 0 deletions src/js/__test__/jsx.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ describe('When parsing JSX, the SaxWasm', () => {
return parser.prepareWasm(saxWasm);
});

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

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

it('should recognize child tags within Javascriopt', () => {
parser.write(`
<Component>
Expand Down
12 changes: 11 additions & 1 deletion src/js/__test__/procInst.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,25 @@ describe('When parsing JSX, the SaxWasm', () => {
let parser: SAXParser;
let _event: number;
let _data: string;
beforeEach(async () => {

beforeAll(async () => {
parser = new SAXParser(SaxEventType.ProcessingInstruction);

parser.eventHandler = function (event: SaxEventType, data: string) {
_event = event as number;
_data = data;
};
return parser.prepareWasm(saxWasm);
});

beforeEach(() => {
_data = '';
});

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

it('should recognize Processing Instructions', () => {
parser.write('<?xml version="1.0" encoding="utf-8"?>');
expect(_event).toBe(SaxEventType.ProcessingInstruction);
Expand Down
10 changes: 9 additions & 1 deletion src/js/__test__/tag.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@ describe('SaxWasm', () => {
return parser.prepareWasm(saxWasm);
});

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

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

it('should report the SaxEventType.OpenTagStart', () => {
parser.write('<div class="myDiv">This is my div</div>');
expect(_event & SaxEventType.OpenTagStart).toBeTruthy();
Expand Down Expand Up @@ -71,6 +79,6 @@ describe('SaxWasm', () => {
parser.events = SaxEventType.Text;
parser.write('<div><a href="http://github.com">GitHub</a></orphan></div>');
expect(_event).toBe(SaxEventType.Text);
expect(_data[1]).toBe('</orphan>')
expect(_data[1]).toBe('</orphan>');
});
});
6 changes: 5 additions & 1 deletion src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,14 @@ async function runProgram() {
const linearMemory = result.instance.exports.memory;
const document = `<> <p></p> </>`;
const docBuff = Buffer.from(document);
const memBuff = new Uint8Array(linearMemory.buffer, 0, docBuff.length);
let memBuff = new Uint8Array(linearMemory.buffer, 0, docBuff.length);
const s = memBuff.set(docBuff, 0);
result.instance.exports.parser(0b111111111111);
result.instance.exports.write(0, memBuff.length);
result.instance.exports.end();
memBuff = new Uint8Array(linearMemory.buffer, 0, docBuff.length);
memBuff.set(docBuff, 0);
result.instance.exports.write(0, memBuff.length);
}

runProgram().catch();
4 changes: 1 addition & 3 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,7 @@ pub unsafe extern fn write(ptr: *mut u8, length: usize) {

#[no_mangle]
pub extern fn end() {
let parser = get_parser();
parser.character = 0;
parser.line = 0;
get_parser().identity();
}

extern "C" {
Expand Down
10 changes: 10 additions & 0 deletions src/sax/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,16 @@ impl<'a> SAXParser<'a> {
}
}

pub fn identity(&mut self) {
self.character = 0;
self.line = 0;
self.state = State::Begin;
self.text = "".to_string();
self.saw_root = false;
self.closed_root = false;
self.attribute = Attribute::new();
}

fn process_grapheme(&mut self, grapheme: &'a str) {
if grapheme == "\n" {
self.line += 1;
Expand Down

0 comments on commit ba63508

Please sign in to comment.