nehan
Version:
Html layout engine for paged-media written in Typescript
138 lines • 5.21 kB
JavaScript
import { Config, LogicalEdgeMap, LogicalCornerMap, NativeStyleMap, } from './public-api';
export class LogicalCssEvaluator {
constructor(writingMode) {
this.writingMode = writingMode;
}
visitUnmanagedCssProps(style) {
const css = new NativeStyleMap();
Config.unmanagedCssProps.forEach(prop => {
const unmanagedValue = style.getPropertyValue(prop);
if (unmanagedValue !== null) {
css.set(prop, unmanagedValue);
}
});
return css;
}
visitFont(font) {
const css = new NativeStyleMap();
css.set("font-style", font.style);
css.set("font-variant", font.variant);
css.set("font-weight", font.weight);
css.set("font-stretch", font.stretch);
css.set("font-size", font.size + "px");
css.set("font-family", font.family);
return css;
}
visitColor(color) {
const css = new NativeStyleMap();
css.set("color", color.value);
return css;
}
visitSizeHori(size) {
const css = new NativeStyleMap();
css.set("width", size.measure + "px");
css.set("height", size.extent + "px");
return css;
}
visitSizeVert(size) {
const css = new NativeStyleMap();
css.set("width", size.extent + "px");
css.set("height", size.measure + "px");
return css;
}
visitSize(size) {
if (this.writingMode.isTextHorizontal()) {
return this.visitSizeHori(size);
}
return this.visitSizeVert(size);
}
visitPosHori(pos) {
const css = new NativeStyleMap();
css.set("top", pos.before + "px");
css.set("left", pos.start + "px");
return css;
}
visitPosVertLtr(pos) {
const css = new NativeStyleMap();
css.set("top", pos.start + "px");
css.set("left", pos.before + "px");
return css;
}
visitPosVertRtl(pos) {
const css = new NativeStyleMap();
css.set("top", pos.start + "px");
css.set("right", pos.before + "px");
return css;
}
visitPos(pos) {
if (this.writingMode.isTextHorizontal()) {
return this.visitPosHori(pos);
}
if (this.writingMode.isVerticalRl()) {
return this.visitPosVertRtl(pos);
}
return this.visitPosVertLtr(pos);
}
visitBackgroundPos(backgroundPos) {
const css = new NativeStyleMap();
let value = backgroundPos.value;
LogicalEdgeMap.select(this.writingMode).forEach((logical, physical) => {
value = value.replace(logical, physical);
});
css.set("background-position", value);
return css;
}
visitLogicalMargin(margin) {
return margin.getPhysicalEdge(this.writingMode).items.reduce((css, item) => {
return css.set(margin.getPropByLogicalDirection(item.prop), item.value + "px");
}, new NativeStyleMap());
}
visitLogicalPadding(padding) {
return padding.getPhysicalEdge(this.writingMode).items.reduce((css, item) => {
return css.set(padding.getPropByLogicalDirection(item.prop), item.value + "px");
}, new NativeStyleMap());
}
visitLogicalBorderColor(borderColor) {
return borderColor.getPhysicalEdge(this.writingMode).items.reduce((css, item) => {
return css.set(borderColor.getPropByLogicalDirection(item.prop), String(item.value));
}, new NativeStyleMap());
}
visitLogicalBorderWidth(borderWidth) {
return borderWidth.getPhysicalEdge(this.writingMode).items.reduce((css, item) => {
return css.set(borderWidth.getPropByLogicalDirection(item.prop), item.value + "px");
}, new NativeStyleMap());
}
visitLogicalBorderStyle(borderStyle) {
return borderStyle.getPhysicalEdge(this.writingMode).items.reduce((css, item) => {
return css.set(borderStyle.getPropByLogicalDirection(item.prop), String(item.value));
}, new NativeStyleMap());
}
visitLogicalBorderRadius(borderRadius, borderWidth) {
const cornerMap = LogicalCornerMap.select(this.writingMode);
return borderRadius.items.reduce((css, item) => {
if (item.prop.indexOf("before") >= 0 && borderWidth.before <= 0 ||
item.prop.indexOf("after") >= 0 && borderWidth.after <= 0) {
return css;
}
return css.set(`border-${cornerMap.get(item.prop)}-radius`, String(item.value));
}, new NativeStyleMap());
}
visitLogicalPos(pos) {
const css = new NativeStyleMap();
const map = LogicalEdgeMap.select(this.writingMode);
if (pos.before !== undefined) {
css.set(map.get("before"), pos.before + "px");
}
if (pos.end !== undefined) {
css.set(map.get("end"), pos.end + "px");
}
if (pos.after !== undefined) {
css.set(map.get("after"), pos.after + "px");
}
if (pos.start !== undefined) {
css.set(map.get("start"), pos.start + "px");
}
return css;
}
}
//# sourceMappingURL=logical-css-evaluator.js.map