w3d
Version:
Framework to create 3D web pages.
109 lines (88 loc) • 2.43 kB
JavaScript
/*
* ht3d.js
* Copyright 2017 Lucas Neves <lcneves@gmail.com>
*
* Exports a function that parses an HT3D string and returns a w3d object.
* Part of the Livre project.
*/
'use strict';
const Object3D = require('./object3d.js');
function parse (html, parentObject) {
var array = html.split('>');
for (let index = 0; index < array.length; index++) {
while (array[index].indexOf('<') > 0) {
var text = array[index].substring(0, array[index].indexOf('<')).trim();
var newTag = array[index].substring(array[index].indexOf('<')).trim();
array[index] = newTag;
if (text) { array.splice(index, 0, text); }
}
array[index] = array[index].trim();
}
function makeInitialProperties (object) {
object.setProperty('class', '');
object.setProperty('id', '');
}
function getTagName(line) {
var re = /^<(\w+)/gi;
var results = re.exec(line);
return results[1];
}
function getProps(line) {
var re = /([\w-]+)="([\w\s-]+)"/gi;
var results = [];
var prop;
while ((prop = re.exec(line)) !== null) {
let value = prop[1] === 'class' ? prop[2].split(' ') : prop[2];
results.push({ name: prop[1], value: value });
}
return results;
}
function checkSelfClose (line) {
return (line.charAt(line.length - 1) === '/');
}
function closeTag () {
if (currentObject) {
currentObject.makeText();
if (currentObject.parent) {
currentObject = currentObject.parent;
}
}
}
function parseTagLine (line) {
var tagName = getTagName(line);
var props = getProps(line);
if (tagName) {
var object = new Object3D();
object._parent = parentObject;
makeInitialProperties(object);
object.setProperty('tag', tagName);
for (let prop of props) {
object.setProperty(prop.name, prop.value);
}
object.makeStyle();
if (currentObject) {
currentObject.add(object);
}
currentObject = object;
}
if (checkSelfClose(line)) {
closeTag();
}
}
var currentObject = null;
for (let line of array) {
if (line.charAt(0) === '<') {
if (line.charAt(1) === '/') {
closeTag();
}
else {
parseTagLine(line);
}
}
else if (currentObject && line) {
currentObject.setProperty('text', line);
}
}
return currentObject;
}
module.exports.parse = parse;