From 3e3ca7375c998314a95e74af6f670d5ab0feb772 Mon Sep 17 00:00:00 2001 From: Zeddy Date: Sat, 14 Apr 2018 15:51:42 -0400 Subject: [PATCH] generates multi page PDF from input JSON 6 slips to a page. The formatting needs to be cleaned up a little to be honest, but this version actually seems to work for at least small numbers of swimmers. This works when interfaced with a google sheet that I've created with a script that pings this particular endpoint. I'm actually very happy with this solution so far. --- build.gradle | 2 +- firebase.json | 5 - functions/index.js | 142 ++++++++++++++---- functions/index.meta.js | 2 +- .../online/cinphart/laneslips/laneslips.kjsm | Bin 959 -> 1370 bytes functions/package-lock.json | 46 +++--- .../online/cinphart/laneslips/Generator.kt | 98 ++++-------- 7 files changed, 169 insertions(+), 126 deletions(-) diff --git a/build.gradle b/build.gradle index 294000f..c5dc9c9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,5 @@ buildscript { ext.kotlin_version = '1.2.30' - repositories { mavenCentral() } @@ -26,4 +25,5 @@ dependencies { compileKotlin2Js.kotlinOptions { moduleKind = "commonjs" outputFile = "functions/index.js" + sourceMap = true } diff --git a/firebase.json b/firebase.json index a68a195..2c63c08 100644 --- a/firebase.json +++ b/firebase.json @@ -1,7 +1,2 @@ { - "functions": { - "predeploy": [ - "npm --prefix \"$RESOURCE_DIR\" run lint" - ] - } } diff --git a/functions/index.js b/functions/index.js index b7c2bbb..ce0405f 100644 --- a/functions/index.js +++ b/functions/index.js @@ -1,14 +1,16 @@ (function (_, Kotlin) { 'use strict'; var Kind_CLASS = Kotlin.Kind.CLASS; - var listOf = Kotlin.kotlin.collections.listOf_i5x0yv$; + var throwCCE = Kotlin.throwCCE; + var until = Kotlin.kotlin.ranges.until_dqglrj$; + var chunked = Kotlin.kotlin.collections.chunked_ba2ldo$; function get_cm($receiver) { return $receiver / 2.54; } function get_asPoints($receiver) { return $receiver * 72; } - function SlipInfo(eventNbr, event, lane, heat, swimmer, team) { + function Entry(eventNbr, event, lane, heat, swimmer, team) { this.eventNbr = eventNbr; this.event = event; this.lane = lane; @@ -16,36 +18,36 @@ this.swimmer = swimmer; this.team = team; } - SlipInfo.$metadata$ = { + Entry.$metadata$ = { kind: Kind_CLASS, - simpleName: 'SlipInfo', + simpleName: 'Entry', interfaces: [] }; - SlipInfo.prototype.component1 = function () { + Entry.prototype.component1 = function () { return this.eventNbr; }; - SlipInfo.prototype.component2 = function () { + Entry.prototype.component2 = function () { return this.event; }; - SlipInfo.prototype.component3 = function () { + Entry.prototype.component3 = function () { return this.lane; }; - SlipInfo.prototype.component4 = function () { + Entry.prototype.component4 = function () { return this.heat; }; - SlipInfo.prototype.component5 = function () { + Entry.prototype.component5 = function () { return this.swimmer; }; - SlipInfo.prototype.component6 = function () { + Entry.prototype.component6 = function () { return this.team; }; - SlipInfo.prototype.copy_cdqwiw$ = function (eventNbr, event, lane, heat, swimmer, team) { - return new SlipInfo(eventNbr === void 0 ? this.eventNbr : eventNbr, event === void 0 ? this.event : event, lane === void 0 ? this.lane : lane, heat === void 0 ? this.heat : heat, swimmer === void 0 ? this.swimmer : swimmer, team === void 0 ? this.team : team); + Entry.prototype.copy_cdqwiw$ = function (eventNbr, event, lane, heat, swimmer, team) { + return new Entry(eventNbr === void 0 ? this.eventNbr : eventNbr, event === void 0 ? this.event : event, lane === void 0 ? this.lane : lane, heat === void 0 ? this.heat : heat, swimmer === void 0 ? this.swimmer : swimmer, team === void 0 ? this.team : team); }; - SlipInfo.prototype.toString = function () { - return 'SlipInfo(eventNbr=' + Kotlin.toString(this.eventNbr) + (', event=' + Kotlin.toString(this.event)) + (', lane=' + Kotlin.toString(this.lane)) + (', heat=' + Kotlin.toString(this.heat)) + (', swimmer=' + Kotlin.toString(this.swimmer)) + (', team=' + Kotlin.toString(this.team)) + ')'; + Entry.prototype.toString = function () { + return 'Entry(eventNbr=' + Kotlin.toString(this.eventNbr) + (', event=' + Kotlin.toString(this.event)) + (', lane=' + Kotlin.toString(this.lane)) + (', heat=' + Kotlin.toString(this.heat)) + (', swimmer=' + Kotlin.toString(this.swimmer)) + (', team=' + Kotlin.toString(this.team)) + ')'; }; - SlipInfo.prototype.hashCode = function () { + Entry.prototype.hashCode = function () { var result = 0; result = result * 31 + Kotlin.hashCode(this.eventNbr) | 0; result = result * 31 + Kotlin.hashCode(this.event) | 0; @@ -55,25 +57,89 @@ result = result * 31 + Kotlin.hashCode(this.team) | 0; return result; }; - SlipInfo.prototype.equals = function (other) { + Entry.prototype.equals = function (other) { return this === other || (other !== null && (typeof other === 'object' && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && (Kotlin.equals(this.eventNbr, other.eventNbr) && Kotlin.equals(this.event, other.event) && Kotlin.equals(this.lane, other.lane) && Kotlin.equals(this.heat, other.heat) && Kotlin.equals(this.swimmer, other.swimmer) && Kotlin.equals(this.team, other.team))))); }; + function Meet(meet, entries) { + this.meet = meet; + this.entries = entries; + } + Meet.$metadata$ = { + kind: Kind_CLASS, + simpleName: 'Meet', + interfaces: [] + }; + Meet.prototype.component1 = function () { + return this.meet; + }; + Meet.prototype.component2 = function () { + return this.entries; + }; + Meet.prototype.copy_khic54$ = function (meet, entries) { + return new Meet(meet === void 0 ? this.meet : meet, entries === void 0 ? this.entries : entries); + }; + Meet.prototype.toString = function () { + return 'Meet(meet=' + Kotlin.toString(this.meet) + (', entries=' + Kotlin.toString(this.entries)) + ')'; + }; + Meet.prototype.hashCode = function () { + var result = 0; + result = result * 31 + Kotlin.hashCode(this.meet) | 0; + result = result * 31 + Kotlin.hashCode(this.entries) | 0; + return result; + }; + Meet.prototype.equals = function (other) { + return this === other || (other !== null && (typeof other === 'object' && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && (Kotlin.equals(this.meet, other.meet) && Kotlin.equals(this.entries, other.entries))))); + }; + function hydrateEntry(entry) { + return new Entry(entry.eventNbr, entry.event, entry.lane, entry.heat, entry.swimmer, entry.team); + } + var collectionSizeOrDefault = Kotlin.kotlin.collections.collectionSizeOrDefault_ba2ldo$; + var ArrayList_init = Kotlin.kotlin.collections.ArrayList_init_ww73n8$; + function iterate(list) { + var tmp$; + var $receiver = until(0, typeof (tmp$ = list.length) === 'number' ? tmp$ : throwCCE()); + var destination = ArrayList_init(collectionSizeOrDefault($receiver, 10)); + var tmp$_0; + tmp$_0 = $receiver.iterator(); + while (tmp$_0.hasNext()) { + var item = tmp$_0.next(); + destination.add_11rb$(list[item]); + } + return destination; + } + function hydrateMeet(meet) { + var tmp$ = meet.meet; + var $receiver = iterate(meet.entries); + var destination = ArrayList_init(collectionSizeOrDefault($receiver, 10)); + var tmp$_0; + tmp$_0 = $receiver.iterator(); + while (tmp$_0.hasNext()) { + var item = tmp$_0.next(); + destination.add_11rb$(hydrateEntry(item)); + } + return new Meet(tmp$, destination); + } function main$lambda(req, res) { - var doc = new (require('pdfkit'))(); + var doc = new (require('pdfkit'))({autoFirstPage: false}); + var meetInfo = hydrateMeet(req.body); + res.setHeader('Content-Disposition', 'attachment;filename=' + '"' + 'lane-slips-' + meetInfo.meet + '.pdf' + '"'); res.setHeader('Content-Type', 'application/pdf'); - var slips = listOf([new SlipInfo(1, 'Girls 8&U 100 Yd Medley Relay', 1, 1, 'A', 'Delshire'), new SlipInfo(1, 'Girls 8&U 100 Yd Medley Relay', 1, 3, 'B', 'Delshire'), new SlipInfo(19, 'Boys 15-18 50 Yd Freestyle', 3, 5, 'Jack Hart', 'Delshire'), new SlipInfo(19, 'Boys 15-18 50 Yd Freestyle', 6, 1, 'Joseph Obert', 'Delshire'), new SlipInfo(1, 'Girls 8&U 100 Yd Medley Relay', 1, 1, 'A', 'Delshire'), new SlipInfo(1, 'Girls 8&U 100 Yd Medley Relay', 1, 3, 'B', 'Delshire')]); doc.pipe(res); - writeSlip(slips.get_za3lpa$(0), doc, 0, 0); - writeSlip(slips.get_za3lpa$(1), doc, 1, 0); - writeSlip(slips.get_za3lpa$(2), doc, 0, 1); - writeSlip(slips.get_za3lpa$(3), doc, 1, 1); - writeSlip(slips.get_za3lpa$(4), doc, 0, 2); - writeSlip(slips.get_za3lpa$(5), doc, 1, 2); - var dashOptions = {}; - dashOptions.space = 10; - doc.moveTo(get_asPoints(get_cm(10.25)), get_asPoints(get_cm(1.0))).lineTo(get_asPoints(get_cm(10.25)), get_asPoints(get_cm(27.0))).dash(5, dashOptions).stroke(); - doc.moveTo(get_asPoints(get_cm(1.0)), get_asPoints(get_cm(8.5))).lineTo(get_asPoints(get_cm(21.0)), get_asPoints(get_cm(8.5))).dash(5, dashOptions).stroke(); - doc.moveTo(get_asPoints(get_cm(1.0)), get_asPoints(get_cm(16.5))).lineTo(get_asPoints(get_cm(21.0)), get_asPoints(get_cm(16.5))).dash(5, dashOptions).stroke(); + var tmp$; + tmp$ = chunked(meetInfo.entries, 6).iterator(); + while (tmp$.hasNext()) { + var element = tmp$.next(); + doc.addPage(); + var tmp$_0, tmp$_0_0; + var index = 0; + tmp$_0 = element.iterator(); + while (tmp$_0.hasNext()) { + var item = tmp$_0.next(); + var index_0 = (tmp$_0_0 = index, index = tmp$_0_0 + 1 | 0, tmp$_0_0); + writeSlip(item, doc, index_0 % 2, index_0 / 2 | 0); + } + drawDashes(doc); + } return doc.end(); } function main(args) { @@ -81,6 +147,13 @@ fireFunctions.config(); exports.laneslips = fireFunctions.https.onRequest(main$lambda); } + function drawDashes(doc) { + var dashOptions = {}; + dashOptions.space = 10; + doc.moveTo(get_asPoints(get_cm(10.25)), get_asPoints(get_cm(1.0))).lineTo(get_asPoints(get_cm(10.25)), get_asPoints(get_cm(27.0))).dash(5, dashOptions).stroke(); + doc.moveTo(get_asPoints(get_cm(1.0)), get_asPoints(get_cm(8.5))).lineTo(get_asPoints(get_cm(21.0)), get_asPoints(get_cm(8.5))).dash(5, dashOptions).stroke(); + doc.moveTo(get_asPoints(get_cm(1.0)), get_asPoints(get_cm(16.5))).lineTo(get_asPoints(get_cm(21.0)), get_asPoints(get_cm(16.5))).dash(5, dashOptions).stroke(); + } function writeSlip($receiver, doc, x, y) { var xOffset = get_asPoints(get_cm(10.0)) * x; var yOffset = get_asPoints(get_cm(8.0)) * y; @@ -143,10 +216,17 @@ var package$laneslips = package$cinphart.laneslips || (package$cinphart.laneslips = {}); package$laneslips.get_cm_yrwdxr$ = get_cm; package$laneslips.get_asPoints_yrwdxr$ = get_asPoints; - package$laneslips.SlipInfo = SlipInfo; + package$laneslips.Entry = Entry; + package$laneslips.Meet = Meet; + package$laneslips.hydrateEntry_za3rmp$ = hydrateEntry; + package$laneslips.iterate_za3rmp$ = iterate; + package$laneslips.hydrateMeet_za3rmp$ = hydrateMeet; package$laneslips.main_kand9s$ = main; - package$laneslips.writeSlip_xwsitz$ = writeSlip; + package$laneslips.drawDashes_za3rmp$ = drawDashes; + package$laneslips.writeSlip_dmpztf$ = writeSlip; main([]); Kotlin.defineModule('index', _); return _; }(module.exports, require('kotlin'))); + +//# sourceMappingURL=index.js.map diff --git a/functions/index.meta.js b/functions/index.meta.js index 316c580..9562d63 100644 --- a/functions/index.meta.js +++ b/functions/index.meta.js @@ -1 +1 @@ -// Kotlin.kotlin_module_metadata(513, "index", "H4sIAAAAAAAAAF2Ty27TQBSGfYs9OUnbwaU0mAIh3CuBjLmIbUtBaRdV5YLEgo3rDI1FPBPsCW32KA8AG9Z9Cp6AR8gL8CKccYYksPH/zZl/5sx/JBvE9r978NsCV/BBxhmQNOPDflJIqA8SzspBNiyBHKPs848C3E9Cog/sHT4Gwr4wLg9PCrD3uYRatQT3WBYZPwVHnQenzxIJXnmW5TkrwJEsyQFSkQ8FR/eTJY6W+OkSP1vi50v8ApxUDMfgss+jZFCCtyvEgCUcakL2sRfpJ2X/lehhKCn0ozx2PhSFRPMhmlTFnyV6vDfmSZ6lb8dD9Cflkcg42tw9MToZMLDSHJw8weTOO55JcJLitITaTlEkY/AKfEFWMHBz0Ruhu35WZJKpoYHdEymY52CO/Q9gUQMcYlATvybFoROL2i0D6w6yQ2vISj2tda1XtF7TekPrLa23W0ZwYQabtB1YYSNq0k5AfMe3Qi9s/iRGsEXvBNDe2nZaZlgL65FL76LR607aavcRvaeObVuhHa3S+/85H+Cei/pQKdo7GzRYtryffDVVeY1eRwfgLfDyzaxw85/CD2J1LiwyIS07ssLabui71FWXohL1HFTQ64bWpq6vKD2o01VV7/6yEdeqBBXSRfXSAv2FYf0vvqaXAxWT4OCr3hVV3SuCea0xp+Z8d2V2jXmwTjcQSUToZlCNoTtVbVpV86mJeLWyTs1YZ4t11lhni3XWWGeMdUac0zdigRHoH+0PWtUuxaEDAAA="); +// Kotlin.kotlin_module_metadata(513, "index", "H4sIAAAAAAAAAJVUTVMTQRDNfmR30knIuAiEBRVBRVFwCWh5BcFCSikraJXXZTNFttzsxN1ByN3iB3jy4MmDR8/+Af0J/B57JkNY8ORl35t+Pd39eqq2RCzvJ8BvCxyeJnHKgERx2u+GmYBKEqYsT+J+DuXtVGQDcD5wgUlgbaQDIOwTS8XeQQbWy1RAWR3B2RdZnB6CLS+D3WWhADc/jns9loEtWNgDiHivz1PMXi3wVoGvFfh6gT8p8KdgR7yPM7GPR2GSg7vJecLCFMpcdLEX6YZ59znvoCPBz4d6zZgAuye/LtbIYpZDNeJJwiIR8zQH+1WcS+2kzzOBRfewmLzpDZ2vbA3SsBdHbwd9rBvmb3icYpqzxY8OEgZmhO46WXi8hb2xtP0ujQVYHR5BrTtAQbDhIstMQVUH1VhuLJg84OrkDHYvxE3bYXaI69/IsnAAboZe44yB0+OdI+xXOc7w0j4+ERgnYAy8DExaApuUqIFfg5rgEJNazRLGbeQ2LSOX6GqsaJxUaFK/Ke/b9AaegN7U6pzGBY33ND5ulvxvpj9N7/pmMNYao4s+zN1esptGUA5qv0gJpfsoWSg9+FdaQqmC0sxVaZE+9KlX8wrhoIqJj64mTtFl1blGV3zi2Z4ZuEFDCrM0KOa2HLqKie7O6ZxUl2lLXlsaTrZ4JXMNNQdxXSKmz0/QW8WU96efDRlu0HnMqGOV+rMXw8CdS4GvxJz/bpJT0rRaZlDeDDyHOrIoIpHjIII+VzXWdLwucbdCx2R854+FtKEcKEovotcuqHeRMH5Ot+l19QAEH1f1Vkx1VwxGseqI1UZqfVjG2B2nE0hJi9ApX61h50y2aarmZwbSaZV6ZrS1t7b22tbe2tprW3tsa49ycT8MuaSKWtIkmp9RS6jRWf2oVlDVq1CeGriKkSADC8pkRY2s7rbGkM0Wk/7LwqXObT0PDvqFmFDy9W/wL9qlo788BQAA"); diff --git a/functions/index/online/cinphart/laneslips/laneslips.kjsm b/functions/index/online/cinphart/laneslips/laneslips.kjsm index c679824e6043522a788d4563e69bd73c5f99f017..3cce8706f3f81bb0089fbbc14365d18bec73bf10 100644 GIT binary patch delta 631 zcmZXPPcH*O7{)uZ)7|NGwQn|5t$$U2N~w8ecpFoj1O^}qiKca^>%6_%pJb2BpUDx#mJ6EUS zqUyOd5iM3qCAa8%m2yq69k1rM5@cmpoK_1L>xJ4GTG)Qs^M!U=DGKwfj=*=@nIf!0 z>LMD5?RdlUUF8t0gjqPP;FVj)Bx{gMLF!hubx&5WDA>u6V4T6Q(7AvSeChZ~1$8{A zQ$fuqL-qr;2Vl~sGUmh}V~f;SmL-V{OY@nB5KSY}5Y7BYSws;;g8{nwZp*-|4VGzj zrO7Bd=l+KDL#{pAgn64=%%akeaW!}dWVhGRVF8WCRwJco4jk2%?X32-^-g;}S{D)O zSeH~qf4UDwyVDLE*F?#2NTZ_%V|tc1JHo`5@N`3S0F4JSCiTZM!9Kku61)h0n`4fW=PPSpR;bzHA%*^9r3C+tanS7K{i-$QS zKbecMf{U?IC}#3EM*Dge0ci;aE;bGp0XZnG2&I)J7^D_4N{I_7NHH038}SGzNpT3V z2r(J38}RJlV33j#P?6$NkkMk1U^HMg;51?rPz5Sv_h?f9$?6KIfwXBc8893138dN}>W%$Z8_mS{OmX`~tE-6jI5J5n79}K D=sqhN diff --git a/functions/package-lock.json b/functions/package-lock.json index 83471d6..4647dd8 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -248,7 +248,7 @@ "@types/body-parser": { "version": "1.16.8", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz", - "integrity": "sha1-aH7DQUBiSjvsKxqOqSaEeK6PO+M=", + "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==", "requires": { "@types/express": "4.11.1", "@types/node": "8.10.3" @@ -257,7 +257,7 @@ "@types/cors": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.3.tgz", - "integrity": "sha1-6vbkdtoNNr7msGGiTVfjQ93OhtY=", + "integrity": "sha512-wiZ7yYSIKZ005QJeyoUk5OHHEamNHTxaYwaFQWfTPohBjyhgIDHTgV8oGn+zBYTWQCb9WQYg54PhtntFTD7GVg==", "requires": { "@types/express": "4.11.1" } @@ -265,12 +265,12 @@ "@types/events": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha1-gaZzHOTfQ2GeXIyUU4Oz5iqJ6oY=" + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" }, "@types/express": { "version": "4.11.1", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz", - "integrity": "sha1-+ZZjs6sy0EyxHbYS713Xkz91Rls=", + "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==", "requires": { "@types/body-parser": "1.16.8", "@types/express-serve-static-core": "4.11.1", @@ -280,7 +280,7 @@ "@types/express-serve-static-core": { "version": "4.11.1", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz", - "integrity": "sha1-9vchI4LVmxnWlmd7yqSKNygPXUU=", + "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==", "requires": { "@types/events": "1.2.0", "@types/node": "8.10.3" @@ -297,7 +297,7 @@ "@types/jsonwebtoken": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.6.tgz", - "integrity": "sha1-jQGMIcpZELXrPryzhWVmBqIVAy8=", + "integrity": "sha512-SuCA16HtLqPy0yerKEvMdaEAeLRgm6zPUJE1sF7bwGq0hAO4xW9UJZxTcDBaBwr5rcz1HST5QC1+1qXQ1+R9yw==", "requires": { "@types/node": "8.10.3" } @@ -305,7 +305,7 @@ "@types/lodash": { "version": "4.14.106", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.106.tgz", - "integrity": "sha1-YJPpoCqlZ93s/pr63KieU+Xc5N0=" + "integrity": "sha512-tOSvCVrvSqFZ4A/qrqqm6p37GZoawsZtoR0SJhlF7EonNZUgrn8FfT+RNQ11h+NUpMt6QVe36033f3qEKBwfWA==" }, "@types/long": { "version": "3.0.32", @@ -315,7 +315,7 @@ "@types/mime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha1-WnMG42fFObn2VDSZ3o3VGfrDeos=" + "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" }, "@types/node": { "version": "8.10.3", @@ -325,7 +325,7 @@ "@types/serve-static": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha1-HSgB+mNdJ0zZfU7AfiayG0QSdJI=", + "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==", "requires": { "@types/express-serve-static-core": "4.11.1", "@types/mime": "2.0.0" @@ -706,7 +706,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -1107,7 +1107,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { "version": "1.5.1", @@ -1712,7 +1712,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -1919,7 +1919,7 @@ "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", "encodeurl": "1.0.2", @@ -1933,7 +1933,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -3939,7 +3939,7 @@ "moment": { "version": "2.22.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.0.tgz", - "integrity": "sha1-eSGt4BAX3UUYbn/uX0JPC4ZjpzA=" + "integrity": "sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg==" }, "ms": { "version": "2.0.0", @@ -4357,7 +4357,7 @@ "proxy-addr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha1-NV8mJQWmIWRrMTCnKOtkfiIFU0E=", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { "forwarded": "0.1.2", "ipaddr.js": "1.6.0" @@ -4652,7 +4652,7 @@ "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", "depd": "1.1.2", @@ -4672,7 +4672,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -4680,14 +4680,14 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=" + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" } } }, "serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { "encodeurl": "1.0.2", "escape-html": "1.0.3", @@ -4719,7 +4719,7 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "shallow-copy": { "version": "0.0.1", @@ -4997,7 +4997,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=" + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, "stream-events": { "version": "1.0.3", @@ -5252,7 +5252,7 @@ "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", "mime-types": "2.1.18" diff --git a/src/main/kotlin/online/cinphart/laneslips/Generator.kt b/src/main/kotlin/online/cinphart/laneslips/Generator.kt index 0b73c07..2c0e2be 100644 --- a/src/main/kotlin/online/cinphart/laneslips/Generator.kt +++ b/src/main/kotlin/online/cinphart/laneslips/Generator.kt @@ -9,7 +9,7 @@ val Double.cm: Double val Double.asPoints: Double get() = this * 72 -data class SlipInfo( +data class Entry( val eventNbr: Int, val event: String, val lane: Int, @@ -17,83 +17,51 @@ data class SlipInfo( val swimmer: String, val team: String) +data class Meet(val meet : String, val entries : List) + +fun hydrateEntry(entry : dynamic) = Entry(entry.eventNbr, entry.event, entry.lane, entry.heat, entry.swimmer, entry.team) + +fun iterate(list : dynamic) : List = (0 until (list.length as Int)).map { list[it] } + +fun hydrateMeet(meet : dynamic) = Meet(meet.meet, iterate(meet.entries).map { hydrateEntry(it) }) + fun main(args: Array) { val fireFunctions = require("firebase-functions") fireFunctions.config() exports.laneslips = fireFunctions.https.onRequest { req, res -> - val doc = js("new (require('pdfkit'))()") - //res.setHeader("Content-Disposition", "attachment;filename=\"lane-slips.pdf\"") - res.setHeader("Content-Type", "application/pdf") + val doc = js("new (require('pdfkit'))({autoFirstPage:false})") - val slips = listOf( - SlipInfo( - eventNbr = 1, - event = "Girls 8&U 100 Yd Medley Relay", - lane = 1, - heat = 1, - swimmer = "A", - team = "Delshire"), - SlipInfo( - eventNbr = 1, - event = "Girls 8&U 100 Yd Medley Relay", - lane = 1, - heat = 3, - swimmer = "B", - team = "Delshire"), - SlipInfo( - eventNbr = 19, - event = "Boys 15-18 50 Yd Freestyle", - lane = 3, - heat = 5, - swimmer = "Jack Hart", - team = "Delshire"), - SlipInfo( - eventNbr = 19, - event = "Boys 15-18 50 Yd Freestyle", - lane = 6, - heat = 1, - swimmer = "Joseph Obert", - team = "Delshire"), - SlipInfo( - eventNbr = 1, - event = "Girls 8&U 100 Yd Medley Relay", - lane = 1, - heat = 1, - swimmer = "A", - team = "Delshire"), - SlipInfo( - eventNbr = 1, - event = "Girls 8&U 100 Yd Medley Relay", - lane = 1, - heat = 3, - swimmer = "B", - team = "Delshire") - ) + val meetInfo = hydrateMeet(req.body) + + res.setHeader("Content-Disposition", "attachment;filename=\"lane-slips-${meetInfo.meet}.pdf\"") + res.setHeader("Content-Type", "application/pdf") doc.pipe(res) - slips[0].writeSlip(doc, 0, 0) - slips[1].writeSlip(doc, 1, 0) - slips[2].writeSlip(doc, 0, 1) - slips[3].writeSlip(doc, 1, 1) - slips[4].writeSlip(doc, 0, 2) - slips[5].writeSlip(doc, 1, 2) - - val dashOptions = js("{}") - dashOptions.space = 10 - - doc.moveTo(10.25.cm.asPoints, 1.0.cm.asPoints).lineTo(10.25.cm.asPoints, 27.0.cm.asPoints).dash(5, dashOptions).stroke() - - doc.moveTo(1.0.cm.asPoints, 8.5.cm.asPoints).lineTo(21.0.cm.asPoints, 8.5.cm.asPoints).dash(5, dashOptions).stroke() - - doc.moveTo(1.0.cm.asPoints, 16.5.cm.asPoints).lineTo(21.0.cm.asPoints, 16.5.cm.asPoints).dash(5, dashOptions).stroke() - + meetInfo.entries.chunked(6).forEach { + doc.addPage() + it.forEachIndexed { index, slip -> + slip.writeSlip(doc, index % 2, index / 2) + } + drawDashes(doc) + } doc.end() } } -fun SlipInfo.writeSlip(doc: dynamic, x: Int, y: Int) { +fun drawDashes(doc : dynamic) { + val dashOptions = js("{}") + dashOptions.space = 10 + + doc.moveTo(10.25.cm.asPoints, 1.0.cm.asPoints).lineTo(10.25.cm.asPoints, 27.0.cm.asPoints).dash(5, dashOptions).stroke() + + doc.moveTo(1.0.cm.asPoints, 8.5.cm.asPoints).lineTo(21.0.cm.asPoints, 8.5.cm.asPoints).dash(5, dashOptions).stroke() + + doc.moveTo(1.0.cm.asPoints, 16.5.cm.asPoints).lineTo(21.0.cm.asPoints, 16.5.cm.asPoints).dash(5, dashOptions).stroke() +} + +fun Entry.writeSlip(doc: dynamic, x: Int, y: Int) { val xOffset = 10.0.cm.asPoints * x val yOffset = 8.0.cm.asPoints * y val leftMargin = 1.0.cm.asPoints + xOffset