regexper-static/src/js/parser/javascript/base.js

165 lines
3.5 KiB
JavaScript
Raw Normal View History

2014-12-10 00:02:31 +00:00
import _ from 'lodash';
import Q from 'q';
2014-12-10 00:02:31 +00:00
export default {
setContainer(container) {
this.container = container;
this.container.addClass(this.type);
},
2014-12-10 00:02:31 +00:00
getBBox() {
return this.container.getBBox();
},
2014-12-11 01:28:02 +00:00
transform(matrix) {
return this.container.transform(matrix);
},
renderLabel(text) {
var deferred = Q.defer(),
group = this.container.group()
.addClass('label'),
rect = group.rect(),
text = group.text().attr({
text: text
});
setTimeout(deferred.resolve.bind(deferred, group));
deferred.promise.then(() => {
var box = text.getBBox(),
margin = 5;
text.transform(Snap.matrix()
.translate(margin, box.height + margin));
rect.attr({
width: box.width + 2 * margin,
height: box.height + 2 * margin
});
});
return deferred.promise;
},
render(container) {
if (container) {
this.setContainer(container);
}
var promise = this._render();
return promise.then(_.constant(this));
},
proxy(node) {
this._proxy = node;
return this._proxy.render(this.container);
},
_render() {
console.log(this.type, this);
2014-12-04 01:20:08 +00:00
this.container.addClass('placeholder');
return this.renderLabel(this.type + ': ' + this.textValue).then(label => {
label.select('rect').attr({
2014-12-11 00:23:14 +00:00
rx: 10,
ry: 10
});
});
2014-12-10 00:02:31 +00:00
},
spaceHorizontally(items, options) {
var verticalCenter = 0;
_.defaults(options, {
padding: 0
});
_.reduce(items, (offset, item) => {
2014-12-11 01:28:02 +00:00
var box;
2014-12-10 00:02:31 +00:00
2014-12-11 01:28:02 +00:00
item.transform(Snap.matrix()
2014-12-10 00:02:31 +00:00
.translate(offset, 0));
box = item.getBBox();
verticalCenter = Math.max(verticalCenter, box.cy);
return offset + options.padding + box.width;
}, 0);
_.each(items, item => {
2014-12-11 01:28:02 +00:00
item.transform(Snap.matrix()
.add(item.transform().localMatrix)
2014-12-10 00:02:31 +00:00
.translate(0, verticalCenter - item.getBBox().cy));
});
},
spaceVertically(items, options) {
var horizontalCenter = 0;
_.defaults(options, {
padding: 0
});
_.reduce(items, (offset, item) => {
2014-12-11 01:28:02 +00:00
var box;
2014-12-11 01:28:02 +00:00
item.transform(Snap.matrix()
.translate(0, offset));
box = item.getBBox();
horizontalCenter = Math.max(horizontalCenter, box.cx);
return offset + options.padding + box.height;
}, 0);
_.each(items, item => {
2014-12-11 01:28:02 +00:00
item.transform(Snap.matrix()
.add(item.transform().localMatrix)
.translate(horizontalCenter - item.getBBox().cx, 0));
});
},
renderLabeledBox(label) {
this.label = this.container.text()
.addClass([this.type, 'label'].join('-'))
.attr({
text: label
});
this.box = this.container.rect()
.addClass([this.type, 'box'].join('-'))
.attr({
rx: 3,
ry: 3
});
},
positionLabeledBox(content, options) {
var labelBox, contentBox;
_.defaults(options, {
padding: 0
});
labelBox = this.label.getBBox();
contentBox = content.getBBox();
this.label.transform(Snap.matrix()
.translate(0, labelBox.height));
this.box
.transform(Snap.matrix()
.translate(0, labelBox.height))
.attr({
width: Math.max(contentBox.width + options.padding * 2, labelBox.width),
height: contentBox.height + options.padding * 2
});
content.transform(Snap.matrix()
.translate(this.box.getBBox().cx - contentBox.cx, labelBox.height + options.padding));
}
};