Browse Source

Update parser

pull/36/head
Artur Arseniev 10 years ago
parent
commit
65f7ac241c
  1. 2
      index.html
  2. 33
      src/dom_components/main.js
  3. 7
      src/dom_components/model/Component.js
  4. 20
      src/dom_components/model/ComponentImage.js
  5. 18
      src/dom_components/model/ComponentLink.js
  6. 19
      src/dom_components/model/ComponentMap.js
  7. 31
      src/dom_components/model/ComponentVideo.js
  8. 5
      src/parser/main.js
  9. 16
      src/parser/model/ParserHtml.js
  10. 89
      test/specs/dom_components/model/Component.js

2
index.html

@ -36,6 +36,8 @@
<div class="menu-item">WEB</div> <div class="menu-item">WEB</div>
</nav> </nav>
<div class="clearfix"></div> <div class="clearfix"></div>
<iframe class="c3043" src="http://www.youtube.com/embed/jNQXAC9IVRw?"></iframe>
<iframe src="https://maps.google.com/maps?&q=London, UK&z=11&t=q&output=embed"></iframe>
<div class="lead-title">Build your templates without coding</div> <div class="lead-title">Build your templates without coding</div>
<div class="sub-lead-title">All text blocks could be edited easily with double clicking on it. You can create new text blocks with the command from the left panel</div> <div class="sub-lead-title">All text blocks could be edited easily with double clicking on it. You can create new text blocks with the command from the left panel</div>
<div class="lead-btn">Hover me</div> <div class="lead-btn">Hover me</div>

33
src/dom_components/main.js

@ -42,30 +42,30 @@ define(function(require) {
ComponentView = require('./view/ComponentView'); ComponentView = require('./view/ComponentView');
var component, componentView; var component, componentView;
var defaultTypes = { var defaultTypes = {
'default': { 'map': {
model: Component, model: require('./model/ComponentMap'),
view: ComponentView, view: require('./view/ComponentMapView'),
},
'text': {
model: require('./model/ComponentText'),
view: require('./view/ComponentTextView'),
},
'image': {
model: require('./model/ComponentImage'),
view: require('./view/ComponentImageView'),
}, },
'link': { 'link': {
model: require('./model/ComponentLink'), model: require('./model/ComponentLink'),
view: require('./view/ComponentLinkView'), view: require('./view/ComponentLinkView'),
}, },
'map': {
model: require('./model/ComponentMap'),
view: require('./view/ComponentMapView'),
},
'video': { 'video': {
model: require('./model/ComponentVideo'), model: require('./model/ComponentVideo'),
view: require('./view/ComponentVideoView'), view: require('./view/ComponentVideoView'),
} },
'image': {
model: require('./model/ComponentImage'),
view: require('./view/ComponentImageView'),
},
'text': {
model: require('./model/ComponentText'),
view: require('./view/ComponentTextView'),
},
'default': {
model: Component,
view: ComponentView,
},
}; };
return { return {
@ -119,6 +119,7 @@ define(function(require) {
c.rte = c.em.get('rte') || ''; c.rte = c.em.get('rte') || '';
c.modal = c.em.get('Modal') || ''; c.modal = c.em.get('Modal') || '';
c.am = c.em.get('AssetManager') || ''; c.am = c.em.get('AssetManager') || '';
c.em.get('Parser').compTypes = defaultTypes;
} }
component = new Component(c.wrapper, { component = new Component(c.wrapper, {

7
src/dom_components/model/Component.js

@ -194,11 +194,8 @@ define(['backbone','./Components', 'SelectorManager/model/Selectors', 'TraitMana
* @private * @private
*/ */
isComponent: function(el) { isComponent: function(el) {
var result = ''; return {tagName: el.tagName ? el.tagName.toLowerCase() : ''};
if(el.tagName == 'DIV') },
result = {tagName: 'div'};
return result;
}
}); });
}); });

20
src/dom_components/model/ComponentImage.js

@ -4,6 +4,7 @@ define(['./Component'],
return Component.extend({ return Component.extend({
defaults: _.extend({}, Component.prototype.defaults, { defaults: _.extend({}, Component.prototype.defaults, {
type: 'image',
tagName: 'img', tagName: 'img',
src: '', src: '',
void: 1, void: 1,
@ -31,5 +32,24 @@ define(['./Component'],
return attr; return attr;
} }
},{
/**
* Detect if the passed element is a valid component.
* In case the element is valid an object abstracted
* from the element will be returned
* @param {HTMLElement}
* @return {Object}
* @private
*/
isComponent: function(el) {
var result = '';
if(el.tagName == 'IMG'){
result = {type: 'image', tagName: 'img'};
result.src = el.src;
}
return result;
},
}); });
}); });

18
src/dom_components/model/ComponentLink.js

@ -8,5 +8,23 @@ define(['./ComponentText'],
traits: ['title', 'href', 'target'], traits: ['title', 'href', 'target'],
}), }),
},{
/**
* Detect if the passed element is a valid component.
* In case the element is valid an object abstracted
* from the element will be returned
* @param {HTMLElement}
* @return {Object}
* @private
*/
isComponent: function(el) {
var result = '';
if(el.tagName == 'A'){
result = {type: 'link', tagName: 'a'};
}
return result;
},
}); });
}); });

19
src/dom_components/model/ComponentMap.js

@ -33,5 +33,24 @@ define(['./ComponentImage'],
}], }],
}), }),
},{
/**
* Detect if the passed element is a valid component.
* In case the element is valid an object abstracted
* from the element will be returned
* @param {HTMLElement}
* @return {Object}
* @private
*/
isComponent: function(el) {
var result = '';
if(el.tagName == 'IFRAME' &&
/maps\.google\.com/.test(el.src) ){
result = {type: 'map', src: el.src, tagName: 'iframe'};
}
return result;
},
}); });
}); });

31
src/dom_components/model/ComponentVideo.js

@ -242,5 +242,36 @@ define(['./ComponentImage'],
return url; return url;
}, },
},{
/**
* Detect if the passed element is a valid component.
* In case the element is valid an object abstracted
* from the element will be returned
* @param {HTMLElement}
* @return {Object}
* @private
*/
isComponent: function(el) {
var result = '';
var isYtProv = /youtube\.com\/embed/.test(el.src);
var isViProv = /player\.vimeo\.com\/video/.test(el.src);
var isExtProv = isYtProv || isViProv;
if(el.tagName == 'VIDEO' ||
(el.tagName == 'IFRAME' && isExtProv) ){
result = {type: 'video', tagName: 'video'};
if(el.src)
result.src = el.src;
if(isExtProv){
result.tagName = 'iframe';
if(isYtProv)
result.provider = 'yt';
else if(isViProv)
result.provider = 'vi';
}
}
return result;
},
}); });
}); });

5
src/parser/main.js

@ -9,6 +9,8 @@ define(function(require) {
return { return {
compTypes: '',
/** /**
* Name of the module * Name of the module
* @type {String} * @type {String}
@ -48,6 +50,7 @@ define(function(require) {
* @return {Object} * @return {Object}
*/ */
parseHtml: function(str){ parseHtml: function(str){
pHtml.compTypes = this.compTypes;
return pHtml.parse(str, pCss); return pHtml.parse(str, pCss);
}, },
@ -60,4 +63,4 @@ define(function(require) {
return Parser; return Parser;
}); });

16
src/parser/model/ParserHtml.js

@ -7,6 +7,8 @@ define(function(require) {
return { return {
compTypes: '',
/** /**
* Parse style string to object * Parse style string to object
* @param {string} str * @param {string} str
@ -68,6 +70,18 @@ define(function(require) {
var prevSib = result[prevI]; var prevSib = result[prevI];
model.tagName = node.tagName ? node.tagName.toLowerCase() : ''; model.tagName = node.tagName ? node.tagName.toLowerCase() : '';
var ct = this.compTypes;
if(ct){
var obj = '';
for (var cType in ct) {
var component = ct[cType].model;
obj = component.isComponent(node);
if(obj)
break;
}
model = obj;
}
if(attrsLen) if(attrsLen)
model.attributes = {}; model.attributes = {};
@ -197,4 +211,4 @@ define(function(require) {
}; };
}); });

89
test/specs/dom_components/model/Component.js

@ -2,8 +2,12 @@ define(['DomComponents',
'DomComponents/model/Component', 'DomComponents/model/Component',
'DomComponents/model/ComponentImage', 'DomComponents/model/ComponentImage',
'DomComponents/model/ComponentText', 'DomComponents/model/ComponentText',
'DomComponents/model/ComponentLink',
'DomComponents/model/ComponentMap',
'DomComponents/model/ComponentVideo',
'DomComponents/model/Components'], 'DomComponents/model/Components'],
function(DomComponents, Component, ComponentImage, ComponentText, Components) { function(DomComponents, Component, ComponentImage, ComponentText,
ComponentLink, ComponentMap, ComponentVideo, Components) {
return { return {
run : function(){ run : function(){
@ -102,6 +106,18 @@ define(['DomComponents',
obj.toHTML().should.equal('<div/>'); obj.toHTML().should.equal('<div/>');
}); });
it('Component parse empty div', function() {
var el = document.createElement('div');
obj = Component.isComponent(el);
obj.should.deep.equal({tagName: 'div'});
});
it('Component parse span', function() {
var el = document.createElement('span');
obj = Component.isComponent(el);
obj.should.deep.equal({tagName: 'span'});
});
}); });
describe('Image Component', function() { describe('Image Component', function() {
@ -135,6 +151,25 @@ define(['DomComponents',
obj.toHTML().should.equal('<img alt="AltTest" src="testPath"/>'); obj.toHTML().should.equal('<img alt="AltTest" src="testPath"/>');
}); });
it('Refuse not img element', function() {
var el = document.createElement('div');
obj = ComponentImage.isComponent(el);
obj.should.equal('');
});
it('Component parse img element', function() {
var el = document.createElement('img');
obj = ComponentImage.isComponent(el);
obj.should.deep.equal({type: 'image', src: ''});
});
it('Component parse img element with src', function() {
var el = document.createElement('img');
el.src = 'http://localhost/';
obj = ComponentImage.isComponent(el);
obj.should.deep.equal({type: 'image', src: 'http://localhost/'});
});
}); });
describe('Text Component', function() { describe('Text Component', function() {
@ -165,6 +200,58 @@ define(['DomComponents',
}); });
describe('Link Component', function() {
it('Component parse a element', function() {
var el = document.createElement('a');
obj = ComponentLink.isComponent(el);
obj.should.deep.equal({type: 'link'});
});
});
describe('Map Component', function() {
it('Component parse map iframe', function() {
var src = 'https://maps.google.com/maps?&q=London,UK&z=11&t=q&output=embed';
var el = $('<iframe src="' + src + '"></iframe>');
obj = ComponentMap.isComponent(el.get(0));
obj.should.deep.equal({type: 'map', src: src});
});
it('Component parse not map iframe', function() {
var el = $('<iframe src="https://www.youtube.com/watch?v=jNQXAC9IVRw"></iframe>');
obj = ComponentMap.isComponent(el.get(0));
obj.should.equal('');
});
});
describe('Video Component', function() {
it('Component parse video', function() {
var src = 'http://localhost/';
var el = $('<video src="' + src + '"></video>');
obj = ComponentVideo.isComponent(el.get(0));
obj.should.deep.equal({type: 'video'}); //src: src
});
it('Component parse youtube video iframe', function() {
var src = 'http://www.youtube.com/embed/jNQXAC9IVRw?';
var el = $('<iframe src="' + src + '"></video>');
obj = ComponentVideo.isComponent(el.get(0));
obj.should.deep.equal({type: 'video', provider: 'yt', src: src});
});
it('Component parse vimeo video iframe', function() {
var src = 'http://player.vimeo.com/video/2?';
var el = $('<iframe src="' + src + '"></video>');
obj = ComponentVideo.isComponent(el.get(0));
obj.should.deep.equal({type: 'video', provider: 'vi', src: src});
});
});
describe('Components', function() { describe('Components', function() {
beforeEach(function () { beforeEach(function () {

Loading…
Cancel
Save