diff options
Diffstat (limited to 'sundry/misc/util/d/cgi')
| -rw-r--r-- | sundry/misc/util/d/cgi/search/src/spine_cgi_sqlite_search.d | 976 | 
1 files changed, 488 insertions, 488 deletions
| diff --git a/sundry/misc/util/d/cgi/search/src/spine_cgi_sqlite_search.d b/sundry/misc/util/d/cgi/search/src/spine_cgi_sqlite_search.d index 987c319..aa073c0 100644 --- a/sundry/misc/util/d/cgi/search/src/spine_cgi_sqlite_search.d +++ b/sundry/misc/util/d/cgi/search/src/spine_cgi_sqlite_search.d @@ -40,7 +40,7 @@      - docReform object numbering        - standard SiSU object citation numbering & system -  - Hompages: +  - Homepages:      [https://www.doc_reform.org]      [https://www.sisudoc.org] @@ -118,325 +118,325 @@ void cgi_function_intro(Cgi cgi) {        //   cgi.write(field ~ ": " ~ content ~ "<br>");        // }      } -    static struct Rgx { -      // static canned_query   = ctRegex!(`\A(?P<matched>.+)\Z`,                            "m"); -      static search_text_area  = ctRegex!(`\A(?P<matched>.+)\Z`,                            "m"); -      // static fulltext       = ctRegex!(`\A(?P<matched>.+)\Z`,                            "m"); -      static line              = ctRegex!(`^(?P<matched>.+?)(?: ~|$)`,                      "m"); -      static text              = ctRegex!(`(?:^|\s~\s*)text:\s+(?P<matched>.+?)(?: ~|$)`,   "m"); -      static author            = ctRegex!(`(?:^|\s~\s*)author:\s+(?P<matched>.+)$`,         "m"); -      static title             = ctRegex!(`(?:^|\s~\s*)title:\s+(?P<matched>.+)$`,          "m"); -      static uid               = ctRegex!(`(?:^|\s~\s*)uid:\s+(?P<matched>.+)$`,            "m"); -      static fn                = ctRegex!(`(?:^|\s~\s*)fn:\s+(?P<matched>.+)$`,             "m"); -      static keywords          = ctRegex!(`(?:^|\s~\s*)keywords:\s+(?P<matched>.+)$`,       "m"); -      static topic_register    = ctRegex!(`(?:^|\s~\s*)topic_register:\s+(?P<matched>.+)$`, "m"); -      static subject           = ctRegex!(`(?:^|\s~\s*)subject:\s+(?P<matched>.+)$`,        "m"); -      static description       = ctRegex!(`(?:^|\s~\s*)description:\s+(?P<matched>.+)$`,    "m"); -      static publisher         = ctRegex!(`(?:^|\s~\s*)publisher:\s+(?P<matched>.+)$`,      "m"); -      static editor            = ctRegex!(`(?:^|\s~\s*)editor:\s+(?P<matched>.+)$`,         "m"); -      static contributor       = ctRegex!(`(?:^|\s~\s*)contributor:\s+(?P<matched>.+)$`,    "m"); -      static date              = ctRegex!(`(?:^|\s~\s*)date:\s+(?P<matched>.+)$`,           "m"); -      static results_type      = ctRegex!(`(?:^|\s~\s*)type:\s+(?P<matched>.+)$`,           "m"); -      static format            = ctRegex!(`(?:^|\s~\s*)format:\s+(?P<matched>.+)$`,         "m"); -      static identifier        = ctRegex!(`(?:^|\s~\s*)identifier:\s+(?P<matched>.+)$`,     "m"); -      static source            = ctRegex!(`(?:^|\s~\s*)source:\s+(?P<matched>.+)$`,         "m"); -      static language          = ctRegex!(`(?:^|\s~\s*)language:\s+(?P<matched>.+)$`,       "m"); -      static relation          = ctRegex!(`(?:^|\s~\s*)relation:\s+(?P<matched>.+)$`,       "m"); -      static coverage          = ctRegex!(`(?:^|\s~\s*)coverage:\s+(?P<matched>.+)$`,       "m"); -      static rights            = ctRegex!(`(?:^|\s~\s*)rights:\s+(?P<matched>.+)$`,         "m"); -      static comment           = ctRegex!(`(?:^|\s~\s*)comment:\s+(?P<matched>.+)$`,        "m"); -      // static abstract_         = ctRegex!(`(?:^|\s~\s*)abstract:\s+(?P<matched>.+)$`,       "m"); -      static src_filename_base = ctRegex!(`^src_filename_base:\s+(?P<matched>.+)$`,         "m"); -    } -    struct searchFields { -      string canned_query      = ""; // GET  canned_query     == cq -      string search_text_area  = ""; // POST search_text_area == tsa -      string text              = ""; // text              == txt -      string author            = ""; // author            == au -      string title             = ""; // title             == ti -      string uid               = "";  // uid               == uid -      string fn                = ""; // fn                == fn -      string keywords          = ""; // keywords          == kw -      string topic_register    = ""; // topic_register    == tr -      string subject           = ""; // subject           == su -      string description       = ""; // description       == de -      string publisher         = ""; // publisher         == pb -      string editor            = ""; // editor            == ed -      string contributor       = ""; // contributor       == ct -      string date              = ""; // date              == dt -      string format            = ""; // format            == fmt -      string identifier        = ""; // identifier        == id -      string source            = ""; // source            == src sfn -      string language          = ""; // language          == lng -      string relation          = ""; // relation          == rl -      string coverage          = ""; // coverage          == cv -      string rights            = ""; // rights            == rgt -      string comment           = ""; // comment           == cmt -      // string abstract          = ""; -      string src_filename_base = ""; // src_filename_base == bfn -      string results_type      = ""; // results_type      == rt     radio -      string sql_match_limit   = ""; // sql_match_limit   == sml    radio -      string sql_match_offset  = ""; // sql_match_offset  == smo -      string stats             = ""; // stats             == sts    checked -      string echo              = ""; // echo              == ec     checked -      string url               = ""; // url               == url    checked -      string searched          = ""; // searched          == se     checked -      string sql               = ""; // sql               == sql    checked -    } -    auto rgx  = Rgx(); -    auto got  = searchFields(); -    if (environment.get("REQUEST_METHOD", "POST") == "POST") { -      if ("sf" in cgi.post) { -        got.search_text_area =  cgi.post["sf"]; -        if (auto m = got.search_text_area.matchFirst(rgx.text)) { +  static struct Rgx { +    // static canned_query   = ctRegex!(`\A(?P<matched>.+)\Z`,                            "m"); +    static search_text_area  = ctRegex!(`\A(?P<matched>.+)\Z`,                            "m"); +    // static fulltext       = ctRegex!(`\A(?P<matched>.+)\Z`,                            "m"); +    static line              = ctRegex!(`^(?P<matched>.+?)(?: ~|$)`,                      "m"); +    static text              = ctRegex!(`(?:^|\s~\s*)text:\s+(?P<matched>.+?)(?: ~|$)`,   "m"); +    static author            = ctRegex!(`(?:^|\s~\s*)author:\s+(?P<matched>.+)$`,         "m"); +    static title             = ctRegex!(`(?:^|\s~\s*)title:\s+(?P<matched>.+)$`,          "m"); +    static uid               = ctRegex!(`(?:^|\s~\s*)uid:\s+(?P<matched>.+)$`,            "m"); +    static fn                = ctRegex!(`(?:^|\s~\s*)fn:\s+(?P<matched>.+)$`,             "m"); +    static keywords          = ctRegex!(`(?:^|\s~\s*)keywords:\s+(?P<matched>.+)$`,       "m"); +    static topic_register    = ctRegex!(`(?:^|\s~\s*)topic_register:\s+(?P<matched>.+)$`, "m"); +    static subject           = ctRegex!(`(?:^|\s~\s*)subject:\s+(?P<matched>.+)$`,        "m"); +    static description       = ctRegex!(`(?:^|\s~\s*)description:\s+(?P<matched>.+)$`,    "m"); +    static publisher         = ctRegex!(`(?:^|\s~\s*)publisher:\s+(?P<matched>.+)$`,      "m"); +    static editor            = ctRegex!(`(?:^|\s~\s*)editor:\s+(?P<matched>.+)$`,         "m"); +    static contributor       = ctRegex!(`(?:^|\s~\s*)contributor:\s+(?P<matched>.+)$`,    "m"); +    static date              = ctRegex!(`(?:^|\s~\s*)date:\s+(?P<matched>.+)$`,           "m"); +    static results_type      = ctRegex!(`(?:^|\s~\s*)type:\s+(?P<matched>.+)$`,           "m"); +    static format            = ctRegex!(`(?:^|\s~\s*)format:\s+(?P<matched>.+)$`,         "m"); +    static identifier        = ctRegex!(`(?:^|\s~\s*)identifier:\s+(?P<matched>.+)$`,     "m"); +    static source            = ctRegex!(`(?:^|\s~\s*)source:\s+(?P<matched>.+)$`,         "m"); +    static language          = ctRegex!(`(?:^|\s~\s*)language:\s+(?P<matched>.+)$`,       "m"); +    static relation          = ctRegex!(`(?:^|\s~\s*)relation:\s+(?P<matched>.+)$`,       "m"); +    static coverage          = ctRegex!(`(?:^|\s~\s*)coverage:\s+(?P<matched>.+)$`,       "m"); +    static rights            = ctRegex!(`(?:^|\s~\s*)rights:\s+(?P<matched>.+)$`,         "m"); +    static comment           = ctRegex!(`(?:^|\s~\s*)comment:\s+(?P<matched>.+)$`,        "m"); +    // static abstract_         = ctRegex!(`(?:^|\s~\s*)abstract:\s+(?P<matched>.+)$`,       "m"); +    static src_filename_base = ctRegex!(`^src_filename_base:\s+(?P<matched>.+)$`,         "m"); +  } +  struct searchFields { +    string canned_query      = ""; // GET  canned_query     == cq +    string search_text_area  = ""; // POST search_text_area == tsa +    string text              = ""; // text              == txt +    string author            = ""; // author            == au +    string title             = ""; // title             == ti +    string uid               = "";  // uid               == uid +    string fn                = ""; // fn                == fn +    string keywords          = ""; // keywords          == kw +    string topic_register    = ""; // topic_register    == tr +    string subject           = ""; // subject           == su +    string description       = ""; // description       == de +    string publisher         = ""; // publisher         == pb +    string editor            = ""; // editor            == ed +    string contributor       = ""; // contributor       == ct +    string date              = ""; // date              == dt +    string format            = ""; // format            == fmt +    string identifier        = ""; // identifier        == id +    string source            = ""; // source            == src sfn +    string language          = ""; // language          == lng +    string relation          = ""; // relation          == rl +    string coverage          = ""; // coverage          == cv +    string rights            = ""; // rights            == rgt +    string comment           = ""; // comment           == cmt +    // string abstract          = ""; +    string src_filename_base = ""; // src_filename_base == bfn +    string results_type      = ""; // results_type      == rt     radio +    string sql_match_limit   = ""; // sql_match_limit   == sml    radio +    string sql_match_offset  = ""; // sql_match_offset  == smo +    string stats             = ""; // stats             == sts    checked +    string echo              = ""; // echo              == ec     checked +    string url               = ""; // url               == url    checked +    string searched          = ""; // searched          == se     checked +    string sql               = ""; // sql               == sql    checked +  } +  auto rgx  = Rgx(); +  auto got  = searchFields(); +  if (environment.get("REQUEST_METHOD", "POST") == "POST") { +    if ("sf" in cgi.post) { +      got.search_text_area =  cgi.post["sf"]; +      if (auto m = got.search_text_area.matchFirst(rgx.text)) { +        got.text = m["matched"]; +        got.canned_query ~= "sf=" ~ m["matched"]; +      } else if (auto m = got.search_text_area.matchFirst(rgx.line)) { +        if ( +          !(m["matched"].matchFirst(rgx.author)) +          && !(m["matched"].matchFirst(rgx.title)) +        ) {            got.text = m["matched"];            got.canned_query ~= "sf=" ~ m["matched"]; -        } else if (auto m = got.search_text_area.matchFirst(rgx.line)) { -          if ( -            !(m["matched"].matchFirst(rgx.author)) -            && !(m["matched"].matchFirst(rgx.title)) -          ) { -            got.text = m["matched"]; -            got.canned_query ~= "sf=" ~ m["matched"]; -          } -        } -        if (auto m = got.search_text_area.matchFirst(rgx.author)) { -          got.author = m["matched"]; -          got.canned_query ~= "&au=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.title)) { -          got.title = m["matched"]; -          got.canned_query ~= "&ti=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.uid)) { -          got.uid = m["matched"]; -          got.canned_query ~= "&uid=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.fn)) { -          got.fn = m["matched"]; -          got.canned_query ~= "&fn=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.keywords)) { -          got.keywords = m["matched"]; -          got.canned_query ~= "&kw=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.topic_register)) { -          got.topic_register = m["matched"]; -          got.canned_query ~= "&tr=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.subject)) { -          got.subject = m["matched"]; -          got.canned_query ~= "&su=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.description)) { -          got.description = m["matched"]; -          got.canned_query ~= "&de=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.publisher)) { -          got.publisher = m["matched"]; -          got.canned_query ~= "&pb=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.editor)) { -          got.editor = m["matched"]; -          got.canned_query ~= "&ed=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.contributor)) { -          got.contributor = m["matched"]; -          got.canned_query ~= "&ct=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.date)) { -          got.date = m["matched"]; -          got.canned_query ~= "&dt=" ~ m["matched"]; -        } -        // if (auto m = got.search_text_area.matchFirst(rgx.results_type)) { -        //   got.results_type = m["matched"]; -        //   got.canned_query ~= "&rt=" ~ m["matched"]; -        // } -        if (auto m = got.search_text_area.matchFirst(rgx.format)) { -          got.format = m["matched"]; -          got.canned_query ~= "&fmt=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.identifier)) { -          got.identifier = m["matched"]; -          got.canned_query ~= "&id=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.source)) { -          got.source = m["matched"]; -          got.canned_query ~= "&src=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.language)) { -          got.language = m["matched"]; -          got.canned_query ~= "&lng=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.relation)) { -          got.relation = m["matched"]; -          got.canned_query ~= "&rl=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.coverage)) { -          got.coverage = m["matched"]; -          got.canned_query ~= "&cv=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.rights)) { -          got.rights = m["matched"]; -          got.canned_query ~= "&rgt=" ~ m["matched"]; -        } -        if (auto m = got.search_text_area.matchFirst(rgx.comment)) { -          got.comment = m["matched"]; -          got.canned_query ~= "&cmt=" ~ m["matched"]; -        } -        // if (auto m = search_text_area.matchFirst(rgx.abstract)) { -        //   got.abstract = m["matched"]; -        // } -        if (auto m = got.search_text_area.matchFirst(rgx.src_filename_base)) { -          got.src_filename_base = m["matched"]; -          got.canned_query ~= "&bfn=" ~ m["matched"];          }        } -      if ("fn" in cgi.post) { -        got.fn =  cgi.post["fn"]; -        got.canned_query ~= "&fn=" ~ cgi.post["fn"]; +      if (auto m = got.search_text_area.matchFirst(rgx.author)) { +        got.author = m["matched"]; +        got.canned_query ~= "&au=" ~ m["matched"];        } -      if ("rt" in cgi.post) { -        got.results_type =  cgi.post["rt"]; -        got.canned_query ~= "&rt=" ~ cgi.post["rt"]; +      if (auto m = got.search_text_area.matchFirst(rgx.title)) { +        got.title = m["matched"]; +        got.canned_query ~= "&ti=" ~ m["matched"];        } -      if ("sts" in cgi.post) { -        got.stats =  cgi.post["sts"]; -        got.canned_query ~= "&sts=" ~ cgi.post["sts"]; +      if (auto m = got.search_text_area.matchFirst(rgx.uid)) { +        got.uid = m["matched"]; +        got.canned_query ~= "&uid=" ~ m["matched"];        } -      if ("ec" in cgi.post) { -        got.echo =  cgi.post["ec"]; -        got.canned_query ~= "&ec=" ~ cgi.post["ec"]; +      if (auto m = got.search_text_area.matchFirst(rgx.fn)) { +        got.fn = m["matched"]; +        got.canned_query ~= "&fn=" ~ m["matched"];        } -      if ("url" in cgi.post) { -        got.url =  cgi.post["url"]; -        got.canned_query ~= "&url=" ~ cgi.post["url"]; +      if (auto m = got.search_text_area.matchFirst(rgx.keywords)) { +        got.keywords = m["matched"]; +        got.canned_query ~= "&kw=" ~ m["matched"];        } -      if ("se" in cgi.post) { -        got.searched =  cgi.post["se"]; -        got.canned_query ~= "&se=" ~ cgi.post["se"]; +      if (auto m = got.search_text_area.matchFirst(rgx.topic_register)) { +        got.topic_register = m["matched"]; +        got.canned_query ~= "&tr=" ~ m["matched"];        } -      if ("sql" in cgi.post) { -        got.sql =  cgi.post["sql"]; -        got.canned_query ~= "&sql=" ~ cgi.post["sql"]; +      if (auto m = got.search_text_area.matchFirst(rgx.subject)) { +        got.subject = m["matched"]; +        got.canned_query ~= "&su=" ~ m["matched"];        } -      if ("sml" in cgi.post) { -        got.sql_match_limit =  cgi.post["sml"]; -        got.canned_query ~= "&sml=" ~ cgi.post["sml"]; -      } -      if ("smo" in cgi.post) { -        got.sql_match_offset = "0";   // cgi.post["smo"]; -        got.canned_query ~= "&smo=0"; //  ~ cgi.post["smo"]; -      } -      got.canned_query = got.canned_query.strip.split(" ").join("%20"); -      conf.query_string = got.canned_query; -      // cgi.write("f.canned_query: " ~ got.canned_query ~ "<br>"); -    } else if (environment.get("REQUEST_METHOD", "POST") == "GET") { -      got.canned_query = environment.get("QUERY_STRING", ""); -      // cgi.write("f.canned_query: " ~ got.canned_query ~ "<br>"); -      got.search_text_area = ""; -      if ("sf" in canned_query && !(canned_query["sf"]).empty) { -        got.text = canned_query["sf"].split("%20").join(" "); -        got.search_text_area ~= "text: " ~ got.text ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.description)) { +        got.description = m["matched"]; +        got.canned_query ~= "&de=" ~ m["matched"];        } -      if ("au" in canned_query && !(canned_query["au"]).empty) { -        got.author = canned_query["au"].split("%20").join(" "); -        got.search_text_area ~= "author: " ~ got.author ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.publisher)) { +        got.publisher = m["matched"]; +        got.canned_query ~= "&pb=" ~ m["matched"];        } -      if ("ti" in canned_query && !(canned_query["ti"]).empty) { -        got.title = canned_query["ti"].split("%20").join(" "); -        got.search_text_area ~= "title: " ~ got.title ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.editor)) { +        got.editor = m["matched"]; +        got.canned_query ~= "&ed=" ~ m["matched"];        } -      if ("uid" in canned_query && !(canned_query["uid"]).empty) { -        got.uid = canned_query["uid"].split("%20").join(" "); -        got.search_text_area ~= "uid: " ~ got.uid ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.contributor)) { +        got.contributor = m["matched"]; +        got.canned_query ~= "&ct=" ~ m["matched"];        } -      if ("fn" in canned_query && !(canned_query["fn"]).empty) { -        got.fn = canned_query["fn"].split("%20").join(" "); -        got.search_text_area ~= "fn: " ~ got.fn ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.date)) { +        got.date = m["matched"]; +        got.canned_query ~= "&dt=" ~ m["matched"];        } -      if ("kw" in canned_query && !(canned_query["kw"]).empty) { -        got.keywords = canned_query["kw"].split("%20").join(" "); -        got.search_text_area ~= "keywords: " ~ got.keywords ~ "\n"; -      } -      if ("tr" in canned_query && !(canned_query["tr"]).empty) { -        got.topic_register = canned_query["tr"].split("%20").join(" "); -        got.search_text_area ~= "topic_register: " ~ got.topic_register ~ "\n"; -      } -      if ("su" in canned_query && !(canned_query["su"]).empty) { -        got.subject = canned_query["su"].split("%20").join(" "); -        got.search_text_area ~= "subject: " ~ got.subject ~ "\n"; -      } -      if ("de" in canned_query && !(canned_query["de"]).empty) { -        got.description = canned_query["de"].split("%20").join(" "); -        got.search_text_area ~= "description: " ~ got.description ~ "\n"; -      } -      if ("pb" in canned_query && !(canned_query["pb"]).empty) { -        got.publisher = canned_query["pb"].split("%20").join(" "); -        got.search_text_area ~= "publisher: " ~ got.publisher ~ "\n"; -      } -      if ("ed" in canned_query && !(canned_query["ed"]).empty) { -        got.editor = canned_query["ed"].split("%20").join(" "); -        got.search_text_area ~= "editor: " ~ got.editor ~ "\n"; -      } -      if ("ct" in canned_query && !(canned_query["ct"]).empty) { -        got.contributor = canned_query["ct"].split("%20").join(" "); -        got.search_text_area ~= "contributor: " ~ got.contributor ~ "\n"; -      } -      if ("dt" in canned_query && !(canned_query["dt"]).empty) { -        got.date = canned_query["dt"].split("%20").join(" "); -        got.search_text_area ~= "date: " ~ got.date ~ "\n"; -      } -      if ("rt" in canned_query && !(canned_query["rt"]).empty) { -        got.results_type = canned_query["rt"].split("%20").join(" "); -        // got.search_text_area ~= "results_type: " ~ got.results_type ~ "\n"; -      } -      if ("fmt" in canned_query && !(canned_query["fmt"]).empty) { -        got.format = canned_query["fmt"].split("%20").join(" "); -        got.search_text_area ~= "format: " ~ got.format ~ "\n"; +      // if (auto m = got.search_text_area.matchFirst(rgx.results_type)) { +      //   got.results_type = m["matched"]; +      //   got.canned_query ~= "&rt=" ~ m["matched"]; +      // } +      if (auto m = got.search_text_area.matchFirst(rgx.format)) { +        got.format = m["matched"]; +        got.canned_query ~= "&fmt=" ~ m["matched"];        } -      if ("id" in canned_query && !(canned_query["id"]).empty) { -        got.identifier = canned_query["id"].split("%20").join(" "); -        got.search_text_area ~= "identifier: " ~ got.identifier ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.identifier)) { +        got.identifier = m["matched"]; +        got.canned_query ~= "&id=" ~ m["matched"];        } -      if ("src" in canned_query && !(canned_query["src"]).empty) { -        got.source = canned_query["src"].split("%20").join(" "); -        got.search_text_area ~= "source: " ~ got.source ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.source)) { +        got.source = m["matched"]; +        got.canned_query ~= "&src=" ~ m["matched"];        } -      if ("lng" in canned_query && !(canned_query["lng"]).empty) { -        got.language = canned_query["lng"].split("%20").join(" "); -        got.search_text_area ~= "language: " ~ got.language ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.language)) { +        got.language = m["matched"]; +        got.canned_query ~= "&lng=" ~ m["matched"];        } -      if ("rl" in canned_query && !(canned_query["rl"]).empty) { -        got.relation = canned_query["rl"].split("%20").join(" "); -        got.search_text_area ~= "relation: " ~ got.relation ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.relation)) { +        got.relation = m["matched"]; +        got.canned_query ~= "&rl=" ~ m["matched"];        } -      if ("cv" in canned_query && !(canned_query["cv"]).empty) { -        got.coverage = canned_query["cv"].split("%20").join(" "); -        got.search_text_area ~= "coverage: " ~ got.coverage ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.coverage)) { +        got.coverage = m["matched"]; +        got.canned_query ~= "&cv=" ~ m["matched"];        } -      if ("rgt" in canned_query && !(canned_query["rgt"]).empty) { -        got.rights = canned_query["rgt"].split("%20").join(" "); -        got.search_text_area ~= "rights: " ~ got.rights ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.rights)) { +        got.rights = m["matched"]; +        got.canned_query ~= "&rgt=" ~ m["matched"];        } -      if ("cmt" in canned_query && !(canned_query["cmt"]).empty) { -        got.comment = canned_query["cmt"].split("%20").join(" "); -        got.search_text_area ~= "comment: " ~ got.comment ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.comment)) { +        got.comment = m["matched"]; +        got.canned_query ~= "&cmt=" ~ m["matched"];        } -      // if ("abstract" in canned_query && !(canned_query["abstract"]).empty) { -      //   got.abstract = canned_query["abstract"]; +      // if (auto m = search_text_area.matchFirst(rgx.abstract)) { +      //   got.abstract = m["matched"];        // } -      if ("bfn" in canned_query && !(canned_query["bfn"]).empty) { // search_field -        got.src_filename_base = canned_query["bfn"].split("%20").join(" "); -        got.search_text_area ~= "src_filename_base: " ~ got.src_filename_base ~ "\n"; -      } -      if ("sml" in canned_query && !(canned_query["sml"]).empty) { -        got.sql_match_limit = canned_query["sml"].split("%20").join(" "); -        // got.search_text_area ~= "sql_match_limit: " ~ got.sql_match_limit ~ "\n"; +      if (auto m = got.search_text_area.matchFirst(rgx.src_filename_base)) { +        got.src_filename_base = m["matched"]; +        got.canned_query ~= "&bfn=" ~ m["matched"];        } -      // cgi.write("f.search_text_area: " ~ got.search_text_area ~ "<br>");      } -    return got; +    if ("fn" in cgi.post) { +      got.fn =  cgi.post["fn"]; +      got.canned_query ~= "&fn=" ~ cgi.post["fn"]; +    } +    if ("rt" in cgi.post) { +      got.results_type =  cgi.post["rt"]; +      got.canned_query ~= "&rt=" ~ cgi.post["rt"]; +    } +    if ("sts" in cgi.post) { +      got.stats =  cgi.post["sts"]; +      got.canned_query ~= "&sts=" ~ cgi.post["sts"]; +    } +    if ("ec" in cgi.post) { +      got.echo =  cgi.post["ec"]; +      got.canned_query ~= "&ec=" ~ cgi.post["ec"]; +    } +    if ("url" in cgi.post) { +      got.url =  cgi.post["url"]; +      got.canned_query ~= "&url=" ~ cgi.post["url"]; +    } +    if ("se" in cgi.post) { +      got.searched =  cgi.post["se"]; +      got.canned_query ~= "&se=" ~ cgi.post["se"]; +    } +    if ("sql" in cgi.post) { +      got.sql =  cgi.post["sql"]; +      got.canned_query ~= "&sql=" ~ cgi.post["sql"]; +    } +    if ("sml" in cgi.post) { +      got.sql_match_limit =  cgi.post["sml"]; +      got.canned_query ~= "&sml=" ~ cgi.post["sml"]; +    } +    if ("smo" in cgi.post) { +      got.sql_match_offset = "0";   // cgi.post["smo"]; +      got.canned_query ~= "&smo=0"; //  ~ cgi.post["smo"]; +    } +    got.canned_query = got.canned_query.strip.split(" ").join("%20"); +    conf.query_string = got.canned_query; +    // cgi.write("f.canned_query: " ~ got.canned_query ~ "<br>"); +  } else if (environment.get("REQUEST_METHOD", "POST") == "GET") { +    got.canned_query = environment.get("QUERY_STRING", ""); +    // cgi.write("f.canned_query: " ~ got.canned_query ~ "<br>"); +    got.search_text_area = ""; +    if ("sf" in canned_query && !(canned_query["sf"]).empty) { +      got.text = canned_query["sf"].split("%20").join(" "); +      got.search_text_area ~= "text: " ~ got.text ~ "\n"; +    } +    if ("au" in canned_query && !(canned_query["au"]).empty) { +      got.author = canned_query["au"].split("%20").join(" "); +      got.search_text_area ~= "author: " ~ got.author ~ "\n"; +    } +    if ("ti" in canned_query && !(canned_query["ti"]).empty) { +      got.title = canned_query["ti"].split("%20").join(" "); +      got.search_text_area ~= "title: " ~ got.title ~ "\n"; +    } +    if ("uid" in canned_query && !(canned_query["uid"]).empty) { +      got.uid = canned_query["uid"].split("%20").join(" "); +      got.search_text_area ~= "uid: " ~ got.uid ~ "\n"; +    } +    if ("fn" in canned_query && !(canned_query["fn"]).empty) { +      got.fn = canned_query["fn"].split("%20").join(" "); +      got.search_text_area ~= "fn: " ~ got.fn ~ "\n"; +    } +    if ("kw" in canned_query && !(canned_query["kw"]).empty) { +      got.keywords = canned_query["kw"].split("%20").join(" "); +      got.search_text_area ~= "keywords: " ~ got.keywords ~ "\n"; +    } +    if ("tr" in canned_query && !(canned_query["tr"]).empty) { +      got.topic_register = canned_query["tr"].split("%20").join(" "); +      got.search_text_area ~= "topic_register: " ~ got.topic_register ~ "\n"; +    } +    if ("su" in canned_query && !(canned_query["su"]).empty) { +      got.subject = canned_query["su"].split("%20").join(" "); +      got.search_text_area ~= "subject: " ~ got.subject ~ "\n"; +    } +    if ("de" in canned_query && !(canned_query["de"]).empty) { +      got.description = canned_query["de"].split("%20").join(" "); +      got.search_text_area ~= "description: " ~ got.description ~ "\n"; +    } +    if ("pb" in canned_query && !(canned_query["pb"]).empty) { +      got.publisher = canned_query["pb"].split("%20").join(" "); +      got.search_text_area ~= "publisher: " ~ got.publisher ~ "\n"; +    } +    if ("ed" in canned_query && !(canned_query["ed"]).empty) { +      got.editor = canned_query["ed"].split("%20").join(" "); +      got.search_text_area ~= "editor: " ~ got.editor ~ "\n"; +    } +    if ("ct" in canned_query && !(canned_query["ct"]).empty) { +      got.contributor = canned_query["ct"].split("%20").join(" "); +      got.search_text_area ~= "contributor: " ~ got.contributor ~ "\n"; +    } +    if ("dt" in canned_query && !(canned_query["dt"]).empty) { +      got.date = canned_query["dt"].split("%20").join(" "); +      got.search_text_area ~= "date: " ~ got.date ~ "\n"; +    } +    if ("rt" in canned_query && !(canned_query["rt"]).empty) { +      got.results_type = canned_query["rt"].split("%20").join(" "); +      // got.search_text_area ~= "results_type: " ~ got.results_type ~ "\n"; +    } +    if ("fmt" in canned_query && !(canned_query["fmt"]).empty) { +      got.format = canned_query["fmt"].split("%20").join(" "); +      got.search_text_area ~= "format: " ~ got.format ~ "\n"; +    } +    if ("id" in canned_query && !(canned_query["id"]).empty) { +      got.identifier = canned_query["id"].split("%20").join(" "); +      got.search_text_area ~= "identifier: " ~ got.identifier ~ "\n"; +    } +    if ("src" in canned_query && !(canned_query["src"]).empty) { +      got.source = canned_query["src"].split("%20").join(" "); +      got.search_text_area ~= "source: " ~ got.source ~ "\n"; +    } +    if ("lng" in canned_query && !(canned_query["lng"]).empty) { +      got.language = canned_query["lng"].split("%20").join(" "); +      got.search_text_area ~= "language: " ~ got.language ~ "\n"; +    } +    if ("rl" in canned_query && !(canned_query["rl"]).empty) { +      got.relation = canned_query["rl"].split("%20").join(" "); +      got.search_text_area ~= "relation: " ~ got.relation ~ "\n"; +    } +    if ("cv" in canned_query && !(canned_query["cv"]).empty) { +      got.coverage = canned_query["cv"].split("%20").join(" "); +      got.search_text_area ~= "coverage: " ~ got.coverage ~ "\n"; +    } +    if ("rgt" in canned_query && !(canned_query["rgt"]).empty) { +      got.rights = canned_query["rgt"].split("%20").join(" "); +      got.search_text_area ~= "rights: " ~ got.rights ~ "\n"; +    } +    if ("cmt" in canned_query && !(canned_query["cmt"]).empty) { +      got.comment = canned_query["cmt"].split("%20").join(" "); +      got.search_text_area ~= "comment: " ~ got.comment ~ "\n"; +    } +    // if ("abstract" in canned_query && !(canned_query["abstract"]).empty) { +    //   got.abstract = canned_query["abstract"]; +    // } +    if ("bfn" in canned_query && !(canned_query["bfn"]).empty) { // search_field +      got.src_filename_base = canned_query["bfn"].split("%20").join(" "); +      got.search_text_area ~= "src_filename_base: " ~ got.src_filename_base ~ "\n"; +    } +    if ("sml" in canned_query && !(canned_query["sml"]).empty) { +      got.sql_match_limit = canned_query["sml"].split("%20").join(" "); +      // got.search_text_area ~= "sql_match_limit: " ~ got.sql_match_limit ~ "\n"; +    } +    // cgi.write("f.search_text_area: " ~ got.search_text_area ~ "<br>"); +  } +  return got;    }    auto tf = text_fields; //    struct SQL_select { @@ -573,96 +573,96 @@ void cgi_function_intro(Cgi cgi) {      conf.http_host,     );    } -  { -    table = format(q"┃ - <table summary="band" border="0" cellpadding="2" cellspacing="0"> - <tr><td width="20%%"> -  <table summary="home button / home information" border="0" cellpadding="2" cellspacing="0"> -  <tr><td align="left"> -   <br /><a href="https://sisudoc.org/" target="_top"> -     <b>SiSU</b> -   </a> -   <br /><a href="https://git.sisudoc.org/" target="_top"> -     git -   </a> -  </td></tr> -  </table> - </td> - <td> -   <label for="find"><b>SiSU spine (generated) search form</b></label> + { +   table = format(q"┃ +<table summary="band" border="0" cellpadding="2" cellspacing="0"> +<tr><td width="20%%"> + <table summary="home button / home information" border="0" cellpadding="2" cellspacing="0"> + <tr><td align="left"> +  <br /><a href="https://sisudoc.org/" target="_top"> +    <b>SiSU</b> +  </a> +  <br /><a href="https://git.sisudoc.org/" target="_top"> +    git +  </a>   </td></tr>   </table> - ┃"); -  } -  { -    string post_value(string field_name, string type="box", string set="on") { -      string val = ""; -      switch (type) { -      case "field": -        val = ((field_name in cgi.post && !(cgi.post[field_name]).empty) -          ? cgi.post[field_name] -          : (field_name in cgi.get) -            ? cgi.get[field_name] -            : ""); -        val = tf.search_text_area; -        break; -      case "box": // generic for checkbox or radio; checkbox set == "on" radio set == "name set" -        val = ((field_name in cgi.post && !(cgi.post[field_name]).empty) -          ? (cgi.post[field_name]  == set ? "checked" : "off") -          : (field_name in cgi.get) -            ? (cgi.get[field_name] == set ? "checked" : "off") -            :                               "off"); -        break; -      case "radio": // used generic bo -        val = ((field_name in cgi.post && !(cgi.post[field_name]).empty) -          ? (cgi.post[field_name]  == set ? "checked" : "off") -          : (field_name in cgi.get) -            ? (cgi.get[field_name] == set ? "checked" : "off") -            :                               "checked"); -        break; -      case "checkbox": // used generic bo -        val = ((field_name in cgi.post && !(cgi.post[field_name]).empty) -          ? (cgi.post[field_name]  == set ? "checked" : "off") -          : (field_name in cgi.get) -            ? (cgi.get[field_name] == set ? "checked" : "off") -            :                               "checked"); -        break; -      default: -      } -      return val; +</td> +<td> +  <label for="find"><b>SiSU spine (generated) search form</b></label> +</td></tr> +</table> +┃"); + } +{ +  string post_value(string field_name, string type="box", string set="on") { +    string val = ""; +    switch (type) { +    case "field": +      val = ((field_name in cgi.post && !(cgi.post[field_name]).empty) +        ? cgi.post[field_name] +        : (field_name in cgi.get) +          ? cgi.get[field_name] +          : ""); +      val = tf.search_text_area; +      break; +    case "box": // generic for checkbox or radio; checkbox set == "on" radio set == "name set" +      val = ((field_name in cgi.post && !(cgi.post[field_name]).empty) +        ? (cgi.post[field_name]  == set ? "checked" : "off") +        : (field_name in cgi.get) +          ? (cgi.get[field_name] == set ? "checked" : "off") +          :                               "off"); +      break; +    case "radio": // used generic bo +      val = ((field_name in cgi.post && !(cgi.post[field_name]).empty) +        ? (cgi.post[field_name]  == set ? "checked" : "off") +        : (field_name in cgi.get) +          ? (cgi.get[field_name] == set ? "checked" : "off") +          :                               "checked"); +      break; +    case "checkbox": // used generic bo +      val = ((field_name in cgi.post && !(cgi.post[field_name]).empty) +        ? (cgi.post[field_name]  == set ? "checked" : "off") +        : (field_name in cgi.get) +          ? (cgi.get[field_name] == set ? "checked" : "off") +          :                               "checked"); +      break; +    default:      } -    string the_can(string fv) { -      string show_the_can = post_value("url"); -      string _the_can = ""; -      if (show_the_can == "checked") { -        tf = text_fields; -        string method_get_url            = conf.http_request_type ~ "://" ~ conf.http_host ~ conf.cgi_script ~ "?" ~ environment.get("QUERY_STRING", ""); -        string method_post_url_construct = conf.http_request_type ~ "://" ~ conf.http_host ~ conf.cgi_script ~ "?" ~ tf.canned_query; -        // assert(method_get_url == environment.get("HTTP_REFERER", conf.http_request_type ~ "://" ~ conf.http_host ~ conf.cgi_script ~ "?" ~ conf.query_string)); -        if (conf.request_method == "POST") { -          _the_can = -            "<font size=\"2\" color=\"#666666\">" -            ~ "POST: " -            ~ "<a href=\"" -            ~ method_post_url_construct -            ~ "\">" -            ~ method_post_url_construct -            ~ "</a></font>" -            ~ "<br>"; -        } else if (conf.request_method == "GET") { -          _the_can = -            "<font size=\"2\" color=\"#666666\">" -            ~ "GET:  " -            ~ "<a href=\"" -            ~ method_get_url -            ~ "\">" -            ~ method_get_url -            ~ "</a></font>"; -        } -        conf.http_url = conf.http_request_type ~ "://" ~ conf.http_host ~ conf.cgi_script ~ tf.canned_query; -      } -      return _the_can; +    return val; +  } +string the_can(string fv) { +  string show_the_can = post_value("url"); +  string _the_can = ""; +  if (show_the_can == "checked") { +    tf = text_fields; +    string method_get_url            = conf.http_request_type ~ "://" ~ conf.http_host ~ conf.cgi_script ~ "?" ~ environment.get("QUERY_STRING", ""); +    string method_post_url_construct = conf.http_request_type ~ "://" ~ conf.http_host ~ conf.cgi_script ~ "?" ~ tf.canned_query; +    // assert(method_get_url == environment.get("HTTP_REFERER", conf.http_request_type ~ "://" ~ conf.http_host ~ conf.cgi_script ~ "?" ~ conf.query_string)); +    if (conf.request_method == "POST") { +      _the_can = +        "<font size=\"2\" color=\"#666666\">" +        ~ "POST: " +        ~ "<a href=\"" +        ~ method_post_url_construct +        ~ "\">" +        ~ method_post_url_construct +        ~ "</a></font>" +        ~ "<br>"; +    } else if (conf.request_method == "GET") { +      _the_can = +        "<font size=\"2\" color=\"#666666\">" +        ~ "GET:  " +        ~ "<a href=\"" +        ~ method_get_url +        ~ "\">" +        ~ method_get_url +        ~ "</a></font>";      } +    conf.http_url = conf.http_request_type ~ "://" ~ conf.http_host ~ conf.cgi_script ~ tf.canned_query; +  } +  return _the_can; +}      string provide_tip() {        string searched_tip = post_value("se");        string tip = ""; @@ -732,59 +732,59 @@ void cgi_function_intro(Cgi cgi) {    </table>  </form>  ┃", -      "spine-search", -      (post_value("ec") == "checked") ? post_value("sf", "field") : "", -      provide_tip, -      search_note, -      the_can(post_value("sf", "field")), -      cv.db_selected, -      cv.db_selected, -      post_value("rt",  "box", "idx"), -      post_value("rt",  "box", "txt"), -      post_value("sml", "box", "1000"), -      post_value("sml", "box", "2500"), -      post_value("ec"), -      post_value("sts"), -      post_value("url"), -      post_value("se"), -      post_value("tip"), -      post_value("sql"), -    ); -    { -      string set_value(string field_name, string default_val) { -        string val; -        if (field_name in cgi.post) { -          val = cgi.post[field_name]; -        } else if (field_name in cgi.get) { -          val = cgi.get[field_name]; -        } else { val = default_val; } -        return val; -      } -      bool set_bool(string field_name) { -        bool val; -        if (field_name in cgi.post -        && cgi.post[field_name] == "on") { -          val = true; -        } else if (field_name in cgi.get -        && cgi.get[field_name] == "on") { -          val = true; -        } else { val = false; } -        return val; -      } -      cv.db_selected      = set_value("selected_db",      "spine.search.db"); // selected_db == db -      cv.sql_match_limit  = set_value("sml", "1000"); -      cv.sql_match_offset = set_value("smo", "0"); -      cv.search_text      = set_value("sf",  "test");                         // remove test -      cv.results_type     = set_value("rt",  "idx"); -      cv.checked_echo     = set_bool("ec"); -      cv.checked_stats    = set_bool("sts"); -      cv.checked_url      = set_bool("url"); -      cv.checked_searched = set_bool("se"); -      cv.checked_tip      = set_bool("tip"); -      cv.checked_sql      = set_bool("sql"); -      tf = text_fields; +  "spine-search", +  (post_value("ec") == "checked") ? post_value("sf", "field") : "", +  provide_tip, +  search_note, +  the_can(post_value("sf", "field")), +  cv.db_selected, +  cv.db_selected, +  post_value("rt",  "box", "idx"), +  post_value("rt",  "box", "txt"), +  post_value("sml", "box", "1000"), +  post_value("sml", "box", "2500"), +  post_value("ec"), +  post_value("sts"), +  post_value("url"), +  post_value("se"), +  post_value("tip"), +  post_value("sql"), +); +  { +    string set_value(string field_name, string default_val) { +      string val; +      if (field_name in cgi.post) { +        val = cgi.post[field_name]; +      } else if (field_name in cgi.get) { +        val = cgi.get[field_name]; +      } else { val = default_val; } +      return val; +    } +    bool set_bool(string field_name) { +      bool val; +      if (field_name in cgi.post +      && cgi.post[field_name] == "on") { +        val = true; +      } else if (field_name in cgi.get +      && cgi.get[field_name] == "on") { +        val = true; +      } else { val = false; } +      return val;      } +    cv.db_selected      = set_value("selected_db",      "spine.search.db"); // selected_db == db +    cv.sql_match_limit  = set_value("sml", "1000"); +    cv.sql_match_offset = set_value("smo", "0"); +    cv.search_text      = set_value("sf",  "test");                         // remove test +    cv.results_type     = set_value("rt",  "idx"); +    cv.checked_echo     = set_bool("ec"); +    cv.checked_stats    = set_bool("sts"); +    cv.checked_url      = set_bool("url"); +    cv.checked_searched = set_bool("se"); +    cv.checked_tip      = set_bool("tip"); +    cv.checked_sql      = set_bool("sql"); +    tf = text_fields;    } +}    {      cgi.write(header);      cgi.write(table); @@ -888,68 +888,68 @@ LIMIT %s OFFSET %s          cv.sql_match_limit,          cv.sql_match_offset,        ); -      (cv.checked_sql) -      ? cgi.write(previous_next ~ "<hr><font size=\"2\" color=\"#666666\">" ~ sql_select.the_body.split("\n  ").join(" ").split("\n").join("<br>") ~ "</font>\n") -      : ""; -      cgi.write(previous_next); -      auto select_query_results = db.execute(sql_select.the_body).cached; -      string _old_uid = ""; -      if (!select_query_results.empty) { -        foreach (row; select_query_results) { -          if (row["uid"].as!string != _old_uid) { -            _old_uid = row["uid"].as!string; -            auto m = (row["date_published"].as!string).match(regex(r"^([0-9]{4})")); // breaks if row missing or no match? -            cgi.write( -              "<hr><a href=\"" -                ~ "https://" ~ conf.http_host ~ "/" -                ~ row["language_document_char"].as!string ~ "/html/" -                ~ row["src_filename_base"].as!string ~ "/" -                ~ "toc.html" -              ~ "\">\"" -                ~ row["title"].as!string ~ "\"" -              ~ "</a> (" -              ~ m.hit -              ~ ") " -              ~ "[" -              ~ row["language_document_char"].as!string -              ~ "] " -              ~ row["creator_author_last_first"].as!string -              ~ ":<br>\n" -            ); -          } -          if (cv.results_type == "txt") { -            cgi.write( -              "<hr><a href=\"" -                ~ "https://" ~ conf.http_host ~ "/" -                ~ row["language_document_char"].as!string ~ "/html/" -                ~ row["src_filename_base"].as!string ~ "/" -                ~ row["seg_name"].as!string ~ ".html#" ~ row["ocn"].as!string -              ~ "\">" -                ~ row["ocn"].as!string -              ~ "</a>" -              ~ "<br>" -              ~ row["body"].as!string -            ); -          } else { -            cgi.write( -              "<a href=\"" -                ~ "https://" ~ conf.http_host ~ "/" -                ~ row["language_document_char"].as!string ~ "/html/" -                ~ row["src_filename_base"].as!string ~ "/" -                ~ row["seg_name"].as!string ~ ".html#" ~ row["ocn"].as!string -              ~ "\">" -                ~ row["ocn"].as!string -              ~ "</a>, " -            ); -          } +    (cv.checked_sql) +    ? cgi.write(previous_next ~ "<hr><font size=\"2\" color=\"#666666\">" ~ sql_select.the_body.split("\n  ").join(" ").split("\n").join("<br>") ~ "</font>\n") +    : ""; +    cgi.write(previous_next); +    auto select_query_results = db.execute(sql_select.the_body).cached; +    string _old_uid = ""; +    if (!select_query_results.empty) { +      foreach (row; select_query_results) { +        if (row["uid"].as!string != _old_uid) { +          _old_uid = row["uid"].as!string; +          auto m = (row["date_published"].as!string).match(regex(r"^([0-9]{4})")); // breaks if row missing or no match? +          cgi.write( +            "<hr><a href=\"" +              ~ "https://" ~ conf.http_host ~ "/" +              ~ row["language_document_char"].as!string ~ "/html/" +              ~ row["src_filename_base"].as!string ~ "/" +              ~ "toc.html" +            ~ "\">\"" +              ~ row["title"].as!string ~ "\"" +            ~ "</a> (" +            ~ m.hit +            ~ ") " +            ~ "[" +            ~ row["language_document_char"].as!string +            ~ "] " +            ~ row["creator_author_last_first"].as!string +            ~ ":<br>\n" +          ); +        } +        if (cv.results_type == "txt") { +          cgi.write( +            "<hr><a href=\"" +              ~ "https://" ~ conf.http_host ~ "/" +              ~ row["language_document_char"].as!string ~ "/html/" +              ~ row["src_filename_base"].as!string ~ "/" +              ~ row["seg_name"].as!string ~ ".html#" ~ row["ocn"].as!string +            ~ "\">" +              ~ row["ocn"].as!string +            ~ "</a>" +            ~ "<br>" +            ~ row["body"].as!string +          ); +        } else { +          cgi.write( +            "<a href=\"" +              ~ "https://" ~ conf.http_host ~ "/" +              ~ row["language_document_char"].as!string ~ "/html/" +              ~ row["src_filename_base"].as!string ~ "/" +              ~ row["seg_name"].as!string ~ ".html#" ~ row["ocn"].as!string +            ~ "\">" +              ~ row["ocn"].as!string +            ~ "</a>, " +          );          } -        cgi.write( previous_next); -      } else { // offset_not_beyond_limit = false; -        cgi.write("select_query_results empty<p>\n");        } +      cgi.write( previous_next); +    } else { // offset_not_beyond_limit = false; +      cgi.write("select_query_results empty<p>\n");      } -    sql_search_query;    } +  sql_search_query; +}    {      db.close;    } | 
