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

88 lines
2.3 KiB
JavaScript

var Utils = require("../rtf-utils"),
Element = require('./element'),
async = require('async');
//TODO: probably replace this with something from underscore
function columnCount(target){
var rows = target.length, max = 0, i;
for(i = 0; i < rows; i++){
if(target[i].length > max) max = target[i].length;
}
return max;
}
module.exports = TableElement = function(){
Element.apply(this, arguments);
this._data = [];
this._rows = 0;
this._cols = 0;
};
TableElement.subclass(Element);
TableElement.prototype.addRow = function(row){
this._data.push(row);
};
TableElement.prototype.setData = function(data){
this._data = data;
};
function rowTask(row, numCols, colorTable, fontTable){
return function(rowcb){
var rowTasks = [];
//generate tasks for each column
row.forEach(function(el, i) {
if (el instanceof Element){
rowTasks.push(function(cb) { el.getRTFCode(colorTable, fontTable, cb); });
} else {
rowTasks.push(function(cb) { cb(null, Utils.getRTFSafeText(el)); });
}
});
//process the row
return async.parallel(rowTasks, function(err, results) {
var out = "";
results.forEach(function(result) {
out += (result + "\\cell ");
});
return rowcb(null, out);
});
};
}
TableElement.prototype.getRTFCode = function(colorTable, fontTable, callback){
var rtf = "",
i, j,
tasks = [];
this._rows = this._data.length;
this._cols = columnCount(this._data);
//eaech row requires all this data about columns
var pre = "\\trowd\\trautofit1\\intbl";
var post = "{\\trowd\\trautofit1\\intbl";
//now do the first \cellx things
for(j = 0; j<this._cols; j++){
pre += "\\clbrdrt\\brdrs\\brdrw10\\clbrdrl\\brdrs\\brdrw10\\clbrdrb\\brdrs\\brdrw10\\clbrdrr\\brdrs\\brdrw10";
pre += "\\cellx" + (j+1).toString();
post += "\\cellx" + (j+1).toString();
}
post += "\\row }";
//generate tasks for each row
for(i = 0; i < this._rows; i++){
if(this._data[i]){
tasks.push(rowTask(this._data[i], this._cols, colorTable, fontTable));
}
}
return async.parallel(tasks, function(err, results) {
var rows = "";
results.forEach(function(result) {
rows += (pre + "{" + result + " }" + post);
});
rtf = "\\par" + rows + "\\pard";
return callback(null, rtf);
});
};