280 lines
7.1 KiB
JavaScript
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;
|
|
};
|