User Tools

Site Tools


project:bioosm:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
project:bioosm:start [2018/06/07 15:59] sachyproject:bioosm:start [2022/09/18 16:53] sachy
Line 3: Line 3:
 {{template>:project:infobox| {{template>:project:infobox|
 name=Biologicke zbrane ve vasem okoli| name=Biologicke zbrane ve vasem okoli|
-image= :project:bioosm:biohazard.svg?200 +image= bioosm:bioosm.jpg?400 
-founder=[[user:sachy:start]]| +founder=[[user:sachy]]| 
-interested=[[user:sumie]]| +interested=[[user:sumie-dh]]| 
-sw=CC|+sw=CC-BY-SA|
 hw=N/A| hw=N/A|
 status=active}} status=active}}
 ~~META: ~~META:
 status = active status = active
-&relation firstimage = :project:bioosm:biohazard.svg+&relation firstimage = :project:bioosm:bioosm.jpg
 ~~ ~~
  
 [[http://brmlab.s0c4.net/bioosm/|BioOSM]] je mapa vyskytu mikroorganismu (ras, bakterii, plostenek, ...) a do budoucna i dalsich prirodnin (mineralu, ...). [[http://brmlab.s0c4.net/bioosm/|BioOSM]] je mapa vyskytu mikroorganismu (ras, bakterii, plostenek, ...) a do budoucna i dalsich prirodnin (mineralu, ...).
 +
 +==== K cemu to je ====
 +
 +  * interaktivni mapa vhodna k zobrazovani vetsiho mnozstvi fotek, brmlabi wiki, sluzby typu phtagr a soup se zdaly nevhodne k publikaci tohoto typu obsahu, wiki by byla prilis obludna, na beznych sdilecich obrazkovych sluzbach se neda nic pohodlne dohledavat a davat tam biologicky smysluplne a prehledne popisky
 +  * monitoring zivocichu a rostlin podle zajmu prispevovatelu 
 +  * snadne klikaci katalogovani nalezu skrze Tellico nevyzadujici coding skills
 +  * TODO - jednoduche selekce zajmoveho okruhu subjektu [napr. podle rodu, biotopu, datumu] na mape
 +  * procvicovani temne magie commandu grep, sed a regexpu
  
 ==== Jak to funguje ==== ==== Jak to funguje ====
Line 20: Line 28:
 Podklad jsou [[https://openstreetmap.org|OSM]], ktere maji API [[http://openlayers.org/|OpenLayers]] jez umoznuje pridavat do mapy vlastni body, vrstvy... Podklad jsou [[https://openstreetmap.org|OSM]], ktere maji API [[http://openlayers.org/|OpenLayers]] jez umoznuje pridavat do mapy vlastni body, vrstvy...
  
-Jednotliva pozorovani jsou v databazi [[http://tellico-project.org/|Tellico]]. Udelal jsem script parse_tellico.sh, ktery z .tc databaze (je to vlastne ZIP s XML uvnitr) vyparsuje jednotlive polozky a vygeneruje HTML soubor s mapou a podadresar "det" s HTML strankami s detaily jednotlivych pozorovani.+Jednotliva pozorovani jsou v databazi [[http://tellico-project.org/|Tellico]]. Udelal jsem script parse_tellico.sh, ktery z .tc databaze (je to vlastne ZIP s XML uvnitr) vyparsuje jednotlive polozky a vygeneruje HTML soubor s mapou a podadresar "det" s HTML strankami s detaily jednotlivych pozorovani. Vygeneruje se taky JSON s vyparsovanymi polozkami, ktery lze z webu projektu stahnout. 
 + 
 +Pro nadsence je vygenerovany taky prehled prispevku plainlog.htm serazeny dle data pridani do databaze. 
 + 
 +Pokud chcete vedet co je noveho, odebirejte projektovou [[http://brmlab.s0c4.net/bioosm/bioosm.rss|RSS]]
  
 Obrazky v plnem rozliseni jsou v podadresari "img", nahledy v "simg". Videa jsou nahrana na YT a misto nahledu maji generickou ikonu. Obrazky v plnem rozliseni jsou v podadresari "img", nahledy v "simg". Videa jsou nahrana na YT a misto nahledu maji generickou ikonu.
  
-Pozorovani ktera se v mape zobrazi lze filtrovat dle prislusnosti k radu (bakterie, zvirata, rostliny,...) pripadne cimkoli co lze grepnout z Tellico XML.+Pozorovani ktera se v mape zobrazi lze filtrovat dle prislusnosti k radu (bakterie, zvirata, rostliny,...) az po prislusnost k jednotlivym druhum.
  
 === Tellico sample database === === Tellico sample database ===
Line 40: Line 52:
   - seskupeni dle lokality   - seskupeni dle lokality
  
-<code>+<code bash>
 praseTC=$(unzip -p "$1" tellico.xml | tr -d '\n' | sed -e $'s/<entry id="/\\\n<entry id="/g' -e $'s/<\/entry>/<\/entry>\\\n/g' | grep -Pe '^<entry id="' | grep "<strcit-do-mapy>yep</strcit-do-mapy>" | sed -E 's/(^.*)(<locality>.*<\/locality>)(.*$)/\2\1\3/' | sort) praseTC=$(unzip -p "$1" tellico.xml | tr -d '\n' | sed -e $'s/<entry id="/\\\n<entry id="/g' -e $'s/<\/entry>/<\/entry>\\\n/g' | grep -Pe '^<entry id="' | grep "<strcit-do-mapy>yep</strcit-do-mapy>" | sed -E 's/(^.*)(<locality>.*<\/locality>)(.*$)/\2\1\3/' | sort)
 </code> </code>
Line 47: Line 59:
  
 Nazvy vrstev musi byt v JS poli kvuli ovladacimu API (skryti/zobrazeni) Nazvy vrstev musi byt v JS poli kvuli ovladacimu API (skryti/zobrazeni)
-<code>+<code javascript>
 var laycon = [vectorLayer,ALL]; var laycon = [vectorLayer,ALL];
 ... ...
Line 53: Line 65:
 </code> </code>
  
-<code>+<code javascript>
 var controls = { var controls = {
   selector: new OpenLayers.Control.SelectFeature(laycon,{onSelect: createPopup, onUnselect: destroyPopup})   selector: new OpenLayers.Control.SelectFeature(laycon,{onSelect: createPopup, onUnselect: destroyPopup})
Line 62: Line 74:
  
 === Prepnuti viditelnych vrstev === === Prepnuti viditelnych vrstev ===
-<code>+<code javascript>
 function kinchange() { function kinchange() {
   kinsel=document.getElementById('kin');   kinsel=document.getElementById('kin');
Line 74: Line 86:
  
 === Nastaveni brmlabu do paticky map === === Nastaveni brmlabu do paticky map ===
-<code>+<code javascript>
 OpenLayers.Layer.Vector('Overlay',{attribution:'<a href="http://brmlab.cz">Brmlab</a>'}); OpenLayers.Layer.Vector('Overlay',{attribution:'<a href="http://brmlab.cz">Brmlab</a>'});
 </code> </code>
Line 81: Line 93:
  
 OSM maji defaultne copyright nesmyslne odsazeny od spodniho okraje mapy, CSS zmena na nejaky rozumny offset: OSM maji defaultne copyright nesmyslne odsazeny od spodniho okraje mapy, CSS zmena na nejaky rozumny offset:
-<code>+<code javascript>
 .olControlAttribution .olControlAttribution
 { {
Line 89: Line 101:
  
 ==== parse_tellico.sh ==== ==== parse_tellico.sh ====
-<code>+<code bash parse_tellico.sh>
 #!/bin/bash #!/bin/bash
 # Parse Tellico database to BioOSM index.htm # Parse Tellico database to BioOSM index.htm
Line 95: Line 107:
 # Print result to stdout # Print result to stdout
 # #
-Generate minis in simg folder +<iframe width="500" height="500" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://www.openstreetmap.org/export/embed.html?bbox=14.978000%2C49.990000%2C15.022000%2C50.010000&amp;layer=mapnik&amp;marker=50.000000%2C15.000000"></iframe
-# find ./ -type f -exec mogrify -verbose -layers Dispose -resize 128\>x128\-quality 100% {} + +// vectorLayer.removeFeatures(atol) 
-#+# // map.removeLayer(vectorLayer)
 # #
 # #
 # Creates: # Creates:
-#   (to stdout) index.htm file with the map and static entries+#   (to stdout) HTML file with the map and static entries
 #   ./det/ID.htm details of each and every entry #   ./det/ID.htm details of each and every entry
 +#   ./bioosm.json JSON of all entries
 +#   ./bioosm.rss updated RSS feed
 +#   ./plainlog.htm sorted entries for easy human/alg
 # #
  
 rm -rfv "./det/*" rm -rfv "./det/*"
 mkdir -p "./det" mkdir -p "./det"
-#cat "./index_head.htm"+ 
 +ICON_animalia="animalia.png" 
 +ICON_bacteria="bacteria.png" 
 +ICON_fungi="fungi.png" 
 +ICON_chromista="chromista.png" 
 +ICON_plantae="plantae.svg" 
 +ICON_plostenkoid="plostenkoid.png" 
 +ICON_protista="protista.png" 
 +ICON_biohazard="biohazard.svg" 
 + 
 +json="" 
 + 
 +rss=$'<?xml version="1.0" encoding="UTF-8" ?>\n' 
 +rss+=$'<rss version="2.0">\n' 
 +rss+=$'<channel>\n' 
 +rss+=$'<title>Brmlab BioOSM RSS feed</title>\n' 
 +rss+=$'<description>New entries on BioOSM database</description>\n' 
 +rss+=$'<link>https://bioosm.s0c4.net</link>\n' 
 +rss+=$'<lastBuildDate></lastBuildDate>\n' 
 +rss+=$'<pubDate></pubDate>\n' 
 +rss+=$'<ttl>86400</ttl>\n' 
 + 
 +Return icon by Regnum 
 +function geticon () { 
 + case "$1" in 
 + "Animalia"
 + echo "$ICON_animalia";; 
 + "Bacteria"
 + echo "$ICON_bacteria";; 
 + "Fungi"
 + echo "$ICON_fungi";; 
 + "Chromista"
 + echo "$ICON_chromista";; 
 + "Plantae"
 + echo "$ICON_plantae";; 
 + "Protista"
 + echo "$ICON_protista";; 
 + *) 
 + echo "$ICON_biohazard";; 
 + esac 
 +
 + 
 +function safehtml () { 
 + echo "$1" | sed -e "s/'/\&#39;/g" -e 's/"/\&#34;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g' -e 's/^[ ]*//g' -e 's/[ ]*$//g' 
 +
 + 
 +i=1 # GLOBAL increment must persist multiple spagety() calls; incremented to infinity 
 +# Core function generating entries matching selection criteria (ie Kingdom) 
 +# !!! BEZ ODSAZENI !!! 
 +# $1 = list of entries 
 +# $2 = layer name 
 +# $3 = icon of the points 
 +function spagety () { 
 + 
 + bylo="" # Minula pozice 
 + sam="" # HTML samostatneho zaznamu 
 + osam="" # predchozi $sam 
 + spoj="" # HTML had z popisu stejnych pozic 
 + ospoj="" # Predchozi $spoj 
 + ox="" # Old X 
 + oy="" # Old Y 
 + datelog="" # Entries sorted by date for plaintext log 
 + json="var data='{\"version\":\"$(date --rfc-3339=seconds)\",\"arma\":[" 
 + 
 + while IFS='' read -r radek || [[ -n "$radek" ]]; do 
 + co=$(echo "$radek" | grep -oe ' <title>.*</title> ' | sed -E 's/( )*<(\/)?title>( )*//g'
 + co=$(safehtml "$co"
 + obr=$(echo "$radek" | grep -oe ' <image>.*</image> ' | sed -E 's/( )*<(\/)?image>( )*//g' | grep -oPe '[^/]*$'
 + obr=$(safehtml "$obr"
 + kde=$(echo "$radek" | grep -oe '<locality>.*</locality>' | grep -oPe '[0-9]+\.[0-9]{1,10}[, ]*[0-9]+\.[0-9]{1,10}'
 + kde=$(safehtml "$kde"
 + kdex=$(echo "$kde" | grep -oPe '[0-9]+\.[0-9]{1,10}$'
 + kdex=$(safehtml "$kdex"
 + kdey=$(echo "$kde" | grep -oPe '^[0-9]+\.[0-9]{1,10}'
 + kdey=$(safehtml "$kdey"
 + kdy=$(echo "$radek" | grep -oe ' <taken-date>.*</taken-date> ' | sed -E 's/( )*<(\/)?taken-date>( )*//g' | sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]{4})/\3-\2-\1/g' | sed -E 's/-([0-9])-/-0\1-/g' | sed -E 's/-([0-9])$/-0\1/g'
 + kdy=$(safehtml "$kdy"
 + skop_typ=$(echo "$radek" | grep -oe ' <new-field-1>.*</new-field-1> ' | sed -E 's/( )*<(\/)?new-field-1>( )*//g'
 + skop_typ=$(safehtml "$skop_typ"
 + skop=$(echo "$radek" | grep -oe ' <microscope>.*</microscope> ' | sed -E 's/( )*<(\/)?microscope>( )*//g'
 + skop=$(safehtml "$skop"
 + imp=$(echo "$radek" | grep -oe ' <new-field-3>.*</new-field-3> ' | sed -E 's/( )*<(\/)?new-field-3>( )*//g'
 + imp=$(safehtml "$imp"
 + reg=$(echo "$radek" | grep -oe ' <new-field-4>.*</new-field-4> ' | sed -E 's/( )*<(\/)?new-field-4>( )*//g'
 + reg=$(safehtml "$reg"
 + phy=$(echo "$radek" | grep -oe ' <phylum>.*</phylum> ' | sed -E 's/( )*<(\/)?phylum>( )*//g'
 + phy=$(safehtml "$phy"
 + cla=$(echo "$radek" | grep -oe ' <class>.*</class> ' | sed -E 's/( )*<(\/)?class>( )*//g'
 + cla=$(safehtml "$cla"
 + ord=$(echo "$radek" | grep -oe ' <order>.*</order> ' | sed -E 's/( )*<(\/)?order>( )*//g'
 + ord=$(safehtml "$ord"
 + fam=$(echo "$radek" | grep -oe ' <family>.*</family> ' | sed -E 's/( )*<(\/)?family>( )*//g'
 + fam=$(safehtml "$fam"
 + gen=$(echo "$radek" | grep -oe ' <genus>.*</genus> ' | sed -E 's/( )*<(\/)?genus( )*>//g'
 + gen=$(safehtml "$gen"
 + spe=$(echo "$radek" | grep -oe ' <species>.*</species> ' | sed -E 's/( )*<(\/)?species>( )*//g'
 + spe=$(safehtml "$spe"
 + loc=$(echo "$radek" | grep -oe ' <locality---plaintext>.*</locality---plaintext> ' | sed -E 's/( )*<(\/)?locality---plaintext>( )*//g'
 + loc=$(safehtml "$loc"
 + des=$(echo "$radek" | grep -oe ' <description>.*</description> ' | sed -E 's/( )*<(\/)?description>( )*//g'
 + des=$(safehtml "$des"
 + vid=$(echo "$radek" | grep -oe ' <videolink>.*</videolink> ' | sed -E 's/( )*<(\/)?videolink>( )*//g'
 + vid=$(safehtml "$vid"
 + bio=$(echo "$radek" | grep -oe ' <biotope>.*</biotope> ' | sed -E 's/( )*<(\/)?biotope>( )*//g'
 + bio=$(safehtml "$bio"
 + eng=$(echo "$radek" | grep -oe ' <enlargement>.*</enlargement> ' | sed -E 's/( )*<(\/)?enlargement>( )*//g'
 + eng=$(safehtml "$eng"
 + obs=$(echo "$radek" | grep -oe ' <observer>.*</observer> ' | sed -E 's/( )*<(\/)?observer>( )*//g'
 + obs=$(safehtml "$obs"
 + lnk=$(echo "$radek" | grep -oe ' <localitylink>.*</localitylink> ' | sed -E 's/( )*<(\/)?localitylink>( )*//g'
 + lnk=$(safehtml "$lnk"
 + har=$(echo "$radek" | grep -oe ' <harvesting-method>.*</harvesting-method> ' | sed -E 's/( )*<(\/)?harvesting-method>( )*//g'
 + den=$(echo "$radek" | grep -oe ' <population-density>.*</population-density> ' | sed -E 's/( )*<(\/)?population-density>( )*//g'
 + dur=$(echo "$radek" | grep -oe ' <min>.*</min> ' | sed -E 's/( )*<(\/)?min>( )*//g'
 + lor=$(echo "$radek" | grep -oe ' <locality-reference>.*</locality-reference> ' | sed -E 's/( )*<(\/)?locality-reference>( )*//g'
 + lrl=$(echo "$radek" | grep -oe ' <locality-reference---link>.*</locality-reference---link> ' | sed -E 's/( )*<(\/)?locality-reference---link>( )*//g'
 + lov=$(echo "$radek" | grep -oe ' <locality---vobrazek>.*</locality---vobrazek> ' | sed -E 's/( )*<(\/)?locality---vobrazek>( )*//g' | grep -oPe '[^/]*$'
 + 
 + # >&2 echo "$co - $har - $den - $dur - $lor - $lrl - $lov" 
 + 
 + detid=$(echo "brmlab$co$obr$kde$kdy" | md5sum | grep -oe '[a-zA-Z0-9]*'
 + 
 + if [[ "$kdex" = "" ]]; then 
 + >&2 echo -e "\033[31m" $(echo "$radek" | grep -oe '<locality>.*</locality>') " $co\033[0m" 
 + continue; 
 + fi 
 + zkurvenetellico=$(echo "$obr" | grep -oe '\.[a-zA-Z]*$'
 + if [[ "$zkurvenetellico" = ".jpeg" ]]; then 
 + >&2 echo -e "\033[31m$obr $co\033[0m" 
 + continue; 
 + fi 
 + 
 + if [[ "$spe" = "sp." ]]; then 
 + wikisp="https://en.wikipedia.org/wiki/$gen" 
 + else 
 + wikisp="https://en.wikipedia.org/wiki/$gen $spe" 
 + fi 
 + 
 + json+="{" 
 + json+=" \"qualis\":\"$co\"," 
 + json+=" \"imperium\":\"$imp\"," 
 + json+=" \"regnum\":\"$reg\"," 
 + json+=" \"phylum\":\"$phy\"," 
 + json+=" \"classis\":\"$cla\"," 
 + json+=" \"ordo\":\"$ord\"," 
 + json+=" \"familia\":\"$fam\"," 
 + json+=" \"genus\":\"$gen\"," 
 + json+=" \"specie\":\"$spe\"," 
 + json+=" \"locus\":\"$kde\"," 
 + json+=" \"x\":\"$kdex\"," 
 + json+=" \"y\":\"$kdey\"," 
 + json+=" \"locplain\":\"$loc\"," 
 + json+=" \"depictio\":\"$des\"," 
 + json+=" \"quando\":\"$kdy\"," 
 + json+=" \"obr\":\"$obr\"," 
 + json+=" \"micro\":\"$skop\"," 
 + json+=" \"microtyp\":\"$skop_typ\"," 
 + json+=" \"vid\":\"$vid\"," 
 + json+=" \"bio\":\"$bio\"," 
 + json+=" \"amp\":\"$eng\"," 
 + json+=" \"spec\":\"$obs\"," 
 + json+=" \"detid\":\"$detid\"," 
 + json+=" \"har\":\"$har\"," 
 + json+=" \"den\":\"$den\"," 
 + json+=" \"dur\":\"$dur\"," 
 + json+=" \"lor\":\"$lor\"," 
 + json+=" \"lrl\":\"$lrl\"," 
 + json+=" \"lov\":\"$lov\"," 
 + json+=" \"lnk\":\"$lnk\"" # Lastone without ',' 
 + json+="}," 
 + 
 + 
 + rss+=$'<item>\n' 
 + rss+=$'  <title>'"$co"$'</title>\n' 
 + rss+=$'  <description>'"$des"$'</description>\n' 
 + rss+=$'  <link>http://brmlab.s0c4.net/bioosm/det/'"$detid"$'.htm</link>\n' 
 + rss+=$'  <guid isPermaLink="false">'"$detid"$'</guid>\n' 
 + rss+=$'  <pubDate>'"$kdy"$'</pubDate>\n' 
 + rss+=$'</item>\n' 
 + 
 + 
 + # Generate detail page 
 + detid=$(echo "brmlab$co$obr$kde$kdy" | md5sum | grep -oe '[a-zA-Z0-9]*'
 + detpg="<html><head>" 
 + detpg+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" 
 + detpg+="<link rel='stylesheet' href='../style.css' type='text/css'>" 
 + detpg+="<title>Brmlab - BioOSM $co $kde</title>" 
 + detpg+="</head><body>" 
 + detpg+="<table class='dettbl'><tr>" 
 + detpg+="<h1>$co (<a href='$wikisp' target='_blank'>wiki</a>)</h1>" 
 + detpg+="<td style='width:33%;vertical-align:top'>" 
 + if [[ "$imp" != "" ]]; then 
 + detpg+="<b>Imperium:</b> <a href='https://en.wikipedia.org/wiki/$imp' target='_blank'>$imp</a><br>" 
 + fi 
 + if [[ "$reg" != "" ]]; then 
 + detpg+="<b>Regnum:</b> <a href='https://en.wikipedia.org/wiki/$reg' target='_blank'>$reg</a><br>" 
 + fi 
 + if [[ "$phy" != "" ]]; then 
 + detpg+="<b>Phylum:</b> <a href='https://en.wikipedia.org/wiki/$phy' target='_blank'>$phy</a><br>" 
 + fi 
 + if [[ "$cla" != "" ]]; then 
 + detpg+="<b>Classis:</b> <a href='https://en.wikipedia.org/wiki/$cla' target='_blank'>$cla</a><br>" 
 + fi 
 + if [[ "$ord" != "" ]]; then 
 + detpg+="<b>Ordo:</b> <a href='https://en.wikipedia.org/wiki/$ord' target='_blank'>$ord</a><br>" 
 + fi 
 + if [[ "$fam" != "" ]]; then 
 + detpg+="<b>Familia:</b> <a href='https://en.wikipedia.org/wiki/$fam' target='_blank'>$fam</a><br>" 
 + fi 
 + if [[ "$gen" != "" ]]; then 
 + detpg+="<b>Genus:</b> <a href='https://en.wikipedia.org/wiki/$gen' target='_blank'>$gen</a><br>" 
 + fi 
 + if [[ "$spe" != "" ]]; then 
 + detpg+="<b>Specie:</b> <a href='$wikisp' target='_blank'>$spe</a><br>" 
 + fi 
 + detpg+="<br>" 
 + if [[ "$kdy" != "" ]]; then 
 + detpg+="<b>Quando:</b> $kdy<br>" 
 + fi 
 + if [[ "$lnk" != "" ]]; then 
 + loc="<a href=\"$lnk\" target=\"_blank\">$loc</a>" # Yes, escaped " 
 + fi 
 + detpg+="<b>Locus:</b> $kde ($loc)<br>" 
 + if [[ "$obs" != "" ]]; then 
 + detpg+="<b>Spectator:</b> $obs<br>" 
 + fi 
 + if [[ "$bio" != "" ]]; then 
 + detpg+="<b>Biotope:</b> $bio<br>" 
 + fi 
 + if [[ "$skop" != "" ]]; then 
 + detpg+="<b>Microscopium:</b> $skop ($skop_typ)<br>" 
 + fi 
 + if [[ "$eng" != "" ]]; then 
 + detpg+="<b>Amplificatio:</b> $eng<br>" 
 + fi 
 + if [[ "$vid" != "" ]]; then 
 + detpg+="<b>Video:</b> <a href=\"$vid\" target=\"_blank\">$vid</a><br>" 
 + fi 
 + if [[ "$har" != "" ]]; then 
 + detpg+="<b>Collecting method:</b> $har<br>" 
 + fi 
 + if [[ "$den" != "" ]]; then 
 + detpg+="<b>Individuals found:</b> $den<br>" 
 + fi 
 + if [[ "$dur" != "" ]]; then 
 + detpg+="<b>Duration on stage:</b> $dur<br>" 
 + fi 
 + if [[ "$lrl" != "" ]]; then 
 + detpg+="<b>Locality reference:</b> <a href=\"$lrl\" target=\"_blank\">$lor</a><br>" 
 + elif [[ "$lor" != "" ]]; then 
 + detpg+="<b>Locality reference:</b> $lor<br>" 
 + fi 
 + if [[ "$des" != "" ]]; then 
 + detpg+="<b>Depictio:</b> $des<br>" 
 + fi 
 + detpg+="<br><b>More on <a href=\"../\">BioOSM map</a></b><br>" 
 + detpg+="<br>" 
 + 
 + lhx=$(echo "$kdex-0.022" | bc) 
 + lhy=$(echo "$kdey-0.010" | bc) 
 + pdx=$(echo "$kdex+0.022" | bc) 
 + pdy=$(echo "$kdey+0.010" | bc) 
 + detpg+="<iframe id='minimapa' src='https://www.openstreetmap.org/export/embed.html?bbox=$lhx%2C$lhy%2C$pdx%2C$pdy&amp;layer=mapnik&amp;marker=$kdey%2C$kdex'></iframe>" 
 + detpg+="</td><td style='min-width:66%;vertical-align:top'>" 
 + 
 + if [[ "$obr" != "" ]]; then 
 + detpg+="<a href=\"../img/$obr\"><img src=\"../img/$obr\" alt=\"$co\" class='detimg'></a>" 
 + else 
 + if [[ "$vid" != "" ]]; then 
 + detyt=$(echo "$vid" | sed -e 's/youtube.com\/watch?v=/youtube.com\/embed\//g'
 + detpg+="<iframe class='detvid' src='$detyt' frameborder='0' allow='encrypted-media' allowfullscreen></iframe>" 
 + else 
 + detpg+="<img src=\"../$3\" alt=\"video\" class='detimg'>" 
 + fi 
 + fi 
 + if [[ "$lov" != "" ]]; then 
 + detpg+="<img class=\"detimg\" src=\"../lokality/$lov\" alt=\"Locality photo\"><br>" 
 + fi 
 + 
 + detpg+="</td></tr></table>" 
 + detpg+="</body></html>" 
 + echo "$detpg" > "./det/$detid.htm" 
 + 
 + # Plain log of entries 
 + datelog+="$kdy $kde <a href='./det/$detid.htm' target='_blank'>$co</a><br>\n" 
 + 
 + >&2 echo -e "\033[32m$co $obs\033[0m" 
 + 
 + ox="$kdex" 
 + oy="$kdey" 
 + 
 + i=$(($i+1)) 
 + 
 + done <<< $(echo "$1") # Zere parametr spaget, nikoli $1 scriptu !!! 
 + echo "$json{}]}" | sed -e "s/^var data='//g" > "./bioosm.json" 
 + echo "$json{}]}'" 
 + 
 + rss+=$'</channel>\n' 
 + rss+=$'</rss>\n' 
 + echo "$rss" > "./bioosm.rss" 
 + 
 +} # KONEC FCE SPAGETY 
 + 
  
 # Parse Tellico file to list of entries # Parse Tellico file to list of entries
Line 114: Line 432:
 # Sorted unique Kingdoms (to be passed as selection criteria) # Sorted unique Kingdoms (to be passed as selection criteria)
 kingdoms=$(echo "$praseTC" | grep -oe ' <new-field-4>.*</new-field-4> ' | sed -E 's/( )*<(\/)?new-field-4>( )*//g' | sort | uniq) kingdoms=$(echo "$praseTC" | grep -oe ' <new-field-4>.*</new-field-4> ' | sed -E 's/( )*<(\/)?new-field-4>( )*//g' | sort | uniq)
- 
  
 echo '<!DOCTYPE html>' echo '<!DOCTYPE html>'
Line 120: Line 437:
 echo '<head>' echo '<head>'
 echo ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">' echo ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">'
-echo ' <title>BioOSM</title>'+echo ' <title>brmlab - BioOSM</title>'
 echo ' <link rel="stylesheet" href="./style.css" type="text/css">' echo ' <link rel="stylesheet" href="./style.css" type="text/css">'
 +echo ' <link rel="favicon" href="./'$ICON_biohazard'">'
 echo ' <script src="./OpenLayers.js"></script>' echo ' <script src="./OpenLayers.js"></script>'
 echo '</head>' echo '</head>'
 +echo '<body>'
 +# Generate select
 +echo "<div id='plainlog'><b><a href='./bioosm.rss'>RSS feed</a><br><a href='./plainlog.htm'>Quick news log</a></b></div>"
 +echo "<h1 id='title'>BioOSM - arma biologica in tuis vicinia</h1>"
 +ksel="<select id='reg' onChange='genphy()'>"
 +ksel="$ksel<option value='ALL' selected>ALL</option>"
 +while IFS='' read -r king || [[ -n "$king" ]]; do
 + ksel="$ksel<option value='"$king"'>$king</option>"
 +done <<< $(echo "$kingdoms")
 +ksel="$ksel</select>"
 +echo "Regnum: $ksel "
  
-echo "<body>" +echo "Phylum: <select id='phy' onChange='gencla()'><option>ALL</option></select> " 
- echo "<h1 id='title'>BioOSM - armis biologica in tuis vicinia</h1>" +echo "Classis: <select id='cla' onChange='genord()'><option>ALL</option></select> " 
- +echo "Ordo: <select id='ord' onChange='genfam()'><option>ALL</option></select> " 
- # Generate select +echo "Familia: <select id='famonChange='gengen()'><option>ALL</option></select> " 
- ksel="<select id='kin' onChange='kinchange()'>" +echo "Genus: <select id='genonChange='genspe()'><option>ALL</option></select>
- ksel="$ksel<option value='ALLselected>ALL</option>" +echo "Specie: <select id='spe' onChange='armageddon()'><option>ALL</option></select>" 
- while IFS='' read -r king || [[ -n "$king]]; do +echo "<br><input type='button' value='Platyhelminthes' onClick='plostenkoidy()'>" 
- ksel="$ksel<option value='"$king"'>$king</option>" +echo "<input type='checkbox' id='studchecker' onChange='studdrv()'>&nbsp;Springs
- done <<< $(echo "$kingdoms") +#echo "<input type='button' value='Bugs' onClick='buggy()'>
- ksel="$ksel</select>" +echo "<br><br><div id='map' class='smallmap'></div>" 
- echo "Regnum: $ksel | +echo "<br><p>Welcome! You can download the <a href='./bioosm.json' target='_blank'>source data as JSON file</a><br>" 
- echo "<input type='button' value='Plostenkoidy' onClick='plostenkoid()'><br><br>+echo "This site is owned by members of the <a href='https://brmlab.cz' target='_blank'>hackerspace brmlab</a>. See our wiki page for <a href='https://brmlab.cz/project/bioosm/start' target='_blank'>details and contact info</a><br>License: CC-BY-SA</p>"
- +
-  echo "<div id='map' class='smallmap'></div>"+
 echo "</body>" echo "</body>"
  
-echo '<script>+echo "<script>"
 echo 'map = new OpenLayers.Map("map");' echo 'map = new OpenLayers.Map("map");'
 echo 'map.addLayer(new OpenLayers.Layer.OSM());' echo 'map.addLayer(new OpenLayers.Layer.OSM());'
Line 158: Line 484:
 echo ' new OpenLayers.Geometry.Point(14.41876, 50.10554).transform(epsg4326, projectTo),' echo ' new OpenLayers.Geometry.Point(14.41876, 50.10554).transform(epsg4326, projectTo),'
 echo ' {description:"Atomovy atol Brmkini"} ,' echo ' {description:"Atomovy atol Brmkini"} ,'
-echo ' {externalGraphic: "./biohazard.svg", graphicHeight:24, graphicWidth:24, graphicXOffset:-12, graphicYOffset:-12},'+echo ' {externalGraphic: "./biohazard.svg", graphicHeight:8, graphicWidth:8, graphicXOffset:-4, graphicYOffset:-4},'
 echo ');' echo ');'
 echo 'vectorLayer.addFeatures(atol);' echo 'vectorLayer.addFeatures(atol);'
Line 164: Line 490:
 echo "map.addLayer(vectorLayer);" echo "map.addLayer(vectorLayer);"
  
 +spagety "$praseTC" "ALL" "$ICON_biohazard"
  
 +echo '</script>'
 +echo '<script src="./bioosm.js"></script>' # Must be after JSON
 +echo "</html>"
  
-i=1 GLOBAL increment must persist multiple spagety() calls; incremented to infinity +Create plaintext log 
-# Core function generating entries matching selection criteria (ie Kingdom) +dateloghtm="<html><head>" 
-# !!! BEZ ODSAZENI !!! +dateloghtm+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" 
-# $1 list of entries +dateloghtm+="<link rel='stylesheet' href='./style.css' type='text/css'>" 
-# $2 layer name +dateloghtm+="<title>Brmlab - BioOSM plaintext log</title>" 
-# $3 icon of the points +dateloghtm+="</head><body>" 
-function spagety () {+datelogsort=$(echo -e "$datelog" | sort -r | uniq) 
 +dateloghtm+="$datelogsort" 
 +dateloghtm+="</body></html>" 
 +echo "$dateloghtm" > "./plainlog.htm" 
 +</code>
  
-bylo="" # Minula pozice +==== bioosm.js ====
-sam="" # HTML samostatneho zaznamu +
-osam="" # predchozi $sam +
-spoj="" # HTML had z popisu stejnych pozic +
-ospoj="" # Predchozi $spoj +
-ox="" # Old X +
-oy="" # Old Y+
  
-while IFS='' read -r radek || [[ -n "$radek" ]]do+<code javascript bioosm.js> 
 +var blob=JSON.parse(data) 
 +var arma=blob.arma 
 +var stud=JSON.parse('{}');
  
- co=$(echo "$radek" | grep -oe ' <title>.*</title> ' | sed -E 's/( )*<(\/)?title>( )*//g'+var vectorLayerDynamic new OpenLayers.Layer.Vector('Overlay',{attribution:'<a href="http://brmlab.cz">Brmlab</a>'}); 
- obr=$(echo "$radek" | grep -oe ' <image>.*</image> ' | sed -E 's/)*<(\/)?image>( )*//g| grep -oPe '[^/]*$'+map.addLayer(vectorLayerDynamic); 
- kde=$(echo "$radek" | grep -oe '<locality>.*</locality>' | grep -oPe '[0-9]{2}\.[0-9]{1,10}[]*[0-9]{2}\.[0-9]{1,10}'+var studlay = new OpenLayers.Layer.Vector("Overlay",{attribution:"<a href=\"http://brmlab.cz\">Brmlab</a>"})// studanky 
- kdex=$(echo "$kde" | grep -oPe '[0-9]{2}\.[0-9]{1,10}$'+map.addLayer(studlay);
- kdey=$(echo "$kde" | grep -oPe '^[0-9]{2}\.[0-9]{1,10}'+
- kdy=$(echo "$radek" | grep -oe ' <taken-date>.*</taken-date> ' | sed -E 's/( )*<(\/)?taken-date>( )*//g'+
- skop_typ=$(echo "$radek" | grep -oe ' <new-field-1>.*</new-field-1> ' | sed -E 's/( )*<(\/)?new-field-1>( )*//g'+
- skop=$(echo "$radek" | grep -oe ' <microscope>.*</microscope> ' | sed -E 's/( )*<(\/)?microscope>( )*//g'+
- imp=$(echo "$radek" | grep -oe ' <new-field-3>.*</new-field-3> ' | sed -E 's/( )*<(\/)?new-field-3>( )*//g') +
- reg=$(echo "$radek" | grep -oe ' <new-field-4>.*</new-field-4> ' | sed -E 's/( )*<(\/)?new-field-4>( )*//g'+
- phy=$(echo "$radek" | grep -oe ' <phylum>.*</phylum> ' | sed -E 's/)*<(\/)?phylum>( )*//g'+
- cla=$(echo "$radek| grep -oe ' <class>.*</class> ' | sed -E 's/( )*<(\/)?class>( )*//g'+
- ord=$(echo "$radek" | grep -oe ' <order>.*</order> ' | sed -E 's/( )*<(\/)?order>( )*//g'+
- fam=$(echo "$radek" | grep -oe ' <family>.*</family> ' | sed -E 's/( )*<(\/)?family>( )*//g'+
- gen=$(echo "$radek" | grep -oe ' <genus>.*</genus> ' | sed -E 's/( )*<(\/)?genus( )*>//g'+
- spe=$(echo "$radek" | grep -oe ' <species>.*</species> ' | sed -E 's/( )*<(\/)?species>( )*//g'+
- loc=$(echo "$radek" | grep -oe ' <locality---plaintext>.*</locality---plaintext' | sed -E 's/( )*<(\/)?locality---plaintext>( )*//g'+
- des=$(echo "$radek" | grep -oe ' <description>.*</description> ' | sed -E 's/)*<(\/)?description>( )*//g') +
- vid=$(echo "$radek" | grep -oe ' <videolink>.*</videolink> ' | sed -E 's/( )*<(\/)?videolink>( )*//g'+
- bio=$(echo "$radek" | grep -oe ' <biotope>.*</biotope> ' | sed -E 's/( )*<(\/)?biotope>( )*//g'+
- eng=$(echo "$radek" | grep -oe ' <enlargement>.*</enlargement> ' | sed -E 's/( )*<(\/)?enlargement>( )*//g'+
- obs=$(echo "$radek" | grep -oe ' <observer>.*</observer> ' | sed -E 's/( )*<(\/)?observer>( )*//g')+
  
 +var regsel=document.getElementById("reg")
 +var physel=document.getElementById("phy")
 +var clasel=document.getElementById("cla")
 +var ordsel=document.getElementById("ord")
 +var famsel=document.getElementById("fam")
 +var gensel=document.getElementById("gen")
 +var spesel=document.getElementById("spe")
  
- if [[ "$kdex" = "" ]]; then +var ICON_animalia="animalia.png" 
- >&2 echo $(echo "$radek| grep -oe '<locality>.*</locality>') " $co+var ICON_bacteria="bacteria.png
- continue; +var ICON_fungi="fungi.png
- fi +var ICON_chromista="chromista.png" 
- zkurvenetellico=$(echo "$obr| grep -oe '\.[a-zA-Z]*$') +var ICON_plantae="plantae.svg" 
- if [[ "$zkurvenetellico" = ".jpeg]]; then +var ICON_plostenkoid="plostenkoid.png" 
- >&2 echo "$obr $co+var ICON_protista="protista.png
- continue; +var ICON_biohazard="biohazard.svg
- fi+var ICON_studanka="studanka.png"
  
 +function getJSONstud()
 +{
 + url="./stud.json";
 + var request;
 + if(window.XMLHttpRequest)
 + request=new XMLHttpRequest();
 + else
 + request=new ActiveXObject("Microsoft.XMLHTTP");
 + request.onreadystatechange=function()
 + {
 + if(request.readyState==4)
 + {
 + stud=JSON.parse(request.responseText);
 + studdraw(stud);
 + }
 + }
 + request.open("GET",url,true);
 + request.send();
 +}
  
- # Generate detail page +function studdraw(sj
- detid=$(echo "brmlab$co$obr$kde$kdy" | md5sum | grep -oe '[a-zA-Z0-9]*'+{ 
- detpg="<html><head>" + studlay.destroyFeatures()
- detpg="$detpg<meta http-equiv='Content-Type' content='text/htmlcharset=utf-8'>" + sjs=stud.std; 
- detpg="$detpg<link rel='stylesheet' href='../style.css' type='text/css'>" + s=[]; 
- detpg="$detpg<title>Brmlab - BioOSM $co $kde</title>" + 
- detpg="$detpg</head><body>" + for(i=0;i<sjs.length;i++) 
- detpg="$detpg<table class='dettbl'><tr>" + { 
- detpg="$detpg<td><h1>$co</h1>" + s[i] = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(sjs[i].lon,sjs[i].lat).transform(epsg4326,projectTo),{'description':"<table class=\"hadtbl\">"+sjs[i].name+"</table>"},{'externalGraphic':ICON_studanka,'graphicHeight':24,'graphicWidth':24,'graphicXOffset':-12,'graphicYOffset':-12}); 
- if [[ "$imp" != "" ]]; then + studlay.addFeatures(s[i])
- detpg="$detpg<b>Imperium:</b> $imp<br>" + } 
- fi +} 
- if [[ "$reg" !"" ]]then + 
- detpg="$detpg<b>Regnum:</b> $reg<br>" +function studdrv() 
- fi +{ 
- if [[ "$phy" != "" ]]; then + box=document.getElementById("studchecker")
- detpg="$detpg<b>Phylum:</b> $phy<br>" + if(box.checked) 
- fi + getJSONstud();
- if [[ "$cla" != "" ]]; then +
- detpg="$detpg<b>Classis:</b> $cla<br>" +
- fi +
- if [[ "$ord" != "" ]]; then +
- detpg="$detpg<b>Ordo:</b> $ord<br>" +
- fi +
- if [[ "$fam" != "" ]]; then +
- detpg="$detpg<b>Familia:</b> $fam<br>" +
- fi +
- if [[ "$gen" != "" ]]; then +
- detpg="$detpg<b>Genus:</b> $gen<br>" +
- fi +
- if [[ "$spe" != "" ]]; then +
- detpg="$detpg<b>Specie:</b> $spe<br>" +
- fi +
- detpg="$detpg<br>" +
- if [[ "$kdy" != "" ]]; then +
- detpg="$detpg<b>Quando:</b> $kdy<br>" +
- fi +
- detpg="$detpg<b>Locus:</b> $kde ($loc)<br>" +
- if [[ "$obs" != "" ]]then +
- detpg="$detpg<b>Spectator:</b> $obs<br>" +
- fi +
- if [[ "$bio" != "" ]]; then +
- detpg="$detpg<b>Biotope:</b> $bio<br>" +
- fi +
- detpg="$detpg<br>" +
- if [[ "$skop" != "" ]]; then +
- detpg="$detpg<b>Microscopium:</b> $skop ($skop_typ)<br>" +
- fi +
- if [[ "$eng" != "" ]]then +
- detpg="$detpg<b>Amplificatio:</b> $eng<br>" +
- fi +
- detpg="$detpg<br>" +
- if [[ "$des" != "" ]]; then +
- detpg="$detpg<b>Depictio:</b> $des<br>" +
- fi +
- if [[ "$vid" != "" ]]then +
- detpg="$detpg<b>Video:</b> <a href=\"$vid\" target=\"_blank\">$vid</a><br>" +
- fi +
- detpg="$detpg</td><td>" +
- if [[ "$obr" != "" ]]; then +
- detpg="$detpg<a href=\"../img/$obr\"><img src=\"../img/$obr\" alt=\"$co\" class='detimg'></a>"+
  else  else
- if [[ "$vid" != "" ]]; then + studlay.destroyFeatures(); 
- detyt=$(echo "$vid" | sed -e 's/youtube.com\/watch?v=/youtube.com\/embed\//g'+
- detpg="$detpg<iframe class='detvid' src='$detytframeborder='0allow='encrypted-mediaallowfullscreen></iframe>"+ 
 +// Return icon by Regnum 
 +function geticon (a,i) 
 +
 + var r="" 
 + if(document.getElementById("reg").value!="ALL"
 + r=document.getElementById("reg").value 
 + else 
 +
 + r=a[i].regnum 
 + for(var e=i;e>=0 && a[e].locus==a[i].locus;e--) 
 + if(a[e].regnum!=a[i].regnum) 
 +
 + r="ALL"
 + break; 
 +
 +
 + 
 + switch (r) 
 +
 + case "Animalia": 
 + return ICON_animalia; 
 + case "Bacteria": 
 + return ICON_bacteria; 
 + case "Fungi": 
 + return ICON_fungi; 
 + case "Chromista": 
 + return ICON_chromista; 
 + case "Plantae": 
 + return ICON_plantae; 
 + case "Protista": 
 + return ICON_protista; 
 + default: 
 + return ICON_biohazard 
 +
 +
 + 
 +function genphy() { 
 + physel.innerHTML="<option>ALL</option>" 
 + clasel.innerHTML="<option>ALL</option>" 
 + ordsel.innerHTML="<option>ALL</option>" 
 + famsel.innerHTML="<option>ALL</option>" 
 + gensel.innerHTML="<option>ALL</option>" 
 + spesel.innerHTML="<option>ALL</option>" 
 + 
 + var phyarr=[] 
 + for (var i=0;i<arma.length-1;i++) 
 +
 + if(regsel.value==arma[i].regnum && arma[i].phynum!=""
 + phyarr.push(arma[i].phylum) 
 +
 + phyarr.sort() 
 + for (var i=0;i<phyarr.length;i++) 
 +
 + if(i==0) 
 +
 + physel.innerHTML+="<option>"+phyarr[0]+"</option>" 
 + continue 
 +
 + if(phyarr[i]!=phyarr[i-1]) 
 + physel.innerHTML+="<option>"+phyarr[i]+"</option>" 
 +
 + armageddon() // Populate the map with monsters... 
 +
 + 
 +function gencla() { 
 + clasel.innerHTML="<option>ALL</option>" 
 + ordsel.innerHTML="<option>ALL</option>" 
 + famsel.innerHTML="<option>ALL</option>" 
 + gensel.innerHTML="<option>ALL</option>" 
 + spesel.innerHTML="<option>ALL</option>" 
 + 
 + var claarr=[] 
 + for (var i=0;i<arma.length-1;i++) 
 +
 + if(physel.value==arma[i].phylum && arma.classis!="") 
 + claarr.push(arma[i].classis) 
 +
 + claarr.sort() 
 + for (var i=0;i<claarr.length;i++) 
 +
 + if(i==0) 
 +
 + clasel.innerHTML+="<option>"+claarr[0]+"</option>" 
 + continue 
 +
 + if(claarr[i]!=claarr[i-1]) 
 + clasel.innerHTML+="<option>"+claarr[i]+"</option>" 
 +
 + armageddon() // Populate the map with monsters... 
 +
 + 
 +function genord() { 
 + ordsel.innerHTML="<option>ALL</option>" 
 + famsel.innerHTML="<option>ALL</option>" 
 + gensel.innerHTML="<option>ALL</option>" 
 + spesel.innerHTML="<option>ALL</option>" 
 + var ordarr=[] 
 + for (var i=0;i<arma.length-1;i++) 
 +
 + if(clasel.value==arma[i].classis && arma[i].ordo!=""
 + ordarr.push(arma[i].ordo) 
 +
 + ordarr.sort() 
 + for (var i=0;i<ordarr.length;i++) 
 +
 + if(i==0) 
 +
 + ordsel.innerHTML+="<option>"+ordarr[0]+"</option>" 
 + continue 
 +
 + if(ordarr[i]!=ordarr[i-1]) 
 + ordsel.innerHTML+="<option>"+ordarr[i]+"</option>" 
 +
 + armageddon() // Populate the map with monsters... 
 +
 + 
 +function genfam() { 
 + famsel.innerHTML="<option>ALL</option>" 
 + gensel.innerHTML="<option>ALL</option>" 
 + spesel.innerHTML="<option>ALL</option>" 
 + var famarr=[] 
 + for (var i=0;i<arma.length-1;i++) 
 +
 + if(ordsel.value==arma[i].ordo && arma[i].familia!=""
 + famarr.push(arma[i].familia) 
 +
 + famarr.sort() 
 + for (var i=0;i<famarr.length;i++) 
 +
 + if(i==0) 
 +
 + famsel.innerHTML+="<option>"+famarr[0]+"</option>" 
 + continue 
 +
 + if(famarr[i]!=famarr[i-1]) 
 + famsel.innerHTML+="<option>"+famarr[i]+"</option>" 
 +
 + armageddon() // Populate the map with monsters... 
 +
 + 
 +function gengen() { 
 + gensel.innerHTML="<option>ALL</option>" 
 + spesel.innerHTML="<option>ALL</option>" 
 + var genarr=[] 
 + for (var i=0;i<arma.length-1;i++) 
 +
 + if(famsel.value==arma[i].familia && arma[i].genus!=""
 + genarr.push(arma[i].genus) 
 +
 + genarr.sort() 
 + for (var i=0;i<genarr.length;i++) 
 +
 + if(i==0) 
 +
 + gensel.innerHTML+="<option>"+genarr[0]+"</option>" 
 + continue 
 +
 + if(genarr[i]!=genarr[i-1]) 
 + gensel.innerHTML+="<option>"+genarr[i]+"</option>" 
 +
 + //genspe() // ...and here we go 
 + armageddon() // Populate the map with monsters... 
 +
 + 
 +function genspe() 
 +
 + spesel.innerHTML="<option>ALL</option>" 
 + var spearr=[] 
 + for (var i=0;i<arma.length-1;i++) 
 +
 + if(gensel.value==arma[i].genus && arma[i].specie!=""
 + spearr.push(arma[i].specie) 
 +
 + spearr.sort() 
 + for (var i=0;i<spearr.length;i++) 
 +
 + if(i==0) 
 +
 + spesel.innerHTML+="<option>"+spearr[0]+"</option>" 
 + continue 
 +
 + if(spearr[i]!=spearr[i-1]) 
 + spesel.innerHTML+="<option>"+spearr[i]+"</option>" 
 +
 + armageddon() // Populate the map with monsters... 
 +
 + 
 +function armageddon() 
 +
 + var speval=document.getElementById("spe").value 
 + var genval=document.getElementById("gen").value 
 + var famval=document.getElementById("fam").value 
 + var ordval=document.getElementById("ord").value 
 + var claval=document.getElementById("cla").value 
 + var phyval=document.getElementById("phy").value 
 + var regval=document.getElementById("reg").value 
 + var a=[] 
 + 
 + if(speval!="ALL"
 +
 + for(var i=0;i<arma.length-1;i++) 
 + if(arma[i].specie==speval && arma[i].genus==genval) // Check genus because of unknown "sp." 
 + a.push(arma[i]) 
 +
 + else if(genval!="ALL"
 +
 + for(var i=0;i<arma.length-1;i++) 
 + if(arma[i].genus==genval) 
 + a.push(arma[i]) 
 +
 + else if(famval!="ALL"
 +
 + for(var i=0;i<arma.length-1;i++) 
 + if(arma[i].familia==famval) 
 + a.push(arma[i]) 
 +
 + else if(ordval!="ALL"
 +
 + for(var i=0;i<arma.length-1;i++) 
 + if(arma[i].ordo==ordval) 
 + a.push(arma[i]) 
 +
 + else if(claval!="ALL"
 +
 + for(var i=0;i<arma.length-1;i++) 
 + if(arma[i].classis==claval) 
 + a.push(arma[i]) 
 +
 + else if(phyval!="ALL"
 +
 + for(var i=0;i<arma.length-1;i++) 
 + if(arma[i].phylum==phyval) 
 + a.push(arma[i]) 
 +
 + else if(regval!="ALL"
 +
 + for(var i=0;i<arma.length-1;i++) 
 + if(arma[i].regnum==regval) 
 + a.push(arma[i]) 
 +
 + else // Regnum: ALL 
 +
 + for(var i=0;i<arma.length-1;i++) 
 + a.push(arma[i]) 
 +
 + 
 + icongeddon(a) 
 +
 + 
 +function buggy() 
 +
 + var p=[] 
 + for(var i=0;i<arma.length-1;i++) 
 +
 + if(arma[i].regnum==""|
 +      arma[i].phylum==""|| 
 +      arma[i].classis==""|| 
 +      arma[i].ordo==""|| 
 +      arma[i].familia==""|| 
 +      arma[i].genus==""
 +   p.push(arma[i]) 
 +
 + icongeddon(p) 
 +
 + 
 +function plostenkoidy() 
 +
 + var p=[] 
 + for(var i=0;i<arma.length-1;i++) 
 +
 + if(arma[i].phylum=="Platyhelminthes"
 + p.push(arma[i]) 
 +
 + icongeddon(p) 
 +
 + 
 +function icongeddon(a) 
 +
 + //alert(a.length) // #thingies to show in the map' 
 + while(map.popups.length) 
 + map.removePopup(map.popups[0]) 
 + vectorLayerDynamic.destroyFeatures() 
 + 
 + var bylo="" // Minula pozice 
 + var sam="" // HTML samostatneho zaznamu 
 + var osam="" // predchozi $sam 
 + var spoj="" // HTML had z popisu stejnych pozic 
 + var ospoj="" // Predchozi spoj 
 + var ox="" // Old X 
 + var oy="" // Old Y 
 + var datelog="" // Entries sorted by date for plaintext log 
 + var i=0 // Iterator over a[] (needed after FOR) 
 + var n=[] // New points in the layer 
 + var muchicons=0 // How much Regnum's? 
 + var samicon=ICON_biohazard // Icon 
 + var spojicon=ICON_biohazard // Icon 
 + 
 + for(;i<a.length;i++) // -1 fix for last empty entry 
 +
 + // Pokracujem v hadovi 
 + if(a[i].locus == bylo) 
 + { 
 + sam=""; 
 + spoj+="<tr><td>" 
 + spoj+='<a href="./det/'+a[i].detid+'.htm" target="_blank">' 
 + if(a[i].obr != ""
 + spoj+='<img src="./simg/'+a[i].obr+'" class="hadimg"></a></td>' 
 + else 
 + spoj+='<img src=./"'+ICON_biohazard+'" class="hadimg"></a></td>' 
 + spoj+="<td>"+a[i].qualis+"<br>"+a[i].quando+"</td>" 
 + spoj+="</tr>" 
 + ox=a[i].x 
 + oy=a[i].y 
 + continue; 
 +
 + 
 + if(a[i].specie=="sp."
 + wikisp="https://en.wikipedia.org/wiki/"+a[i].genus
  else  else
- detpg="$detpg<img src=\"../$3\" alt=\"video\" class='detimg'>" + wikisp="https://en.wikipedia.org/wiki/"+a[i].genus+" "+a[i].specie
- fi +
- fi +
- detpg="$detpg</td></tr></table>" +
- detpg="$detpg</body></html>" +
- echo "$detpg""./det/$detid.htm"+
  
- # Pokracujem v hadovi + // Bud prvni zaznam, nebo zmena pozice 
- if [[ "$kde" = "$bylo" ]]; then + 
- sam=""; + // Predchozi pozice jen 1 zaznam? 
- spoj="$spoj<tr><td><a href=\"./det/$detid.htm\" target=\"_blank\">" + if(sam != ""
- if [[ "$obr!= "" ]]; then +
- spoj="$spoj<img src=\"./simg/$obr\" class=\"hadimg\"></a></td>"+ samicon=geticon(a,i-1) 
 + n[i] = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(ox,oy).transform(epsg4326,projectTo),{'description':sam},{'externalGraphic':samicon,'graphicHeight':24,'graphicWidth':24,'graphicXOffset':-12,'graphicYOffset':-12}); 
 + vectorLayerDynamic.addFeatures(n[i]); 
 + spoj="" 
 + sam="" 
 + } // ELSE vytvori prazdny radek 
 + // Predchozi pozice vic zaznamu? 
 + if(spoj!=""
 +
 + spojicon=geticon(a,i-1) 
 + n[i= new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(ox,oy).transform(epsg4326,projectTo),{'description':"<table class=\"hadtbl\">"+spoj+"</table>"},{'externalGraphic':spojicon,'graphicHeight':24,'graphicWidth':24,'graphicXOffset':-12,'graphicYOffset':-12}); 
 + vectorLayerDynamic.addFeatures(n[i])
 + spoj="" 
 + sam="" 
 +
 + 
 + bylo=a[i].locus 
 + spoj='<tr><td><a href="./det/'+a[i].detid+'.htm" target="_blank">' 
 + if(a[i].obr != "") 
 + spoj+='<img src="./simg/'+a[i].obr+'" class="hadimg"></a></td>'
  else  else
- spoj="$spoj<img src=\"./$3\" class=\"hadimg\"></a></td>+ spoj+='<img src="./'+geticon(a,i)+'" class="hadimg"</a></td>' 
- fi + spoj+='<td>'+a[i].qualis+'<br>'+a[i].quando+'</td>' 
- spoj="$spoj<td>$co<br>$kdy</td>" + spoj+="</tr>"
- spoj="$spoj</tr>" +
- ox="$kdex" +
- oy="$kdey" +
- continue; +
- fi+
  
- # Bud prvni zaznam, nebo zmena pozice 
  
- # Predchozi pozice jen 1 zaznam? + sam='<a href="./det/'+a[i].detid+'.htm" target="_blank"><img src="./simg/'+a[i].obr+'alt="'+a[i].qualis+'" class="buttimg"></a>' 
- if [[ "$sam" != "" ]]; then + sam+='<br><span class="butttext">' 
- echo "var n$i = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point($ox,$oy).transform(epsg4326,projectTo),{description:'"$sam"'},{externalGraphic:'./$3',graphicHeight:24,graphicWidth:24,graphicXOffset:-12,graphicYOffset:-12});+ sam+='<b>Qualis:</b> <a href="'+wikisp+'target="_blank">'+a[i].qualis+'</a><br>' 
- echo "$2.addFeatures(n$i);+ if(a[i].imperium !""
- spoj="" + sam+='<b>Imperium:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].imperium+'" target="_blank">'+a[i].imperium+'</a><br>' 
- sam="" + if(a[i].regnum != "") 
- fi # ELSE vytvori prazdny radek +    sam+='<b>Regnum:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].regnum+'" target="_blank">'+a[i].regnum+'</a><br>' 
- # Predchozi pozice vic zaznamu? + if(a[i].phylum != "") 
- if [[ "$spoj" != "" ]]; then + sam+='<b>Phylum:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].phylum+'" target="_blank">'+a[i].phylum+'</a><br>' 
- echo "var n$= new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point($ox,$oy).transform(epsg4326,projectTo),{description:'<table class=\"hadtbl\">"$spoj"</table>'},{externalGraphic:'./$3',graphicHeight:24,graphicWidth:24,graphicXOffset:-12,graphicYOffset:-12});+ if(a[i].classis != ""
-    echo "$2.addFeatures(n$i);+ sam+='<b>Classis:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].classis+'" target="_blank">'+a[i].classis+'</a><br>' 
- spoj="" + if(a[i].ordo != ""
- sam="" + sam+='<b>Ordo:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].ordo+'target="_blank">'+a[i].ordo+'</a><br>' 
- fi+ if(a[i].familia != "") 
 + sam+='<b>Familia:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].familia+'" target="_blank">'+a[i].familia+'</a><br>' 
 + if(a[i].genus != "") 
 + sam+='<b>Genus:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].genus+'" target="_blank">'+a[i].genus+'</a><br>' 
 + if(a[i].specie != "") 
 + sam+='<b>Specie:</b> <a href="'+wikisp+'target="_blank">'+a[i].specie+'</a><br>' 
 + if(a[i].bio != ""
 + sam+="<b>Biotope:</b> "+a[i].bio+"<br>" 
 + if(a[i].quando != ""
 + sam+="<b>Quando:</b> "+a[i].quando+"<br>" 
 + sam+="<b>Locus:</b> "+a[i].locus+" ("+a[i].locplain+")<br>" 
 + if(a[i].spec != "") 
 +  sam+="<b>Spectator:</b> "+a[i].spec+"<br>" 
 + if(a[i].micro != "") 
 + sam+="<b>Microscopium:</b> "+a[i].micro+("+a[i].microtyp+")<br>" 
 + if(a[i].amp != ""
 + sam+="<b>Amplificatio:</b> "+a[i].amp+"<br>" 
 + /* if [[ "$des!= "" ]]; then 
 + #   sam="$sam<b>Depictio:</b> $des<br>
 + # fi */ 
 + if(a[i].vid != "") 
 + sam+='<b>Video:</b> <a href="'+a[i].vid+'target="_blank">'+a[i].vid+'</a><br>' 
 + sam+="</span>"
  
- bylo="$kde" + ox=a[i].x 
- spoj="<tr><td><href=\"./det/$detid.htm\" target=\"_blank\">" + oy=a[i].y 
- if [[ "$obr" != "" ]]; then + // Konec prochazeni a[]
- spoj="$spoj<img src=\"./simg/$obr\" class=\"hadimg\"></a></td>" +
- else +
- spoj="$spoj<img src=\"./$3\" class=\"hadimg\"</a></td>" +
- fi +
- spoj="$spoj<td>$co<br>$kdy</td>" +
- spoj="$spoj</tr>"+
  
- sam="<a href=\"./det/$detid.htm\" target=\"_blank\"><img src=\"./simg/$obr\" alt=\"$co\" class=\"buttimg\"></a>" + // Do not forget to print last line when FOR ends
- sam="$sam<br><span class=\"butttext\"><b>Qualis:</b> $co<br>" + samicon=geticon(a,i-1
- if [[ "$imp" != "" ]]; then + if(sam == ""
- sam="$sam<b>Imperium:</b> $imp<br>" + sam='<table style="hadtbl">'+spoj+'</table>'
- fi +
- if [[ "$reg" != "" ]]; then +
- sam="$sam<b>Regnum:</b> $reg<br>" +
- fi +
- if [[ "$phy" != "" ]]; then +
- sam="$sam<b>Phylum:</b> $phy<br>" +
- fi +
- if [[ "$cla" != "" ]]; then +
- sam="$sam<b>Classis:</b> $cla<br>" +
- fi +
- if [[ "$ord" != "" ]]; then +
- sam="$sam<b>Ordo:</b> $ord<br>" +
- fi +
- if [[ "$fam" != "" ]]; then +
- sam="$sam<b>Familia:</b> $fam<br>" +
- fi +
- if [[ "$gen" != "" ]]; then +
- sam="$sam<b>Genus:</b> $gen<br>" +
- fi +
- if [[ "$spe" != "" ]]; then +
- sam="$sam<b>Specie:</b> $spe<br>" +
- fi +
- if [[ "$bio" != "" ]]; then +
- sam="$sam<b>Biotope:</b> $bio<br>" +
- fi +
- if [[ "$kdy" != "" ]]; then +
- sam="$sam<b>Quando:</b> $kdy<br>" +
- fi +
- sam="$sam<b>Locus:</b> $kde ($loc)<br>" +
- if [[ "$obs" != "" ]]; then +
- sam="$sam<b>Spectator:</b> $obs<br>" +
- fi +
- if [[ "$skop" != "" ]]; then +
- sam="$sam<b>Microscopium:</b> $skop ($skop_typ)<br>" +
- fi +
- if [[ "$eng" != "" ]]; then +
- sam="$sam<b>Amplificatio:</b> $eng<br>" +
- fi +
-# if [[ "$des" != "" ]]; then +
-# sam="$sam<b>Depictio:</b$des<br>" +
-# fi +
- if [[ "$vid" != "" ]]; then +
- sam="$sam<b>Video:</b> <a href=\"$vid\" target=\"_blank\">$vid</a><br>" +
- fi +
- sam="$sam</span>"+
  
- #>&2 echo "$sam" + n[i]=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(a[i-1].x,a[i-1].y).transform(epsg4326,projectTo),{description:"'"+sam+"'"},{externalGraphic:samicon,graphicHeight:24,graphicWidth:24,graphicXOffset:-12,graphicYOffset:-12}); 
- >&2 echo "$co $obs"+ vectorLayerDynamic.addFeatures(n[i]);
  
 +} // Konec armageddonu
  
- ox="$kdex" +var laycon [vectorLayer,vectorLayerDynamic,studlay];
- oy="$kdey"+
  
 +var controls = {selector: new OpenLayers.Control.SelectFeature(laycon, { onSelect: createPopup, onUnselect: destroyPopup })};
 +map.addControl(controls['selector']);
 +controls['selector'].activate();
  
- i=$(($i+1))+function createPopup(feature) 
 +
 + feature.popup new OpenLayers.Popup.FramedCloud('pop', 
 + feature.geometry.getBounds().getCenterLonLat(), 
 + null, 
 + '<div class="markerContent">'+feature.attributes.description+'</div>', 
 + null, 
 + false, // Close button? 
 + function({ controls['selector'].unselectAll();
 + ); 
 + //feature.popup.closeOnMove = true; 
 + map.addPopup(feature.popup)
 +}
  
- # Precti XML, vyfiltruj jen to co ma prijit do mapy a serad to dle umisteni +function destroyPopup(feature) { 
- #  Umisteni je razene kvuli vic vzorkum z jednoho mista+ feature.popup.destroy(); 
 + feature.popup = null; 
 +}
  
-done <<< $(echo "$1"# Zere parametr spaget, nikoli $1 scriptu !!!+// Run armageddon on initial load 
 +armageddon() 
 +</code>
  
-# Do not forget to print last line when WHILE ends! +==== Springs ====
-if [[ "$sam" "" ]]; then +
- sam="<table style=\"hadtbl\">$spoj</table>" +
-fi +
-echo "var n$i new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point($kdex,$kdey).transform(epsg4326,projectTo),{description:'"$sam"'},{externalGraphic:'./$3',graphicHeight:24,graphicWidth:24,graphicXOffset:-12,graphicYOffset:-12});" +
-echo "$2.addFeatures(n$i);"+
  
-} # KONEC FCE SPAGETY !!!+To be able to better plan routes for collecting planarians, the knowledge of locations of springs seems to be important. So BioOSM can show themBelow is a script to get the locations from OSM XMLs obtainable from [[http://osm.kyblsoft.cz/archiv/]].
  
-echo "var ALL = new OpenLayers.Layer.Vector('Overlay',{attribution:'<a href=\"http://brmlab.cz\">Brmlab</a>'});" +<code bash studanky.sh> 
-spagety "$praseTC" "ALL" "biohazard.svg+#!/bin/bash 
-echo "map.addLayer(ALL);"+# generate BioOSM compatible "springs" 
 +# Usage: studanky.sh osmdump.xml 
 +#  
 +# Download OSM file to be passed as $1 
 +# wget "http://osm.kyblsoft.cz/archiv/czech_republic-2019-11-03.osm.gz
 +# gzip -kd ./czech_republic-2019-11-03.osm.gz 
 +
 +# Pozor ^^ sezere spoustu rameti 
 +#
  
-echo "var laycon [vectorLayer,ALL];# Layer controls JS array +osm=$(cat "$1" | sed -e 's/<node/\'$'\a<node/g-e 's/<\/node>/<\/node\'$'\a/g' -e 's/<way/\'$'\a<way/g' -e 's/<\/way>/<\/way>\'$'\a/g' -e 's/<relation/\'$'\a<relation/g' -e 's/<\/relation>/<\/relation>\'$'\a/g' | tr -d '\n' | tr '\a' '\n' | grep 'v="spring"' | grep 'k="natural"')
-while IFS='' read -r spag || [[ -n "$spag" ]]; do +
- echo "var $spag = new OpenLayers.Layer.Vector('Overlay',{attribution:'<href=\"http://brmlab.cz\">Brmlab</a>'});" +
- spg=$(echo "$praseTC" | grep "<new-field-4>$spag</new-field-4>") +
- case "$spag" in +
- "Animalia"+
- icon="animalia.png";; +
- "Bacteria"+
- icon="bacteria.png";; +
- "Fungi") +
- icon="fungi.png";; +
- "Chromista"+
- icon="chromista.png";; +
- "Plantae"+
- icon="plantae.svg";; +
- "Protista"+
- icon="protista.png";; +
- *) +
- icon="biohazard.svg";; +
- esac+
  
- spagety "$spg" "$spag" "$icon" +json='{"version":"'$(date --rfc-3339=seconds)'","std":['
- echo "laycon.push($spag);" +
-done <<< $(echo "$kingdoms")+
  
-# Plostenky +while IFS='' read -r spr || [[ -n "$spr" ]]; do 
-spg=$(echo "$praseTC" | grep "<phylum>Platyhelminthes</phylum>") + n=$(echo "$spr" | grep -oPe 'k="name" v="[^"]*"' | sed -e 's/k="name" v="//g' -e 's/"$//g'
-echo "var Platyhelminthes new OpenLayers.Layer.Vector('Overlay',{attribution:'<a href=\"http://brmlab.cz\">Brmlab</a>'});" + lat=$(echo "$spr" | grep -oPe ' lat="[^"]*"| sed -e 's/ lat="//g' -e 's/"$//g') 
-spagety "$spg" "Platyhelminthes" "plostenkoid.png" + lon=$(echo "$spr| grep -oPe ' lon="[^"]*"' | sed -e 's/ lon="//g' -e 's/"$//g')
-echo "laycon.push(Platyhelminthes)"+
  
 + if [ "$lat" = "" ] || [ "$lon" = "" ]; then
 + continue; # <way> a tak
 + fi
 + if [[ "$n" = "" ]]; then
 + n="inkognito"
 + >&2 echo -e "\033[34m $lat $lon \033[0m";
 + fi
  
-echo "var controls = {" + json+="{" 
-echo " selectornew OpenLayers.Control.SelectFeature(laycon{ onSelectcreatePopuponUnselect: destroyPopup })+ json+=" \"name\":\"$n\",
-echo "};" + json+=" \"lon\":\"$lon\"," 
-echo "map.addControl(controls['selector']);+ json+=\"lat\":\"$lat\"" 
-echo "controls['selector'].activate();"+ json+="},"
  
 + >&2 echo -e "\033[32m $n $lat $lon\033[0m"
  
 +done <<< $(echo "$osm")
  
 +echo "$json{}]}"
 +</code>
  
 +=== LocalityID ===
 +<code bash ajdy.sh>
 +#!/bin/bash
  
-echo "function createPopup(feature{" +T=$(mktemp
- echo " feature.popup = new OpenLayers.Popup.FramedCloud('pop'," +unzip -p "$1tellico.xml | tr -d '\n| sed -e $'s/<entry id="/\\\n<entry id="/g-e $'s/<\/entry>/<\/entry>\\\n/g'"$T"
- echo " feature.geometry.getBounds().getCenterLonLat()," +
- echo " null," +
- echo " '<div class=\"markerContent\">'+feature.attributes.description+'</div>'," +
- echo " null," +
- echo " false," +
- echo " function() { controls['selector'].unselectAll(); }" +
- echo " );" +
- echo " //feature.popup.closeOnMove = true;" +
- echo " map.addPopup(feature.popup);" +
-echo "}"+
  
-echo "function destroyPopup(feature) {" 
- echo " feature.popup.destroy();" 
- echo " feature.popup = null;" 
-echo "}" 
  
 +hf=$(cat "$T" | grep -Pe '^<entry id="' | grep '<hasflatworms>yep</hasflatworms>')
 +# nejvyssi dosazene ID
 +mid=$(cat "$T" | grep -Pe '^<entry id="' | grep -oe ' <localityid>.*</localityid> ' | grep -oPe '[0-9]+' | sort | tail -n 1)
 +mid=$(($mid+1))
  
-echo "function kinchange() {" 
- echo " kinsel=document.getElementById('kin');" 
- echo " kinopt=kinsel.options[kinsel.selectedIndex].text;" 
- echo " for (var i = map.layers.length - 1; i >= 1; i--) {" 
- echo " map.removeLayer(map.layers[i]);" 
- echo " }" 
- echo " map.addLayer(window[kinopt])" 
-echo "}" 
  
-echo "function plostenkoid() {" +function ll() 
- echo " for (var i=map.layers.length-1;i>=1;i--) {" +{ 
- echo " map.removeLayer(map.layers[i]);" + while IFS='' read -r r || [[ -n "$r" ]]; do 
- echo " }+ t=$(echo "$r" | grep -oe ' <taken-date>.*</taken-date> ' | sed -E 's/)*<(\/)?taken-date>( )*//g' | sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]{4})/\3-\2-\1/g' | sed -E 's/-([0-9])-/-0\1-/g' | sed -E 's/-([0-9])$/-0\1/g'
- echo " map.addLayer(Platyhelminthes)+ l=$(echo "$r" | grep -oe '<locality>.*</locality>' | grep -oPe '[0-9]+\.[0-9]+[, ]*[0-9]+\.[0-9]+'
-echo "}"+  echo "$t@$l
 + done <<< $(echo "$1") 
 +}
  
 +srt=$(ll "$hf" | sort -u)
  
-echo "</script>" +uid=$mid 
-echo "</html>"+while IFS='' read -r r || [[ -n "$r" ]]; do 
 + l=$(echo "$r" | grep -oPe '@.*$' | tr -d '@'
 + lid=$(cat "$T" | grep  <locality>$l</locality> " | grep -oe ' <localityid>.*</localityid> ' | grep -oPe '[0-9]+') 
 + if [[ "$lid" = "" ]]; then 
 + 
 + sedexp="s/( <locality>$l<\/locality.*<hasflatworms>yep<\/hasflatworms> )/ \\1 <localityid>$uid<\/localityid> /g" 
 + #echo "$sedexp" 
 + sed -E "$sedexp" -i "$T" 
 + uid=$(($uid+1)) 
 + fi 
 +done <<< $(echo "$srt"
 + 
 +D=$(mktemp -d) 
 +cp -f "$T" "$D/tellico.xml" 
 +zip -j "./micro_new.tc" "$D/tellico.xml" 
 + 
 +rm -rfv "$T" 
 +rm -rfv "$D"
 </code> </code>
project/bioosm/start.txt · Last modified: 2023/09/21 12:15 by sachy