PageSourceSearch

https://sustainabledevelopment-kyrgyzstan.github.io/assets/js/custom.js?v=20260414111621

js sustainabledevelopment-kyrgyzstan.github.io collected 2026-10-03 10:01:50 UTC 10,808 bytes, 187 lines download raw bytes

1opensdg.dataRounding = function (value) {
2  if (value == null) {
3    return value
4  } else {
5    return Number(value.toFixed(2))
6  }
7};
8
9var indicatorSearch = function () {
10  var urlParams = new URLSearchParams(window.location.search);
11  var searchTerms = urlParams.get('q');
12
13  if (searchTerms !== null) {
14    document.getElementById('search-bar-on-page').value = searchTerms;
15    document.getElementById('search-term').innerHTML = searchTerms;
16
17    var searchTermsToUse = searchTerms;
18    // This is to allow for searching by indicator with dashes.
19    if (searchTerms.split('-').length == 3 && searchTerms.length < 15) {
20      // Just a best-guess check to see if the user intended to search for an
21      // indicator ID.
22      searchTermsToUse = searchTerms.replace(/-/g, '.');
23    }
24
25    var useLunr = typeof window.lunr !== 'undefined';
26    if (useLunr && opensdg.language != 'en') {
27      if (typeof lunr[opensdg.language] === 'undefined') {
28        useLunr = false;
29      }
30    }
31
32    var results = [];
33    var alternativeSearchTerms = [];
34
35    if (useLunr) {
36      // Engish-specific tweak for words separated only by commas.
37      if (opensdg.language == 'en') {
38        lunr.tokenizer.separator = /[\s\-,]+/
39      }
40      if (opensdg.language != 'en' && lunr[opensdg.language]) {
41
42        var trimmerEnRu = function (token) {
43          return token.update(function (s) {
44            return s.replace(/^[^\wа-яёА-ЯЁ]+/, '')
45              .replace(/[^\wа-яёА-ЯЁ]+$/, '')
46          })
47        };
48
49        lunr.Pipeline.registerFunction(trimmerEnRu, 'trimmer-enru');
50
51        var stopWordFilter = lunr.generateStopWordFilter('алло без близко более больше будем будет будете будешь будто буду будут будь бы бывает бывь был была были было быть в важная важное важные важный вам вами вас ваш ваша ваше ваши вверх вдали вдруг ведь везде весь вниз внизу во вокруг вон восемнадцатый восемнадцать восемь восьмой вот впрочем времени время все всегда всего всем всеми всему всех всею всю всюду вся всё второй вы г где говорил говорит год года году да давно даже далеко дальше даром два двадцатый двадцать две двенадцатый двенадцать двух девятнадцатый девятнадцать девятый девять действительно дел день десятый десять для до довольно долго должно другая другие других друго другое другой е его ее ей ему если есть еще ещё ею её ж же жизнь за занят занята занято заняты затем зато зачем здесь значит и из или им именно иметь ими имя иногда их к каждая каждое каждые каждый кажется как какая какой кем когда кого ком кому конечно которая которого которой которые который которых кроме кругом кто куда лет ли лишь лучше люди м мало между меля менее меньше меня миллионов мимо мира мне много многочисленная многочисленное многочисленные многочисленный мной мною мог могут мож может можно можхо мои мой мор мочь моя моё мы на наверху над надо назад наиболее наконец нам нами нас начала наш наша наше наши не него недавно недалеко нее ней нельзя нем немного нему непрерывно нередко несколько нет нею неё ни нибудь ниже низко Ð
51½Ð¸ÐºÐ¾Ð³Ð´Ð° никуда ними них ничего но ну нужно нх о об оба обычно один одиннадцатый одиннадцать однажды однако одного одной около он она они оно опять особенно от отовсюду отсюда очень первый перед по под пожалуйста позже пока пор пора после посреди потом потому почему почти прекрасно при про просто против процентов пятнадцатый пятнадцать пятый пять раз разве рано раньше рядом с сам сама сами самим самими самих само самого самой самом самому саму свое своего своей свои своих свою сеаой себе себя сегодня седьмой сейчас семнадцатый семнадцать семь сих сказал сказала сказать сколько слишком сначала снова со собой собою совсем спасибо стал суть т та так такая также такие такое такой там твой твоя твоё те тебе тебя тем теми теперь тех то тобой тобою тогда того тоже только том тому тот тою третий три тринадцатый тринадцать ту туда тут ты тысяч у уж уже уметь хорошо хотеть хоть хотя хочешь часто чаще чего человек чем чему через четвертый четыре четырнадцатый четырнадцать что чтоб чтобы чуть шестнадцатый шестнадцать шестой шесть эта эти этим этими этих это этого этой этом этому этот эту я а'.split(' '));
52
53        lunr.Pipeline.registerFunction(stopWordFilter, 'stopWordFilter-ru');
54      }
55
56      var searchIndex = lunr(function () {
57        if (opensdg.language != 'en' && lunr[opensdg.language]) {
58          this.pipeline.reset();
59          this.pipeline.add(
60            trimmerEnRu,
61            lunr.stopWordFilter,
62            lunr.stemmer,
63            lunr.ru.stemmer)
64        }
65
66        this.ref('url');
67        // Index the expected fields.
68        this.field('title', getSearchFieldOptions('title'));
69        this.field('content', getSearchFieldOptions('content'));
70        this.field('id', getSearchFieldOptions('id'));
71        // Index any extra fields.
72        var i;
73        for (i = 0; i < opensdg.searchIndexExtraFields.length; i++) {
74          var extraField = opensdg.searchIndexExtraFields[i];
75          this.field(extraField, getSearchFieldOptions(extraField));
76        }
77        // Index all the documents.
78        for (var ref in opensdg.searchItems) {
79          this.add(opensdg.searchItems[ref]);
80        }
81
82      });
83      // Perform the search.
84      var results = searchIndex.search(searchTermsToUse);
85      // If we didn't find anything, get progressively "fuzzier" to look for
86      // alternative search term options.
87      if (!results.length > 0) {
88        for (var fuzziness = 1; fuzziness < 5; fuzziness++) {
89          var fuzzierQuery = getFuzzierQuery(searchTermsToUse, fuzziness);
90          var alternativeResults = searchIndex.search(fuzzierQuery);
91          if (alternativeResults.length > 0) {
92            var matchedTerms = getMatchedTerms(alternativeResults);
93            if (matchedTerms) {
94              alternativeSearchTerms = matchedTerms;
95            }
96            break;
97          }
98        }
99      }
100    } else {
101      // Non-Lunr basic search functionality.
102      results = _.filter(opensdg.searchItems, function (item) {
103        var i, match = false;
104        if (item.title) {
105          match = match || item.title.indexOf(searchTermsToUse) !== -1;
106        }
107        if (item.content) {
108          match = match || item.content.indexOf(searchTermsToUse) !== -1;
109        }
110        for (i = 0; i < opensdg.searchIndexExtraFields.length; i++) {
111          var extraField = opensdg.searchIndexExtraFields[i];
112          if (typeof item[extraField] !== 'undefined') {
113            match = match || item[extraField].indexOf(searchTermsToUse) !== -1;
114          }
115        }
116        return match;
117      });
118      // Mimic what Lunr does.
119      results = _.map(results, function (item) {
120        return {ref: item.url}
121      });
122    }
123
124    var resultItems = [];
125
126    results.forEach(function (result) {
127      var doc = opensdg.searchItems[result.ref]
128      // Truncate the contents.
129      if (doc.content.length > 400) {
130        doc.content = doc.content.substring(0, 400) + '...';
131      }
132      // Indicate the matches.
133      doc.content = doc.content.replace(new RegExp('(' + escapeRegExp(searchTerms) + ')', 'gi'), '<span class="match">$1</span>');
134      doc.title = doc.title.replace(new RegExp('(' + escapeRegExp(searchTerms) + ')', 'gi'), '<span class="match">$1</span>');
135      resultItems.push(doc);
136    });
137
138    $('.loader').hide();
139
140    // Print the results using a template.
141    var template = _.template(
142      $("script.results-template").html()
143    );
144    $('div.results').html(template({
145      searchResults: resultItems,
146      resultsCount: resultItems.length,
147      didYouMean: (alternativeSearchTerms.length > 0) ? alternativeSearchTerms : false,
148    }));
149  }
150
151  // Helper function to make a search query "fuzzier", using the ~ syntax.
152  // See https://lunrjs.com/guides/searching.html#fuzzy-matches.
153  function getFuzzierQuery(query, amountOfFuzziness) {
154    return query
155      .split(' ')
156      .map(function (x) {
157        return x + '~' + amountOfFuzziness;
158      })
159      .join(' ');
160  }
161
162  // Helper function to get the matched words from a result set.
163  function getMatchedTerms(results) {
164    var matchedTerms = {};
165    results.forEach(function (result) {
166      Object.keys(result.matchData.metadata).forEach(function (matchedTerm) {
167        matchedTerms[matchedTerm] = true;
168      })
169    });
170    return Object.keys(matchedTerms);
171  }
172
173  // Helper function to get a boost score, if any.
174  function getSearchFieldOptions(field) {
175    var opts = {}
176    if (opensdg.searchIndexBoost[field]) {
177      opts['boost'] = parseInt(opensdg.searchIndexBoost[field])
178    }
179    return opts
180  }
181
182  // Used to highlight search term matches on the screen.
183  function escapeRegExp(str) {
184    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/gi, "\\$&");
185  };
186};
187

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.