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
project:bioosm:start [2018/06/07 18:14] – [parse_tellico.sh] ruzaproject:bioosm:start [2023/09/21 12:15] (current) – render terminal/html escapes sachy
Line 3: Line 3:
 {{template>:project:infobox| {{template>:project:infobox|
 name=Biologicke zbrane ve vasem okoli| name=Biologicke zbrane ve vasem okoli|
-image= 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 bash>+<code bash parse_tellico.sh>
 #!/bin/bash #!/bin/bash
 # Parse Tellico database to BioOSM index.htm # Parse Tellico database to BioOSM index.htm
 # $1 = tellico .tc file # $1 = tellico .tc file
-Print result to stdout+$2 = "" terminal stderr (default) 
 +#    = "html" html marked stderr (for web bioosm)
 # #
-Generate minis in simg folder +Print result to /jsonrss/*.json
-# find .-type f -exec mogrify -verbose -layers Dispose -resize 128\>x128\> -quality 100% {} ++
 # #
 +# find ./ -type f -name '*.jpg' -newermt "2023-09-03" -exec mogrify -verbose -layers Dispose -resize 1600\>x1600\> -quality 90% {} +
 +# echo "14.7345 48.7145" | gdallocationinfo -wgs84 ./cesko_big.tiff
 +# gdal_translate -of GTiff -a_srs WGS84 -a_ullr 11.6863 50.9745 19.9876 48.3729 ./source.tif ./result.tif
 +# https://data.geus.dk/egdi/#baslay=baseMapGEUS&extent=3953440,2399890,4757540,2763830&layers=igme5000
 +
 +#bnds=new OpenLayers.Bounds(11.6863000,48.3729000 ,19.9876000,50.9745000);
 +#var geoimg = new OpenLayers.Layer.Image("geo","https://brmlab.s0c4.net/bioosm/eusr5000_600dpi_cesko.png", bnds,bnds.getSize(),{numZoomLevels: 20,isBaseLayer:false});
 +#map.addLayer(geoimg);
 +
 +
 +#
 +# <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>
 +# // 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" 
  
-# Parse Tellico file to list of entries +ICON_animalia="animalia.png" 
-praseTC=$(unzip -p "$1tellico.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)+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"
  
-# Sorted unique Kingdoms (to be passed as selection criteria) +json="" 
-kingdoms=$(echo "$praseTC| grep -oe ' <new-field-4>.*</new-field-4> ' | sed -E 's/( )*<(\/)?new-field-4>( )*//g' | sort | uniq)+geojson=""
  
 +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 in the 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'
  
-echo '<!DOCTYPE html>' +errhtml="$2"
-echo '<html>' +
-echo '<head>' +
-echo ' <meta http-equiv="Content-Typecontent="text/html; charset=utf-8">' +
-echo ' <title>BioOSM</title>' +
-echo ' <link rel="stylesheet" href="./style.css" type="text/css">' +
-echo ' <script src="./OpenLayers.js"></script>' +
-echo '</head>'+
  
-echo "<body>" +# paticka (co, rok, odkaz) 
- echo "<h1 id='title'>BioOSM - armis biologica in tuis vicinia</h1>"+function obioosm () { 
 + r="<div id='obioosm'><p>Welcome to BioOSM! This site is owned and maintained by members of the <a href='https://brmlab.cz' target='_blank'>hackerspace brmlab</a>. See our wiki page for further <a href='https://brmlab.cz/project/bioosm/start' target='_blank'>details</a><br>License: <a href='https://creativecommons.org/licenses/by-nc-nd/4.0/' target='_blank'>CC BY-NC-ND</a>. In case you have any questions, suggestions, please let us know at bioosm<span id='zavinacvmejlu'></span>s0c4.net.</p><p>To cite any material (including images) in your publication, please use following format: <br><i>Plskova, K., Sacha, M., brmlab. BioOSM" 
 + if [[ "$1" != "" ]]; then 
 + r+=" - $1" 
 + fi 
 + r+=". " 
 + if [[ "$2" != "" ]]; then 
 + r+="$2. " 
 + else 
 + r+="2023. " 
 + fi 
 + if [[ "$3" != "" ]]; then 
 + r+="$3" 
 + else 
 + r+="https://bioosm.s0c4.net" 
 + fi 
 + r+="</i></p></div>" 
 + echo "$r" 
 +}
  
- Generate select +HTML fajl per project 
- ksel="<select id='kin' onChange='kinchange()'>" +function genhtml() { 
- ksel="$ksel<option value='ALLselected>ALL</option>+ o=$(obioosm "$1" "" "" | sed -e 's/\//\\\//g') # make "\/" from "/" so sed below is OK 
- while IFS='' read -r king |[[ -"$king]]; do + h=$(cat "./__BIOVZOR__.htm" sed -"s/__BIOVZOR_TIT__/$1/g| sed -e "s/__BIOVZOR_CPRT__/$o/g| sed -e "s/__BIOVZOR_J__/$1/g") 
- ksel="$ksel<option value='"$king"'>$king</option>+ echo "$h"./jsonrss/$1.htm
- done <<< $(echo "$kingdoms"+ echo "*** $1 done ***
- ksel="$ksel</select>+}
- echo "Regnum: $ksel | +
- echo "<input type='button' value='Plostenkoidy' onClick='plostenkoid()'><br><br>"+
  
-  echo "<div id='map' class='smallmap'></div>+# Return icon by Regnum 
-echo "</body>+function geticon () { 
- + case "$1in 
-echo '<script>' + "Animalia") 
- + echo "$ICON_animalia";; 
-echo 'map = new OpenLayers.Map("map");+ "Bacteria") 
-echo 'map.addLayer(new OpenLayers.Layer.OSM());' + echo "$ICON_bacteria";
-echo 'epsg4326 =  new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection' + "Fungi"
-echo 'projectTo = map.getProjectionObject()//The map projection (Spherical Mercator)' + echo "$ICON_fungi";
-echo 'var lonLat = new OpenLayers.LonLat(15.478, 49.817).transform(epsg4326, projectTo);' + "Chromista"
-echo 'var zoom=8;' + echo "$ICON_chromista";; 
-echo 'map.setCenter (lonLat, zoom);' + "Plantae") 
- + echo "$ICON_plantae";; 
-echo 'var vectorLayer = new OpenLayers.Layer.Vector("Overlay",{attribution:"<a href=\"http://brmlab.cz\">Brmlab</a>"});' + "Protista") 
- + echo "$ICON_protista";; 
-echo '// Define markers as "featuresof the vector layer:' + *
- + echo "$ICON_biohazard";
-echo 'var atol = new OpenLayers.Feature.Vector(' + esac 
-echo ' new OpenLayers.Geometry.Point(14.41876, 50.10554).transform(epsg4326, projectTo),' +}
-echo ' {description:"Atomovy atol Brmkini"} ,' +
-echo ' {externalGraphic: "./biohazard.svg", graphicHeight:24, graphicWidth:24, graphicXOffset:-12, graphicYOffset:-12},' +
-echo ');' +
-echo 'vectorLayer.addFeatures(atol);' +
-# Sem prijdou dalsi staticke ficury +
-echo "map.addLayer(vectorLayer);"+
  
 +function safehtml () {
 + echo "$1" | sed -e 's/#/%23/g' -e "s/'/\&#39;/g" -e 's/"/\&#34;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g' -e 's/^[ ]*//g' -e 's/[ ]*$//g'
 +}
  
 +function getgeo () {
 + #g=$(echo "$1 $2" | gdallocationinfo -wgs84 ./geo/eusr5000_600dpi_cesko_8b_geo.tif | grep -v 255 | grep -oPe '[0-9]+$')
 + g=$(echo "$1 $2" | gdallocationinfo -wgs84 ./geo/eusr5000_600dpi_cesko_8b_geo.tif | grep -v 255 | grep -oE '[0-9]+$')
 + case "$g" in
 + "1")
 + echo "Fluvial deposits, sediments";;
 + "128")
 + echo "Weathering residues of different rocks, loess";;
 + "130")
 + echo "Volcanic rocks";;
 + "133")
 + echo "Igneous and metamorphic rocks, Palaeozoic sedimentary rocks, loess";;
 + "143")
 + echo "Loess, igneous and metamorphic rocks";;
 + "144")
 + echo "Loess, Cretaceous sandstone and marl";;
 + "147")
 + echo "Igneous, metamorphic and Palaeozoic sedimentary rocks, loess";;
 + "148")
 + echo "Igneous and metamorphic rocks, loess";;
 + "149")
 + echo "Igneous and metamorphic rocks, Palaeozoic sedimentary rocks, loess";; # asi fakt stejny jako 133 omg
 + "150")
 + echo "Igneous and metamorphic rocks, palaeozoic sedimentary rocks";;
 + "153")
 + echo "Sandy and loamy loess, Tertiary sediments, fluvial deposits";;
 + "205")
 + echo "Cretaceous and Tertiary flysch, marl, sandstone, limestone";;
 + *)
 + echo "";;
 + esac
 +}
  
 i=1 # GLOBAL increment must persist multiple spagety() calls; incremented to infinity i=1 # GLOBAL increment must persist multiple spagety() calls; incremented to infinity
Line 170: Line 253:
 # !!! BEZ ODSAZENI !!! # !!! BEZ ODSAZENI !!!
 # $1 = list of entries # $1 = list of entries
-# $2 = layer name+# $2 = layer name = JSON filename without suffix
 # $3 = icon of the points # $3 = icon of the points
 function spagety () { function spagety () {
  
-bylo="" # Minula pozice + if [[ "$errhtml== "" ]]; then 
-sam="" # HTML samostatneho zaznamu + >&2 echo "===== $2 =====" 
-osam="" # predchozi $sam + else 
-spoj="" # HTML had z popisu stejnych pozic + >&2 echo "<h2>$2</h2>
-ospoj="" # Predchozi $spoj + fi
-ox="" # Old X +
-oy="" # Old Y+
  
-while IFS='' read -r radek || [[ -"$radek]]; do+ 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)\",\"fund\":\"$2\",\"arma\":[" 
 + geojson='{"type":"FeatureCollection","version":"BIOOSM_' 
 + geojson+="$(date --rfc-3339=seconds)" 
 + geojson+='","features":['
  
- co=$(echo "$radek" | grep -oe <title>.*</title> | sed -E 's/( )*<(\/)?title>( )*//g'+ while IFS='' read -radek || [[ -"$radek" ]]; do 
- obr=$(echo "$radekgrep -oe ' <image>.*</image>sed -E 's/( )*<(\/)?image>( )*//g' | grep -oPe '[^/]*$'+ if [[ "$radek" = "" ]]; then 
- kde=$(echo "$radek" | grep -oe '<locality>.*</locality>' | grep -oPe '[0-9]{2}\.[0-9]{1,10}[, ]*[0-9]{2}\.[0-9]{1,10}'+ continue; 
- kdex=$(echo "$kde| grep -oPe '[0-9]{2}\.[0-9]{1,10}$') + fi
- 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')+
  
 + entryid=$(echo "$radek" | sed -E 's/^.*<entry id="([0-9]+)">.*$/\1/g;t;d')
 + co=$(echo "$radek" | sed -E 's/^.*<title>(.*)<\/title>.*$/\1/g;t;d')
 + co=$(safehtml "$co")
 + obr=$(echo "$radek" | sed -E 's/^.*<image>(.*)<\/image>.*$/\1/g;t;d' | sed -E 's/^.*\///g')
 + kde=$(echo "$radek" | sed -E 's/^.*<locality>(.*)<\/locality>.*$/\1/g;t;d')
 + kde=$(safehtml "$kde")
 + kdex=$(echo "$kde" | sed -E 's/^[0-9]+\.[0-9]+[, ]*//g;t;d') # keep second part
 + kdey=$(echo "$kde" | sed -E 's/[, ]*[0-9]+\.[0-9]+$//g;t;d') # keep first part
 + kdy=$(echo "$radek" | sed -E 's/^.*<taken-date>(.*)<\/taken-date>.*$/\1/g;t;d' | 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" | sed -E 's/^.*<new-field-1>(.*)<\/new-field-1>.*$/\1/g;t;d')
 + skop_typ=$(safehtml "$skop_typ")
 + skop=$(echo "$radek" | sed -E 's/^.*<microscope>(.*)<\/microscope>.*$/\1/g;t;d')
 + skop=$(safehtml "$skop")
 + imp=$(echo "$radek" | sed -E 's/^.*<new-field-3>(.*)<\/new-field-3>.*$/\1/g;t;d')
 + imp=$(safehtml "$imp")
 + reg=$(echo "$radek" | sed -E 's/^.*<new-field-4>(.*)<\/new-field-4>.*$/\1/g;t;d')
 + reg=$(safehtml "$reg")
 + phy=$(echo "$radek" | sed -E 's/^.*<phylum>(.*)<\/phylum>.*$/\1/g;t;d')
 + phy=$(safehtml "$phy")
 + cla=$(echo "$radek" | sed -E 's/^.*<class>(.*)<\/class>.*$/\1/g;t;d')
 + cla=$(safehtml "$cla")
 + ord=$(echo "$radek" | sed -E 's/^.*<order>(.*)<\/order>.*$/\1/g;t;d')
 + ord=$(safehtml "$ord")
 + fam=$(echo "$radek" | sed -E 's/^.*<family>(.*)<\/family>.*$/\1/g;t;d')
 + fam=$(safehtml "$fam")
 + gen=$(echo "$radek" | sed -E 's/^.*<genus>(.*)<\/genus>.*$/\1/g;t;d')
 + gen=$(safehtml "$gen")
 + spe=$(echo "$radek" | sed -E 's/^.*<species>(.*)<\/species>.*$/\1/g;t;d')
 + spe=$(safehtml "$spe")
 + loc=$(echo "$radek" | sed -E 's/^.*<locality---plaintext>(.*)<\/locality---plaintext>.*$/\1/g;t;d')
 + loc=$(safehtml "$loc")
 + des=$(echo "$radek" | sed -E 's/^.*<description>(.*)<\/description>.*$/\1/g;t;d')
 + des=$(safehtml "$des")
 + vid=$(echo "$radek" | sed -E 's/^.*<videolink>(.*)<\/videolink>.*$/\1/g;t;d')
 + vid=$(safehtml "$vid")
 + bio=$(echo "$radek" | sed -E 's/^.*<biotope>(.*)<\/biotope>.*$/\1/g;t;d')
 + bio=$(safehtml "$bio")
 + eng=$(echo "$radek" | sed -E 's/^.*<enlargement>(.*)<\/enlargement>.*$/\1/g;t;d')
 + eng=$(safehtml "$eng")
 + obs=$(echo "$radek" | sed -E 's/^.*<observer>(.*)<\/observer>.*$/\1/g;t;d')
 + obs=$(safehtml "$obs")
 + lnk=$(echo "$radek" | sed -E 's/^.*<localitylink>(.*)<\/localitylink>.*$/\1/g;t;d')
 + lnk=$(safehtml "$lnk")
 + har=$(echo "$radek" | sed -E 's/^.*<harvesting-method>(.*)<\/harvesting-method>.*$/\1/g;t;d')
 + den=$(echo "$radek" | sed -E 's/^.*<population-density>(.*)<\/population-density>.*$/\1/g;t;d')
 + dur=$(echo "$radek" | sed -E 's/^.*<min>(.*)<\/min>.*$/\1/g;t;d')
 + lor=$(echo "$radek" | sed -E 's/^.*<locality-reference>(.*)<\/locality-reference>.*$/\1/g;t;d')
 + lrl=$(echo "$radek" | sed -E 's/^.*<locality-reference---link>(.*)<\/locality-reference---link>.*$/\1/g;t;d')
 + lov=$(echo "$radek" | sed -E 's/^.*<locality---vobrazek>(.*)<\/locality---vobrazek>.*$/\1/g;t;d' | sed -E 's/^.*\///g')
 + lov=$(safehtml "$lov")
 + cls=$(echo "$radek" | sed -E 's/^.*<cluster>([0-9]*)<\/cluster>.*$/\1/g;t;d')
 + mpi=$(echo "$radek" | grep -oe ' <mainpic>yep</mainpic> ')
 + elv=$(echo "$kdex $kdey" | gdallocationinfo -wgs84 ./elev/cesko_big.tiff | grep "Value" | grep -oe '[0-9]+$')
 + geo=$(getgeo "$kdex" "$kdey")
 + gra=$(echo "$radek" | sed -E 's/^.*<grant>(.*)<\/grant>.*$/\1/g;t;d')
 + tem=$(echo "$radek" | sed -E 's/^.*<temperature>(.*)<\/temperature>.*$/\1/g;t;d')
 + cnd=$(echo "$radek" | sed -E 's/^.*<conductivity>(.*)<\/conductivity>.*$/\1/g;t;d')
 + ph=$(echo "$radek" | sed -E 's/^.*<ph>(.*)<\/ph>.*$/\1/g;t;d')
 + kar=$(echo "$radek" | sed -E 's/^.*<karyotype>(.*)<\/karyotype>.*$/\1/g;t;d')
 + lid=$(echo "$radek" | sed -E 's/^.*<localityid>(.*)<\/localityid>.*$/\1/g;t;d')
  
- if [[ "$kdex" = "" ]]; then +# if [[ "$errhtml== "" ]]; then 
- >&echo $(echo "$radek" | grep -oe '<locality>.*</locality>') " $co" +# >&2 echo "$co - $har - $den - $dur $lor $lrl - $lov - $elv
- continue; +# else 
- fi +# >&2 echo "<span class='nok'>$co - $har - $den - $dur - $lor - $lrl - $lov - $elv</span><br>
- zkurvenetellico=$(echo "$obr" | grep -oe '\.[a-zA-Z]*$') +# fi 
- if [[ "$zkurvenetellico= ".jpeg" ]]; then +# continue;
- >&2 echo "$obr $co+
- continue; +
- fi+
  
 + detid=$(echo "brmlab$co$obr$kde$kdy" | md5sum | grep -oe '[a-zA-Z0-9]*')
  
- # Generate detail page + if [[ "$kdex" = "" ]]; then 
- detid=$(echo "brmlab$co$obr$kde$kdy" | md5sum | grep -oe '[a-zA-Z0-9]*'+ if [[ "$errhtml== "" ]]; then 
- detpg="<html><head>" + >&2 echo -e "\033[31m $lid KDEX '$kde' '$co' \033[0m
- detpg="$detpg<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" + >&2 echo -e "\033[31m $lid RADEK '$radek' \033[0m
- detpg="$detpg<link rel='stylesheet' href='../style.css' type='text/css'>" + else 
- detpg="$detpg<title>Brmlab - BioOSM $co $kde</title>" + >&2 echo "<span class='nok'>$lid KDEX '$kde' '$co'</span><br>" 
- detpg="$detpg</head><body>" + >&2 echo "<span class='nok'><pre>$radek</pre></span>" 
- detpg="$detpg<table class='dettbl'><tr>" + fi 
- detpg="$detpg<td><h1>$co</h1>" + fi 
- if [[ "$imp!= "" ]]; then + 
- detpg="$detpg<b>Imperium:</b> $imp<br>" + zkurvenetellico=$(echo "$obr| grep -oe '\.[a-zA-Z]*$') 
- fi + odkurvenyobr=$(echo "$obr| sed -e 's/%23/#/g'
- if [[ "$reg!= "" ]]; then + #if [[ "$zkurvenetellico" = ".jpeg" ]]; then 
- detpg="$detpg<b>Regnum:</b> $reg<br>" + if [[ ! -f "./img/$odkurvenyobr" ]]; then 
- fi + if [[ "$gen" != "negative" ]]; then 
- if [[ "$phy" != "" ]]; then + if [[ "$errhtml== "" ]]; then 
- detpg="$detpg<b>Phylum:</b> $phy<br>" + >&2 echo -e "\033[31m $lid OBR $odkurvenyobr $co\033[0m
- fi + else 
- if [[ "$cla" != "" ]]; then + >&2 echo "<span class='nok'>$lid OBR $odkurvenyobr $co</span>" 
- detpg="$detpg<b>Classis:</b> $cla<br>+ fi 
- fi + continue; 
- if [[ "$ord" !"" ]]; then + fi 
- detpg="$detpg<b>Ordo:</b> $ord<br>" + fi 
- fi + obr=$(safehtml "$obr") 
- if [[ "$fam" != "" ]]; then + 
- detpg="$detpg<b>Familia:</b$fam<br>" + if [[ "$spe" = "sp." ]]; then 
- fi + wikisp="https://en.wikipedia.org/wiki/$gen"
- 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 +
- if [[ "$vid!= "" ]]; then +
- detyt=$(echo "$vid" | sed -e 's/youtube.com\/watch?v=/youtube.com\/embed\//g') +
- detpg="$detpg<iframe class='detvid' src='$detyt' frameborder='0' allow='encrypted-media' allowfullscreen></iframe>"+
  else  else
- detpg="$detpg<img src=\"../$3\" alt=\"video\" class='detimg'>"+ wikisp="https://en.wikipedia.org/wiki/$gen $spe"
  fi  fi
- fi 
- detpg="$detpg</td></tr></table>" 
- detpg="$detpg</body></html>" 
- echo "$detpg" > "./det/$detid.htm" 
  
- # Pokracujem v hadovi + povr="" 
- if [[ "$kde" = "$bylo" ]]; then + povs="" 
- sam=""; + pov="" 
- spoj="$spoj<tr><td><a href=\"./det/$detid.htm\" target=\"_blank\">"+ if [[ "$phy" = "Platyhelminthes" ]]; then 
 + povr=$(cat "./povodi_r.json" | ./povodi.py "$kdey" "$kdex"
 + #povrf=$(echo "$povr" | grep -oPe '^[^ ]*' | tr 'e' 'E'
 + povrf=$(echo "$povr" | sed -e 's/ .*$//g' | tr 'e' 'E'
 + povrn=$(echo "$povr" | sed -e 's/^[^ ]* //g'
 + povs=$(cat "./povodi_s.json" | ./povodi.py "$kdey" "$kdex"
 + #povsf=$(echo "$povs" | grep -oPe '^[^ ]*' | tr 'e' 'E'
 + povsf=$(echo "$povs" | sed -e 's/ .*$//g' | tr 'e' 'E'
 + povsn=$(echo "$povs" | sed -e 's/^[^ ]* //g'
 + if (( $(echo "$povsf < $povrf" | bc -l) )) ; then 
 + pov="$povsn - $povrn" 
 + else 
 + pov="$povrn" 
 + fi 
 + fi 
 + 
 + if [[ "$cls" = "" ]]then 
 + cls=0 
 + fi 
 + 
 + if [[ "$mpi" = "" ]]; then 
 + mpi="" 
 + else 
 + mpi="y" 
 + fi 
 + 
 + Tjson="{" 
 + Tjson+=" \"title\":\"$co\"," # qualis 
 + Tjson+=" \"imperium\":\"$imp\"," 
 + Tjson+=" \"regnum\":\"$reg\"," 
 + Tjson+=" \"phylum\":\"$phy\"," 
 + Tjson+=" \"classis\":\"$cla\"," 
 + Tjson+=" \"ordo\":\"$ord\"," 
 + Tjson+=" \"familia\":\"$fam\"," 
 + Tjson+=" \"genus\":\"$gen\"," 
 + Tjson+=" \"specie\":\"$spe\"," 
 + Tjson+=" \"locality\":\"$kde\"," # locus 
 + Tjson+=" \"x\":\"$kdex\"," 
 + Tjson+=" \"y\":\"$kdey\"," 
 + Tjson+=" \"locplain\":\"$loc\"," 
 + Tjson+=" \"description\":\"$des\"," # depictio 
 + Tjson+=" \"takendate\":\"$kdy\"," # quando 
 + Tjson+=" \"obr\":\"$obr\"," 
 + Tjson+=" \"micro\":\"$skop\"," 
 + Tjson+=" \"microtyp\":\"$skop_typ\"," 
 + Tjson+=" \"videolink\":\"$vid\"," # vid 
 + Tjson+=" \"biotope\":\"$bio\"," # bio 
 + Tjson+=" \"enlargement\":\"$eng\"," # amp 
 + Tjson+=" \"observer\":\"$obs\"," # spec 
 + Tjson+=" \"detid\":\"$detid\"," 
 + Tjson+=" \"harvestingmethod\":\"$har\"," # har 
 + Tjson+=" \"populationdensity\":\"$den\"," # den 
 + Tjson+=" \"min\":\"$dur\"," # dur 
 + Tjson+=" \"localityreference\":\"$lor\"," # lor 
 + Tjson+=" \"localityreferencelink\":\"$lrl\"," #lrl 
 + Tjson+=" \"localityvobrazek\":\"$lov\"," # lov 
 + Tjson+=" \"localitylink\":\"$lnk\"," # lnk 
 + Tjson+=" \"cluster\":$cls," # cls 
 + Tjson+=" \"mainpic\":\"$mpi\"," # mpi 
 + Tjson+=" \"pov\":\"$pov\"," 
 + Tjson+=" \"elv\":\"$elv\"," 
 + Tjson+=" \"geo\":\"$geo\"," 
 + Tjson+=" \"temperature\":\"$tem\"," # tem 
 + Tjson+=" \"conductivity\":\"$cnd\"," # cnd 
 + Tjson+=" \"ph\":\"$ph\"," 
 + Tjson+=" \"karyotype\":\"$kar\"" # kar # Last without ',' 
 + Tjson+="}" 
 + 
 + json+="$Tjson," 
 + geojson+='{"type":"Feature","geometry":{"type":"point","coordinates":[' 
 + geojson+="$kdex,$kdey" 
 + geojson+=']},"properties":' 
 + geojson+="$Tjson}," 
 + 
 + 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+="<meta property='og:title' content='BioOSM - $co $kde'>" 
 + detpg+="<meta property='og:description' content='$obs found $co and took an image and additional notes.'>" 
 + detpg+="<meta property='og:image' content='https://brmlab.s0c4.net/bioosm/img/$obr'>" 
 + detpg+="<meta property='og:url' content='https://brmlab.s0c4.net/bioosm/det/$detid.htm'>" 
 + detpg+="<meta name='twitter:card' content='summary_large_image'>" 
 + detpg+="<meta name='og:type' content='website'>" 
 + detpg+="<meta property='og:site_name' content='BioOSM - creatures around us'>" 
 + detpg+="<meta name='twitter:image:alt' content='Image of $co'>" 
 + 
 + detpg+="</head>" 
 + if [[ "$cls" != "0" ]]; then 
 + detpg+="<script src='../bioosmdet.js'></script>" 
 + detpg+="<script>getJSONarma($cls)</script>" 
 + fi 
 + detpg+="<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>Domain:</b> <a href='https://en.wikipedia.org/wiki/$imp' target='_blank'>$imp</a><br>" 
 + fi 
 + if [[ "$reg" != "" ]]; then 
 + detpg+="<b>Kingdom:</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>Class:</b> <a href='https://en.wikipedia.org/wiki/$cla' target='_blank'>$cla</a><br>" 
 + fi 
 + if [[ "$ord" != "" ]]; then 
 + detpg+="<b>Order:</b> <a href='https://en.wikipedia.org/wiki/$ord' target='_blank'>$ord</a><br>" 
 + fi 
 + if [[ "$fam" != "" ]]; then 
 + detpg+="<b>Family:</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>Species:</b> <a href='$wikisp' target='_blank'>$spe</a><br>" 
 + fi 
 + if [[ "$kar" != "" ]]; then 
 + detpg+="<b>Karyotype:</b> $kar<br>" 
 + fi 
 + detpg+="<br>" 
 + if [[ "$kdy" != "" ]]; then 
 + detpg+="<b>Date:</b> $kdy<br>" 
 + fi 
 + if [[ "$lnk" != "" ]]; then 
 + loc="<a href=\"$lnk\" target=\"_blank\">$loc</a>" # Yes, escaped " 
 + fi 
 + detpg+="<b>Place:</b> $kde ($loc)<br>" 
 + if [[ "$elv" != "" ]]; then 
 + detpg+="<b>Elevation:</b> $elv m<br>" 
 + fi 
 + 
 + if [[ "$obs" != "" ]]; then 
 + detpg+="<b>Observer:</b> $obs<br>" 
 + fi 
 + if [[ "$bio" != "" ]]; then 
 + detpg+="<b>Biotope:</b> $bio<br>" 
 + fi 
 + if [[ "$pov" != "" ]]; then 
 + detpg+="<b>River:</b> $pov<br>" 
 + fi 
 + if [[ "$geo" != "" ]]; then 
 + detpg+="<b>Bedrock:</b> $geo<br>" 
 + fi 
 + if [[ "$tem" != "" ]]; then 
 + detpg+="<b>Temperature:</b> $tem °C<br>" 
 + fi 
 + if [[ "$cnd" != "" ]]; then 
 + detpg+="<b>Conductivity:</b> $cnd mSv<br>" 
 + fi 
 + if [[ "$ph" != "" ]]; then 
 + detpg+="<b>pH:</b> $ph<br>" 
 + fi 
 + detpg+="<span id='microscopeval'>" 
 + if [[ "$skop" != "" ]]; then 
 + detpg+="<b>Microscope:</b> $skop ($skop_typ)<br>" 
 + fi 
 + detpg+="</span>" 
 + detpg+="<span id='ampval'>" 
 + if [[ "$eng" != "" ]]; then 
 + detpg+="<b>Amplification:</b> $eng<br>" 
 + fi 
 + detpg+="</span>" 
 + 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 
 + detpg+="<span id='descval'>" 
 + if [[ "$des" != "" ]]; then 
 + detpg+="<b>Description:</b> $des<br>" 
 + fi 
 + detpg+="</span>" 
 + 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  if [[ "$obr" != "" ]]; then
- spoj="$spoj<img src=\"./simg/$obr\" class=\"hadimg\"></a></td>"+ detpg+="<div id='maximatura'><a href=\"../img/$obr\"><img src=\"../img/$obr\" alt=\"$co\" class='detimg'></a></div>" 
 + detpg+="<div id='miniatury'></div>"
  else  else
- spoj="$spoj<img src=\"./$3\" class=\"hadimg\"></a></td>"+ 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 
 + if [[ "$gen" == "negative" ]]; then 
 + detpg+="<img src=\"../negative.png\" alt=\"Negative observation\" class='detimg'>
 + else 
 + detpg+="<img src=\"../$3\" alt=\"video\" class='detimg'>" 
 + fi 
 + fi
  fi  fi
- spoj="$spoj<td>$co<br>$kdy</td>" + if [[ "$lov" != "" ]]; then 
- spoj="$spoj</tr>"+ detpg+="<img class=\"detimg\" src=\"../lokality/$lov\" alt=\"Locality photo\"><br>" 
 + fi 
 + 
 + detpg+="</td></tr></table>" 
 + detpg+=$(obioosm "$co" "$quando" "https://brmlab.s0c4.net/bioosm/det/$detid.htm"
 + detpg+="</body><script>document.getElementById('zavinacvmejlu').innerHTML='@'</script></html>" 
 + echo "$detpg" > "./det/$detid.htm" 
 + 
 + # Plain log of entries 
 + datelog+="$kdy $kde <a href='./det/$detid.htm' target='_blank'>$co</a><br>\n" 
 + 
 + if [[ "$errhtml" == "" ]]; then 
 + >&2 echo -e "\033[32m$lid $co $obs\033[0m" 
 + else 
 + >&2 echo "<span class='ok'>$lid $co $obs</span>" 
 + fi 
  ox="$kdex"  ox="$kdex"
  oy="$kdey"  oy="$kdey"
- continue; 
- fi 
  
- # Bud prvni zaznam, nebo zmena pozice+ i=$(($i+1))
  
- # Predchozi pozice jen zaznam? + done <<< $(echo "$1") # Zere parametr spaget, nikoli $1 scriptu !!
- if [[ "$sam" != "" ]]; then + echo -e "$json{}]}| sed -e "s/^var data='//g"./jsonrss/$2.json
- 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});" +# echo -e "$json{}]}'
- echo "$2.addFeatures(n$i);+ echo -e "$geojson{}]}" > "./jsonrss/geo_$2.geojson"
- spoj="" +
- sam="" +
- fi ELSE vytvori prazdny radek +
- # Predchozi pozice vic zaznamu? +
- if [[ "$spoj!= "" ]]; then +
- echo "var n$i = 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});" +
-    echo "$2.addFeatures(n$i);" +
- spoj="" +
- sam="" +
- fi+
  
- bylo="$kde+ rss+=$'</channel>\n' 
- spoj="<tr><td><a href=\"./det/$detid.htm\" target=\"_blank\">" + rss+=$'</rss>\n' 
- if [[ "$obr!= "" ]]; then + echo "$rss" > "./jsonrss/$2.rss
- spoj="$spoj<img src=\"./simg/$obr\class=\"hadimg\"></a></td>"+ 
 +} # KONEC FCE SPAGETY 
 + 
 + 
 + 
 +# Sorted unique Kingdoms (to be passed as selection criteria) 
 +#kingdoms=$(unzip -p "$1" tellico.xml | grep -oe '<new-field-4>.*</new-field-4>' | sed -E 's/( )*<(\/)?new-field-4>( )*//g' | sort | uniq) 
 +kingdoms=$(unzip -p "$1" tellico.xml | sed -E 's/^.*<new-field-4>(.*)<\/new-field-4>.*$/\1/g;t;d' | sort | uniq) 
 + 
 +#echo '<!DOCTYPE html>' 
 +#echo '<html>' 
 +#echo '<head>' 
 +#echo ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">' 
 +#echo ' <title>brmlab - BioOSM</title>' 
 +#echo ' <link rel="stylesheet" href="./style.css" type="text/css">' 
 +#echo ' <link rel="favicon" href="./'$ICON_biohazard'">' 
 +#echo ' <script src="./OpenLayers.js"></script>' 
 +#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>" 
 +#echo "<h1 id='title'>BioOSM - creatures around us</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 "Kingdom: $ksel " 
 +#echo "Phylum: <select id='phy' onChange='gencla()'><option>ALL</option></select>
 +#echo "Class: <select id='cla' onChange='genord()'><option>ALL</option></select>
 +#echo "Order: <select id='ord' onChange='genfam()'><option>ALL</option></select>
 +#echo "Family: <select id='fam' onChange='gengen()'><option>ALL</option></select>
 +#echo "Genus: <select id='gen' onChange='genspe()'><option>ALL</option></select>" 
 +#echo "Species: <select id='spe' onChange='armageddon()'><option>ALL</option></select>" 
 +
 +#echo "<br><input type='button' value='Platyhelminthes' onClick='plostenkoidy()'>" 
 +#echo "<label><input type='checkbox' id='studchecker' onChange='studdrv()'>Springs</label>" 
 +##echo "<input type='button' value='Bugs' onClick='buggy()'>" 
 +#echo "<form style='display:inline;margin-left:5em'><input type='text' length=10 id='srch'><input type='submit' value='&#x1F50D;' onClick='limit();return false;'></form>" 
 +#echo "<br><br><div id='map' class='smallmap'></div>" 
 +#echo $(obioosm "" "" ""
 +#echo "</body>" 
 +
 +#echo "<script>" 
 +#echo 'document.getElementById("zavinacvmejlu").innerHTML="@";' 
 +#echo 'map = new OpenLayers.Map("map");' 
 +#echo 'map.addLayer(new OpenLayers.Layer.OSM());' 
 +#echo 'epsg4326 =  new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection' 
 +#echo 'projectTo = map.getProjectionObject(); //The map projection (Spherical Mercator)' 
 +#echo 'var lonLat = new OpenLayers.LonLat(15.478, 49.817).transform(epsg4326, projectTo);' 
 +#echo 'var zoom=8;' 
 +#echo 'map.setCenter (lonLat, zoom);' 
 +
 +#echo 'var vectorLayer = new OpenLayers.Layer.Vector("Overlay",{attribution:"<a href=\"http://brmlab.cz\">Brmlab</a>"});' 
 +
 +#echo '// Define markers as "features" of the vector layer:' 
 +
 +#echo 'var atol = new OpenLayers.Feature.Vector(' 
 +#echo ' new OpenLayers.Geometry.Point(14.41876, 50.10554).transform(epsg4326, projectTo),' 
 +#echo ' {description:"Atomovy atol Brmkini"} ,' 
 +#echo ' {externalGraphic: "./biohazard.svg", graphicHeight:8, graphicWidth:8, graphicXOffset:-4, graphicYOffset:-4},' 
 +#echo ');' 
 +#echo 'vectorLayer.addFeatures(atol);' 
 +## Sem prijdou dalsi staticke ficury 
 +#echo "map.addLayer(vectorLayer);" 
 +
 + 
 + 
 +# Parse Tellico file to get list of entries 
 +granty=$(unzip -p "$1" tellico.xml | grep "<grant>" | sed -E 's/( )*<(\/)?grant>( )*//g' | sed -E 's/_additional$//g' | sort -u | grep -v "^none$"
 +#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="' | 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 -E '^<entry id="' | sed -E 's/(^.*)(<locality>.*<\/locality>)(.*$)/\2\1\3/' | sort) 
 + 
 + 
 +velkyvepr=$(echo "$praseTC" | grep "<strcit-do-mapy>yep</strcit-do-mapy>"
 +spagety "$velkyvepr" "bioosm" "$ICON_biohazard" 
 + 
 +# VSECHNO i non-public - zakomentuj predchozi "spagety" a odkomunetuj tohle + exit 
 +#spagety "$praseTC" "celytraktor" "$ICON_biohazard" # vsechno i non-public 
 +#exit 
 + 
 +while IFS='' read -r grnt || [[ -n "$grnt" ]]; do 
 + # 'nope' pokud to ma byt jen na grantstrance ale ne ve velkem bioosm 
 + #vepr=$(echo "$praseTC" | grep -Pe "<strcit-do-mapy>(yep)|(negative)|(nope)</strcit-do-mapy>" | grep -Pe "<grant>$grnt(_additional)?</grant>"
 + vepr=$(echo "$praseTC" | grep -E "<strcit-do-mapy>(yep)|(negative)|(nope)</strcit-do-mapy>" | grep -E "<grant>$grnt(_additional)?</grant>"
 + spagety "$vepr" "$grnt" "$ICON_biohazard" 
 + genhtml "$grnt" 
 +done <<< $(echo "$granty"
 + 
 +#if [[ "$errhtml== "html" ]]; then 
 + >&2 echo "*** DONE ***" 
 +#fi 
 + 
 + 
 +##echo -e "$json{}]}" 
 +#echo '</script>' 
 +#echo '<script src="./bioosm.js"></script>' # Must be after JSON 
 +#echo "</html>" 
 + 
 +# Create plaintext log 
 +dateloghtm="<html><head>" 
 +dateloghtm+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" 
 +dateloghtm+="<link rel='stylesheet' href='./style.css' type='text/css'>" 
 +dateloghtm+="<title>Brmlab - BioOSM plaintext log</title>" 
 +dateloghtm+="</head><body>" 
 +datelogsort=$(echo -e "$datelog" | sort -r | uniq) 
 +dateloghtm+="$datelogsort" 
 +dateloghtm+="</body></html>
 +echo "$dateloghtm" > "./plainlog.htm" 
 +</code> 
 + 
 +==== bioosm.js ==== 
 + 
 +<code javascript bioosm.js> 
 +window.blob=JSON.parse('{}'); 
 +window.arma=null; 
 +// 
 +// MAIN LOAD START HERE 
 +// https://web.archive.org/web/20200502112446/http://dev.openlayers.org/releases/OpenLayers-2.13.1/doc/apidocs/files/OpenLayers-js.html 
 +// 
 +// 
 +function getJSONbioosm() 
 +
 + url="./bioosm.json"; 
 + var request; 
 + if(window.XMLHttpRequest) 
 + request=new XMLHttpRequest();
  else  else
- spoj="$spoj<img src=\"./$3\" class=\"hadimg\"</a></td>" + request=new ActiveXObject("Microsoft.XMLHTTP"); 
- fi + request.onreadystatechange=function() 
- spoj="$spoj<td>$co<br>$kdy</td>" +
- spoj="$spoj</tr>"+ if(request.readyState==4) 
 +
 + window.blob=JSON.parse(request.responseText); 
 + window.arma=blob.arma; 
 + // Display ONLY platyhelminthes if reguired 
 + pus=document.URL.match(/platyhelminthes=understone/); 
 + console.log(pus); 
 + if(pus) 
 + plostenkoidy(); 
 + else 
 + // Else initial load 
 + armageddon() 
 +
 +
 + request.open("GET","./"+ubermaster+".json",true); // defined in html 
 + request.send(); 
 +}
  
- sam="<a href=\"./det/$detid.htm\" target=\"_blank\"><img src=\"./simg/$obr\" alt=\"$co\" class=\"buttimg\"></a>" +getJSONbioosm();
- sam="$sam<br><span class=\"butttext\"><b>Qualis:</b> $co<br>" +
- if [[ "$imp" != "" ]]; then +
- sam="$sam<b>Imperium:</b> $imp<br>" +
- 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" +var stud=JSON.parse('{}');
- >&2 echo "$co $obs"+
  
 +var vectorLayerDynamic = new OpenLayers.Layer.Vector('Overlay',{attribution:'<a href="http://brmlab.cz">Brmlab</a>'});
 +var vectorLayerPonygon = new OpenLayers.Layer.Vector('Overlay',{attribution:'<a href="http://brmlab.cz">Brmlab</a>'});
 +map.addLayer(vectorLayerPonygon);
 +map.addLayer(vectorLayerDynamic);
 +//map.setLayerZIndex(vectorLayerDynamic,999);
 +//map.raiseLayer(vectorLayerDynamic,map.layers.length);
 +var studlay = new OpenLayers.Layer.Vector("Overlay",{attribution:"<a href=\"http://brmlab.cz\">Brmlab</a>"}); // studanky
 +map.addLayer(studlay);
  
- ox="$kdex+var regsel=document.getElementById("reg") 
- oy="$kdey"+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")
  
 +var ICON_animalia="animalia.png"
 +var ICON_bacteria="bacteria.png"
 +var ICON_fungi="fungi.png"
 +var ICON_chromista="chromista.png"
 +var ICON_plantae="plantae.svg"
 +var ICON_plostenkoid="plostenkoid.png"
 +var ICON_protista="protista.png"
 +var ICON_biohazard="biohazard.svg"
 +var ICON_studanka="studanka.png"
 +var ICON_negative="negative.png"
  
- i=$(($i+1)) 
  
- # Precti XMLvyfiltruj jen to co ma prijit do mapy a serad to dle umisteni +function getJSONstud() 
- #  Umisteni je razene kvuli vic vzorkum z jednoho mista+
 + 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(); 
 +}
  
-done <<< $(echo "$1"# Zere parametr spaget, nikoli $1 scriptu !!!+function studdraw(sj) 
 +
 + studlay.destroyFeatures(); 
 + sjs=stud.std; 
 + s=[];
  
-# Do not forget to print last line when WHILE ends! + for(i=0;i<sjs.length;i++) 
-if [[ "$sam" "" ]]then + { 
- sam="<table style=\"hadtbl\">$spoj</table>" + 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}); 
-fi + studlay.addFeatures(s[i]); 
-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 !!!+function studdrv() 
 +
 + box=document.getElementById("studchecker"); 
 + if(box.checked) 
 + getJSONstud(); 
 + else 
 + studlay.destroyFeatures(); 
 +}
  
-echo "var ALL = new OpenLayers.Layer.Vector('Overlay',{attribution:'<href=\"http://brmlab.cz\">Brmlab</a>'});" +// Return icon by Regnum 
-spagety "$praseTC" "ALL" "biohazard.svg" +function geticon (a,i) 
-echo "map.addLayer(ALL);"+{ 
 + if(a[i].genus=="negative") 
 + return ICON_negative;
  
-echo "var laycon [vectorLayer,ALL];" # Layer controls JS array + var p=true
-while IFS='' read -r spag || [[ -n "$spag]]; do + var r="" 
- echo "var $spag = new OpenLayers.Layer.Vector('Overlay',{attribution:'<a href=\"http://brmlab.cz\">Brmlab</a>'});" + if(document.getElementById("reg").value!="ALL") 
- spg=$(echo "$praseTC" | grep "<new-field-4>$spag</new-field-4>") + { 
- case "$spag" in + r=document.getElementById("reg").value 
- "Animalia") + p=false; 
- icon="animalia.png";+
- "Bacteria"+ else 
- icon="bacteria.png";; + { 
- "Fungi"+ r=a[i].regnum 
- icon="fungi.png";+ for(var e=i;e>=0 && a[e].locality==a[i].locality;e--) 
- "Chromista") + { 
- icon="chromista.png";; + if(a[e].phylum!="Platyhelminthes") 
- "Plantae") + p=false
- icon="plantae.svg";+ if(a[e].regnum!=a[i].regnum
- "Protista") +
- icon="protista.png";; + r="ALL"; 
- *+ break
- icon="biohazard.svg";; +
- esac+
 + }
  
- spagety "$spg" "$spag" "$icon" 
- echo "laycon.push($spag);" 
-done <<< $(echo "$kingdoms") 
  
-# Plostenky + switch (r
-spg=$(echo "$praseTC" | grep "<phylum>Platyhelminthes</phylum>"+ { 
-echo "var Platyhelminthes = new OpenLayers.Layer.Vector('Overlay',{attribution:'<a href=\"http://brmlab.cz\">Brmlab</a>'});" + case "Animalia"
-spagety "$spg" "Platyhelminthes" "plostenkoid.png+
-echo "laycon.push(Platyhelminthes)"+ if(p) 
 + return ICON_plostenkoid; 
 + 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>"
  
-echo "var controls = {" + var phyarr=[] 
-echo " selector: new OpenLayers.Control.SelectFeature(laycon, onSelect: createPopup, onUnselect: destroyPopup })" + for (var i=0;i<window.arma.length-1;i++) 
-echo "};" +
-echo "map.addControl(controls['selector']);" + if(regsel.value==window.arma[i].regnum && window.arma[i].phynum!="") 
-echo "controls['selector'].activate();"+ phyarr.push(window.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<window.arma.length-1;i++)
 + {
 + if(physel.value==window.arma[i].phylum && window.arma.classis!="")
 + claarr.push(window.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<window.arma.length-1;i++)
 + {
 + if(clasel.value==window.arma[i].classis && window.arma[i].ordo!="")
 + ordarr.push(window.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<window.arma.length-1;i++)
 + {
 + if(ordsel.value==window.arma[i].ordo && window.arma[i].familia!="")
 + famarr.push(window.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...
 +}
  
-echo "function createPopup(feature) {" +function gengen() { 
- echo " feature.popup new OpenLayers.Popup.FramedCloud('pop'," + gensel.innerHTML="<option>ALL</option>" 
- echo " feature.geometry.getBounds().getCenterLonLat()," + spesel.innerHTML="<option>ALL</option>" 
- echo " null," + var genarr=[] 
- echo " '<div class=\"markerContent\">'+feature.attributes.description+'</div>',+ for (var i=0;i<window.arma.length-1;i++) 
- echo " null," + { 
- echo " false," + if(famsel.value==window.arma[i].familia && window.arma[i].genus!=""
- echo " function() { controls['selector'].unselectAll(); }" + genarr.push(window.arma[i].genus) 
- echo " );" +
- echo " //feature.popup.closeOnMove = true;" + genarr.sort() 
- echo " map.addPopup(feature.popup);" + for (var i=0;i<genarr.length;i++) 
-echo "}"+ { 
 + 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... 
 +}
  
-echo "function destroyPopup(feature) {" +function genspe() 
- echo " feature.popup.destroy();" +{ 
- echo " feature.popup null;" + spesel.innerHTML="<option>ALL</option>
-echo "}"+ var spearr=[] 
 + for (var i=0;i<window.arma.length-1;i++) 
 +
 + if(gensel.value==window.arma[i].genus && window.arma[i].specie!="") 
 + spearr.push(window.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()
 +{
 + console.log("a "+window.arma.length);
 + 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=[]
  
-echo "function kinchange() {" + if(speval!="ALL") 
- echo " kinsel=document.getElementById('kin');+
- echo " kinopt=kinsel.options[kinsel.selectedIndex].text;" + for(var i=0;i<window.arma.length-1;i++) 
- echo " for (var i = map.layers.length - 1; i >1; i--{" + if(window.arma[i].specie==speval && window.arma[i].genus==genval// Check genus because of unknown "sp.
- echo " map.removeLayer(map.layers[i]);" + a.push(window.arma[i]) 
- echo " }" +
- echo " map.addLayer(window[kinopt])" + else if(genval!="ALL"
-echo "}"+
 + for(var i=0;i<window.arma.length-1;i++) 
 + if(window.arma[i].genus==genval) 
 + a.push(window.arma[i]
 +
 + else if(famval!="ALL"
 +
 + for(var i=0;i<window.arma.length-1;i++) 
 + if(window.arma[i].familia==famval) 
 + a.push(window.arma[i]) 
 +
 + else if(ordval!="ALL"
 +
 + for(var i=0;i<window.arma.length-1;i++) 
 + if(window.arma[i].ordo==ordval) 
 + a.push(window.arma[i]) 
 +
 + else if(claval!="ALL"
 +
 + for(var i=0;i<window.arma.length-1;i++
 + if(window.arma[i].classis==claval) 
 + a.push(window.arma[i]) 
 +
 + else if(phyval!="ALL"
 +
 + for(var i=0;i<window.arma.length-1;i++) 
 + if(window.arma[i].phylum==phyval) 
 + a.push(window.arma[i]) 
 +
 + else if(regval!="ALL"
 +
 + for(var i=0;i<window.arma.length-1;i++) 
 + if(window.arma[i].regnum==regval) 
 + a.push(window.arma[i]) 
 +
 + else // Regnum: ALL 
 +
 + for(var i=0;i<window.arma.length-1;i++) 
 + a.push(window.arma[i]) 
 + }
  
-echo "function plostenkoid() {" + icongeddon(a) 
- echo " for (var i=map.layers.length-1;i>=1;i--) {" +
- echo " map.removeLayer(map.layers[i]);" + 
- echo " }" +function buggy() 
- echo " map.addLayer(Platyhelminthes)" +{ 
-echo "}"+ var p=[] 
 + for(var i=0;i<window.arma.length-1;i++) 
 +
 + if(window.arma[i].regnum==""|| 
 +      window.arma[i].phylum==""|| 
 +      window.arma[i].classis==""|| 
 +      window.arma[i].ordo==""|| 
 +      window.arma[i].familia==""|| 
 +      window.arma[i].genus==""
 +   p.push(window.arma[i]) 
 +
 + icongeddon(p) 
 +
 + 
 +function plostenkoidy() 
 +
 + var p=[] 
 + for(var i=0;i<window.arma.length-1;i++) 
 +
 + if(window.arma[i].phylum=="Platyhelminthes"
 + p.push(window.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 
 +
 + if(a[i].cluster!=0&&a[i].mainpic!="y") // show only in gallery, without icon in map 
 + continue; 
 + 
 + // Pokracujem v hadovi 
 + if(a[i].locality == 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].title+"<br>"+a[i].takendate+"</td>" 
 + spoj+="</tr>" 
 + ox=a[i].x 
 + oy=a[i].y 
 + continue; 
 +
 + 
 + switch(a[i].specie) 
 +
 + case "sp.": 
 +
 + wikisp="https://en.wikipedia.org/wiki/"+a[i].genus 
 + break; 
 +
 + case "negative": 
 + case "": 
 +
 + wikisp="https://en.wikipedia.org/wiki/Null_result" 
 + break; 
 +
 + default: 
 +
 + wikisp="https://en.wikipedia.org/wiki/"+a[i].genus+" "+a[i].specie 
 + break; 
 +
 +
 + 
 + 
 + // Bud prvni zaznam, nebo zmena pozice 
 + 
 + // Predchozi pozice jen zaznam? 
 + if(sam != ""
 +
 + 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].locality 
 + 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 
 + spoj+='<img src="./'+geticon(a,i)+'" class="hadimg"</a></td>' 
 + spoj+='<td>'+a[i].title+'<br>'+a[i].takendate+'</td>' 
 + spoj+="</tr>" 
 + 
 + sam='<a href="./det/'+a[i].detid+'.htm" target="_blank"><img src="'+(a[i].genus=='negative'?ICON_negative:'./simg/'+a[i].obr)+'" alt="'+a[i].title+'" class="buttimg"></a>' 
 + sam+='<br><span class="butttext">' 
 + sam+='<a href="'+wikisp+'" target="_blank">'+(a[i].title=="negative"?"Negative observation":a[i].title)+'</a><br>' 
 + if(a[i].imperium != ""
 + sam+='<b>Domain:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].imperium+'" target="_blank">'+a[i].imperium+'</a><br>' 
 + if(a[i].regnum != ""
 +    sam+='<b>Kingdom:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].regnum+'" target="_blank">'+a[i].regnum+'</a><br>' 
 + if(a[i].phylum != ""
 + sam+='<b>Phylum:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].phylum+'" target="_blank">'+a[i].phylum+'</a><br>' 
 + if(a[i].classis != ""
 + sam+='<b>Class:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].classis+'" target="_blank">'+a[i].classis+'</a><br>' 
 + if(a[i].ordo != ""
 + sam+='<b>Order:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].ordo+'" target="_blank">'+a[i].ordo+'</a><br>' 
 + if(a[i].familia != ""
 + sam+='<b>Family:</b> <a href="https://en.wikipedia.org/wiki/'+a[i].familia+'" target="_blank">'+a[i].familia+'</a><br>' 
 + if(a[i].genus != "" && a[i].genus!="negative"
 + 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>Species:</b> <a href="'+wikisp+'" target="_blank">'+a[i].specie+'</a><br>' 
 + if(a[i].biotope != ""
 + sam+="<b>Biotope:</b> "+a[i].biotope+"<br>" 
 + if(a[i].pov != ""
 + sam+="<b>River:</b> "+a[i].pov+"<br>" 
 + if(a[i].temperature != ""
 + sam+="<b>Temperature:</b> "+a[i].temperature+" °C<br>" 
 + if(a[i].pov != ""
 + sam+="<b>Conductivity:</b> "+a[i].conductivity+" mSv<br>" 
 + if(a[i].pov != ""
 + sam+="<b>pH:</b> "+a[i].ph+"<br>" 
 + 
 + 
 + 
 + if(a[i].takendate != ""
 + sam+="<b>Date:</b> "+a[i].takendate+"<br>" 
 + sam+="<b>Location:</b> "+a[i].locality+" ("+a[i].locplain+")<br>" 
 + if(a[i].observer != ""
 +  sam+="<b>Spectator:</b> "+a[i].observer+"<br>" 
 + if(a[i].micro != ""
 + sam+="<b>Microscope:</b> "+a[i].micro+" ("+a[i].microtyp+")<br>" 
 + if(a[i].enlargement != ""
 + sam+="<b>Amplification:</b> "+a[i].enlargement+"<br>" 
 + /* if [[ "$des" != "" ]]; then 
 + #   sam="$sam<b>Depictio:</b> $des<br>" 
 + # fi */ 
 + //if(a[i].videolink != ""
 + // sam+='<b>Video:</b> <a href="'+a[i].videolink+'" target="_blank">'+a[i].videolink+'</a><br>' 
 + sam+="</span>" 
 + 
 + ox=a[i].x 
 + oy=a[i].y 
 + } // Konec prochazeni a[] 
 + 
 + // Do not forget to print last line when FOR ends! 
 + samicon=geticon(a,i-1) 
 + if(sam == ""
 + sam='<table style="hadtbl">'+spoj+'</table>' 
 + 
 + 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}); 
 + vectorLayerDynamic.addFeatures(n[i]); 
 + 
 +} // Konec armageddonu 
 + 
 +//var laycon = [vectorLayer,vectorLayerPonygon,vectorLayerDynamic,studlay]; 
 +var laycon = [vectorLayer,vectorLayerDynamic,studlay]; 
 + 
 +var controls = {selector: new OpenLayers.Control.SelectFeature(laycon, { onSelect: createPopup, onUnselect: destroyPopup })}; 
 +map.addControl(controls['selector']); 
 +controls['selector'].activate(); 
 + 
 +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); 
 +
 + 
 +function destroyPopup(feature) { 
 + feature.popup.destroy(); 
 + feature.popup = null; 
 +
 + 
 + 
 +// Vyhledavani 
 +function limit() 
 +
 + srch=document.getElementById("srch").value.toLowerCase(); 
 + var p=[] 
 + for(var i=0;i<window.arma.length-1;i++) 
 +
 + if(window.arma[i].title.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].imperium.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].regnum.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].phylum.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].classis.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].ordo.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].familia.toLowerCase().indexOf(srch)>=0|| 
 +    //window.arma[i].genus.toLowerCase().indexOf(srch)>=0|| // v "qualis" 
 +    //window.arma[i].observerie.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].locplain.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].description.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].takendate.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].micro.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].microtyp.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].biotope.toLowerCase().indexOf(srch)>=0|| 
 +    window.arma[i].pov.toLowerCase().indexOf(srch)>=0) 
 +   p.push(arma[i]) 
 +
 + icongeddon(p) 
 +
 + 
 + 
 +// ====== GEOJSON ====== 
 + 
 +var metageo=JSON.parse("{}"); 
 +var geje=[]; 
 +var gejbarva=""; 
 + 
 +function placegeo(coor,gejbarva) 
 +
 + var geja=new Array; 
 + epsg4326 =  new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection 
 + projectTo = map.getProjectionObject(); 
 + 
 + for(i=0;i<coor.length;i++) 
 +
 + geja.push(new OpenLayers.Geometry.Point(coor[i][0],coor[i][1]).transform(epsg4326, projectTo)) 
 +
 +/* "default" namespaces work for Layers, not Features 
 + var lajna=new OpenLayers.StyleMap({ 
 +     "default": new OpenLayers.Style({ 
 +        //strokeColor: "#FF0000", 
 +        strokeColor: gejbarva, 
 +        strokeOpacity: 1, 
 +        strokeWidth: 5, 
 +        pointRadius: 6, 
 +     }), 
 +     "select": new OpenLayers.Style({ 
 +       //strokeColor: "#0000FF", 
 +       strokeColor: gejbarva, 
 +       strokeOpacity: 1, 
 +       strokeWidth: 5, 
 +       pointRadius: 6, 
 +     }) 
 + }); */ 
 + var lajna={ // Feature without the namespaces 
 +        strokeColor: gejbarva, 
 +        strokeOpacity: 1, 
 +        strokeWidth: 5, 
 +        pointRadius: 6, 
 + }; 
 + 
 + gejs=new OpenLayers.Geometry.LineString(geja); 
 + vectorLayerPonygon.addFeatures([new OpenLayers.Feature.Vector(gejs,{},lajna)]); 
 +
 + 
 +function getsld(url,s,g) 
 +
 + var request; 
 + if(window.XMLHttpRequest) 
 + request=new XMLHttpRequest(); 
 + else 
 + request=new ActiveXObject("Microsoft.XMLHTTP"); 
 + request.overrideMimeType("text/plain"); 
 + request.onreadystatechange=function() 
 +
 + if(request.readyState==4) 
 +
 + tmpc=request.responseText; 
 + tmpc=tmpc.match(/SvgParameter name="stroke">#[0-9a-fA-F]*<\/se:SvgParameter/)[0].match(/#[0-9a-fA-F]*/)[0]; 
 + getgeo(url,g,tmpc); 
 + //console.log(tmpc); 
 +
 +
 + request.open("GET",url+s,true); 
 + request.send(); 
 +
 + 
 + 
 +function getgeo(url,g,c) 
 +
 + var request; 
 + if(window.XMLHttpRequest) 
 + request=new XMLHttpRequest(); 
 + else 
 + request=new ActiveXObject("Microsoft.XMLHTTP"); 
 + request.overrideMimeType("application/geo+json"); 
 + request.onreadystatechange=function() 
 +
 + if(request.readyState==4) 
 +
 + tmpg=JSON.parse(request.responseText); 
 + for(var e=0;e<tmpg.features.length;e++) 
 +
 + if(typeof tmpg.features[e].properties === 'undefined') // || tmpg.features[e].properties.osm_type!="way"
 + continue; 
 + 
 + for(var i=0;i<tmpg.features[e].geometry.coordinates.length;i++) 
 +
 + for(var j=0;j<tmpg.features[e].geometry.coordinates[i].length;j++) 
 +
 + if(tmpg.features[e].geometry.coordinates[i][j].length<2) 
 + continue; 
 + //console.log(tmpg.features[e].properties.osm_type+" "+tmpg.features[e].geometry.coordinates[i][j].length); 
 + placegeo(tmpg.features[e].geometry.coordinates[i][j],c); 
 +
 +
 +
 +
 +
 + request.open("GET",url+g,true); 
 + request.send(); 
 +
 + 
 +// ENTRY POINT 
 +// parametr je ./ adresar ve kterem je metadata.json S LOMITKEM NA KONCI 
 +function drawgeojson(url) 
 +
 + var request; 
 + if(window.XMLHttpRequest) 
 + request=new XMLHttpRequest(); 
 + else 
 + request=new ActiveXObject("Microsoft.XMLHTTP"); 
 + request.onreadystatechange=function() 
 +
 + if(request.readyState==4) 
 +
 + window.metageo=JSON.parse(request.responseText); 
 + for(var i=0;i<metageo.layers.length;i++) 
 +
 + //console.log(metageo.layers[i].geojson); 
 + getsld(url,metageo.layers[i].sld,metageo.layers[i].geojson) 
 +
 +
 +
 + request.open("GET",url+"metadata.json",true); 
 + request.send(); 
 +
 + 
 +</code> 
 + 
 +==== Springs ==== 
 + 
 +To be able to better plan routes for collecting planarians, the knowledge of locations of springs seems to be important. So BioOSM can show them! Below is a script to get the locations from OSM XMLs obtainable from [[http://osm.kyblsoft.cz/archiv/]]. 
 + 
 +<code bash studanky.sh> 
 +#!/bin/bash 
 +# 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 
 +
 + 
 +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"'
 + 
 +json='{"version":"'$(date --rfc-3339=seconds)'","std":[' 
 + 
 +while IFS='' read -r spr || [[ -n "$spr" ]]; do 
 + n=$(echo "$spr" | grep -oPe 'k="name" v="[^"]*"' | sed -e 's/k="name" v="//g' -e 's/"$//g'
 + lat=$(echo "$spr" | grep -oPe ' lat="[^"]*"' | sed -e 's/ lat="//g' -e 's/"$//g'
 + lon=$(echo "$spr" | grep -oPe ' lon="[^"]*"' | sed -e 's/ lon="//g' -e 's/"$//g'
 + 
 + if [ "$lat" = "" ] || [ "$lon" = "" ]; then 
 + continue; # <way> a tak 
 + fi 
 + if [[ "$n" = "" ]]; then 
 + n="inkognito" 
 + >&2 echo -e "\033[34m $lat $lon \033[0m"; 
 + fi 
 + 
 + json+="{" 
 + json+=" \"name\":\"$n\"," 
 + json+=" \"lon\":\"$lon\"," 
 + json+=" \"lat\":\"$lat\"" 
 + json+="},
 + 
 + >&echo -e "\033[32m $n $lat $lon\033[0m" 
 + 
 +done <<< $(echo "$osm"
 + 
 +echo "$json{}]}" 
 +</code> 
 + 
 +=== LocalityID === 
 +<code bash ajdy.sh> 
 +#!/bin/bash 
 + 
 +T=$(mktemp) 
 +unzip -p "$1" tellico.xml | tr -d '\n' | sed -e $'s/<entry id="/\\\n<entry id="/g' -e $'s/<\/entry>/<\/entry>\\\n/g' > "$T
 + 
 + 
 +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)) 
 + 
 + 
 +function ll() 
 +
 + while IFS='' read -r r || [[ -n "$r" ]]; do 
 + 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'
 + l=$(echo "$r" | grep -oe '<locality>.*</locality>' | grep -oPe '[0-9]+\.[0-9]+[, ]*[0-9]+\.[0-9]+'
 + echo "$t@$l" 
 + done <<< $(echo "$1"
 +
 + 
 +srt=$(ll "$hf" | sort -u) 
 + 
 +uid=$mid 
 +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"
  
-echo "</script>+rm -rfv "$T
-echo "</html>"+rm -rfv "$D"
 </code> </code>
project/bioosm/start.1528395244.txt.gz · Last modified: 2018/06/07 18:14 by ruza