#! /usr/local/bin/apl --script ⍝ ******************************************************************** ⍝ wp2.apl Workspace to print reports ⍝ Copyright (C) 2019 Bill Daly ⍝ This program is free software: you can redistribute it and/or modify ⍝ it under the terms of the GNU General Public License as published by ⍝ the Free Software Foundation, either version 3 of the License, or ⍝ (at your option) any later version. ⍝ This program is distributed in the hope that it will be useful, ⍝ but WITHOUT ANY WARRANTY; without even the implied warranty of ⍝ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ⍝ GNU General Public License for more details. ⍝ You should have received a copy of the GNU General Public License ⍝ along with this program. If not, see . ⍝ ******************************************************************** )copy_once 5 DALY/utl )copy_once 3 DALY/lex )copy_once 5 DALY/utf8 )copy_once 1 html )copy_once 3 DALY/fmt ⍝ ******************************************************************** ⍝ Report methods ⍝ ******************************************************************** ∇rpt←wp∆init id ⍝ Function returns a blank report rpt←lex∆init rpt←rpt lex∆assign 'Id' id rpt←rpt lex∆assign (⊂'Data'),⊂ 1 1 ⍴0 rpt←rpt lex∆assign 'Head_ln01' 'Uknown' rpt←rpt lex∆assign 'Head_ln02' 'Empty' rpt←rpt lex∆assign 'Head_ln03' 'mm/dd/yyyy' rpt←rpt lex∆assign (⊂'Author' ),⊂2⊃,⎕env 'USER' rpt←rpt lex∆assign 'Initials' 1 rpt←rpt lex∆assign 'Function' '' rpt←rpt lex∆assign (⊂'Stylesheet'),⊂wp∆defaultSS rpt←rpt lex∆assign (⊂'Attributes'),⊂1 1 ⍴⊂wp∆attr∆init rpt←rpt lex∆assign (⊂'DefaultFormat'),⊂(lex∆init)lex∆assign 'Format' 'CF14.2' ∇ ∇b←wp∆is rpt;keys;ix;lb;test_keys ⍝ Predicate tests whether rpt is a workpaper. →(~b←lex∆is rpt)/0 keys←lex∆keys wp∆init 'test' test_keys←lex∆keys rpt lb←((⍴test_keys)⍴st),ed ix←1 st: →(~b←keys utl∆member ix⊃test_keys)/0 →lb[ix←ix+1] ed: ∇ ∇Id←wp∆getId rpt ⍝ Function returns the report Id. Id←rpt lex∆lookup 'Id' ∇ ∇rpt←old wp∆setId Id ⍝ Function sets the report Id. rpt←old lex∆assign 'Id' Id ∇ ∇data←wp∆getData rpt ⍝ Function returns the report's data data←rpt lex∆lookup 'Data' ∇ ∇ rpt←old wp∆setData data;attr;shape;ix ⍝ Function adds data to the report and conforms the attribute array ⍝ to that data rpt←old lex∆assign 'Data' data attr←,(shape←⍴data)↑wp∆getAttributes old →(∨/ix←0=∊{⍴⍴⍵}¨attr)/save_attr attr[ix/⍳⍴attr]←⊂wp∆attr∆init attr←shape⍴attr save_attr: rpt←rpt lex∆assign 'Attributes' attr ∇ ∇ attr←wp∆getAttributes rpt ⍝ Function returns the data attributes attr←rpt lex∆lookup 'Attributes' ∇ ∇ rpt←old wp∆setAttributes attr;data ⍝ Function stores data attributes data←old lex∆lookup 'Data' utl∆es (~∧/(⍴data)=⍴attr)/'ATTRIBUTES MUST BE THE SAME SIZE AND SHAPE AS TH DATA' rpt←old lex∆assign 'Attributes' attr ∇ ∇attr←wp∆getStylesheet rpt ⍝ Function returns the reports's stylesheet attr←rpt lex∆lookup 'Stylesheet' ∇ ∇rpt←old wp∆setStylesheet sheet ⍝ Function sets the stylesheet for the report rpt←old lex∆assign 'Stylesheet' sheet ∇ ∇author←wp∆getAuthor rpt ⍝ Function returns the author of the report author←rpt lex∆lookup 'Author' ∇ ∇rpt←old wp∆setAuthor author ⍝ Function sets the author of the report. wp∆init uses the username ⍝ from the environment. rpt←old lex∆assign 'Author' author ∇ ∇fmt←wp∆getDefaultFormat rpt ⍝ Function returns the default format string for the report fmt←rpt lex∆lookup 'DefaultFormat' ∇ ∇rpt←old wp∆setDefaultFormat fmt ⍝ Function sets the optional default format rpt←old lex∆assign 'DefaultFormat' fmt ∇ ∇hd←wp∆getHeading rpt;lines ⍝ Function returns a list of the heading lines lines←((⊂rpt) lex∆haskey ¨lines)/lines←{'Head_ln','00'⍕⍵}¨⍳6 hd←(⊂rpt) lex∆lookup ¨ lines ∇ ∇rpt←old wp∆setHeading hd;ln;lb ⍝ Function sets a list of lines ⍎(2=⍴⍴hd)/'hd←⊂[2]hd' ln←1 lb←((⍴hd)⍴st),ed st: old←old lex∆assign (⊂'Head_ln','00'⍕ln),hd[ln] →lb[ln←ln+1] ed:rpt←old ∇ ∇initials←wp∆getInitialFlag wp ⍝ Function returns the boolean initial flag initials←wp lex∆lookup 'Initials' ∇ ∇rpt←old wp∆setInitialFlag initials ⍝ Function sets the boolean initial flag utl∆es (~utl∆numberp initials)/'INITIAL FLAG MUST BE BOOLEAN' initials←~~initials rpt←old lex∆assign 'Initials' initials ∇ ⍝ ∇rpt←wp∆newSchema old ⍝ ⍝ Function adds header lines from an old schema report. ⍝ rpt←old ⍝ ⍎(rpt lex∆haskey 'Entity')/'rpt←rpt lex∆assign (⊂''Head_ln01''),⊂rpt lex∆lookup ''Entity''' ⍝ ⍎(rpt lex∆haskey 'Title')/'rpt←rpt lex∆assign (⊂''Head_ln02''),⊂rpt lex∆lookup ''Title''' ⍝ ⍎(rpt lex∆haskey 'Period')/'rpt←rpt lex∆assign (⊂''Head_ln03''),⊂rpt lex∆lookup ''Period''' ⍝ ∇ ⍝ Function replaced with wp∆convert. wld 20220501 ∇txt←attr wp∆∆txtCell val;fs ⍝ Funcion returns a numberic cell as text →(attr lex∆haskey 'format')/hf txt←⍕val →0 hf: →(fmt∆STSC fs ← attr lex∆lookup 'format')/stsc txt←fs⍕val →0 stsc: txt←fs fmt val →0 ∇ ⍝ ******************************************************************** ⍝ Functions to assemble an html report ⍝ ******************************************************************** ∇html←wp∆html∆assemble wp;dat;size;hattr;ibattr;thead;tbody;hhead;attrs;colgrp ⍝ Function to assemble an html page from a workpaper wp←wp∆convert wp size←⍴dat←wp lex∆lookup 'Data' ⍝ Asemble table heading →(wp lex∆lookup 'Initials')/IBlock NoIBlock: thead←size wp∆html∆headWithoutInitals wp →body IBlock: thead←size wp∆html∆assemble∆head wp →body body: ⍝ Assemble body tbody←wp∆html∆assemble∆body wp ⍝ Assemble html head hhead←(html∆title wp lex∆lookup 'Head_ln02'),html∆style wp∆assemble∆css wp lex∆lookup 'Stylesheet' hhead←hhead, html∆meta (lex∆init) lex∆assign 'charset' 'UTF8' hhead←html∆head hhead ⍝ Assemble documetn →(wp lex∆haskey 'Footer')/withFoot html←html∆html hhead, html∆body html∆table thead, tbody →0 withFoot: html←html∆html hhead, html∆body (html∆table thead,tbody),wp∆html∆assemble∆footer wp →0 ∇ ∇thead← size wp∆html∆assemble∆head wp;hattr;ibattr;lrattr ⍝ Function to asemble the report heading for wp∆html∆assemble hattr←(lex∆init) lex∆assign 'class' 'page-head' hattr←hattr lex∆assign (⊂'colspan'),⊂ ⍕size[2]-1 ibattr←(lex∆init) lex∆assign 'class' 'initial-block' lrattr←((lex∆init) lex∆assign 'class' 'last-head')lex∆assign (⊂'colspan'),⊂⍕size[2] thead←⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln01'),ibattr wp∆html∆∆td wp lex∆lookup 'Id' thead←thead,⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln02'),ibattr wp∆html∆∆td wp lex∆lookup 'Author' thead←thead,⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln03'),ibattr wp∆html∆∆td utl∆today thead←thead,⎕av[11],html∆tr lrattr wp∆html∆∆td ' ' thead←html∆thead thead ∇ ∇thead←size wp∆html∆headWithoutInitals wp;hattr;lrattr ⍝ Function returns heading lines with an initial block hattr←(lex∆init) lex∆assign 'class' 'page-head' hattr←hattr lex∆assign (⊂'colspan'),⊂ ⍕size[2]-1 lrattr←((lex∆init) lex∆assign 'class' 'last-head')lex∆assign (⊂'colspan'),⊂⍕size[2] thead←⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln01') thead←thead,⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln02') thead←thead,⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln03') thead←thead,⎕av[11],html∆tr lrattr wp∆html∆∆td ' ' thead←html∆thead thead ∇ ∇ln←w wp∆text∆center txt;indent ⍝ Function returns txt centered on width w. If w is not supplied, ⍝ centered on ⎕pw →(2=⎕nc 'w')/w_defined w←⎕pw w_defined: indent←(⌊(w-⍴txt←,txt)÷2)⍴' ' ln←indent,txt,indent ∇ ∇tbody←wp∆html∆assemble∆body wp;a;f;d ⍝ Function to assemble the report body for wp∆html∆assemble shape←⍴d ←wp lex∆lookup 'Data' a←wp lex∆lookup 'Attributes' →(0=⍴f←wp lex∆lookup 'Function')/pr01 d←⍎'a ',f,' d' pr01: d←,d a←,a tbody←∊⎕av[11],¨html∆tr ¨ ∊¨ ⊂[2] size⍴ a wp∆html∆∆td ¨ ,d ∇ ∇tfoot←wp∆html∆assemble∆footer wp ⍝ Function to assemble the footer tfoot←html∆footer wp lex∆lookup 'Footer' ∇ ∇txt←attr wp∆html∆∆td val;fs ⍝ Function to format numeric data and return an html td element. txt←(attr lex∆drop 'format')html∆td attr wp∆∆txtCell val ∇ ∇sheet←wp∆assemble∆css ss;lb;ix;classes;props;cur ⍝ Function assembles a cascading style sheet lb←((⍴classes←lex∆keys ss)⍴st),ed ix←1 st: →('body' utl∆stringEquals cur←ix⊃classes)/s1 props←ss lex∆lookup cur ss←ss lex∆drop cur ss←ss lex∆assign (⊂'.',cur),⊂props s1:→lb[ix←ix+1] ed: sheet← xml∆mkSheet ss ∇ ⍝ ******************************************************************** ⍝ Methods to assemble a text report ⍝ ******************************************************************** ∇txt←wp∆txt∆assemble wp;shape;head ⍝ function returns a workpaper formated as text wp←wp∆convert wp →(wp lex∆lookup 'Initials')/IBlock NoIBlock: head←wp∆txt∆headWithoutInitials wp →body IBlock: head←wp∆txt∆assemble∆head wp →body body: txt←head,wp∆txt∆assemble∆body wp →(~wp lex∆haskey 'Footer')/0 txt←txt,wp∆txt∆assemble∆footer wp ∇ ∇thead←wp∆txt∆assemble∆head wp;author;today;id ⍝ Function to assemble the text report heading id←wp lex∆lookup 'Id' today←utl∆today author←wp lex∆lookup 'Author' thead←((-⍴id)↓wp∆text∆center wp lex∆lookup 'Head_ln01'),id,⎕tc[3] thead←thead,((-⍴author)↓wp∆text∆center wp lex∆lookup 'Head_ln02'),author,⎕tc[3] thead←thead,((-⍴today)↓wp∆text∆center wp lex∆lookup 'Head_ln03'),today,2⍴⎕tc[3] ∇ ∇thead←wp∆txt∆headWithoutInitials wp ⍝ Functions assembles a text report heading with the initial block thead←(wp∆text∆center wp lex∆lookup 'Head_ln01'),⎕tc[3] thead←thead,(wp∆text∆center wp lex∆lookup 'Head_ln02'),⎕tc[3] thead←thead,(wp∆text∆center wp lex∆lookup 'Head_ln03'),⎕tc[3] ∇ ∇tbody←wp∆txt∆assemble∆body wp;dat;a;ix;f;shape ⍝ Function to assemble the body of a text reppr shape←⍴dat ←wp lex∆lookup 'Data' a←wp lex∆lookup 'Attributes' →(0=⍴f←wp lex∆lookup 'Function')/pr01 dat←⍎'a ',f,' dat' pr01: a←,a dat←,dat ix←(utl∆numberp ¨ dat)/⍳×/shape dat[ix]←a[ix] wp∆∆txtCell ¨ dat[ix] tbody←1⌽,⎕tc[3],utl∆concatColumns shape⍴dat ∇ ∇tfoot←wp∆txt∆assemble∆footer wp ⍝ Function to assemble the footer for a text rendering tfoot ← (wp∆text∆center wp lex∆lookup 'Footer'),⎕tc[3] ∇ ⍝ ******************************************************************** ⍝ Data array methods ⍝ ******************************************************************** ∇ val←rpt wp∆dt∆getCellValue ix;row;col;data;shape ⍝ Function returns the value of cell in the data array →(1 ≠ ⍴⍴ix)/error →(2 ≠ ⍴ix)/error shape←⍴data←rpt lex∆lookup 'Data' →(shape[1]0),(la[2]>0),la[3 4]≤⍴attr utl∆es stest/'SHAPE OF ATTRIBUTES IS LESS THAN THE RECTAGLE ',⍕la[⍳4] utl∆es(~∧/(∊⍴¨ix)=⍴new)/'SHAPE OF NEW DATA IS NOT DESCRIBED BY ',⍕ix →assignment assignment: attr[1⊃ix;2⊃ix]←new rpt←old lex∆assign 'Attributes' attr ∇ ⍝ ******************************************************************** ⍝ Stylesheet methods ⍝ ******************************************************************** ∇ss←wp∆ss∆default old ⍝ Method assigns the default stylesheet to a workpaper ss←old lex∆assign 'Stylesheet' wp∆defaultSS ∇ ∇ss←wp∆ss∆init ⍝ Function sets up a new, empty stylesheet ss←lex∆init ∇ ∇ss←old wp∆ss∆assignClass class ⍝ Function assigns a class to the stylesheet ss←old lex∆assign class ∇ ∇txt←wp∆ss∆css ss;selectors;classes;values selectors←lex∆keys ss values← (⊂ss) lex∆lookup ¨ selectors classes←⊂[2] selectors,((⍴selectors),1)⍴values txt←⎕av[11] utl∆join wp∆ssc∆cssRule ¨ classes ∇ ⍝ ******************************************************************** ⍝ Stylesheet class methods. A class is a selector and a lexicon of ⍝ stylesheet properties. ⍝ ******************************************************************** ∇class←wp∆ssc∆init name ⍝ Function creates a class class← name lex∆init ∇ ∇class←old wp∆ssc∆assignProp property;good ⍝ Function adds or replaces a property →(~good←2 = ⍴ property)/bad →(~good←wp∆ssp∆propertyp 1⊃property)/bad →(~good←utl∆stringp 2⊃property)/bad class←old[1],⊂(2⊃old) lex∆assign property →0 bad: utl∆es '"',property,'" is not valid.' →0 ∇ ∇txt←wp∆ssc∆cssClass class;name;lx;keys ⍝ Function renders a class for a css style sheet name←1⊃class ◊ lx ← 2⊃class keys←lex∆keys lx txt←⎕av[11] utl∆join {(⎕av[10],⍵,':'⎕av[10]),(lx lex∆lookup ⍵),';'}¨lex∆keys lx txt←name,' {',⎕av[11],txt,'}' ∇ ⍝ ******************************************************************** ⍝ Stylesheet property methods. A property is a name--value pair ⍝ ******************************************************************** ∇b←wp∆ssp∆propertyp property ⍝ Function confirms that property is valid →(~b←utl∆stringp property)/0 b←(⍴wp∆ssp∆propertyList)≥wp∆ssp∆propertyList utl∆listSearch property ∇ ∇txt←wp∆ssp∆cssProperty property ⍝ Function renders a property for a style tag or style sheet. txt←⎕av[10],(1⊃property),':',⎕av[10],(2⊃property),';',⎕av[11] ∇ ⍝ ******************************************************************** ⍝ Conversion from old data model ⍝ ******************************************************************** ⍝ ∇ wp←wp∆convert old ⍝ ⍝ Function converts from the old attribute list to the new ⍝ wp←wp∆init wp∆getId old ⍝ wp←wp wp∆setHeading (⊂old lex∆lookup 'Entity'),(⊂old lex∆lookup 'Title'),⊂old lex∆lookup 'Period' ⍝ wp←wp wp∆setAuthor old lex∆lookup 'Author' ⍝ wp←wp wp∆setData wp∆getData old ⍝ wp←wp wp∆setAttributes wp∆getAttributes old ⍝ wp←wp wp∆setStylesheet wp∆getStylesheet old ⍝ ∇ ∇ wp←wp∆convert old ⍝ Function converts from the old attribute list to the new wp←old →(~wp lex∆haskey 'Entity')/h2 wp←wp lex∆assign (⊂'Head_ln01'),⊂wp lex∆lookup 'Entity' h2: →(~wp lex∆haskey 'Title')/h3 wp←wp lex∆assign (⊂'Head_ln02'),⊂wp lex∆lookup 'Title' h3: →(~wp lex∆haskey 'Period')/0 wp←lex∆assign (⊂'Head_ln02'),⊂wp lex∆lookup 'Period' ∇ ⍝ ******************************************************************** ⍝ Other matters ⍝ ******************************************************************** ∇ss←wp∆defaultSS;r1;r2;r3;r4;r5;r6;r7;r8 ⍝ Function returns the default stylesheet ss←wp∆ss∆init r1←wp∆ssc∆init 'body' r1←r1 wp∆ssc∆assignProp 'font' '12pt sans-serif' r1←r1 wp∆ssc∆assignProp 'text-align' 'left' r1←r1 wp∆ssc∆assignProp 'border' 'none 2pt black' ss←ss wp∆ss∆assignClass r1 ⍝ ******************************************************************** r2←wp∆ssc∆init 'colhead' r2←r2 wp∆ssc∆assignProp 'text-align' 'center' r2←r2 wp∆ssc∆assignProp 'font-size' '8pt' ss←ss wp∆ss∆assignClass r2 ⍝ ******************************************************************** r3←wp∆ssc∆init 'number' r3←r3 wp∆ssc∆assignProp 'text-align' 'right' ss←ss wp∆ss∆assignClass r3 ⍝ ******************************************************************** r4←wp∆ssc∆init 'page-head' r4←r4 wp∆ssc∆assignProp 'font-size' 'large' r4←r4 wp∆ssc∆assignProp 'font-weight' 'bold' r4←r4 wp∆ssc∆assignProp 'text-align' 'center' r4←r4 wp∆ssc∆assignProp 'width' '90%' ss←ss wp∆ss∆assignClass r4 ⍝ ******************************************************************** r5←wp∆ssc∆init 'initial-block' r5←r5 wp∆ssc∆assignProp 'font-size' 'small' r5←r5 wp∆ssc∆assignProp 'border' 'solid 1pt black' r5←r5 wp∆ssc∆assignProp 'text-align' 'right' r5←r5 wp∆ssc∆assignProp 'width' '10%' ss←ss wp∆ss∆assignClass r5 ⍝ ******************************************************************** r6←wp∆ssc∆init 'last-head' r6←r6 wp∆ssc∆assignProp 'font-size' 'large' r6←r6 wp∆ssc∆assignProp 'font-weight' 'bold' r6←r6 wp∆ssc∆assignProp 'height' '36pt' r6←r6 wp∆ssc∆assignProp 'vertical-align' 'top' ss←ss wp∆ss∆assignClass r6 ⍝ ******************************************************************** r7←wp∆ssc∆init 'subtotal' r7←r7 wp∆ssc∆assignProp 'text-align' 'right' r7←r7 wp∆ssc∆assignProp 'border-top' 'solid 1px black' r7←r7 wp∆ssc∆assignProp 'padding-bottom' '2em' ss←ss wp∆ss∆assignClass r7 ⍝ ******************************************************************** r8←wp∆ssc∆init 'grandtotal' r8←r8 wp∆ssc∆assignProp 'text-align' 'right' r8←r8 wp∆ssc∆assignProp 'border-bottom' 'double 1px black' r8←r8 wp∆ssc∆assignProp 'border-top' 'solid 1px black' ss←ss wp∆ss∆assignClass r8 ∇ ∇Z←wp⍙metadata Z←0 2⍴⍬ Z←Z⍪'Author' 'Bill Daly' Z←Z⍪'BugEmail' 'bugs@dalywebandedit.com' Z←Z⍪'Documentation' 'doc/apl-library.info' Z←Z⍪'Download' 'https://sourceforge.net/p/apl-library' Z←Z⍪'License' 'GPL v3.0' Z←Z⍪'Portability' 'L5' Z←Z⍪'Provides' '' Z←Z⍪'Requires' 'utl, lex, utf8, html, fmt' Z←Z⍪'Version' '0 2 3' Z←Z⍪'Last update' '2022-02-07' ∇ wp∆ssp∆propertyList←111⍴0 ⍝ prolog ≡1 (wp∆ssp∆propertyList)[⍳17]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (wp∆ssp∆propertyList)[17+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (wp∆ssp∆propertyList)[33+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (wp∆ssp∆propertyList)[49+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (wp∆ssp∆propertyList)[65+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (wp∆ssp∆propertyList)[81+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (wp∆ssp∆propertyList)[97+⍳14]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 ((⎕IO+0)⊃wp∆ssp∆propertyList)←'background' ((⎕IO+1)⊃wp∆ssp∆propertyList)←'background-attachment' ((⎕IO+2)⊃wp∆ssp∆propertyList)←'background-color' ((⎕IO+3)⊃wp∆ssp∆propertyList)←'background-image' ((⎕IO+4)⊃wp∆ssp∆propertyList)←'background-position' ((⎕IO+5)⊃wp∆ssp∆propertyList)←'background-position-x' ((⎕IO+6)⊃wp∆ssp∆propertyList)←'background-position-y' ((⎕IO+7)⊃wp∆ssp∆propertyList)←'background-repeat' ((⎕IO+8)⊃wp∆ssp∆propertyList)←'border' ((⎕IO+9)⊃wp∆ssp∆propertyList)←'border-bottom' ((⎕IO+10)⊃wp∆ssp∆propertyList)←'border-bottom-color' ((⎕IO+11)⊃wp∆ssp∆propertyList)←'border-bottom-style' ((⎕IO+12)⊃wp∆ssp∆propertyList)←'border-bottom-width' ((⎕IO+13)⊃wp∆ssp∆propertyList)←'border-collapse' ((⎕IO+14)⊃wp∆ssp∆propertyList)←'border-color' ((⎕IO+15)⊃wp∆ssp∆propertyList)←'border-left' ((⎕IO+16)⊃wp∆ssp∆propertyList)←'border-left-color' ((⎕IO+17)⊃wp∆ssp∆propertyList)←'border-left-style' ((⎕IO+18)⊃wp∆ssp∆propertyList)←'border-left-width' ((⎕IO+19)⊃wp∆ssp∆propertyList)←'border-right' ((⎕IO+20)⊃wp∆ssp∆propertyList)←'border-right-color' ((⎕IO+21)⊃wp∆ssp∆propertyList)←'border-right-style' ((⎕IO+22)⊃wp∆ssp∆propertyList)←'border-right-width' ((⎕IO+23)⊃wp∆ssp∆propertyList)←'border-spacing' ((⎕IO+24)⊃wp∆ssp∆propertyList)←'border-style' ((⎕IO+25)⊃wp∆ssp∆propertyList)←'border-top' ((⎕IO+26)⊃wp∆ssp∆propertyList)←'border-top-color' ((⎕IO+27)⊃wp∆ssp∆propertyList)←'border-top-style' ((⎕IO+28)⊃wp∆ssp∆propertyList)←'border-top-width' ((⎕IO+29)⊃wp∆ssp∆propertyList)←'border-width' ((⎕IO+30)⊃wp∆ssp∆propertyList)←'caption-side' ((⎕IO+31)⊃wp∆ssp∆propertyList)←'clear' ((⎕IO+32)⊃wp∆ssp∆propertyList)←'color' ((⎕IO+33)⊃wp∆ssp∆propertyList)←'direction' ((⎕IO+34)⊃wp∆ssp∆propertyList)←'display' ((⎕IO+35)⊃wp∆ssp∆propertyList)←'empty-cells' ((⎕IO+36)⊃wp∆ssp∆propertyList)←'float' ((⎕IO+37)⊃wp∆ssp∆propertyList)←'font' ((⎕IO+38)⊃wp∆ssp∆propertyList)←'font-family' ((⎕IO+39)⊃wp∆ssp∆propertyList)←'font-size' ((⎕IO+40)⊃wp∆ssp∆propertyList)←'font-size-adjust' ((⎕IO+41)⊃wp∆ssp∆propertyList)←'font-stretch' ((⎕IO+42)⊃wp∆ssp∆propertyList)←'font-style' ((⎕IO+43)⊃wp∆ssp∆propertyList)←'font-variant' ((⎕IO+44)⊃wp∆ssp∆propertyList)←'font-weight' ((⎕IO+45)⊃wp∆ssp∆propertyList)←'height' ((⎕IO+46)⊃wp∆ssp∆propertyList)←'left' ((⎕IO+47)⊃wp∆ssp∆propertyList)←'letter-spacing' ((⎕IO+48)⊃wp∆ssp∆propertyList)←'line-break' ((⎕IO+49)⊃wp∆ssp∆propertyList)←'line-height' ((⎕IO+50)⊃wp∆ssp∆propertyList)←'list-style' ((⎕IO+51)⊃wp∆ssp∆propertyList)←'list-style-image' ((⎕IO+52)⊃wp∆ssp∆propertyList)←'list-style-position' ((⎕IO+53)⊃wp∆ssp∆propertyList)←'list-style-type' ((⎕IO+54)⊃wp∆ssp∆propertyList)←'margin' ((⎕IO+55)⊃wp∆ssp∆propertyList)←'margin-bottom' ((⎕IO+56)⊃wp∆ssp∆propertyList)←'margin-left' ((⎕IO+57)⊃wp∆ssp∆propertyList)←'margin-right' ((⎕IO+58)⊃wp∆ssp∆propertyList)←'margin-top' ((⎕IO+59)⊃wp∆ssp∆propertyList)←'marker-offset' ((⎕IO+60)⊃wp∆ssp∆propertyList)←'max-height' ((⎕IO+61)⊃wp∆ssp∆propertyList)←'max-width' ((⎕IO+62)⊃wp∆ssp∆propertyList)←'min-height' ((⎕IO+63)⊃wp∆ssp∆propertyList)←'min-width' ((⎕IO+64)⊃wp∆ssp∆propertyList)←'orphans' ((⎕IO+65)⊃wp∆ssp∆propertyList)←'outline' ((⎕IO+66)⊃wp∆ssp∆propertyList)←'outline-color' ((⎕IO+67)⊃wp∆ssp∆propertyList)←'outline-style' ((⎕IO+68)⊃wp∆ssp∆propertyList)←'outline-width' ((⎕IO+69)⊃wp∆ssp∆propertyList)←'overflow' ((⎕IO+70)⊃wp∆ssp∆propertyList)←'overflow-X' ((⎕IO+71)⊃wp∆ssp∆propertyList)←'overflow-Y' ((⎕IO+72)⊃wp∆ssp∆propertyList)←'padding' ((⎕IO+73)⊃wp∆ssp∆propertyList)←'padding-bottom' ((⎕IO+74)⊃wp∆ssp∆propertyList)←'padding-left' ((⎕IO+75)⊃wp∆ssp∆propertyList)←'padding-right' ((⎕IO+76)⊃wp∆ssp∆propertyList)←'padding-top' ((⎕IO+77)⊃wp∆ssp∆propertyList)←'page' ((⎕IO+78)⊃wp∆ssp∆propertyList)←'page-break-after' ((⎕IO+79)⊃wp∆ssp∆propertyList)←'page-break-before' ((⎕IO+80)⊃wp∆ssp∆propertyList)←'page-break-inside' ((⎕IO+81)⊃wp∆ssp∆propertyList)←'position' ((⎕IO+82)⊃wp∆ssp∆propertyList)←'quotes' ((⎕IO+83)⊃wp∆ssp∆propertyList)←'right' ((⎕IO+84)⊃wp∆ssp∆propertyList)←'size' ((⎕IO+85)⊃wp∆ssp∆propertyList)←'stress' ((⎕IO+86)⊃wp∆ssp∆propertyList)←'table-layout' ((⎕IO+87)⊃wp∆ssp∆propertyList)←'text-align' ((⎕IO+88)⊃wp∆ssp∆propertyList)←'text-align-last' ((⎕IO+89)⊃wp∆ssp∆propertyList)←'text-decoration' ((⎕IO+90)⊃wp∆ssp∆propertyList)←'text-indent' ((⎕IO+91)⊃wp∆ssp∆propertyList)←'text-justify' ((⎕IO+92)⊃wp∆ssp∆propertyList)←'text-overflow' ((⎕IO+93)⊃wp∆ssp∆propertyList)←'text-shadow' ((⎕IO+94)⊃wp∆ssp∆propertyList)←'text-transform' ((⎕IO+95)⊃wp∆ssp∆propertyList)←'text-autospace' ((⎕IO+96)⊃wp∆ssp∆propertyList)←'text-kashida-space' ((⎕IO+97)⊃wp∆ssp∆propertyList)←'text-underline-position' ((⎕IO+98)⊃wp∆ssp∆propertyList)←'top' ((⎕IO+99)⊃wp∆ssp∆propertyList)←'vertical-align' ((⎕IO+100)⊃wp∆ssp∆propertyList)←'visibility' ((⎕IO+101)⊃wp∆ssp∆propertyList)←'white-space' ((⎕IO+102)⊃wp∆ssp∆propertyList)←'widows' ((⎕IO+103)⊃wp∆ssp∆propertyList)←'width' ((⎕IO+104)⊃wp∆ssp∆propertyList)←'word-break' ((⎕IO+105)⊃wp∆ssp∆propertyList)←'word-spacing' ((⎕IO+106)⊃wp∆ssp∆propertyList)←'word-wrap' ((⎕IO+107)⊃wp∆ssp∆propertyList)←'writing-mode' ((⎕IO+108)⊃wp∆ssp∆propertyList)←'z-index' ((⎕IO+109)⊃wp∆ssp∆propertyList)←'zoom' ((⎕IO+110)⊃wp∆ssp∆propertyList)←' ' ⍝ proto 1 ((⎕IO+110)⊃wp∆ssp∆propertyList)←0⍴((⎕IO+110)⊃wp∆ssp∆propertyList) ⍝ proto 2