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

211 lines
4.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-13 16:35:01 +00:00
getAnchor() {
if (this._proxy) {
return this._proxy.getAnchor();
} else {
return this._getAnchor();
}
},
_getAnchor() {
var box = this.container.getBBox();
return {
atype: this.type,
ax: box.x,
ax2: box.x2,
ay: box.cy
};
},
2014-12-10 00:02:31 +00:00
getBBox() {
2014-12-13 16:35:01 +00:00
return _.extend(this.container.getBBox(), this.getAnchor());
2014-12-10 00:02:31 +00:00
},
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;
},
2014-12-13 16:35:01 +00:00
renderAnchor() {
var box = this.getBBox(),
anchorLine;
this.container.path(box.path)
.attr({
style: 'stroke:#000;stroke-dasharray:2,2;;'
});
anchorLine = this.container.path(Snap.format('M{ax},{ay}H{ax2}', box))
.attr({
style: 'stroke:#f00;stroke-dasharray:2,2;',
'data-type': this.type,
'data-anchor-type': box.atype
});
console.log(box, anchorLine.node);
},
render(container) {
if (container) {
this.setContainer(container);
}
2014-12-13 16:35:01 +00:00
return this._render()
.then((() => {
if (this.anchorDebug) {
this.renderAnchor();
}
}).bind(this))
.then(_.constant(this));
},
proxy(node) {
2014-12-13 16:35:01 +00:00
this.anchorDebug = false;
2014-12-13 18:00:46 +00:00
return node.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, content, options) {
var deferred = Q.defer(),
label = this.container.text()
.addClass([this.type, 'label'].join('-'))
.attr({
text: label
}),
box = this.container.rect()
.addClass([this.type, 'box'].join('-'))
.attr({
rx: 3,
ry: 3
});
_.defaults(options, {
padding: 0
});
this.container.prepend(label);
this.container.prepend(box);
setTimeout(deferred.resolve);
deferred.promise.then(() => {
var labelBox = label.getBBox(),
contentBox = content.getBBox();
label.transform(Snap.matrix()
.translate(0, labelBox.height));
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(box.getBBox().cx - contentBox.cx, labelBox.height + options.padding));
});
return deferred.promise;
}
};