118 lines
3.6 KiB
JavaScript
118 lines
3.6 KiB
JavaScript
var Utils = require("./rtf-utils"),
|
|
Align = require("./Align"),
|
|
Fonts = require("./fonts");
|
|
|
|
module.exports = Format = function(){
|
|
this.underline=false;
|
|
this.bold=false;
|
|
this.italic=false;
|
|
this.strike=false;
|
|
|
|
this.superScript=false;
|
|
this.subScript=false;
|
|
|
|
this.makeParagraph=false;
|
|
|
|
this.align = "";
|
|
|
|
this.leftIndent=0;
|
|
this.rightIndent=0;
|
|
|
|
this.font = Fonts.ARIAL;
|
|
this.fontSize=0;
|
|
//this.color = rgb;
|
|
//this.backgroundColor = rgb;
|
|
|
|
this.colorPos = -1;
|
|
this.backgroundColorPos= -1;
|
|
this.fontPos = -1;
|
|
|
|
//if defined, this element will become a link to this url
|
|
//TODO: not implemented
|
|
//this.url;
|
|
};
|
|
|
|
//because JS doesn't have .equalsTo
|
|
function getColorPosition(table, find){
|
|
if(find !== undefined && find instanceof RGB){
|
|
table.forEach(function(color, index){
|
|
if(color.red === find.red &&
|
|
color.green === find.green &&
|
|
color.blue === find.blue){
|
|
return index;
|
|
}
|
|
});
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
Format.prototype.updateTables = function(colorTable, fontTable){
|
|
this.fontPos = fontTable.indexOf(this.font);
|
|
this.colorPos = getColorPosition(colorTable, this.color);
|
|
this.backgroundColorPos = getColorPosition(colorTable, this.backgroundColor);
|
|
|
|
//if a a font was defined, and it's not in a table, add it in!
|
|
if(this.fontPos < 0 && this.font !== undefined && this.font.length > 0) {
|
|
fontTable.push(this.font);
|
|
this.fontPos = fontTable.length-1;
|
|
}
|
|
//if a color was defined, and it's not in the table, add it as well
|
|
if(this.colorPos < 0 && this.color !== undefined) {
|
|
colorTable.push(this.color);
|
|
this.colorPos = colorTable.length;
|
|
}
|
|
//background colors use the same table as color
|
|
if(this.backgroundColorPos < 0 && this.backgroundColor !== undefined) {
|
|
colorTable.push(this.backgroundColor);
|
|
this.backgroundColorPos = colorTable.length;
|
|
}
|
|
};
|
|
|
|
//some RTF elements require that they are wrapped, closed by a trailing 0 and must have a spacebefore the text.
|
|
function wrap(text, rtfwrapper){
|
|
return rtfwrapper + " " + text + rtfwrapper + "0";
|
|
}
|
|
|
|
/**
|
|
* Applies a format to some text
|
|
*/
|
|
Format.prototype.formatText = function(text, colorTable, fontTable, safeText){
|
|
this.updateTables(colorTable, fontTable);
|
|
var rtf = "{";
|
|
if(this.makeParagraph) rtf+="\\pard";
|
|
|
|
if(this.fontPos !== undefined && this.fontPos>=0) rtf+="\\f" + this.fontPos.toString();
|
|
//Add one because color 0 is null
|
|
if(this.backgroundColorPos !== undefined && this.backgroundColorPos >= 0) rtf+="\\cb" + (this.backgroundColorPos+1).toString();
|
|
//Add one because color 0 is null
|
|
if(this.colorPos !== undefined && this.colorPos>=0) rtf+="\\cf" + (this.colorPos).toString();
|
|
if(this.fontSize >0) rtf += "\\fs" + (this.fontSize*2).toString();
|
|
if(this.align.length > 0) rtf += align;
|
|
if(this.leftIndent>0) rtf += "\\li" + (this.leftIndent*20).toString();
|
|
if(this.rightIndent>0) rtf += "\\ri" + this.rightIndent.toString();
|
|
|
|
//we don't escape text if there are other elements in it, so set a flag
|
|
var content = "";
|
|
if(safeText === undefined || safeText){
|
|
content += Utils.getRTFSafeText(text);
|
|
}else{
|
|
content += text;
|
|
}
|
|
|
|
if(this.bold) content = wrap(content, "\\b") ;
|
|
if(this.italic) content = wrap(content, "\\i");
|
|
if(this.underline) content = wrap(content, "\\ul");
|
|
if(this.strike) content = wrap(content, "\\strike");
|
|
if(this.subScript) content = wrap(content, "\\sub");
|
|
if(this.superScript) content = wrap(content, "\\super");
|
|
rtf += content;
|
|
|
|
//close paragraph
|
|
if(this.makeParagraph) rtf += "\\par";
|
|
|
|
//close doc
|
|
rtf+="}";
|
|
|
|
return rtf;
|
|
}; |