Skip to content

Instantly share code, notes, and snippets.

@berteh
Last active August 18, 2023 13:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save berteh/672b12ab12e70f13c972aba222536bc9 to your computer and use it in GitHub Desktop.
Save berteh/672b12ab12e70f13c972aba222536bc9 to your computer and use it in GitHub Desktop.
generate (html) labels from excel data, ready for Zebra printer

print-labels-thermal-printer

Example to print a ticket or receipt by using CSS, HTML & JavaScript only With this, you can print a receipt that looks like this:

Based on tutorial and code at : https://parzibyte.me/blog/en/2019/10/10/print-receipt-thermal-printer-javascript-css-html/

May contain icons from the Noun Project, CCBY3.0, by

Alina Oleynik, Handdrawn Factory, Veremey, Maxim Kulikov, Marcel Dornis, Tatyana, Gilda Martini, Gilbert Bages, chabib ali machbubi, Rifai, David S, agus raharjo, Fran Couto AHMAD SIDIK, Ana María Lora Macias, Rolas Design

inject CSV data via PowerShell:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 
Install-Module -Name ImportExcel -Scope CurrentUser

#export labels from excel
ConvertFrom-ExcelSheet -Path $source_file -Delimiter ";" -Encoding UTF8 -Extension .txt -OutputPath $temp_dir -SheetName $sheet_name
categorie plant période barcode PRIX LUN MAR MER JEU VEN brins origine floraison couleur produit type nom comestible soleil eau sol croissance etiquettes
VIVACES Agastache juin/juillet/aout 128480 4.90 € de juillet à août violet foncé fleur vivace Agastache feuille (aromate) moyen peu leger 80 cm
FLEURS COUPEES Agastache 7 Bingenheimer fleur coupée
ANNUELLE Alcea Rosea 2500000887888 0 Stefanie fleur bisanuelle Rose trémière
FLEURS COUPEES Alchemilia juin/juillet/aout de juin à juillet vert fleur coupée Alchemilia beaucoup peu tous 45 cm
FLEURS COUPEES Amaranthus caudatus 2 Stefanie fleur coupée Amarante queue-de-renard feuilles, graines 80 cm
FLEURS COUPEES Ammi majus 2 Stefanie fleur coupée Grand ammi soleil à mi-ombre drainant, riche et frais 80 cm
AROMATIQUES Aneth juin/juillet/aout 991049 3.00 € d'avril à juillet blanc aromate annuel Aneth feuille, graine,fleurs beaucoup peu leger 80 cm
FLEURS COUPEES Antirrhinum majus 1 Stefanie fleur coupée Grand Muflier beaucoup drainant, riche 60 cm
FLEURS COUPEES Aralia elata juin/juillet/aout d'août à septembre vert fleur coupée Aralia elata jeunes pousses beaucoup mi ombre moyen tous 4 à 5m
AROMATIQUES Basilic juin/juillet/aout 991049 3.00 € aromate annuel Basilic feuille,en salade beaucoup moyen leger 0,15m 100
FLEURS COUPEES Bergenia juin/juillet/aout de decembre à avril rose fonce fleur coupée Bergenia mi ombre beaucoup leger 30 à 40 cm
FLEURS COUPEES Buxus juin/juillet/aout d'avril à mai vert fonce fleur coupée Buxus moyen peu tous 3 m, lent
ANNUELLE Calendula off.orange juin/juillet/aout 2500000887888 4.90 € de juin à novembre orange fleur annuelle Calendula off.orange fleur, feuille moyen peu tous 60 cm
FLEURS COUPEES Calendula off.orange juin/juillet/aout de juin à novembre orange fleur coupée Calendula off.orange fleur, feuille moyen peu tous 60 cm
FLEURS COUPEES Campanula medium 2 Bingenheimer fleur coupée Campanule carillon
Carthamus tinctorius Bertrand de juillet à septembre abricot fleur annuel Carthame des teinturiers jeunes pousses & bourgeons, graines chaud peu drainant, profond 0,80 à 1 m, rapide
FLEURS COUPEES Centaurea cyanus juin/juillet/aout de juin à août violet fleur coupée Bleuet des champs feuille, jet beaucoup peu tous 1 m, rapide
VIVACES Centaurea cyanus juin/juillet/aout 128480 4.90 € de juin à août violet fleur vivace Centaurea cyanus jeune feuille, jet beaucoup peu tous 1 m, rapide
FLEURS COUPEES Centaurea cyanus fleur coupée
FLEURS COUPEES Centaurea organs 3 Bingenheimer fleur coupée
AROMATIQUES Cerfeuil juin/juillet/aout 991049 3.00 € aromate annuel Cerfeuil fleur moyen moyen tous 30cm à 1m
ANNUELLE Chrysanthemum carinatum juin/juillet/aout 2500000887888 4.90 € de juillet à septembre jaune, orange fleur annuelle Chrysanthemum carinatum jeune feuille, jet moyen peu tous 0,6 m, rapide
FLEURS COUPEES Chrysanthemum carinatum 2 Bingenheimer fleur coupée
AROMATIQUES ciboulette juin/juillet/aout 991049 3.00 € avril octobre aromate vivace ciboulette tige,fleurs beaucoup peu leger 25cm
FLEURS COUPEES Clarkia elegans 3 Bingenheimer fleur coupée Clarkia élégant
AROMATIQUES Coriandre juin/juillet/aout 991049 3.00 € aromate annuel Coriandre feuille beaucoup moyen leger 25 à 60 cm
FLEURS COUPEES Cornus juin/juillet/aout de juin à juillet blanc fleur coupée Cornus beaucoup mi ombre peu tous 3 m, rapide
FLEURS COUPEES Cosmos bippiinatus juin/juillet/aout 3 Bertrand de juin à novembre rose fleur coupée Cosmos bippiinatus beaucoup peu tous 0,50 à 1,50 m
ANNUELLE Cosmos bippinatus juin/juillet/aout 2500000887888 4.90 € de mai à octobre rose fleur annuelle Cosmos bippinatus fleur (en salade) beaucoup peu tous 50 cm à 1,50 m
FLEURS COUPEES Cotinus juin/juillet/aout de juin à juillet rose fleur coupée Cotinus beaucoup peu tous 5 m
FLEURS COUPEES Cytisus juin/juillet/aout d'avril à juillet bleu fleur coupée Cytisus peu leger 0,2 m
ANNUELLE Delphinium juin/juillet/aout 2500000887888 4.90 € de juin à juillet bleu fleur annuelle Delphinium beaucoup peu tous 50 cm
FLEURS COUPEES Delphinium juin/juillet/aout de juin à octobre bleu fleur coupée Delphinium beaucoup peu tous 50 cm
FLEURS COUPEES Delphinium fleur coupée
FLEURS COUPEES Dianthus Barbatus 5 Stefanie fleur coupée œillet du poète mi-ombre riche
FLEURS COUPEES Dianthus Bartnelke 2 Stefanie fleur coupée Bartnel, œillet balane soleil à mi-ombre riche
FLEURS COUPEES Gaillardia 4 Stefanie fleur coupée Gaillarde
FLEURS COUPEES Gaura lindheimeri juin/juillet/aout de mai à septembre rose fleur coupée Gaura lindheimeri moyen peu tous 60 à 80 cm
VIVACES Gaura lindheimeri juin/juillet/aout 128480 4.90 € de mai à septembre rose fleur vivace Gaura lindheimeri beaucoup à mi ombre tous 60 à 80 cm
FLEURS COUPEES Gaura lindheimeri fleur coupée
FLEURS COUPEES Gypsophile 5 Bingenheimer fleur coupée
FLEURS COUPEES Helianthus debillis juin/juillet/aout d'août à octobre jaune fleur coupée Helianthus debillis beaucoup peu tous 2 m
FLEURS COUPEES Helianthus hella juin/juillet/aout d'avril à juin jaune fleur coupée Helianthus hella pétales beaucoup beaucoup tous 3 m
FLEURS COUPEES Herbe de la pampa juin/juillet/aout de juillet à decembre blanc argente rose fleur coupée Herbe de la pampa beaucoup peu tous 1 à 5m
FLEURS COUPEES Hortensia juin/juillet/aout de juin à septembre bleu fleur coupée Hortensia beaucoup mi ombre peu leger 0,80 à 1m
FLEURS COUPEES Hosta juin/juillet/aout de juillet à août violet pâle fleur coupée Hosta moyuen peu tous 20 cm
FLEURS COUPEES Hypericum juin/juillet/aout de juin à août jaune fleur coupée Hypericum beaucoup mi ombre peu tous 1 m, rapide
FLEURS COUPEES Laburnum juin/juillet/aout de mai à juin jaune fleur coupée Laburnum beaucoup mi ombre moyen tous 5 m, rapide
FLEURS COUPEES Laurier cerise juin/juillet/aout en avril à juin blanc fleur coupée Laurier cerise beaucoup myen tous 1 à 4 m
FLEURS COUPEES Lavande juin/juillet/aout de juin à septembre violet fleur coupée Lavande feuille, fleurs beaucoup moyen leger 30 cm à 1,50 m
FLEURS COUPEES Lilas juin/juillet/aout de mars à juin bleu fleur coupée Lilas beaucoup mi ombre moyen tous 0,60m 10m
AROMATIQUES Liveche juin/juillet/aout 991049 3.00 € aromate vivace Liveche beaucoup moyen leger 0,60m
FLEURS COUPEES Malus Everest juin/juillet/aout en avril blanc, fruit fleur coupée Malus Everest beaucoup mi ombre moyen tous 2m 10m
FLEURS COUPEES Miscanthus juin/juillet/aout 12345 0.10 € de juillet à août blanche fleur coupée Miscanthus bourgeon de fleur clos moyen peu tous 2,5 m, rapide
FLEURS COUPEES Nigella damascena 4 Bingenheimer fleur coupée Nigelle de Damas
AROMATIQUES Paprika barakan 991049 3.00 € mai à septembre aromate Paprika barakan fruit beaucoup modéré tous 0.4 0
AROMATIQUES Paprika cal. Wonder 991049 3.00 € mai à septembre aromate annuel Paprika cal. Wonder fruit beaucoup modéré tous 0.4
FLEURS COUPEES Pennisetum juin/juillet/aout d'août à septembre blanche fleur coupée Pennisetum beaucoup peu leger 1,5 m, rapide
AROMATIQUES Persil juin/juillet/aout 991049 3.00 € aromate annuel Persil beaucou moyen leger 15 à 30 cm
AROMATIQUES Pfefferoni milder spiral 991049 3.00 € aout à octobre aromate annuel Pfefferoni milder spiral fruit beaucoup modéré tous 0.4
AROMATIQUES Physalis juin/juillet/aout 991049 3.00 € aromate annuel Physalis beaucoup moyen leger 50 à 80 cm
VIVACES Pois de senteur juin/juillet/aout 128480 4.90 € de mai à septembre fleur vivace Pois de senteur beaucoup peu tous 15 à 50 cm
FLEURS COUPEES Pois de senteur fleur coupée
AROMATIQUES Poivron sweet pepper 991049 3.00 € juillet à aout aromate annuel Poivron sweet pepper fruit beaucoup modéré tous 0.4
FLEURS COUPEES Rhubarbe juin/juillet/aout d' avril à septembre blanc fleur coupée Rhubarbe beaucoup mi ombre moyen tous 0,50 1m
FLEURS COUPEES Rhus tiphina juin/juillet/aout de juin à août fruit rouge fleur coupée Rhus tiphina beaucoup mi ombre moyen tous 4m 7,50m
Rudbeckia echinacea Bertrand
VIVACES Rudbeckia hirta juin/juillet/aout 128480 4.90 € de juillet à octobre jaune fleur vivace Rudbeckia hirta beaucoup peu tous 2 m
FLEURS COUPEES Rudbeckia hirta fleur coupée
VIVACES Salvia sclarea juin/juillet/aout 128480 4.90 € en août rose fleur vivace Salvia sclarea fleur, feuille, suc beaucoup peu tous 1 m
FLEURS COUPEES Salvia sclarea 1 Stefanie fleur coupée Sauge sclarée
FLEURS COUPEES Scabiosa atropurpurea juin/juillet/aout 3 Stefanie de juin à juillet bleu fleur bisanuelle Scabieuse pourpre beaucoup peu tous 50 cm
VIVACES Scabiosa atropurpurea juin/juillet/aout 128480 4.90 € de juin à septembre violet fleur vivace Scabiosa atropurpurea racines beaucoup peu tous 30 à 90 cm
FLEURS COUPEES Symphorine juin/juillet/aout de juin à septembre baie rose blanc fleur coupée Symphorine beaucoup mi ombre moyen tous 1m
FLEURS COUPEES Tagetes erecta 3 Bingenheimer fleur coupée Rose d'Inde
FLEURS COUPEES Valeriana officinalis 3 Bingenheimer fleur coupée Valériane des collines
FLEURS COUPEES Verbascum 1 Stefanie fleur bisanuelle Grande molène 80 cm
FLEURS COUPEES Veronicastrum virginicum 4 Bingenheimer fleur coupée Véronique de Virginie
ANNUELLE Zinnia elegans juin/juillet/aout 2500000887888 4.90 € de juin à septembre rose fleur annuelle Zinnia elegans beaucoup moyen tous 15 cm à 1m
FLEURS COUPEES Zinnia elegans 1 Stefanie fleur coupée 1,2 m
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<base href="./">
<script src="https://unpkg.com/jsbarcode@latest/dist/JsBarcode.all.min.js"></script>
<style type="text/css">
body {
font-size: 11px; font-family: 'Arial'; font-stretch: 80%;
margin: 0;
}
section {border: solid 1px black;
width:57mm; height: 32mm;
page-break-after: always;
position:relative;
overflow: hidden;
float:left;
}
section:not(.n1){zoom:20%;ba}
p { margin:0 ; padding:0; white-space:nowrap;}
.big, .plant {font-size: 210%; font-weight: bold;}
.med, .prix {font-size: 180%; font-weight: bold;}
p img {height: 10px; margin: 0 2px; vertical-align: middle;}
p.hauteur img {height: 9px;}
.plant, .type, .floraison, .comestible, .barcode {
position:absolute; text-align:left; left:1.5mm;}
.hauteur, .soleil, .eau, .sol, .prix {
position:absolute; text-align:right; right:1.5mm;}
.plant {top:0mm;}
.type {top:6mm;}
.floraison {top:10mm;}
.comestible {top:14mm;}
.hauteur {top:7mm;}
.soleil {top:10mm;}
.eau {top:13mm;}
.sol {top:16mm;}
.barcode {left:3mm; bottom:1.5mm;}
.prix {right:4mm; bottom:3mm;}
@media print {
.hidden-print, .hidden-print * {display: none !important;}
section { width:56mm; height: 30mm; border:none; float:none;
margin: 2mm 0 0 1mm;}
section:not(.n1){zoom:unset !important}
}
@page {margin: 2mm 0 0 1mm;} // margin for each printed piece of paper
@page:first { margin-top: 0mm;} //fix for strange extra margin in chrome first page
</style>
<title>Etiquettes</title>
</head>
<body>
<section class="etq n1">
<p class="plant">Calendula off.orange</p>
<p class="hauteur">60 cm<img src="pics/height.svg"/></p>
<p class="type">fleur annuelle</p>
<p class="soleil">moyen<img src="pics/sun-shining.svg"/></p>
<p class="floraison"><img src="pics/flower.svg" />de juin à novembre</p>
<p class="eau">peu<img src="pics/water.svg"/></p>
<p class="comestible"><img src="pics/restaurant2.svg"/>fleur, feuille</p>
<svg class="barcode" jsbarcode-value="12345"
jsbarcode-format="CODE128" jsbarcode-height="20" jsbarcode-width="1" jsbarcode-margin="0" jsbarcode-textmargin="-11" jsbarcode-fontoptions="small">
</svg>
<p class="sol">tous<img src="pics/sand-soil.svg"/></p>
<p class="prix">0.1 €</p>
</section>
<section class="etq n2">
<p class="plant">Calendula off.orange</p>
<p class="hauteur">60 cm<img src="pics/height.svg"/></p>
<p class="type">fleur annuelle</p>
<p class="soleil">moyen<img src="pics/sun-shining.svg"/></p>
<p class="floraison"><img src="pics/flower.svg" />de juin à novembre</p>
<p class="eau">peu<img src="pics/water.svg"/></p>
<p class="comestible"><img src="pics/restaurant2.svg"/>fleur, feuille</p>
<svg class="barcode" jsbarcode-value="12345"
jsbarcode-format="CODE128" jsbarcode-height="20" jsbarcode-width="1" jsbarcode-margin="0" jsbarcode-textmargin="-11" jsbarcode-fontoptions="small">
</svg>
<p class="sol">tous<img src="pics/sand-soil.svg"/></p>
<p class="prix">0.1 €</p>
</section>
<section class="etq n3">
<p class="plant">Calendula off.orange</p>
<p class="hauteur">60 cm<img src="pics/height.svg"/></p>
<p class="type">fleur annuelle</p>
<p class="soleil">moyen<img src="pics/sun-shining.svg"/></p>
<p class="floraison"><img src="pics/flower.svg" />de juin à novembre</p>
<p class="eau">peu<img src="pics/water.svg"/></p>
<p class="comestible"><img src="pics/restaurant2.svg"/>fleur, feuille</p>
<svg class="barcode" jsbarcode-value="12345"
jsbarcode-format="CODE128" jsbarcode-height="20" jsbarcode-width="1" jsbarcode-margin="0" jsbarcode-textmargin="-11" jsbarcode-fontoptions="small">
</svg>
<p class="sol">tous<img src="pics/sand-soil.svg"/></p>
<p class="prix">0.1 €</p>
</section>
<section class="etq n1">
<p class="plant">Cosmos bippinatus</p>
<p class="hauteur">50 cm à 1,50 m<img src="pics/height.svg"/></p>
<p class="type">fleur annuelle</p>
<p class="soleil">beaucoup<img src="pics/sun-shining.svg"/></p>
<p class="floraison"><img src="pics/flower.svg" />de mai à octobre</p>
<p class="eau">peu<img src="pics/water.svg"/></p>
<p class="comestible"><img src="pics/restaurant2.svg"/>fleur (en salade)</p>
<svg class="barcode" jsbarcode-value="12345"
jsbarcode-format="CODE128" jsbarcode-height="20" jsbarcode-width="1" jsbarcode-margin="0" jsbarcode-textmargin="-11" jsbarcode-fontoptions="small">
</svg>
<p class="sol">tous<img src="pics/sand-soil.svg"/></p>
<p class="prix">120 €</p>
</section>
<section class="etq n1">
<p class="plant">Aneth</p>
<p class="hauteur">80 cm<img src="pics/height.svg"/></p>
<p class="type">aromate annuel</p>
<p class="soleil">beaucoup<img src="pics/sun-shining.svg"/></p>
<p class="floraison"><img src="pics/flower.svg" />d'avril à juillet</p>
<p class="eau">peu<img src="pics/water.svg"/></p>
<p class="comestible"><img src="pics/restaurant2.svg"/>feuille, graine,fleurs</p>
<svg class="barcode" jsbarcode-value="991049"
jsbarcode-format="CODE128" jsbarcode-height="20" jsbarcode-width="1" jsbarcode-margin="0" jsbarcode-textmargin="-11" jsbarcode-fontoptions="small">
</svg>
<p class="sol">leger<img src="pics/sand-soil.svg"/></p>
<p class="prix">3 €</p>
</section>
<div class="hidden-print">
<button id="btnPrint">Print</button>
<script src="script.js"></script>
<script type="text/javascript">
JsBarcode(".barcode").init();
//JsBarcode("#bc1").init();
</script>
</div>
</body>
</html>
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Install-Module -Name ImportExcel -Scope CurrentUser
https://github.com/dfinke/ImportExcel
create launcher that runs
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -file generer-etiquettes.ps1
in active directory:
#### config ####
$sourceFile = [Environment]::GetFolderPath("Desktop")+"\donnees-plantes.xlsx"
$sheetName = "plants"
$repeatColumnName = "etiquettes"
$out_file = [Environment]::GetFolderPath("Desktop")+"\a-imprimer_$(Get-Date -format "yy-MM-dd_HH-mm-ss").html"
## end of config ##
$baseDir = "file://$PSScriptRoot"
function parse()
{
Import-Module ImportExcel
Import-Excel -Path $sourceFile -WorksheetName $sheetName | Where-Object $repeatColumnName
}
function testGeneration()
{
. '.\PowerShellViewEngine\ViewEngineTool.ps1'
#test model
$data = parse
#view render method 1 - embedded powershell string evaluation
$html = "
<html><h1>head</h1>
$(foreach($entry in $data) {
foreach($i in 1..$entry.$repeatColumnName){ "
<li>$($entry.plant), $($i)</li>"}})
<p>footer</p>
</html>"
Write-Host $html
}
function generate()
{
. '.\PowerShellViewEngine\ViewEngineTool.ps1'
$data = parse
$head = $( RenderViewNativePowerShell 'header.html' $data ) | Out-String
$(foreach($entry in $data) {
foreach($i in 1..$entry.$repeatColumnName){
$html += $( RenderViewNativePowerShell 'entry.html' $data )| Out-String
}
})
$foot = $( RenderViewNativePowerShell 'footer.html' $data )| Out-String
$head
$html
$foot
}
generate | Out-File -encoding UTF8 -FilePath $out_file
#preview in browser
start $out_file
<section class="etq n$i">
<p class="plant">$($entry.plant)</p>
<p class="hauteur">$($entry.croissance)<img src="pics/height.svg"/></p>
<p class="type">$($entry.produit) $($entry.type)</p>
<p class="soleil">$($entry.soleil)<img src="pics/sun-shining.svg"/></p>
<p class="floraison"><img src="pics/flower.svg" />$($entry.couleur) $($entry.floraison)</p>
<p class="eau">$($entry.eau)<img src="pics/water.svg"/></p>
<p class="comestible"><img src="pics/restaurant2.svg"/>$($entry.comestible)</p>$( if($entry.barcode) {"
<svg class='barcode' jsbarcode-value='$($entry.barcode)'
jsbarcode-format='CODE128' jsbarcode-height='20' jsbarcode-width='1' jsbarcode-margin='0' jsbarcode-textmargin='-11' jsbarcode-fontoptions='small'>
</svg>"})
<p class="sol">$($entry.sol)<img src="pics/sand-soil.svg"/></p>$( if($entry.prix) {"
<p class='prix'>$($entry.prix) €</p>"})
</section>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<base href="$baseDir/">
<script src="https://unpkg.com/jsbarcode@latest/dist/JsBarcode.all.min.js"></script>
<style type="text/css">
body {
font-size: 11px; font-family: 'Arial'; font-stretch: 80%;
margin: 0;
}
section {border: solid 1px black;
width:57mm; height: 32mm;
page-break-after: always;
position:relative;
overflow: hidden;
float:left;
}
section:not(.n1){zoom:20%;}
section:not(.n1):hover{zoom:100%;}
p { margin:0 ; padding:0; white-space:nowrap;}
.big, .plant {font-size: 210%; font-weight: bold;}
.med, .prix {font-size: 180%; font-weight: bold;}
p img {height: 10px; margin: 0 2px; vertical-align: middle;}
p.hauteur img {height: 9px;}
.plant, .type, .floraison, .comestible, .barcode {
position:absolute; text-align:left; left:1.5mm;}
.hauteur, .soleil, .eau, .sol, .prix {
position:absolute; text-align:right; right:1.5mm;}
.plant {top:0mm;}
.type {top:6mm;}
.floraison {top:10mm;}
.comestible {top:14mm;}
.hauteur {top:7mm;}
.soleil {top:10mm;}
.eau {top:13mm;}
.sol {top:16mm;}
.barcode {left:2mm; bottom:1.5mm;}
.prix {right:4mm; bottom:3mm;}
@media print {
.hidden-print, .hidden-print * {display: none !important;}
section { width:56mm; height: 30mm; border:none; float:none;
margin: 2mm 0 0 1mm;}
section:not(.n1){zoom:unset !important}
}
@page {margin: 2mm 0 0 1mm;} // margin for each printed piece of paper
@page:first { margin-top: 0mm;} //fix for strange extra margin in chrome first page
</style>
<title>Etiquettes</title>
</head>
<body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment