jsHtml2Ods/src/js/opendocument/OpenDocument.Style.js

280 lines
7.1 KiB
JavaScript

/* global OpenDocument */
/***********************************************************
*
* @constructor
* @param {String} type
* @param {String} styleName
* @returns {OpenDocument.Style}
*/
OpenDocument.Style = function (type, styleName) {
this.type = type;
this.styleName = styleName;
this.styleFamily = OpenDocument.Style.getMatchingStyleFamily(type);
this.parentStyleName = "";
this.dataStyleName = "";
this.propertiesMaps = new Map([
["paragraph", new Map()],
["text", new Map()],
["table-cell", new Map()],
["table-row", new Map()],
["table-column", new Map()]
]);
};
OpenDocument.Style.prototype.putStyleProperty = function (stylePropertyDef, value) {
var propertyName = stylePropertyDef.name;
switch(stylePropertyDef.format) {
case "color":
value = OpenDocument.Style.formatColor(value);
break;
case "wrap":
value = _convertWrap();
break;
}
var property = {
name: propertyName,
value: value
};
this.propertiesMaps.get(stylePropertyDef.category).set(propertyName, property);
function _convertWrap() {
switch(value) {
case "anywhere":
case "break-word":
return "wrap";
default:
return "no-wrap";
}
}
};
OpenDocument.Style.prototype.setParent = function (parentStyleName) {
this.parentStyleName = parentStyleName;
};
OpenDocument.Style.prototype.setDataStyle = function (dataStyleName) {
this.dataStyleName = dataStyleName;
};
OpenDocument.Style.prototype.isEmpty = function () {
for(let map of this.propertiesMaps.values()) {
if (map.size > 0) {
return false;
}
}
return true;
};
OpenDocument.Style.prototype.copyProperties = function (otherStyle) {
if (otherStyle.parentStyleName) {
this.setParent(otherStyle.parentStyleName);
}
for(let entry of otherStyle.propertiesMaps) {
let otherMap = entry[1];
let thisMap = this.propertiesMaps.get(entry[0]);
for(let entry2 of otherMap) {
thisMap.set(entry2[0], entry2[1]);
}
}
};
/**
*
* @param {OpenDocument.XmlWriter} xmlWriter
* @returns {undefined}
*/
OpenDocument.Style.prototype.write = function (xmlWriter) {
xmlWriter
.startStyleOpenTag(this.styleName, this.styleFamily, this.parentStyleName)
.addAttribute("style:data-style-name", this.dataStyleName);
if (this.isEmpty()) {
xmlWriter
.closeEmptyTag();
} else {
xmlWriter
.endOpenTag();
for(let entry of this.propertiesMaps) {
let category = entry[0];
let map = entry[1];
if (map.size > 0) {
xmlWriter
.startOpenTag("style:" + category + "-properties");
for(let property of map.values()) {
xmlWriter
.addAttribute(property.name, property.value);
}
xmlWriter
.closeEmptyTag();
}
}
xmlWriter
.closeStyle();
}
};
OpenDocument.Style.getStylePropertyDef = function (type, name) {
name = _checkAlias();
if (OpenDocument.Style.STYLEPROPERTYDEFS.hasOwnProperty(name)) {
let propertyDef = OpenDocument.Style.STYLEPROPERTYDEFS[name];
if (propertyDef.categories) {
for(let propKey in propertyDef.categories) {
if (propKey === type) {
return Object.assign({}, propertyDef, {category: propertyDef.categories[propKey]});
}
}
return null;
} else {
return propertyDef;
}
} else {
return null;
}
function _checkAlias() {
switch(type) {
case "row":
switch(name) {
case "height":
return "row-height";
}
break;
case "column":
switch(name) {
case "width":
return "column-width";
}
break;
case "cell":
switch(name) {
case "overflow-wrap":
return "wrap-option";
}
break;
}
return name;
}
};
OpenDocument.Style.getMatchingStyleFamily = function (type) {
switch(type) {
case "cell":
return "table-cell";
case "row":
return "table-row";
case "column":
return "table-column";
}
};
OpenDocument.Style.STYLEPROPERTYDEFS = {
"background-color": {
name: "fo:background-color",
categories: {
"cell": "table-cell",
"row": "table-row"
},
format: "color"
},
"border": {
name: "fo:border",
category: "table-cell"
},
"border-bottom": {
name: "fo:border-bottom",
category: "table-cell"
},
"border-left": {
name: "fo:border-left",
category: "table-cell"
},
"border-right": {
name: "fo:border-right",
category: "table-cell"
},
"border-top": {
name: "fo:border-top",
category: "table-cell"
},
"color": {
name: "fo:color",
category: "text",
format: "color"
},
"column-width": {
name: "style:column-width",
category: "table-column"
},
"font-size": {
name: "fo:font-size",
category: "text"
},
"font-style": {
name: "fo:font-style",
category: "text"
},
"font-weight": {
name: "fo:font-weight",
category: "text"
},
"padding": {
name: "fo:padding",
category: "table-cell"
},
"padding-bottom": {
name: "fo:padding-bottom",
category: "table-cell"
},
"padding-left": {
name: "fo:padding-left",
category: "table-cell"
},
"padding-right": {
name: "fo:padding-right",
category: "table-cell"
},
"padding-top": {
name: "fo:padding-top",
category: "table-cell"
},
"row-height": {
name: "style:row-height",
category: "table-row"
},
"text-align": {
name: "fo:text-align",
category: "paragraph"
},
"use-optimal-row-height": {
name: "style:use-optimal-row-height",
category: "table-row"
},
"vertical-align": {
name: "style:vertical-align",
category: "table-cell"
},
"wrap-option": {
name: "fo:wrap-option",
category: "table-cell",
format: "wrap"
}
};
OpenDocument.Style.formatColor = function (color) {
let colorList = color.match(/rgb\((.*)\)/);
if (colorList) {
let hexresult = "#";
for(let token of colorList[1].split(",")) {
let hex = Number.parseInt(token.trim(), 10).toString(16);
if (hex.length === 1) {
hex = "0" + hex;
}
hexresult += hex;
}
color = hexresult;
}
return color;
};