Files
main-website/ruty/js/node_modules/rtf/lib/format.js
T
2024-03-11 00:54:46 +01:00

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;
};