harbour-seaprint/qml/pages/utils.js
Anton Thomasson dd19333c81 Support printing plaintext as plaintext
It will be converted ro \r\n linebraks, but still has lowest prio
for printing plaintext input due to unreliable rendering.
2022-05-02 21:20:26 +02:00

528 lines
14 KiB
JavaScript

.pragma library
.import seaprint.mimer 1.0 as Mimer
.import seaprint.convertchecker 1.0 as ConvertChecker
.import "strings.js" as Strings
// TODO move to IppPrinter?
function supported_formats(printer, considerAdditionalFormats)
{
var formats = printer.attrs["document-format-supported"].value;
if(considerAdditionalFormats)
{
formats=formats+printer.additionalDocumentFormats;
}
var raster = (has(formats, Mimer.Mimer.PWG) || has(formats, Mimer.Mimer.URF));
var mimetypes = [];
var pdf = false;
var postscript = false;
var office = false;
var images = false;
var plaintext = false;
if(has(formats, Mimer.Mimer.PDF) ||
(has(formats, Mimer.Mimer.Postscript) || raster ))
{
pdf = true;
mimetypes.push(Mimer.Mimer.PDF);
}
if(has(formats, Mimer.Mimer.Postscript))
{
postscript = true;
mimetypes.push(Mimer.Mimer.Postscript);
}
if(pdf || has(formats, Mimer.Mimer.Plaintext))
{
plaintext = true;
mimetypes.push(Mimer.Mimer.Plaintext);
}
if((ConvertChecker.ConvertChecker.calligra) && pdf)
{
office = true;
mimetypes = mimetypes.concat(Mimer.Mimer.OfficeFormats);
}
if (raster || has(formats, Mimer.Mimer.JPEG) || has(formats, Mimer.Mimer.PNG) ||
has(formats, Mimer.Mimer.PDF) || has(formats, Mimer.Mimer.Postscript))
{
images = true;
mimetypes.push(Mimer.Mimer.JPEG);
mimetypes.push(Mimer.Mimer.PNG);
mimetypes.push(Mimer.Mimer.TIFF);
mimetypes.push(Mimer.Mimer.GIF);
}
return {pdf: pdf, postscript: postscript, plaintext: plaintext, office: office, images: images, mimetypes: mimetypes};
}
function has(arrayish, what)
{
return arrayish.indexOf(what) != -1;
}
function ippName(name, value, printerStrings)
{
if(value==undefined)
{
return ""
}
switch(name) {
case "job-state":
switch(value) {
case 3:
return qsTr("pending");
case 4:
return qsTr("pending-held");
case 5:
return qsTr("processing");
case 6:
return qsTr("processing-stopped");
case 7:
return qsTr("canceled");
case 8:
return qsTr("aborted");
case 9:
return qsTr("completed");
default:
return qsTr("unknown state ")+value
}
case "printer-state":
switch(value) {
case 3:
return qsTr("Idle");
case 4:
return qsTr("Processing");
case 5:
return qsTr("Stopped");
default:
return qsTr("Unknown State ")+value
}
case "print-quality":
switch(value) {
case 3:
return qsTr("draft");
case 4:
return qsTr("normal");
case 5:
return qsTr("high");
default:
return qsTr("unknown quality ")+value
}
case "orientation-requested":
switch(value) {
case 3:
return qsTr("portrait");
case 4:
return qsTr("landscape");
case 5:
return qsTr("reverse landscape");
case 6:
return qsTr("reverse portrait");
default:
return qsTr("unknown orientation ")+value
}
case "printer-resolution":
var units = "";
if(value.units==3) {
units=qsTr("dpi");
} else if (units==4){
units=qsTr("dots/cm")
}
return ""+value.x+"x"+value.y+units;
case "media":
if(Strings.media.hasOwnProperty(value))
{
return Strings.media[value];
}
else
{
return value;
}
case "media-type":
if(Strings.mediaType.hasOwnProperty(value))
{
return Strings.mediaType[value];
}
else if(printerStrings != undefined && printerStrings.hasOwnProperty("media-type."+value))
{
return printerStrings["media-type."+value];
}
else
{
return value;
}
case "printer-state-reasons":
if(Strings.printerStateReasons.hasOwnProperty(value))
{
return Strings.printerStateReasons[value];
}
else if (endsWith("-report", value))
{
return ippName(name, value.substr(0, value.length-"-report".length))+" (" + qsTr("Report") + ")"
}
else if (endsWith("-warning", value))
{
return ippName(name, value.substr(0, value.length-"-warning".length))+" (" + qsTr("Warning") + ")"
}
else if (endsWith("-error", value))
{
return ippName(name, value.substr(0, value.length-"-error".length))+" (" + qsTr("Error") + ")"
}
else
{
return value;
}
case "sides":
switch(value) {
case "one-sided":
return qsTr("one-sided");
case "two-sided-long-edge":
return qsTr("two-sided");
case "two-sided-short-edge":
return qsTr("two-sided flipped");
default:
return value
}
case "multiple-document-handling":
switch(value) {
case "single-document":
return qsTr("single document");
case "separate-documents-uncollated-copies":
return qsTr("uncollated");
case "separate-documents-collated-copies":
return qsTr("collated");
case "single-document-new-sheet":
return qsTr("single document (new sheet)");
default:
return value
}
case "print-color-mode":
switch(value) {
case "auto":
return qsTr("automatic");
case "auto-monochrome":
return qsTr("auto monochrome");
case "bi-level":
return qsTr("bi-level");
case "color":
return qsTr("color");
case "highlight":
return qsTr("highlight");
case "monochrome":
return qsTr("monochrome");
case "process-bi-level":
return qsTr("process bi-level");
case "process-monochrome":
return qsTr("process monochrome");
default:
return value
}
case "print-scaling":
switch(value) {
case "auto":
return qsTr("auto");
case "auto-fit":
return qsTr("auto (fit)");
case "fill":
return qsTr("fill");
case "fit":
return qsTr("fit");
case "none":
return qsTr("none");
default:
return value;
}
case "document-format":
switch(value) {
case Mimer.Mimer.OctetStream:
return qsTr("auto-sense");
case Mimer.Mimer.PDF:
return qsTr("PDF");
case Mimer.Mimer.Postscript:
return qsTr("Postscript");
case Mimer.Mimer.Plaintext:
return qsTr("Plaintext");
case Mimer.Mimer.PWG:
return qsTr("PWG-raster");
case Mimer.Mimer.URF:
return qsTr("URF-raster");
case Mimer.Mimer.PNG:
return qsTr("PNG");
case Mimer.Mimer.JPEG:
return qsTr("JPEG");
case Mimer.Mimer.GIF:
return qsTr("GIF");
default:
return value;
}
case "media-top-margin":
case "media-bottom-margin":
case "media-left-margin":
case "media-right-margin":
return ""+(value/100)+"mm"
case "media-source":
if(value.indexOf("tray-")==0)
{
return qsTr("tray")+" "+value.split("-")[1];
}
else if(value.indexOf("roll-")==0)
{
return qsTr("roll")+" "+value.split("-")[1];
}
else
{
switch(value) {
case "alternate":
return qsTr("alternate");
case "alternate-roll":
return qsTr("alternate-roll");
case "auto":
return qsTr("automatic");
case "bottom":
return qsTr("bottom");
case "by-pass-tray":
return qsTr("by-pass tray");
case "center":
return qsTr("center");
case "disc":
return qsTr("disc");
case "envelope":
return qsTr("envelope");
case "hagaki":
return qsTr("hagaki");
case "large-capacity":
return qsTr("large capacity");
case "left":
return qsTr("left");
case "main":
return qsTr("main");
case "main-roll":
return qsTr("main roll");
case "manual":
return qsTr("manual");
case "middle":
return qsTr("middle");
case "photo":
return qsTr("photo");
case "rear":
return qsTr("rear");
case "right":
return qsTr("right");
case "side":
return qsTr("side");
case "top":
return qsTr("top");
default:
return value;
}
}
case "output-bin":
if(value.indexOf("tray-")==0)
{
return qsTr("tray")+" "+value.split("-")[1];
}
else if(value.indexOf("stacker-")==0)
{
return qsTr("stacker")+" "+value.split("-")[1];
}
else if(value.indexOf("mailbox-")==0)
{
return qsTr("mailbox")+" "+value.split("-")[1];
}
else
{
switch(value) {
case "auto":
return qsTr("automatic");
case "top":
return qsTr("top");
case "middle":
return qsTr("middle");
case "bottom":
return qsTr("bottom");
case "side":
return qsTr("side");
case "left":
return qsTr("left");
case "right":
return qsTr("right");
case "center":
return qsTr("center");
case "rear":
return qsTr("rear");
case "face-up":
return qsTr("face-up");
case "face-down":
return qsTr("face-down");
case "large-capacity":
return qsTr("large capacity");
case "my-mailbox":
return qsTr("my mailbox");
default:
return value;
}
}
}
return value;
}
function endsWith(ending, string)
{
return string.lastIndexOf(ending) == (string.length - ending.length);
}
var pdfTargets = [Mimer.Mimer.OctetStream, Mimer.Mimer.PDF, Mimer.Mimer.Postscript, Mimer.Mimer.PWG, Mimer.Mimer.URF];
function canConvertPdfTo(type)
{
return has(pdfTargets, type)
}
function canTransferPostscriptAs(type)
{
var targets = [Mimer.Mimer.OctetStream, Mimer.Mimer.Postscript];
return has(targets, type)
}
function canConvertPlaintextTo(type)
{
var targets = pdfTargets;
targets.push(Mimer.Mimer.Plaintext);
return has(targets, type)
}
function canConvertOfficeDocumentTo(type)
{
return has(pdfTargets, type)
}
function canConvertImageTo(type)
{
var targets = [Mimer.Mimer.OctetStream, Mimer.Mimer.JPEG, Mimer.Mimer.PNG, Mimer.Mimer.PWG, Mimer.Mimer.URF, Mimer.Mimer.PDF, Mimer.Mimer.Postscript];
return has(targets, type)
}
function unitsIsDpi(resolution)
{
return resolution.units == 3;
}
function knownPaperSize(mediaName)
{
return Strings.media.hasOwnProperty(mediaName);
}
function fixupChoices(name, choices, mimeType)
{
switch(name) {
case "document-format":
if(mimeType == Mimer.Mimer.PDF)
{
return choices.filter(canConvertPdfTo)
}
else if(mimeType == Mimer.Mimer.Plaintext)
{
return choices.filter(canConvertPlaintextTo)
}
else if(mimeType == Mimer.Mimer.Postscript)
{
return choices.filter(canTransferPostscriptAs)
}
else if(Mimer.Mimer.isOffice(mimeType))
{
return choices.filter(canConvertOfficeDocumentTo)
}
else if(Mimer.Mimer.isImage(mimeType))
{
return choices.filter(canConvertImageTo);
}
else
{
return [Mimer.Mimer.OctetStream];
}
case "printer-resolution":
return choices.filter(unitsIsDpi);
case "multiple-document-handling" :
// Only collation settings valid, multiple documents not used
return choices.filter(function(elem) {return elem.indexOf("collated") != -1});
case "number-up":
if(choices.constructor.name === "Object")
{
var choice_array = [];
for(var i=choices.low; i <= choices.high; i++)
{
choice_array.push(i);
}
return choice_array;
}
else
{
return choices;
}
case "media":
return choices.filter(knownPaperSize);
default:
return choices;
}
}
function isWaringState(printer)
{
if(printer.attrs["printer-state"].value > 4)
{
return true;
}
if(printer.attrs.hasOwnProperty("printer-state-reasons"))
{
for(var i in printer.attrs["printer-state-reasons"].value)
{
var value = printer.attrs["printer-state-reasons"].value[i];
if(value != "none" && !(endsWith("-report", value)))
{
return true;
}
}
}
return false;
}
function unknownForEmptyString(s)
{
if(s === "")
{
return qsTr("Unknown");
}
else
{
return s;
}
}
function existsAndNotEmpty(attrName, printer)
{
if(printer.attrs.hasOwnProperty(attrName))
{
return printer.attrs[attrName].value != ""
}
else
{
return false
}
}
function basename(filewithpath)
{
return filewithpath.substring(filewithpath.lastIndexOf("/")+1);
}