diff --git a/.gitignore b/.gitignore index e2501b8..4f3d6d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -# editor environment - -/.idea -/*.iml +_site +.sass-cache +.jekyll-metadata +vendor +.idea \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ce84e32..0000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go -sudo: required -before_install: - - export GOPATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace:$GOPATH" - - export PATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace/bin:$PATH" - - sudo env PATH=$PATH GOPATH=$GOPATH sh files/check-install.sh - -script: - - sh files/check.sh - -notifications: - email: false diff --git a/404.html b/404.html new file mode 100644 index 0000000..c472b4e --- /dev/null +++ b/404.html @@ -0,0 +1,24 @@ +--- +layout: default +--- + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index e3a1bf5..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,34 +0,0 @@ -Спасибо, что решили помочь проекту и внести свой вклад в его развитие. - -Нам очень поможет, если при создании Pull Request вы будете придерживаться следующих рекомендаций: - -# Какая информация приветствуется? - -- Информация, которая будет отвечать на вопросы, часто возникающие у большинства вновь приехавших или собирающихся -приехать в Германию. Хорошим примером может выступать страница о [детских пособиях](https://github.com/ewgRa/de_faq/blob/master/%D0%94%D0%B5%D1%82%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B8%D1%8F.md). Все мы так или иначе проходим через определенный круг задач, которые надо решить до приезда, по приезду и в дальнейшем: найти работу, оформить документы, найти квартиру, купить или перевезти машину, оформить BlueCard и т.д. и т.п. - -- Личный опыт, позволяющий сэкономить время и/или деньги в каких-то ситуациях, где достижение результата подвержено каким-то субъективным факторам или не имеет четко определенной процедуры. Хороший пример - получение NE, несмотря на то, что в требуемых документах указывается необходимость сертификата A1 после 33 месяцев, известны случаи получения NE и без него. - Другим хорошим примером можно считать оформление термина в Burgeramt, когда даже если ближайших терминов нет, это еще не означает, что они не появятся там через пять минут. - -# Какая информация не приветствуется? - -- Объемная дополнительная информация, которая уже широко представлена на других ресурсах, имеет смысл просто дать на нее ссылку и кратко описать, что там можно найти. - -- Что-то очевидное и само собой разумеющееся, информация, не отвечающая на какой-то конкретный вопрос. - - -# Как оформить? - -- Приветствуется литературный русский язык с соблюдением пунктуации, без использования сленга. Например, вместо "тачка" лучше написать "автомобиль". - -- Постарайтесь избегать эмоциональных окрасок. Вместо "очередь меня взбесила", лучше написать "в это время уже была большая очередь". - -- Личный опыт, представленный в виде повествования, приветствуется оформлять в виде [цитаты](https://github.com/ewgRa/de_faq/blob/master/Niederlassungserlaubnis.md#monkeyalice). Для цитирования поставьте "> " в начало строки. Текст будет выглядеть следующим образом: "> Документы почтой можно было не слать, ответ..." - - -# После создания Pull Request - -После создания Pull Request измененные файлы будут проверены роботом на содержание орфографических ошибок и недоступные ссылки, дождитесь пожалуйста -выполнения проверок, если какой-то check не прошел, посмотрите лог, возможно где-то допущена опечатка, использовано не словарное слово, либо ссылка на какую-то страницу недоступна. -В случае если слово, на которое ругается проверка является широко употребимым, можно внести его в словарь, для этого добавьте его в файл "files/dictionary.dic". -В случае если ссылка на самом деле доступна, но отдает нестандартный ответ, можно внести такой ответ как корректный в файл "files/known_url.csv" \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..c09aad2 --- /dev/null +++ b/Gemfile @@ -0,0 +1,27 @@ +source "https://rubygems.org" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "~> 3.6.2" + +# This is the default theme for new Jekyll sites. You may change this to anything you like. +#gem "minima", "~> 2.0" + +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +group :jekyll_plugins do +# gem "jekyll-feed", "~> 0.6" +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..9dfb93b --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,54 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + colorator (1.1.0) + ffi (1.9.18) + forwardable-extended (2.6.0) + jekyll (3.6.2) + addressable (~> 2.4) + colorator (~> 1.0) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.1) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 3) + safe_yaml (~> 1.0) + jekyll-sass-converter (1.5.1) + sass (~> 3.4) + jekyll-watch (1.5.1) + listen (~> 3.0) + kramdown (1.16.2) + liquid (4.0.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + mercenary (0.3.6) + pathutil (0.16.1) + forwardable-extended (~> 2.6) + public_suffix (3.0.1) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rouge (2.2.1) + ruby_dep (1.5.0) + safe_yaml (1.0.4) + sass (3.5.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + +PLATFORMS + ruby + +DEPENDENCIES + jekyll (~> 3.6.2) + tzinfo-data + +BUNDLED WITH + 1.16.1 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8ac8098..0000000 --- a/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright © 2015-2016 DE_FAQ Team - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..b4ebfdd --- /dev/null +++ b/_config.yml @@ -0,0 +1,12 @@ +include: ['pages'] + +# Build settings +markdown: kramdown +kramdown: + syntax_highlighter_opts: + disable : true + +plugins: +# - jekyll-feed + +baseurl: /faq diff --git a/_includes/search_form.html b/_includes/search_form.html new file mode 100644 index 0000000..744fc5a --- /dev/null +++ b/_includes/search_form.html @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..90e9d0c --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + +
+
+
+ {{ content | markdownify }} +
+
+
+ + + diff --git a/assets/lunr.de.js b/assets/lunr.de.js new file mode 100644 index 0000000..9e32b0c --- /dev/null +++ b/assets/lunr.de.js @@ -0,0 +1,384 @@ +/*! + * Lunr languages, `German` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.de = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.de.trimmer, + lunr.de.stopWordFilter, + lunr.de.stemmer + ); + + // for lunr version 2 + // this is necessary so that every searched word is also stemmed before + // in lunr <= 1 this is not needed, as it is done using the normal pipeline + if (this.searchPipeline) { + this.searchPipeline.reset(); + this.searchPipeline.add(lunr.de.stemmer) + } + }; + + /* lunr trimmer function */ + lunr.de.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.de.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.de.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.de.trimmer, 'trimmer-de'); + + /* lunr stemmer function */ + lunr.de.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function GermanStemmer() { + var a_0 = [new Among("", -1, 6), new Among("U", 0, 2), + new Among("Y", 0, 1), new Among("\u00E4", 0, 3), + new Among("\u00F6", 0, 4), new Among("\u00FC", 0, 5) + ], + a_1 = [ + new Among("e", -1, 2), new Among("em", -1, 1), + new Among("en", -1, 2), new Among("ern", -1, 1), + new Among("er", -1, 1), new Among("s", -1, 3), + new Among("es", 5, 2) + ], + a_2 = [new Among("en", -1, 1), + new Among("er", -1, 1), new Among("st", -1, 2), + new Among("est", 2, 1) + ], + a_3 = [new Among("ig", -1, 1), + new Among("lich", -1, 1) + ], + a_4 = [new Among("end", -1, 1), + new Among("ig", -1, 2), new Among("ung", -1, 1), + new Among("lich", -1, 3), new Among("isch", -1, 2), + new Among("ik", -1, 2), new Among("heit", -1, 3), + new Among("keit", -1, 4) + ], + g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 + ], + g_s_ending = [117, 30, 5], + g_st_ending = [ + 117, 30, 4 + ], + I_x, I_p2, I_p1, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr1(c1, c2, v_1) { + if (sbp.eq_s(1, c1)) { + sbp.ket = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 252)) { + sbp.slice_from(c2); + sbp.cursor = v_1; + return true; + } + } + return false; + } + + function r_prelude() { + var v_1 = sbp.cursor, + v_2, v_3, v_4, v_5; + while (true) { + v_2 = sbp.cursor; + sbp.bra = v_2; + if (sbp.eq_s(1, "\u00DF")) { + sbp.ket = sbp.cursor; + sbp.slice_from("ss"); + } else { + if (v_2 >= sbp.limit) + break; + sbp.cursor = v_2 + 1; + } + } + sbp.cursor = v_1; + while (true) { + v_3 = sbp.cursor; + while (true) { + v_4 = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 252)) { + v_5 = sbp.cursor; + sbp.bra = v_5; + if (habr1("u", "U", v_4)) + break; + sbp.cursor = v_5; + if (habr1("y", "Y", v_4)) + break; + } + if (v_4 >= sbp.limit) { + sbp.cursor = v_3; + return; + } + sbp.cursor = v_4 + 1; + } + } + } + + function habr2() { + while (!sbp.in_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + return false; + } + + function r_mark_regions() { + I_p1 = sbp.limit; + I_p2 = I_p1; + var c = sbp.cursor + 3; + if (0 <= c && c <= sbp.limit) { + I_x = c; + if (!habr2()) { + I_p1 = sbp.cursor; + if (I_p1 < I_x) + I_p1 = I_x; + if (!habr2()) + I_p2 = sbp.cursor; + } + } + } + + function r_postlude() { + var among_var, v_1; + while (true) { + v_1 = sbp.cursor; + sbp.bra = v_1; + among_var = sbp.find_among(a_0, 6); + if (!among_var) + return; + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("y"); + break; + case 2: + case 5: + sbp.slice_from("u"); + break; + case 3: + sbp.slice_from("a"); + break; + case 4: + sbp.slice_from("o"); + break; + case 6: + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + break; + } + } + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_standard_suffix() { + var among_var, v_1 = sbp.limit - sbp.cursor, + v_2, v_3, v_4; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_1, 7); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "s")) { + sbp.bra = sbp.cursor; + if (sbp.eq_s_b(3, "nis")) + sbp.slice_del(); + } + break; + case 3: + if (sbp.in_grouping_b(g_s_ending, 98, 116)) + sbp.slice_del(); + break; + } + } + } + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_2, 4); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + if (sbp.in_grouping_b(g_st_ending, 98, 116)) { + var c = sbp.cursor - 3; + if (sbp.limit_backward <= c && c <= sbp.limit) { + sbp.cursor = c; + sbp.slice_del(); + } + } + break; + } + } + } + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_4, 8); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2()) { + switch (among_var) { + case 1: + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "ig")) { + sbp.bra = sbp.cursor; + v_2 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "e")) { + sbp.cursor = sbp.limit - v_2; + if (r_R2()) + sbp.slice_del(); + } + } + break; + case 2: + v_3 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "e")) { + sbp.cursor = sbp.limit - v_3; + sbp.slice_del(); + } + break; + case 3: + sbp.slice_del(); + sbp.ket = sbp.cursor; + v_4 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(2, "er")) { + sbp.cursor = sbp.limit - v_4; + if (!sbp.eq_s_b(2, "en")) + break; + } + sbp.bra = sbp.cursor; + if (r_R1()) + sbp.slice_del(); + break; + case 4: + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_3, 2); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2() && among_var == 1) + sbp.slice_del(); + } + break; + } + } + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_prelude(); + sbp.cursor = v_1; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_standard_suffix(); + sbp.cursor = sbp.limit_backward; + r_postlude(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(token) { + // for lunr version 2 + if (typeof token.update === "function") { + return token.update(function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + }) + } else { // for lunr version <= 1 + st.setCurrent(token); + st.stem(); + return st.getCurrent(); + } + } + })(); + + lunr.Pipeline.registerFunction(lunr.de.stemmer, 'stemmer-de'); + + lunr.de.stopWordFilter = lunr.generateStopWordFilter('aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über'.split(' ')); + + lunr.Pipeline.registerFunction(lunr.de.stopWordFilter, 'stopWordFilter-de'); + }; +})) \ No newline at end of file diff --git a/assets/lunr.min.js b/assets/lunr.min.js new file mode 100644 index 0000000..edab8b5 --- /dev/null +++ b/assets/lunr.min.js @@ -0,0 +1 @@ +!function(){var e=function(t){var r=new e.Builder;return r.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),r.searchPipeline.add(e.stemmer),t.call(r,r),r.build()};e.version="2.1.5",e.utils={},e.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),e.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},e.FieldRef=function(e,t,r){this.docRef=e,this.fieldName=t,this._stringValue=r},e.FieldRef.joiner="/",e.FieldRef.fromString=function(t){var r=t.indexOf(e.FieldRef.joiner);if(-1===r)throw"malformed field ref string";var i=t.slice(0,r),n=t.slice(r+1);return new e.FieldRef(n,i,t)},e.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+e.FieldRef.joiner+this.docRef),this._stringValue},e.idf=function(e,t){var r=0;for(var i in e)"_index"!=i&&(r+=Object.keys(e[i]).length);var n=(t-r+.5)/(r+.5);return Math.log(1+Math.abs(n))},e.Token=function(e,t){this.str=e||"",this.metadata=t||{}},e.Token.prototype.toString=function(){return this.str},e.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},e.Token.prototype.clone=function(t){return t=t||function(e){return e},new e.Token(t(this.str,this.metadata),this.metadata)},e.tokenizer=function(t){if(null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(t){return new e.Token(e.utils.asString(t).toLowerCase())});for(var r=t.toString().trim().toLowerCase(),i=r.length,n=[],s=0,o=0;s<=i;s++){var a=s-o;(r.charAt(s).match(e.tokenizer.separator)||s==i)&&(a>0&&n.push(new e.Token(r.slice(o,s),{position:[o,a],index:n.length})),o=s+1)}return n},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){t.label&&t.label in this.registeredFunctions||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o;(u=s.str.charAt(0))in s.node.edges?o=s.node.edges[u]:(o=new e.TokenSet,s.node.edges[u]=o),1==s.str.length?o.final=!0:n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining>0&&s.str.length>1){var a,u=s.str.charAt(1);u in s.node.edges?a=s.node.edges[u]:(a=new e.TokenSet,s.node.edges[u]=a),s.str.length<=2?a.final=!0:n.push({node:a,editsRemaining:s.editsRemaining-1,str:s.str.slice(2)})}if(s.editsRemaining>0&&1==s.str.length&&(s.node.final=!0),s.editsRemaining>0&&s.str.length>=1){if("*"in s.node.edges)l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length?l.final=!0:n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.editsRemaining>0){if("*"in s.node.edges)d=s.node.edges["*"];else{var d=new e.TokenSet;s.node.edges["*"]=d}0==s.str.length?d.final=!0:n.push({node:d,editsRemaining:s.editsRemaining-1,str:s.str})}if(s.editsRemaining>0&&s.str.length>1){var h,c=s.str.charAt(0),f=s.str.charAt(1);f in s.node.edges?h=s.node.edges[f]:(h=new e.TokenSet,s.node.edges[f]=h),1==s.str.length?h.final=!0:n.push({node:h,editsRemaining:s.editsRemaining-1,str:c+s.str.slice(2)})}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=!1,s=0,o=t.length;s=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){new e.QueryParser(t,r).parse()})},e.Index.prototype.query=function(t){var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null);t.call(r,r);for(I=0;I1?1:e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t){var r=t[this._ref];this.documentCount+=1;for(var i=0;i=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do{r=(t=this.next()).charCodeAt(0)}while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseFieldOrTerm;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseFieldOrTerm=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(-1==t.query.allFields.indexOf(r.str)){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),-1!=r.str.indexOf("*")&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0!=i)switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}else t.nextClause()}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){s="edit distance must be numeric";throw new e.QueryParseError(s,r.start,r.end)}t.currentClause.editDistance=i;var n=t.peekLexeme();if(void 0!=n)switch(n.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;default:var s="Unexpected lexeme type '"+n.type+"'";throw new e.QueryParseError(s,n.start,n.end)}else t.nextClause()}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){s="boost must be numeric";throw new e.QueryParseError(s,r.start,r.end)}t.currentClause.boost=i;var n=t.peekLexeme();if(void 0!=n)switch(n.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;default:var s="Unexpected lexeme type '"+n.type+"'";throw new e.QueryParseError(s,n.start,n.end)}else t.nextClause()}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); \ No newline at end of file diff --git a/assets/lunr.multi.js b/assets/lunr.multi.js new file mode 100644 index 0000000..076792c --- /dev/null +++ b/assets/lunr.multi.js @@ -0,0 +1,75 @@ +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* Set up the pipeline for indexing content in multiple languages. The + corresponding lunr.{lang} files must be loaded before calling this + function; English ('en') is built in. + + Returns: a lunr plugin for use in your indexer. + + Known drawback: every word will be stemmed with stemmers for every + language. This could mean that sometimes words that have the same + stemming root will not be stemmed as such. + */ + lunr.multiLanguage = function(/* lang1, lang2, ... */) { + var languages = Array.prototype.slice.call(arguments); + var nameSuffix = languages.join('-'); + var wordCharacters = ""; + var pipeline = []; + var searchPipeline = []; + for (var i = 0; i < languages.length; ++i) { + if (languages[i] == 'en') { + wordCharacters += '\\w'; + pipeline.unshift(lunr.stopWordFilter); + pipeline.push(lunr.stemmer); + searchPipeline.push(lunr.stemmer); + } else { + wordCharacters += lunr[languages[i]].wordCharacters; + pipeline.unshift(lunr[languages[i]].stopWordFilter); + pipeline.push(lunr[languages[i]].stemmer); + searchPipeline.push(lunr[languages[i]].stemmer); + } + }; + var multiTrimmer = lunr.trimmerSupport.generateTrimmer(wordCharacters); + lunr.Pipeline.registerFunction(multiTrimmer, 'lunr-multi-trimmer-' + nameSuffix); + pipeline.unshift(multiTrimmer); + + return function() { + this.pipeline.reset(); + + this.pipeline.add.apply(this.pipeline, pipeline); + + // for lunr version 2 + // this is necessary so that every searched word is also stemmed before + // in lunr <= 1 this is not needed, as it is done using the normal pipeline + if (this.searchPipeline) { + this.searchPipeline.reset(); + this.searchPipeline.add.apply(this.searchPipeline, searchPipeline); + } + }; + } + } +})); diff --git a/assets/lunr.ru.js b/assets/lunr.ru.js new file mode 100644 index 0000000..3e79452 --- /dev/null +++ b/assets/lunr.ru.js @@ -0,0 +1,391 @@ +/*! + * Lunr languages, `Russian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.ru = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.ru.trimmer, + lunr.ru.stopWordFilter, + lunr.ru.stemmer + ); + + // for lunr version 2 + // this is necessary so that every searched word is also stemmed before + // in lunr <= 1 this is not needed, as it is done using the normal pipeline + if (this.searchPipeline) { + this.searchPipeline.reset(); + this.searchPipeline.add(lunr.ru.stemmer) + } + }; + + /* lunr trimmer function */ + lunr.ru.wordCharacters = "\u0400-\u0484\u0487-\u052F\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F"; + lunr.ru.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.ru.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.ru.trimmer, 'trimmer-ru'); + + /* lunr stemmer function */ + lunr.ru.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function RussianStemmer() { + var a_0 = [new Among("\u0432", -1, 1), new Among("\u0438\u0432", 0, 2), + new Among("\u044B\u0432", 0, 2), + new Among("\u0432\u0448\u0438", -1, 1), + new Among("\u0438\u0432\u0448\u0438", 3, 2), + new Among("\u044B\u0432\u0448\u0438", 3, 2), + new Among("\u0432\u0448\u0438\u0441\u044C", -1, 1), + new Among("\u0438\u0432\u0448\u0438\u0441\u044C", 6, 2), + new Among("\u044B\u0432\u0448\u0438\u0441\u044C", 6, 2) + ], + a_1 = [ + new Among("\u0435\u0435", -1, 1), new Among("\u0438\u0435", -1, 1), + new Among("\u043E\u0435", -1, 1), new Among("\u044B\u0435", -1, 1), + new Among("\u0438\u043C\u0438", -1, 1), + new Among("\u044B\u043C\u0438", -1, 1), + new Among("\u0435\u0439", -1, 1), new Among("\u0438\u0439", -1, 1), + new Among("\u043E\u0439", -1, 1), new Among("\u044B\u0439", -1, 1), + new Among("\u0435\u043C", -1, 1), new Among("\u0438\u043C", -1, 1), + new Among("\u043E\u043C", -1, 1), new Among("\u044B\u043C", -1, 1), + new Among("\u0435\u0433\u043E", -1, 1), + new Among("\u043E\u0433\u043E", -1, 1), + new Among("\u0435\u043C\u0443", -1, 1), + new Among("\u043E\u043C\u0443", -1, 1), + new Among("\u0438\u0445", -1, 1), new Among("\u044B\u0445", -1, 1), + new Among("\u0435\u044E", -1, 1), new Among("\u043E\u044E", -1, 1), + new Among("\u0443\u044E", -1, 1), new Among("\u044E\u044E", -1, 1), + new Among("\u0430\u044F", -1, 1), new Among("\u044F\u044F", -1, 1) + ], + a_2 = [ + new Among("\u0435\u043C", -1, 1), new Among("\u043D\u043D", -1, 1), + new Among("\u0432\u0448", -1, 1), + new Among("\u0438\u0432\u0448", 2, 2), + new Among("\u044B\u0432\u0448", 2, 2), new Among("\u0449", -1, 1), + new Among("\u044E\u0449", 5, 1), + new Among("\u0443\u044E\u0449", 6, 2) + ], + a_3 = [ + new Among("\u0441\u044C", -1, 1), new Among("\u0441\u044F", -1, 1) + ], + a_4 = [ + new Among("\u043B\u0430", -1, 1), + new Among("\u0438\u043B\u0430", 0, 2), + new Among("\u044B\u043B\u0430", 0, 2), + new Among("\u043D\u0430", -1, 1), + new Among("\u0435\u043D\u0430", 3, 2), + new Among("\u0435\u0442\u0435", -1, 1), + new Among("\u0438\u0442\u0435", -1, 2), + new Among("\u0439\u0442\u0435", -1, 1), + new Among("\u0435\u0439\u0442\u0435", 7, 2), + new Among("\u0443\u0439\u0442\u0435", 7, 2), + new Among("\u043B\u0438", -1, 1), + new Among("\u0438\u043B\u0438", 10, 2), + new Among("\u044B\u043B\u0438", 10, 2), new Among("\u0439", -1, 1), + new Among("\u0435\u0439", 13, 2), new Among("\u0443\u0439", 13, 2), + new Among("\u043B", -1, 1), new Among("\u0438\u043B", 16, 2), + new Among("\u044B\u043B", 16, 2), new Among("\u0435\u043C", -1, 1), + new Among("\u0438\u043C", -1, 2), new Among("\u044B\u043C", -1, 2), + new Among("\u043D", -1, 1), new Among("\u0435\u043D", 22, 2), + new Among("\u043B\u043E", -1, 1), + new Among("\u0438\u043B\u043E", 24, 2), + new Among("\u044B\u043B\u043E", 24, 2), + new Among("\u043D\u043E", -1, 1), + new Among("\u0435\u043D\u043E", 27, 2), + new Among("\u043D\u043D\u043E", 27, 1), + new Among("\u0435\u0442", -1, 1), + new Among("\u0443\u0435\u0442", 30, 2), + new Among("\u0438\u0442", -1, 2), new Among("\u044B\u0442", -1, 2), + new Among("\u044E\u0442", -1, 1), + new Among("\u0443\u044E\u0442", 34, 2), + new Among("\u044F\u0442", -1, 2), new Among("\u043D\u044B", -1, 1), + new Among("\u0435\u043D\u044B", 37, 2), + new Among("\u0442\u044C", -1, 1), + new Among("\u0438\u0442\u044C", 39, 2), + new Among("\u044B\u0442\u044C", 39, 2), + new Among("\u0435\u0448\u044C", -1, 1), + new Among("\u0438\u0448\u044C", -1, 2), new Among("\u044E", -1, 2), + new Among("\u0443\u044E", 44, 2) + ], + a_5 = [ + new Among("\u0430", -1, 1), new Among("\u0435\u0432", -1, 1), + new Among("\u043E\u0432", -1, 1), new Among("\u0435", -1, 1), + new Among("\u0438\u0435", 3, 1), new Among("\u044C\u0435", 3, 1), + new Among("\u0438", -1, 1), new Among("\u0435\u0438", 6, 1), + new Among("\u0438\u0438", 6, 1), + new Among("\u0430\u043C\u0438", 6, 1), + new Among("\u044F\u043C\u0438", 6, 1), + new Among("\u0438\u044F\u043C\u0438", 10, 1), + new Among("\u0439", -1, 1), new Among("\u0435\u0439", 12, 1), + new Among("\u0438\u0435\u0439", 13, 1), + new Among("\u0438\u0439", 12, 1), new Among("\u043E\u0439", 12, 1), + new Among("\u0430\u043C", -1, 1), new Among("\u0435\u043C", -1, 1), + new Among("\u0438\u0435\u043C", 18, 1), + new Among("\u043E\u043C", -1, 1), new Among("\u044F\u043C", -1, 1), + new Among("\u0438\u044F\u043C", 21, 1), new Among("\u043E", -1, 1), + new Among("\u0443", -1, 1), new Among("\u0430\u0445", -1, 1), + new Among("\u044F\u0445", -1, 1), + new Among("\u0438\u044F\u0445", 26, 1), new Among("\u044B", -1, 1), + new Among("\u044C", -1, 1), new Among("\u044E", -1, 1), + new Among("\u0438\u044E", 30, 1), new Among("\u044C\u044E", 30, 1), + new Among("\u044F", -1, 1), new Among("\u0438\u044F", 33, 1), + new Among("\u044C\u044F", 33, 1) + ], + a_6 = [ + new Among("\u043E\u0441\u0442", -1, 1), + new Among("\u043E\u0441\u0442\u044C", -1, 1) + ], + a_7 = [ + new Among("\u0435\u0439\u0448\u0435", -1, 1), + new Among("\u043D", -1, 2), new Among("\u0435\u0439\u0448", -1, 1), + new Among("\u044C", -1, 3) + ], + g_v = [33, 65, 8, 232], + I_p2, I_pV, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr3() { + while (!sbp.in_grouping(g_v, 1072, 1103)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function habr4() { + while (!sbp.out_grouping(g_v, 1072, 1103)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function r_mark_regions() { + I_pV = sbp.limit; + I_p2 = I_pV; + if (habr3()) { + I_pV = sbp.cursor; + if (habr4()) + if (habr3()) + if (habr4()) + I_p2 = sbp.cursor; + } + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function habr2(a, n) { + var among_var, v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a, n); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + v_1 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "\u0430")) { + sbp.cursor = sbp.limit - v_1; + if (!sbp.eq_s_b(1, "\u044F")) + return false; + } + case 2: + sbp.slice_del(); + break; + } + return true; + } + return false; + } + + function r_perfective_gerund() { + return habr2(a_0, 9); + } + + function habr1(a, n) { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a, n); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + sbp.slice_del(); + return true; + } + return false; + } + + function r_adjective() { + return habr1(a_1, 26); + } + + function r_adjectival() { + var among_var; + if (r_adjective()) { + habr2(a_2, 8); + return true; + } + return false; + } + + function r_reflexive() { + return habr1(a_3, 2); + } + + function r_verb() { + return habr2(a_4, 46); + } + + function r_noun() { + habr1(a_5, 36); + } + + function r_derivational() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 2); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2() && among_var == 1) + sbp.slice_del(); + } + } + + function r_tidy_up() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 4); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (!sbp.eq_s_b(1, "\u043D")) + break; + sbp.bra = sbp.cursor; + case 2: + if (!sbp.eq_s_b(1, "\u043D")) + break; + case 3: + sbp.slice_del(); + break; + } + } + } + this.stem = function() { + r_mark_regions(); + sbp.cursor = sbp.limit; + if (sbp.cursor < I_pV) + return false; + sbp.limit_backward = I_pV; + if (!r_perfective_gerund()) { + sbp.cursor = sbp.limit; + if (!r_reflexive()) + sbp.cursor = sbp.limit; + if (!r_adjectival()) { + sbp.cursor = sbp.limit; + if (!r_verb()) { + sbp.cursor = sbp.limit; + r_noun(); + } + } + } + sbp.cursor = sbp.limit; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "\u0438")) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + } else + sbp.cursor = sbp.limit; + r_derivational(); + sbp.cursor = sbp.limit; + r_tidy_up(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(token) { + // for lunr version 2 + if (typeof token.update === "function") { + return token.update(function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + }) + } else { // for lunr version <= 1 + st.setCurrent(token); + st.stem(); + return st.getCurrent(); + } + } + })(); + + lunr.Pipeline.registerFunction(lunr.ru.stemmer, 'stemmer-ru'); + + lunr.ru.stopWordFilter = lunr.generateStopWordFilter('алло без близко более больше будем будет будете будешь будто буду будут будь бы бывает бывь был была были было быть в важная важное важные важный вам вами вас ваш ваша ваше ваши вверх вдали вдруг ведь везде весь вниз внизу во вокруг вон восемнадцатый восемнадцать восемь восьмой вот впрочем времени время все всегда всего всем всеми всему всех всею всю всюду вся всё второй вы г где говорил говорит год года году да давно даже далеко дальше даром два двадцатый двадцать две двенадцатый двенадцать двух девятнадцатый девятнадцать девятый девять действительно дел день десятый десять для до довольно долго должно другая другие других друго другое другой е его ее ей ему если есть еще ещё ею её ж же жизнь за занят занята занято заняты затем зато зачем здесь значит и из или им именно иметь ими имя иногда их к каждая каждое каждые каждый кажется как какая какой кем когда кого ком кому конечно которая которого которой которые который которых кроме кругом кто куда лет ли лишь лучше люди м мало между меля менее меньше меня миллионов мимо мира мне много многочисленная многочисленное многочисленные многочисленный мной мною мог могут мож может можно можхо мои мой мор мочь моя моё мы на наверху над надо назад наиболее наконец нам нами нас начала наш наша наше наши не него недавно недалеко нее ней нельзя нем немного нему непрерывно нередко несколько нет нею неё ни нибудь ниже низко никогда никуда ними них ничего но ну нужно нх о об оба обычно один одиннадцатый одиннадцать однажды однако одного одной около он она они оно опять особенно от отовсюду отсюда очень первый перед по под пожалуйста позже пока пор пора после посреди потом потому почему почти прекрасно при про просто против процентов пятнадцатый пятнадцать пятый пять раз разве рано раньше рядом с сам сама сами самим самими самих само самого самой самом самому саму свое своего своей свои своих свою сеаой себе себя сегодня седьмой сейчас семнадцатый семнадцать семь сих сказал сказала сказать сколько слишком сначала снова со собой собою совсем спасибо стал суть т та так такая также такие такое такой там твой твоя твоё те тебе тебя тем теми теперь тех то тобой тобою тогда того тоже только том тому тот тою третий три тринадцатый тринадцать ту туда тут ты тысяч у уж уже уметь хорошо хотеть хоть хотя хочешь часто чаще чего человек чем чему через четвертый четыре четырнадцатый четырнадцать что чтоб чтобы чуть шестнадцатый шестнадцать шестой шесть эта эти этим этими этих это этого этой этом этому этот эту я а'.split(' ')); + + lunr.Pipeline.registerFunction(lunr.ru.stopWordFilter, 'stopWordFilter-ru'); + }; +})) \ No newline at end of file diff --git a/assets/lunr.stemmer.support.js b/assets/lunr.stemmer.support.js new file mode 100644 index 0000000..896476a --- /dev/null +++ b/assets/lunr.stemmer.support.js @@ -0,0 +1,304 @@ +/*! + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* provides utilities for the included stemmers */ + lunr.stemmerSupport = { + Among: function(s, substring_i, result, method) { + this.toCharArray = function(s) { + var sLength = s.length, charArr = new Array(sLength); + for (var i = 0; i < sLength; i++) + charArr[i] = s.charCodeAt(i); + return charArr; + }; + + if ((!s && s != "") || (!substring_i && (substring_i != 0)) || !result) + throw ("Bad Among initialisation: s:" + s + ", substring_i: " + + substring_i + ", result: " + result); + this.s_size = s.length; + this.s = this.toCharArray(s); + this.substring_i = substring_i; + this.result = result; + this.method = method; + }, + SnowballProgram: function() { + var current; + return { + bra : 0, + ket : 0, + limit : 0, + cursor : 0, + limit_backward : 0, + setCurrent : function(word) { + current = word; + this.cursor = 0; + this.limit = word.length; + this.limit_backward = 0; + this.bra = this.cursor; + this.ket = this.limit; + }, + getCurrent : function() { + var result = current; + current = null; + return result; + }, + in_grouping : function(s, min, max) { + if (this.cursor < this.limit) { + var ch = current.charCodeAt(this.cursor); + if (ch <= max && ch >= min) { + ch -= min; + if (s[ch >> 3] & (0X1 << (ch & 0X7))) { + this.cursor++; + return true; + } + } + } + return false; + }, + in_grouping_b : function(s, min, max) { + if (this.cursor > this.limit_backward) { + var ch = current.charCodeAt(this.cursor - 1); + if (ch <= max && ch >= min) { + ch -= min; + if (s[ch >> 3] & (0X1 << (ch & 0X7))) { + this.cursor--; + return true; + } + } + } + return false; + }, + out_grouping : function(s, min, max) { + if (this.cursor < this.limit) { + var ch = current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + this.cursor++; + return true; + } + ch -= min; + if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) { + this.cursor++; + return true; + } + } + return false; + }, + out_grouping_b : function(s, min, max) { + if (this.cursor > this.limit_backward) { + var ch = current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + this.cursor--; + return true; + } + ch -= min; + if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) { + this.cursor--; + return true; + } + } + return false; + }, + eq_s : function(s_size, s) { + if (this.limit - this.cursor < s_size) + return false; + for (var i = 0; i < s_size; i++) + if (current.charCodeAt(this.cursor + i) != s.charCodeAt(i)) + return false; + this.cursor += s_size; + return true; + }, + eq_s_b : function(s_size, s) { + if (this.cursor - this.limit_backward < s_size) + return false; + for (var i = 0; i < s_size; i++) + if (current.charCodeAt(this.cursor - s_size + i) != s + .charCodeAt(i)) + return false; + this.cursor -= s_size; + return true; + }, + find_among : function(v, v_size) { + var i = 0, j = v_size, c = this.cursor, l = this.limit, common_i = 0, common_j = 0, first_key_inspected = false; + while (true) { + var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j + ? common_i + : common_j, w = v[k]; + for (var i2 = common; i2 < w.s_size; i2++) { + if (c + common == l) { + diff = -1; + break; + } + diff = current.charCodeAt(c + common) - w.s[i2]; + if (diff) + break; + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0 || j == i || first_key_inspected) + break; + first_key_inspected = true; + } + } + while (true) { + var w = v[i]; + if (common_i >= w.s_size) { + this.cursor = c + w.s_size; + if (!w.method) + return w.result; + var res = w.method(); + this.cursor = c + w.s_size; + if (res) + return w.result; + } + i = w.substring_i; + if (i < 0) + return 0; + } + }, + find_among_b : function(v, v_size) { + var i = 0, j = v_size, c = this.cursor, lb = this.limit_backward, common_i = 0, common_j = 0, first_key_inspected = false; + while (true) { + var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j + ? common_i + : common_j, w = v[k]; + for (var i2 = w.s_size - 1 - common; i2 >= 0; i2--) { + if (c - common == lb) { + diff = -1; + break; + } + diff = current.charCodeAt(c - 1 - common) - w.s[i2]; + if (diff) + break; + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0 || j == i || first_key_inspected) + break; + first_key_inspected = true; + } + } + while (true) { + var w = v[i]; + if (common_i >= w.s_size) { + this.cursor = c - w.s_size; + if (!w.method) + return w.result; + var res = w.method(); + this.cursor = c - w.s_size; + if (res) + return w.result; + } + i = w.substring_i; + if (i < 0) + return 0; + } + }, + replace_s : function(c_bra, c_ket, s) { + var adjustment = s.length - (c_ket - c_bra), left = current + .substring(0, c_bra), right = current.substring(c_ket); + current = left + s + right; + this.limit += adjustment; + if (this.cursor >= c_ket) + this.cursor += adjustment; + else if (this.cursor > c_bra) + this.cursor = c_bra; + return adjustment; + }, + slice_check : function() { + if (this.bra < 0 || this.bra > this.ket || this.ket > this.limit + || this.limit > current.length) + throw ("faulty slice operation"); + }, + slice_from : function(s) { + this.slice_check(); + this.replace_s(this.bra, this.ket, s); + }, + slice_del : function() { + this.slice_from(""); + }, + insert : function(c_bra, c_ket, s) { + var adjustment = this.replace_s(c_bra, c_ket, s); + if (c_bra <= this.bra) + this.bra += adjustment; + if (c_bra <= this.ket) + this.ket += adjustment; + }, + slice_to : function() { + this.slice_check(); + return current.substring(this.bra, this.ket); + }, + eq_v_b : function(s) { + return this.eq_s_b(s.length, s); + } + }; + } + }; + + lunr.trimmerSupport = { + generateTrimmer: function(wordCharacters) { + var startRegex = new RegExp("^[^" + wordCharacters + "]+") + var endRegex = new RegExp("[^" + wordCharacters + "]+$") + + return function(token) { + // for lunr version 2 + if (typeof token.update === "function") { + return token.update(function (s) { + return s + .replace(startRegex, '') + .replace(endRegex, ''); + }) + } else { // for lunr version 1 + return token + .replace(startRegex, '') + .replace(endRegex, ''); + } + }; + } + } + } +})); diff --git a/assets/require.js b/assets/require.js new file mode 100644 index 0000000..a3ca583 --- /dev/null +++ b/assets/require.js @@ -0,0 +1,5 @@ +/** vim: et:ts=4:sw=4:sts=4 + * @license RequireJS 2.3.5 Copyright jQuery Foundation and other contributors. + * Released under MIT license, https://github.com/requirejs/requirejs/blob/master/LICENSE + */ +var requirejs,require,define;!function(global,setTimeout){function commentReplace(e,t){return t||""}function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){if(e){var i;for(i=0;i-1&&(!e[i]||!t(e[i],i,e));i-=1);}}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(e,t,i,r){return t&&eachProp(t,function(t,n){!i&&hasProp(e,n)||(!r||"object"!=typeof t||!t||isArray(t)||isFunction(t)||t instanceof RegExp?e[n]=t:(e[n]||(e[n]={}),mixin(e[n],t,i,r)))}),e}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName("script")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e.split("."),function(e){t=t[e]}),t}function makeError(e,t,i,r){var n=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);return n.requireType=e,n.requireModules=r,i&&(n.originalError=i),n}function newContext(e){function t(e){var t,i;for(t=0;t0&&(e.splice(t-1,2),t-=2)}}function i(e,i,r){var n,o,a,s,u,c,d,p,f,l,h=i&&i.split("/"),m=y.map,g=m&&m["*"];if(e&&(c=(e=e.split("/")).length-1,y.nodeIdCompat&&jsSuffixRegExp.test(e[c])&&(e[c]=e[c].replace(jsSuffixRegExp,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),t(e),e=e.join("/")),r&&m&&(h||g)){e:for(a=(o=e.split("/")).length;a>0;a-=1){if(u=o.slice(0,a).join("/"),h)for(s=h.length;s>0;s-=1)if((n=getOwn(m,h.slice(0,s).join("/")))&&(n=getOwn(n,u))){d=n,p=a;break e}!f&&g&&getOwn(g,u)&&(f=getOwn(g,u),l=a)}!d&&f&&(d=f,p=l),d&&(o.splice(0,p,d),e=o.join("/"))}return getOwn(y.pkgs,e)||e}function r(e){isBrowser&&each(scripts(),function(t){if(t.getAttribute("data-requiremodule")===e&&t.getAttribute("data-requirecontext")===q.contextName)return t.parentNode.removeChild(t),!0})}function n(e){var t=getOwn(y.paths,e);if(t&&isArray(t)&&t.length>1)return t.shift(),q.require.undef(e),q.makeRequire(null,{skipMap:!0})([e]),!0}function o(e){var t,i=e?e.indexOf("!"):-1;return i>-1&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function a(e,t,r,n){var a,s,u,c,d=null,p=t?t.name:null,f=e,l=!0,h="";return e||(l=!1,e="_@r"+(T+=1)),c=o(e),d=c[0],e=c[1],d&&(d=i(d,p,n),s=getOwn(j,d)),e&&(d?h=r?e:s&&s.normalize?s.normalize(e,function(e){return i(e,p,n)}):-1===e.indexOf("!")?i(e,p,n):e:(d=(c=o(h=i(e,p,n)))[0],h=c[1],r=!0,a=q.nameToUrl(h))),u=!d||s||r?"":"_unnormalized"+(A+=1),{prefix:d,name:h,parentMap:t,unnormalized:!!u,url:a,originalName:f,isDefine:l,id:(d?d+"!"+h:h)+u}}function s(e){var t=e.id,i=getOwn(S,t);return i||(i=S[t]=new q.Module(e)),i}function u(e,t,i){var r=e.id,n=getOwn(S,r);!hasProp(j,r)||n&&!n.defineEmitComplete?(n=s(e)).error&&"error"===t?i(n.error):n.on(t,i):"defined"===t&&i(j[r])}function c(e,t){var i=e.requireModules,r=!1;t?t(e):(each(i,function(t){var i=getOwn(S,t);i&&(i.error=e,i.events.error&&(r=!0,i.emit("error",e)))}),r||req.onError(e))}function d(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];"string"==typeof t&&(q.defQueueMap[t]=!0),O.push(e)}),globalDefQueue=[])}function p(e){delete S[e],delete k[e]}function f(e,t,i){var r=e.map.id;e.error?e.emit("error",e.error):(t[r]=!0,each(e.depMaps,function(r,n){var o=r.id,a=getOwn(S,o);!a||e.depMatched[n]||i[o]||(getOwn(t,o)?(e.defineDep(n,j[o]),e.check()):f(a,t,i))}),i[r]=!0)}function l(){var e,t,i=1e3*y.waitSeconds,o=i&&q.startTime+i<(new Date).getTime(),a=[],s=[],u=!1,d=!0;if(!x){if(x=!0,eachProp(k,function(e){var i=e.map,c=i.id;if(e.enabled&&(i.isDefine||s.push(e),!e.error))if(!e.inited&&o)n(c)?(t=!0,u=!0):(a.push(c),r(c));else if(!e.inited&&e.fetched&&i.isDefine&&(u=!0,!i.prefix))return d=!1}),o&&a.length)return e=makeError("timeout","Load timeout for modules: "+a,null,a),e.contextName=q.contextName,c(e);d&&each(s,function(e){f(e,{},{})}),o&&!t||!u||!isBrowser&&!isWebWorker||w||(w=setTimeout(function(){w=0,l()},50)),x=!1}}function h(e){hasProp(j,e[0])||s(a(e[0],null,!0)).init(e[1],e[2])}function m(e,t,i,r){e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(i,t,!1)}function g(e){var t=e.currentTarget||e.srcElement;return m(t,q.onScriptLoad,"load","onreadystatechange"),m(t,q.onScriptError,"error"),{node:t,id:t&&t.getAttribute("data-requiremodule")}}function v(){var e;for(d();O.length;){if(null===(e=O.shift())[0])return c(makeError("mismatch","Mismatched anonymous define() module: "+e[e.length-1]));h(e)}q.defQueueMap={}}var x,b,q,E,w,y={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},S={},k={},M={},O=[],j={},P={},R={},T=1,A=1;return E={require:function(e){return e.require?e.require:e.require=q.makeRequire(e.map)},exports:function(e){if(e.usingExports=!0,e.map.isDefine)return e.exports?j[e.map.id]=e.exports:e.exports=j[e.map.id]={}},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(y.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},b=function(e){this.events=getOwn(M,e.id)||{},this.map=e,this.shim=getOwn(y.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0},b.prototype={init:function(e,t,i,r){r=r||{},this.inited||(this.factory=t,i?this.on("error",i):this.events.error&&(i=bind(this,function(e){this.emit("error",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,q.startTime=(new Date).getTime();var e=this.map;if(!this.shim)return e.prefix?this.callPlugin():this.load();q.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()}))}},load:function(){var e=this.map.url;P[e]||(P[e]=!0,q.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var e,t,i=this.map.id,r=this.depExports,n=this.exports,o=this.factory;if(this.inited){if(this.error)this.emit("error",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(o)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{n=q.execCb(i,o,r,n)}catch(t){e=t}else n=q.execCb(i,o,r,n);if(this.map.isDefine&&void 0===n&&((t=this.module)?n=t.exports:this.usingExports&&(n=this.exports)),e)return e.requireMap=this.map,e.requireModules=this.map.isDefine?[this.map.id]:null,e.requireType=this.map.isDefine?"define":"require",c(this.error=e)}else n=o;if(this.exports=n,this.map.isDefine&&!this.ignore&&(j[i]=n,req.onResourceLoad)){var a=[];each(this.depMaps,function(e){a.push(e.normalizedMap||e)}),req.onResourceLoad(q,this.map,a)}p(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else hasProp(q.defQueueMap,i)||this.fetch()}},callPlugin:function(){var e=this.map,t=e.id,r=a(e.prefix);this.depMaps.push(r),u(r,"defined",bind(this,function(r){var n,o,d,f=getOwn(R,this.map.id),l=this.map.name,h=this.map.parentMap?this.map.parentMap.name:null,m=q.makeRequire(e.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(r.normalize&&(l=r.normalize(l,function(e){return i(e,h,!0)})||""),o=a(e.prefix+"!"+l,this.map.parentMap,!0),u(o,"defined",bind(this,function(e){this.map.normalizedMap=o,this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),void((d=getOwn(S,o.id))&&(this.depMaps.push(o),this.events.error&&d.on("error",bind(this,function(e){this.emit("error",e)})),d.enable()))):f?(this.map.url=q.nameToUrl(f),void this.load()):((n=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})})).error=bind(this,function(e){this.inited=!0,this.error=e,e.requireModules=[t],eachProp(S,function(e){0===e.map.id.indexOf(t+"_unnormalized")&&p(e.map.id)}),c(e)}),n.fromText=bind(this,function(i,r){var o=e.name,u=a(o),d=useInteractive;r&&(i=r),d&&(useInteractive=!1),s(u),hasProp(y.config,t)&&(y.config[o]=y.config[t]);try{req.exec(i)}catch(e){return c(makeError("fromtexteval","fromText eval for "+t+" failed: "+e,e,[t]))}d&&(useInteractive=!0),this.depMaps.push(u),q.completeLoad(o),m([o],n)}),void r.load(e.name,m,n,y))})),q.enable(r,this),this.pluginMaps[r.id]=r},enable:function(){k[this.map.id]=this,this.enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,r,n;if("string"==typeof e){if(e=a(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,n=getOwn(E,e.id))return void(this.depExports[t]=n(this));this.depCount+=1,u(e,"defined",bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?u(e,"error",bind(this,this.errback)):this.events.error&&u(e,"error",bind(this,function(e){this.emit("error",e)}))}i=e.id,r=S[i],hasProp(E,i)||!r||r.enabled||q.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(S,e.id);t&&!t.enabled&&q.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){var i=this.events[e];i||(i=this.events[e]=[]),i.push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),"error"===e&&delete this.events[e]}},q={config:y,contextName:e,registry:S,defined:j,urlFetched:P,defQueue:O,defQueueMap:{},Module:b,makeModuleMap:a,nextTick:req.nextTick,onError:c,configure:function(e){if(e.baseUrl&&"/"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+="/"),"string"==typeof e.urlArgs){var t=e.urlArgs;e.urlArgs=function(e,i){return(-1===i.indexOf("?")?"?":"&")+t}}var i=y.shim,r={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){r[t]?(y[t]||(y[t]={}),mixin(y[t],e,!0,!0)):y[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(R[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=q.makeShimExports(e)),i[t]=e}),y.shim=i),e.packages&&each(e.packages,function(e){var t;t=(e="string"==typeof e?{name:e}:e).name,e.location&&(y.paths[t]=e.location),y.pkgs[t]=e.name+"/"+(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}),eachProp(S,function(e,t){e.inited||e.map.unnormalized||(e.map=a(t,null,!0))}),(e.deps||e.callback)&&q.require(e.deps||[],e.callback)},makeShimExports:function(e){return function(){var t;return e.init&&(t=e.init.apply(global,arguments)),t||e.exports&&getGlobal(e.exports)}},makeRequire:function(t,n){function o(i,r,u){var d,p,f;return n.enableBuildCallback&&r&&isFunction(r)&&(r.__requireJsBuild=!0),"string"==typeof i?isFunction(r)?c(makeError("requireargs","Invalid require call"),u):t&&hasProp(E,i)?E[i](S[t.id]):req.get?req.get(q,i,t,o):(p=a(i,t,!1,!0),d=p.id,hasProp(j,d)?j[d]:c(makeError("notloaded",'Module name "'+d+'" has not been loaded yet for context: '+e+(t?"":". Use require([])")))):(v(),q.nextTick(function(){v(),(f=s(a(null,t))).skipMap=n.skipMap,f.init(i,r,u,{enabled:!0}),l()}),o)}return n=n||{},mixin(o,{isBrowser:isBrowser,toUrl:function(e){var r,n=e.lastIndexOf("."),o=e.split("/")[0],a="."===o||".."===o;return-1!==n&&(!a||n>1)&&(r=e.substring(n,e.length),e=e.substring(0,n)),q.nameToUrl(i(e,t&&t.id,!0),r,!0)},defined:function(e){return hasProp(j,a(e,t,!1,!0).id)},specified:function(e){return e=a(e,t,!1,!0).id,hasProp(j,e)||hasProp(S,e)}}),t||(o.undef=function(e){d();var i=a(e,t,!0),n=getOwn(S,e);n.undefed=!0,r(e),delete j[e],delete P[i.url],delete M[e],eachReverse(O,function(t,i){t[0]===e&&O.splice(i,1)}),delete q.defQueueMap[e],n&&(n.events.defined&&(M[e]=n.events),p(e))}),o},enable:function(e){getOwn(S,e.id)&&s(e).enable()},completeLoad:function(e){var t,i,r,o=getOwn(y.shim,e)||{},a=o.exports;for(d();O.length;){if(null===(i=O.shift())[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);h(i)}if(q.defQueueMap={},r=getOwn(S,e),!t&&!hasProp(j,e)&&r&&!r.inited){if(!(!y.enforceDefine||a&&getGlobal(a)))return n(e)?void 0:c(makeError("nodefine","No define call for "+e,null,[e]));h([e,o.deps||[],o.exportsFn])}l()},nameToUrl:function(e,t,i){var r,n,o,a,s,u,c,d=getOwn(y.pkgs,e);if(d&&(e=d),c=getOwn(R,e))return q.nameToUrl(c,t,i);if(req.jsExtRegExp.test(e))s=e+(t||"");else{for(r=y.paths,o=(n=e.split("/")).length;o>0;o-=1)if(a=n.slice(0,o).join("/"),u=getOwn(r,a)){isArray(u)&&(u=u[0]),n.splice(0,o,u);break}s=n.join("/"),s=("/"===(s+=t||(/^data\:|^blob\:|\?/.test(s)||i?"":".js")).charAt(0)||s.match(/^[\w\+\.\-]+:/)?"":y.baseUrl)+s}return y.urlArgs&&!/^blob\:/.test(s)?s+y.urlArgs(e,s):s},load:function(e,t){req.load(q,e,t)},execCb:function(e,t,i,r){return t.apply(r,i)},onScriptLoad:function(e){if("load"===e.type||readyRegExp.test((e.currentTarget||e.srcElement).readyState)){interactiveScript=null;var t=g(e);q.completeLoad(t.id)}},onScriptError:function(e){var t=g(e);if(!n(t.id)){var i=[];return eachProp(S,function(e,r){0!==r.indexOf("_@r")&&each(e.depMaps,function(e){if(e.id===t.id)return i.push(r),!0})}),c(makeError("scripterror",'Script error for "'+t.id+(i.length?'", needed by: '+i.join(", "):'"'),e,[t.id]))}}},q.require=q.makeRequire(),q}function getInteractiveScript(){return interactiveScript&&"interactive"===interactiveScript.readyState?interactiveScript:(eachReverse(scripts(),function(e){if("interactive"===e.readyState)return interactiveScript=e}),interactiveScript)}var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.3.5",commentRegExp=/\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,isBrowser=!("undefined"==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;if(void 0===define){if(void 0!==requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}void 0===require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,r){var n,o,a=defContextName;return isArray(e)||"string"==typeof e||(o=e,isArray(t)?(e=t,t=i,i=r):e=[]),o&&o.context&&(a=o.context),(n=getOwn(contexts,a))||(n=contexts[a]=req.s.newContext(a)),o&&n.configure(o),n.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick=void 0!==setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require||(require=req),req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrowser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each(["toUrl","undef","defined","specified"],function(e){req[e]=function(){var t=contexts[defContextName];return t.require[e].apply(t,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],(baseElement=document.getElementsByTagName("base")[0])&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var r=e.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");return r.type=e.scriptType||"text/javascript",r.charset="utf-8",r.async=!0,r},req.load=function(e,t,i){var r,n=e&&e.config||{};if(isBrowser)return(r=req.createNode(n,t,i)).setAttribute("data-requirecontext",e.contextName),r.setAttribute("data-requiremodule",t),!r.attachEvent||r.attachEvent.toString&&r.attachEvent.toString().indexOf("[native code")<0||isOpera?(r.addEventListener("load",e.onScriptLoad,!1),r.addEventListener("error",e.onScriptError,!1)):(useInteractive=!0,r.attachEvent("onreadystatechange",e.onScriptLoad)),r.src=i,n.onNodeCreated&&n.onNodeCreated(r,n,t,i),currentlyAddingScript=r,baseElement?head.insertBefore(r,baseElement):head.appendChild(r),currentlyAddingScript=null,r;if(isWebWorker)try{setTimeout(function(){},0),importScripts(i),e.completeLoad(t)}catch(r){e.onError(makeError("importscripts","importScripts failed for "+t+" at "+i,r,[t]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){if(head||(head=e.parentNode),dataMain=e.getAttribute("data-main"))return mainScript=dataMain,cfg.baseUrl||-1!==mainScript.indexOf("!")||(src=mainScript.split("/"),mainScript=src.pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,""),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0}),define=function(e,t,i){var r,n;"string"!=typeof e&&(i=t,t=e,e=null),isArray(t)||(i=t,t=null),!t&&isFunction(i)&&(t=[],i.length&&(i.toString().replace(commentRegExp,commentReplace).replace(cjsRequireRegExp,function(e,i){t.push(i)}),t=(1===i.length?["require"]:["require","exports","module"]).concat(t))),useInteractive&&(r=currentlyAddingScript||getInteractiveScript())&&(e||(e=r.getAttribute("data-requiremodule")),n=contexts[r.getAttribute("data-requirecontext")]),n?(n.defQueue.push([e,t,i]),n.defQueueMap[e]=!0):globalDefQueue.push([e,t,i])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}}(this,"undefined"==typeof setTimeout?void 0:setTimeout); \ No newline at end of file diff --git a/assets/search.js b/assets/search.js new file mode 100644 index 0000000..ff34ffe --- /dev/null +++ b/assets/search.js @@ -0,0 +1,72 @@ +(function() { + function displaySearchResults(results, store) { + var searchResults = document.getElementById('search-results'); + + if (results.length) { // Are there any results? + var appendString = ''; + + for (var i = 0; i < results.length; i++) { // Iterate over the results + var item = store[results[i].ref]; + appendString += '

' + item.title + '

'; + appendString += '

' + item.content.substring(0, 150) + '...


'; + } + + searchResults.innerHTML = appendString; + } else { + searchResults.innerHTML = '
  • По вашему запросу ничего не найдено
  • '; + } + } + + function getQueryVariable(variable) { + var query = window.location.search.substring(1); + var vars = query.split('&'); + + for (var i = 0; i < vars.length; i++) { + var pair = vars[i].split('='); + + if (pair[0] === variable) { + return decodeURIComponent(pair[1].replace(/\+/g, '%20')); + } + } + } + + var searchTerm = getQueryVariable('query'); + + if (searchTerm) { + document.getElementById('search-box').setAttribute("value", searchTerm); + + // Initalize lunr with the fields it will be searching on. I've given title + // a boost of 10 to indicate matches on this field are more important. + require([assetsUrl+'/lunr.min.js', assetsUrl+'/lunr.stemmer.support.js', assetsUrl+'/lunr.de.js', assetsUrl+'/lunr.ru.js', assetsUrl+'/lunr.multi.js'], function(lunr, stemmerSupport, de, ru, multiLanguage) { + + stemmerSupport(lunr); + de(lunr); + ru(lunr); + multiLanguage(lunr) + + var idx = lunr(function () { + this.field('id'); + this.field('title'); + this.field('author'); + this.field('category'); + this.field('content'); + + this.use(lunr.multiLanguage('en', 'de', 'ru')); + + for (var key in window.store) { // Add the data to lunr + this.add({ + 'id': key, + 'title': window.store[key].title, + 'author': window.store[key].author, + 'category': window.store[key].category, + 'content': window.store[key].content + }); + } + + }); + + var results = idx.search(searchTerm); // Get lunr to perform a search + displaySearchResults(results, window.store); // We'll write this in the next section + }) + } +})(); \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..05ed408 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +version: "3" +services: + site: + command: jekyll serve + image: jekyll/jekyll:latest + volumes: + - $PWD:/srv/jekyll + - $PWD/vendor/bundle:/usr/local/bundle + ports: + - 4000:4000 + - 35729:35729 + - 3000:3000 + - 80:4000 \ No newline at end of file diff --git a/README.md b/index.md similarity index 76% rename from README.md rename to index.md index 585e56b..3981269 100644 --- a/README.md +++ b/index.md @@ -1,17 +1,18 @@ -# ![#f03c15](https://placehold.it/15/f03c15/000000?text=+) Данный faq переехал на https://github.com/ru-de/faq -Пожалуйста, все новые issue и pull request открывайте на новом месте. Если вы зашли сюда по ссылке со стороннего ресурса - попросите изменить ссылку, или напишите комментарий, что актуальный адрес изменился. Подробнее о переезде и его причинах можно почитать [тут](https://github.com/ewgRa/de_faq/issues/323). - +--- +# You don't need to edit this file, it's empty on purpose. +# Edit theme's home layout instead if you wanna make some changes +# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults +layout: default +--- # Жизнь в Берлине и Германии В этом репозитории собрана полезная информация о жизни в Берлине, а также в целом в Германии: руководства, советы, ответы на часто задаваемые вопросы. Основная первоначальная аудитория: айтишники (программисты, sysops и т.д.), переехавшие в Берлин работать по программе Blue Card из Украины, России и других стран. Вы очень поможете, если поделитесь своим ценным и полезным опытом, исправите устаревшую информацию или сообщите о ней. Это можно сделать прямо в интерфейсе GitHub: вверху каждой страницы есть кнопка редактирования (иконка выглядит как карандаш). При нажатии на неё автоматически создаётся ваш личный клон этого репозитория. Дальше вы можете редактировать файлы в вашем клоне. Когда готово — отправляете pull request в головной репозиторий. Всё делается прямо на сайте, консоль или другие программы использовать не требуется. -Сайт-зеркало: https://ru-de.github.io/faq/ - # Авторские права и отказ от ответственности -Материалы этого репозитория создаются и редактируются различными людьми на добровольной основе. Их использование и распространение разрешается на условиях [лицензионных соглашений](LICENSE). Если вы вносите изменения в репозиторий, вы соглашаетесь с тем, что лицензионные соглашения с этого момента распространяются на материалы с вашими изменениями, и подтверждаете, что имеете все необходимые права и разрешения на предоставление такого согласия. +Материалы этого репозитория создаются и редактируются различными людьми на добровольной основе. Их использование и распространение разрешается на условиях [лицензионных соглашений](https://github.com/ru-de/faq/blob/master/LICENSE). Если вы вносите изменения в репозиторий, вы соглашаетесь с тем, что лицензионные соглашения с этого момента распространяются на материалы с вашими изменениями, и подтверждаете, что имеете все необходимые права и разрешения на предоставление такого согласия. Материалы этого репозитория представляют собой собрание знаний и представлений, накопленных различными людьми. Авторы материалов не несут ответственность за достоверность, точность или актуальность изложенных сведений. Материалы могут содержать неточности и ошибки. Материалы предоставляются безо всяких и любых гарантий. Материалы не могут рассматриваться как юридическая, медицинская, налоговая или иная консультация. diff --git a/Niederlassungserlaubnis.md b/pages/Niederlassungserlaubnis.md similarity index 99% rename from Niederlassungserlaubnis.md rename to pages/Niederlassungserlaubnis.md index 05ca9fa..41de229 100644 --- a/Niederlassungserlaubnis.md +++ b/pages/Niederlassungserlaubnis.md @@ -1,3 +1,8 @@ +--- +title: Niederlassungserlaubnis +layout: default +--- + ## Что такое Niederlassungserlaubnis? Niederlassungserlaubnis является разрешением, позволяющим иностранцам из стран, не входящих в ЕС, свободно жить и работать в Германии. Это также называется unbefristete Aufenthaltserlaubnis — неограниченным видом на жительство. Работа и проживание в евросоюзе за пределами Германии не разрешается. diff --git a/files/Dockerfile b/pages/files/Dockerfile similarity index 100% rename from files/Dockerfile rename to pages/files/Dockerfile diff --git a/files/DrivingLicenseReturnTemplate.md b/pages/files/DrivingLicenseReturnTemplate.md similarity index 100% rename from files/DrivingLicenseReturnTemplate.md rename to pages/files/DrivingLicenseReturnTemplate.md diff --git a/files/Einladung (long term).docx b/pages/files/Einladung (long term).docx similarity index 100% rename from files/Einladung (long term).docx rename to pages/files/Einladung (long term).docx diff --git a/files/Einladung (short term).docx b/pages/files/Einladung (short term).docx similarity index 100% rename from files/Einladung (short term).docx rename to pages/files/Einladung (short term).docx diff --git a/files/be.png b/pages/files/be.png similarity index 100% rename from files/be.png rename to pages/files/be.png diff --git a/files/by.gif b/pages/files/by.gif similarity index 100% rename from files/by.gif rename to pages/files/by.gif diff --git a/files/check-install.sh b/pages/files/check-install.sh similarity index 100% rename from files/check-install.sh rename to pages/files/check-install.sh diff --git a/files/check.sh b/pages/files/check.sh similarity index 100% rename from files/check.sh rename to pages/files/check.sh diff --git a/files/de.gif b/pages/files/de.gif similarity index 100% rename from files/de.gif rename to pages/files/de.gif diff --git a/files/dictionary.dic b/pages/files/dictionary.dic similarity index 100% rename from files/dictionary.dic rename to pages/files/dictionary.dic diff --git a/files/docker-compose.yml b/pages/files/docker-compose.yml similarity index 100% rename from files/docker-compose.yml rename to pages/files/docker-compose.yml diff --git a/files/en.gif b/pages/files/en.gif similarity index 100% rename from files/en.gif rename to pages/files/en.gif diff --git a/files/general_blood_test.jpeg b/pages/files/general_blood_test.jpeg similarity index 100% rename from files/general_blood_test.jpeg rename to pages/files/general_blood_test.jpeg diff --git a/files/known_url.csv b/pages/files/known_url.csv similarity index 53% rename from files/known_url.csv rename to pages/files/known_url.csv index 27a8c49..e7b246d 100644 --- a/files/known_url.csv +++ b/pages/files/known_url.csv @@ -1,5 +1,5 @@ -302,https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(short%20term).docx?raw=true -302,https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(long%20term).docx?raw=true +302,https://github.com/ru-de/faq/blob/master/files/Einladung%20(short%20term).docx?raw=true +302,https://github.com/ru-de/faq/blob/master/files/Einladung%20(long%20term).docx?raw=true 000,https://www.envivas.de/de/tarife-und-service/zusatzversicherungen/auslandsreise/travelxl 000,https://www.envivas.de/de/tarife-und-service/zusatzversicherungen/auslandsreise/travelxf 000,https://www.envivas.de/ diff --git a/files/mu.png b/pages/files/mu.png similarity index 100% rename from files/mu.png rename to pages/files/mu.png diff --git a/files/parentstaxreturn.doc b/pages/files/parentstaxreturn.doc similarity index 100% rename from files/parentstaxreturn.doc rename to pages/files/parentstaxreturn.doc diff --git a/files/ru.gif b/pages/files/ru.gif similarity index 100% rename from files/ru.gif rename to pages/files/ru.gif diff --git a/files/spell-checker.go b/pages/files/spell-checker.go similarity index 100% rename from files/spell-checker.go rename to pages/files/spell-checker.go diff --git a/files/ua.gif b/pages/files/ua.gif similarity index 100% rename from files/ua.gif rename to pages/files/ua.gif diff --git a/misc.md b/pages/misc.md similarity index 98% rename from misc.md rename to pages/misc.md index d21624a..8a42087 100644 --- a/misc.md +++ b/pages/misc.md @@ -1,3 +1,8 @@ +--- +title: misc +layout: default +--- + # Разное * Сервис, который облегчает расторжение договоров: https://www.aboalarm.de diff --git a/АБХ.md b/pages/АБХ.md similarity index 95% rename from АБХ.md rename to pages/АБХ.md index 9a392f0..ab523cc 100644 --- a/АБХ.md +++ b/pages/АБХ.md @@ -1,3 +1,8 @@ +--- +title: АБХ +layout: default +--- + ## АБХ ([Ausländerbehörde](http://www.berlin.de/labo/auslaender/dienstleistungen/)) Внимание! адрес офиса, для держателей Blaue Karte изменился, теперь надо ходить по адресу: Keplerstr. 2, 10589 Berlin, 4 этаж @@ -19,7 +24,7 @@ - TIP: фотографии можно сделать в самом АБХ, ищите фотоавтоматы. - TIP: если есть подозрение, что вам будут менять карту - возьмите фотки. - TIP: замену карту лучше проводить не во время смены работы, либо берите с собой рабочие договора, чтобы подтвердить, что вы трудоустроены, в АБХ может иметься информация, что вы безработный, и соответственно могут быть нюансы со сменой карты. -- Если жена собирается изучать язык, очень рекомендуется попросить направление на [интеграционные курсы](https://github.com/ewgRa/de_faq/blob/master/%D0%AF%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2%D1%8B%D0%B5%20%D0%BA%D1%83%D1%80%D1%81%D1%8B.md#Интеграционные-курсы-языковые-курсы) +- Если жена собирается изучать язык, очень рекомендуется попросить направление на [интеграционные курсы](https://github.com/ru-de/faq/blob/master/%D0%AF%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2%D1%8B%D0%B5%20%D0%BA%D1%83%D1%80%D1%81%D1%8B.md#Интеграционные-курсы-языковые-курсы) ## Неограниченный ВНЖ Можно получить после 21 месяца при предоставлении сертификата владения языком B1, либо после 33 месяцев при предоставлении сертификата A1. diff --git a/Авто.md b/pages/Авто.md similarity index 99% rename from Авто.md rename to pages/Авто.md index 500c57e..d9a18f2 100644 --- a/Авто.md +++ b/pages/Авто.md @@ -1,3 +1,8 @@ +--- +title: Авто +layout: default +--- + # Автомобиль и все, что с этим связано @@ -63,7 +68,7 @@ A: В зависимости от страны, скорее всего ваши #### Возврат национальных прав Но бывает, что сотрудник Fahrerlaubnisbehörde начинает утверждать, что права не возвращаются. Способа, как ему доказать, что он не прав, до сего дня никто не обнаружил (разве что идти к другому сотруднику). Рекомендуется сделать копию, пригодится в дальнейшем для проката авто. -Если вам не удалось убедить не забирать насовсем национальные права, то стоит написать [письмо в свободной форме](https://github.com/ewgRa/de_faq/blob/master/files/DrivingLicenseReturnTemplate.md) с просьбой вернуть. +Если вам не удалось убедить не забирать насовсем национальные права, то стоит написать [письмо в свободной форме](https://github.com/ru-de/faq/blob/master/files/DrivingLicenseReturnTemplate.md) с просьбой вернуть. ### Теория diff --git a/Велосипеды.md b/pages/Велосипеды.md similarity index 99% rename from Велосипеды.md rename to pages/Велосипеды.md index 9f955dd..401bbc2 100644 --- a/Велосипеды.md +++ b/pages/Велосипеды.md @@ -1,3 +1,8 @@ +--- +title: Велосипеды +layout: default +--- + ## Велосипеды ### Городские велосипедные общества diff --git a/Виза.md b/pages/Виза.md similarity index 99% rename from Виза.md rename to pages/Виза.md index 0138f3c..cc55be4 100644 --- a/Виза.md +++ b/pages/Виза.md @@ -1,3 +1,8 @@ +--- +title: Виза +layout: default +--- + # Получение национальной визы diff --git a/Детские пособия.md b/pages/Детские пособия.md similarity index 99% rename from Детские пособия.md rename to pages/Детские пособия.md index 79ab104..3381f6d 100644 --- a/Детские пособия.md +++ b/pages/Детские пособия.md @@ -1,3 +1,8 @@ +--- +title: Детские пособия +layout: default +--- + ## Детское пособие a.k.a Kindergeld Каждый ребенок, находящийся в Германии на законных основаниях, имеет право получать детское пособие. В настоящее время оно составляет 192 евро/мес (с 2018 года 194 евро/мес) на каждого ребенка (для многодетных семей немного больше). C 2016 года для его выдачи требуется указать налоговый номер. В общем случае пособие платится до 18 лет, иногда этот срок можно расширить до 25 лет. diff --git a/Доверенность.md b/pages/Доверенность.md similarity index 99% rename from Доверенность.md rename to pages/Доверенность.md index 8deff17..9729091 100644 --- a/Доверенность.md +++ b/pages/Доверенность.md @@ -1,3 +1,8 @@ +--- +title: Доверенность +layout: default +--- + # Оформление доверенности в украинском консульстве в Берлине Мне пришлось столкнуться с оформлением доверенности для решения вопросов в Украине. По счастливой случайности я почти не наделал ошибок. Информации о том как это сделать правильно с детальным пошаговым алгоритмом я не нашел. На помощь секретарей консульства тоже можете не рассчитывать. diff --git a/Законы.md b/pages/Законы.md similarity index 96% rename from Законы.md rename to pages/Законы.md index 3b3a3cc..8bf330f 100644 --- a/Законы.md +++ b/pages/Законы.md @@ -1,3 +1,8 @@ +--- +title: Законы +layout: default +--- + # Административная и уголовная ответственность В магазине не складывайте товар в свой пакет, рюкзак и т.п. diff --git a/Интернет.md b/pages/Интернет.md similarity index 99% rename from Интернет.md rename to pages/Интернет.md index 4a7019c..f9cae34 100644 --- a/Интернет.md +++ b/pages/Интернет.md @@ -1,3 +1,8 @@ +--- +title: Интернет +layout: default +--- + Интернет ======== @@ -103,7 +108,7 @@ ## Расторжение договора > **Legal Disclaimer:** -> The paragraph below does not provide legal advice of any kind, and we cannot guarantee that the information is accurate, complete or up-to-date. The opinions and thoughts posted on this page are of a casual nature and may change after further reflection. While we intend to make every attempt to keep the information on this site current, the owners of and contributors to this site make no claims, promises or guarantees about the accuracy, completeness or adequacy of the information contained in or linked to from this site. Full version [in Russian](https://github.com/ewgRa/de_faq#Авторские-права-и-отказ-от-ответственности). +> The paragraph below does not provide legal advice of any kind, and we cannot guarantee that the information is accurate, complete or up-to-date. The opinions and thoughts posted on this page are of a casual nature and may change after further reflection. While we intend to make every attempt to keep the information on this site current, the owners of and contributors to this site make no claims, promises or guarantees about the accuracy, completeness or adequacy of the information contained in or linked to from this site. Full version [in Russian](https://github.com/ru-de/faq#Авторские-права-и-отказ-от-ответственности). В Германии существует два типа отмены контракта: diff --git a/Квартирный вопрос.md b/pages/Квартирный вопрос.md similarity index 99% rename from Квартирный вопрос.md rename to pages/Квартирный вопрос.md index 042eb66..359efc7 100644 --- a/Квартирный вопрос.md +++ b/pages/Квартирный вопрос.md @@ -1,3 +1,8 @@ +--- +title: Квартирный вопрос +layout: default +--- + # Квартирный вопрос Квартиры в Германии ищутся только лично, с визитом и осмотрами. Удаленно найти хороший вариант на долгий срок невозможно. Поэтому обычно последовательность выглядит так: diff --git a/Консульство.md b/pages/Консульство.md similarity index 98% rename from Консульство.md rename to pages/Консульство.md index 332bd9d..4991849 100644 --- a/Консульство.md +++ b/pages/Консульство.md @@ -1,4 +1,9 @@ -### Консульский учет (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif)) +--- +title: Консульство +layout: default +--- + +### Консульский учет (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif)) Адрес Albrechtstrasse 26, 10117 Berlin [Карта](https://www.google.de/maps/place/Albrechtstra%C3%9Fe+26,+10117+Berlin/@52.5238574,13.3835722,17z/data=!3m1!4b1!4m2!3m1!1s0x47a851ea09f41bfb:0x23c74fb5f7a0c5da?hl=ru) Есть 2 варианта: постоянны и временный. У товарищей с Голубой Картой вид на жительство ограничен, поэтому временный консульский учет. @@ -16,7 +21,7 @@ - TIP: лучше стать на консульский учет заранее, если вдруг какие проблемы с документантами или подтверждением для родной страны что вы там больше не живете - TIP: без консульского учета паспорт не меняют, отправляют обратно на Украину -### Загран паспорт (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif)) +### Загран паспорт (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif)) Если старый паспорт заканчивается, его рекомендуют не продлевать - так как оформление новых виз в другие страны становится очень сложным вопросом. Оформление нового пасспорта предполагает сдачу старого с концами. - Оплатить можно сразу после подачи документов в окошко, рекомендуют Сomerzbank, ближайшее отделение [тут](https://www.google.de/maps/place/52%C2%B031%2724.4%22N+13%C2%B023%2702.8%22E/@52.5234585,13.3841032,19z/data=!3m1!4b1!4m2!3m1!1s0x0:0x0?hl=en) diff --git a/Магазины, скидки, бонусы.md b/pages/Магазины, скидки, бонусы.md similarity index 98% rename from Магазины, скидки, бонусы.md rename to pages/Магазины, скидки, бонусы.md index 5296372..b48ed2e 100644 --- a/Магазины, скидки, бонусы.md +++ b/pages/Магазины, скидки, бонусы.md @@ -1,3 +1,8 @@ +--- +title: Магазины, скидки, бонусы +layout: default +--- + # Магазины Где выбирать и покупать различные товары: diff --git a/Медицина.md b/pages/Медицина.md similarity index 99% rename from Медицина.md rename to pages/Медицина.md index fa6d37b..fc6097a 100644 --- a/Медицина.md +++ b/pages/Медицина.md @@ -1,3 +1,8 @@ +--- +title: Медицина +layout: default +--- + ## Врачи и медицина - **Телефон экстренной помощи 112**. Если есть угроза жизни, случилось ДТП с потерпевшими, серьезные вещи требующие медицинской помощи, полиции, пожарных или службы спасения - Если помощь нужна срочно, либо в тот же день, но к своему врачу по разным причинам не попасть (термин назначили через год, в отпуске, не рабочее время, выходные), и нет угрозы жизни, телефон 116117 http://www.116117info.de/html/ diff --git a/Мобильная связь.md b/pages/Мобильная связь.md similarity index 99% rename from Мобильная связь.md rename to pages/Мобильная связь.md index 9e15bce..f542c53 100644 --- a/Мобильная связь.md +++ b/pages/Мобильная связь.md @@ -1,3 +1,8 @@ +--- +title: Мобильная связь +layout: default +--- + ## Обзор Операторы, имеющие свои сети - [Vodafone](https://www.vodafone.de/), [O2](https://www.o2online.de/), [T-Mobile](https://www.t-mobile.de/), [E-Plus](https://www.handyflatrate.de/) (последний был куплен O2). diff --git a/Мусор.md b/pages/Мусор.md similarity index 99% rename from Мусор.md rename to pages/Мусор.md index ca25daf..77abde3 100644 --- a/Мусор.md +++ b/pages/Мусор.md @@ -1,3 +1,8 @@ +--- +title: Мусор +layout: default +--- + # Важное уточнение **В этом документе - общие правила и особенности сортировки мусора, с которыми Вы можете столкнуться. Правила могут отличаться в зависимости от многих факторов: земли, города, домоуправления и т.п. Более детальную информацию о том, как сортировать мусор, Вы можете узнать у своего Hausmeister или у компании, которая занимается вывозом мусора. В Берлине это компания BSR: https://www.bsr.de/** diff --git a/Налоги.md b/pages/Налоги.md similarity index 98% rename from Налоги.md rename to pages/Налоги.md index dabf1b6..e0b49a2 100644 --- a/Налоги.md +++ b/pages/Налоги.md @@ -1,3 +1,8 @@ +--- +title: Налоги +layout: default +--- + # Налоги У каждого жителя Германии есть налоговый идентификационный номер и налоговый класс. @@ -69,7 +74,7 @@ Для подачи декларации за первый год жизни в Германии рекомендуется прибегнуть к услугам налогового консультанта. В первый год можно получить большое возмещение. Несколько комментариев на эту тему: * Большой возврат связан с тем, что подоходный налог за год зависит от суммы, полученной за этот год. Ваша компания отчисляет подоходный налог из расчета вашей зарплаты за 12 месяцев. Таким образом, если вы получили денег меньше чем за 12 месяцев, так как приехали, скажем, в октябре, то это означает, что компания перечислила слишком много налогов, и вам положен возврат. Ключевые слова на эту тему для поиска: Steuerfreibetrag, Progressionsvorbehalt. * Сумма доходов за год является основным фактором для расчета подоходного налога. Поэтому, если вы работаете, например, с 1 января по 31 декабря (весь год полностью), то, скорее всего, большого возврата не получится. -* Если вы приехали один, а на родине временно остались ваши жена, нетрудоспособные дети, родители с малыми доходами, которых вы финансово поддерживали, это тоже может быть вам выгодно в налоговом смысле. [Информация](https://github.com/ewgRa/de_faq/raw/master/files/parentstaxreturn.doc) о возврате налогов за помощь родителям. +* Если вы приехали один, а на родине временно остались ваши жена, нетрудоспособные дети, родители с малыми доходами, которых вы финансово поддерживали, это тоже может быть вам выгодно в налоговом смысле. [Информация](https://github.com/ru-de/faq/raw/master/files/parentstaxreturn.doc) о возврате налогов за помощь родителям. * Расходы, связанные с переездом (Umzugskosten), могут иметь влияние на сумму налогов. Если речь идет о переезде внутри Германии, то для его учета нужно, чтобы переезд был обусловлен трудовой деятельностью (например, из-за переезда существенно сократилось время в пути на работу). Общая рекомендация: сохраняйте все чеки и квитанции за все время в Германии, сортируйте по годам. Особенно от всего того, что может как-то быть связано с вашей работой. diff --git a/Обязанности на Родине.md b/pages/Обязанности на Родине.md similarity index 98% rename from Обязанности на Родине.md rename to pages/Обязанности на Родине.md index 817cc8e..c6e6f57 100644 --- a/Обязанности на Родине.md +++ b/pages/Обязанности на Родине.md @@ -1,3 +1,8 @@ +--- +title: Обязанности на Родине +layout: default +--- + # Обязанности на Родине Несмотря на то, что вы проживаете в Германии, вы остаетесь гражданином своей страны и у вас есть некоторые обязанности, несоблюдение которых может иметь последствия. diff --git a/Отпуск и отдых.md b/pages/Отпуск и отдых.md similarity index 99% rename from Отпуск и отдых.md rename to pages/Отпуск и отдых.md index 0225b36..bcd7385 100644 --- a/Отпуск и отдых.md +++ b/pages/Отпуск и отдых.md @@ -1,3 +1,8 @@ +--- +title: Отпуск и отдых +layout: default +--- + ## Отдых - недалеко от Берлина (1-2 часа на поезде), в основном все покрывается [brandenburg ticket](http://www.vbb.de/de/article/touristen/brandenburg-berlin-ticket/10806.html): - Потсдам (можно доехать на S-Bahn) diff --git a/Оформление новорожденных.md b/pages/Оформление новорожденных.md similarity index 97% rename from Оформление новорожденных.md rename to pages/Оформление новорожденных.md index 3fa42d9..c15fa28 100644 --- a/Оформление новорожденных.md +++ b/pages/Оформление новорожденных.md @@ -1,3 +1,8 @@ +--- +title: Оформление новорожденных +layout: default +--- + ## Оформление новорожденных Данная процедура актуальна на январь 2016, родители граждане Украины, Blaue Karte. @@ -43,12 +48,12 @@ > В украинском посольстве отправляют делать апостиль сюда: https://goo.gl/fdzjlb (2 этаж направо, каб. 225) -### Перевод на украинский язык (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif)) +### Перевод на украинский язык (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif)) Немецкое свидетельство с апостилем переводится у немецкого присяжного переводчика, стоимость услуги 20 Евро. После чего оно валидно в Украине, так как легализовано в установленном порядке. -### Посольство Украины: справка о присвоении гражданства по факту рождения (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif)) +### Посольство Украины: справка о присвоении гражданства по факту рождения (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif)) Страница на сайте посольства: http://germany.mfa.gov.ua/ua/consular-affairs/services/civil-state/birth Справка бесплатна, делается неделю. @@ -58,7 +63,7 @@ 1. Заявление (форма с сайта http://germany.mfa.gov.ua/ua/consular-affairs/services/citizenship/birth) -### Посольство Украины: загранпаспорт для ребенка (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif)) +### Посольство Украины: загранпаспорт для ребенка (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif)) После того, как справка готова, делаем загранпаспорт. ~~С 2016 года у детей отдельный паспорт, такого понятия как "вписать в паспорт родителей" нет~~ (Путешествовал по Европе и США летом 2016, ребенок 5 лет был указан в загранпаспорте с фоткой, проблем не было). Желательно уточнить процедуру в посольстве, так как на январь 2016 информация на сайте отличалась от фактической процедуры. @@ -89,7 +94,7 @@ Когда паспорт будет готов, по почте на домашний адрес придет приглашение. -### Посольство Республики Беларусь (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/by.gif)) +### Посольство Республики Беларусь (![](https://raw.githubusercontent.com/ru-de/faq/master/files/by.gif)) Все выше перечисленное не совсем подходит для жителей РБ. У нас немного другой план. В связи с тем, что у нас нет разделения на заграничный паспорт и обычный паспорт, есть два варианта развития событий: 1. Операция "Все через посольство" @@ -148,4 +153,4 @@ https://service.berlin.de/dienstleistung/120686/ ### Kindergeld, Elterngeld -Смотри файл [Детские пособия](https://github.com/ewgRa/de_faq/blob/master/%D0%94%D0%B5%D1%82%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B8%D1%8F.md) +Смотри файл [Детские пособия](https://github.com/ru-de/faq/blob/master/%D0%94%D0%B5%D1%82%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B8%D1%8F.md) diff --git a/План действий для получивших оффер.md b/pages/План действий для получивших оффер.md similarity index 98% rename from План действий для получивших оффер.md rename to pages/План действий для получивших оффер.md index 1f89f7e..124c31f 100644 --- a/План действий для получивших оффер.md +++ b/pages/План действий для получивших оффер.md @@ -1,3 +1,8 @@ +--- +title: План действий для получивших оффер +layout: default +--- + # План действий для получивших job offer в Германии Уже несколько друзей стали счастливыми обладателями офферов и теперь не устают расспрашивать меня о плане дальнейших действий. Соберу в этом посте краткое резюме из своих ответов, быть может, пригодится и вам :) diff --git a/Подтверждение диплома.md b/pages/Подтверждение диплома.md similarity index 97% rename from Подтверждение диплома.md rename to pages/Подтверждение диплома.md index d04d4d1..87ba0e8 100644 --- a/Подтверждение диплома.md +++ b/pages/Подтверждение диплома.md @@ -1,6 +1,11 @@ +--- +title: Подтверждение диплома +layout: default +--- + # Подтверждение диплома -Информация о процедуре проверки диплома [на официальном сайте](https://www.kmk.org/kmk/information-in-english/statement-of-comparability-for-foreign-higher-education-qualifications.html) ((![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/de.gif)), (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/en.gif))). +Информация о процедуре проверки диплома [на официальном сайте](https://www.kmk.org/kmk/information-in-english/statement-of-comparability-for-foreign-higher-education-qualifications.html) ((![](https://raw.githubusercontent.com/ru-de/faq/master/files/de.gif)), (![](https://raw.githubusercontent.com/ru-de/faq/master/files/en.gif))). Есть отдельные указания для Blue Card, есть отдельные указания для стран (Украина и т. д.) Сперва надо оформить [заявку онлайн](https://www.kmk.org/kmk/information-in-english/statement-of-comparability-for-foreign-higher-education-qualifications/application-and-fees/application-form.html). diff --git a/Приглашение (Verpflichtungserklärung).md b/pages/Приглашение (Verpflichtungserklärung).md similarity index 96% rename from Приглашение (Verpflichtungserklärung).md rename to pages/Приглашение (Verpflichtungserklärung).md index ab01f0d..f8f3f18 100644 --- a/Приглашение (Verpflichtungserklärung).md +++ b/pages/Приглашение (Verpflichtungserklärung).md @@ -1,3 +1,8 @@ +--- +title: Приглашение (Verpflichtungserklärung) +layout: default +--- + ## Страница услуги https://service.berlin.de/dienstleistung/120691/ @@ -50,7 +55,7 @@ https://service.berlin.de/dienstleistung/120691/ В одной приглашении можно указать супруга или супругу приглашенного человека и его несовершеннолетних детей. При подаче приглашения совсем не лишним будет приложить еще рукописное приглашение, ему в посольствах всегда рады. -Если жена не работает то, чтобы пригласить ее родителей, приглашение делается от мужа. В посольство жена должна написать письмо от руки, похожее на приглашение. Образец письма на короткий срок пребывания можно найти [тут](https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(short%20term).docx?raw=true), на длинный [тут](https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(long%20term).docx?raw=true). +Если жена не работает то, чтобы пригласить ее родителей, приглашение делается от мужа. В посольство жена должна написать письмо от руки, похожее на приглашение. Образец письма на короткий срок пребывания можно найти [тут](https://github.com/ru-de/faq/blob/master/files/Einladung%20(short%20term).docx?raw=true), на длинный [тут](https://github.com/ru-de/faq/blob/master/files/Einladung%20(long%20term).docx?raw=true). Также на подачу документов в посольство родственники должны взять документы, подтверждающие родство. ## Документы на шенгенскую визу по приглашению diff --git a/Работа.md b/pages/Работа.md similarity index 99% rename from Работа.md rename to pages/Работа.md index 4767cb6..bf819a1 100644 --- a/Работа.md +++ b/pages/Работа.md @@ -1,3 +1,8 @@ +--- +title: Работа +layout: default +--- + ## Работа Поиск вакансий: diff --git a/Регистрация места жительства.md b/pages/Регистрация места жительства.md similarity index 99% rename from Регистрация места жительства.md rename to pages/Регистрация места жительства.md index 53c0b55..1fe349e 100644 --- a/Регистрация места жительства.md +++ b/pages/Регистрация места жительства.md @@ -1,3 +1,8 @@ +--- +title: Регистрация места жительства +layout: default +--- + # Регистрация места жительства В течение **14 дней** после переезда на новое место жительства в Германии вы обязаны зарегистрироваться. Это необходимо делать только для долгосрочного проживания (более двух месяцев), краткосрочное проживание, например, в отеле, регистрировать не обязательно. diff --git a/Страховки.md b/pages/Страховки.md similarity index 99% rename from Страховки.md rename to pages/Страховки.md index c43c926..c1660a5 100644 --- a/Страховки.md +++ b/pages/Страховки.md @@ -1,3 +1,8 @@ +--- +title: Страховки +layout: default +--- + ## Страховки ### Какие виды страховок Вам необходимы? diff --git a/Телевидение.md b/pages/Телевидение.md similarity index 99% rename from Телевидение.md rename to pages/Телевидение.md index 412edc7..95fb310 100644 --- a/Телевидение.md +++ b/pages/Телевидение.md @@ -1,3 +1,8 @@ +--- +title: Телевидение +layout: default +--- + # Телевидение ## ZDF и Rundfunktbeitrag diff --git a/Транспорт.md b/pages/Транспорт.md similarity index 99% rename from Транспорт.md rename to pages/Транспорт.md index 5423602..483c652 100644 --- a/Транспорт.md +++ b/pages/Транспорт.md @@ -1,3 +1,8 @@ +--- +title: Транспорт +layout: default +--- + ## Транспорт Те, кто прописан в Берлине, могут купить VBB Monatskarte с неплохой скидкой (за 63,42 EUR). Для этого нужно подойти в VBB центр по работе с клиентами с Anmeldung, удостоверением личности и карточкой банка. Вы заполните анкету и получите карточку по почте. На то время, пока вы ее не получили, вам выдадут временный Monatskarte(Startkarte), за который нужно заплатить (у меня вышло 53 EUR с 4-го числа до конца месяца). Я подходил в центр на Alexanderplatz, там немного говорят по-английски, достаточно, чтобы помочь заполнить. diff --git a/Финансы и Банки.md b/pages/Финансы и Банки.md similarity index 99% rename from Финансы и Банки.md rename to pages/Финансы и Банки.md index 85b1a16..8cc18d0 100644 --- a/Финансы и Банки.md +++ b/pages/Финансы и Банки.md @@ -1,3 +1,8 @@ +--- +title: Финансы и Банки +layout: default +--- + ## Банки ### Предупреждение @@ -26,7 +31,7 @@ Как правило онлайн банки предоставляют на выбор два варианта идентификации: Видео-идентификация или идентификация в почтовом отделении. В [N26](https://n26.com/) биометрический загранпаспорт РФ подходит для видео-идентификации. Пятилетний российский паспорт (без биометрии) идентифицировать онлайн не получится -Есть удачный опыт прохождения видео-идентификации в N26 с паспортами Украины (see [#147](https://github.com/ewgRa/de_faq/issues/147)). +Есть удачный опыт прохождения видео-идентификации в N26 с паспортами Украины (see [#147](https://github.com/ru-de/faq/issues/147)). Остается вариант идентификации в почтовом отделении. Процедура бесплатная. Для прохождения следует взять свой заграничный паспорт, PDF файл с кодом почтовой идентификации который был получен на последнем этапе регистрации в банке, документ о регистрации места жительства. diff --git a/Фриланс.md b/pages/Фриланс.md similarity index 99% rename from Фриланс.md rename to pages/Фриланс.md index 644c231..211c0c5 100644 --- a/Фриланс.md +++ b/pages/Фриланс.md @@ -1,3 +1,8 @@ +--- +title: Фриланс +layout: default +--- + ## Freiberufler Мы собрали часто задаваемые вопросы и ответы из нашего чата о том как стать Freiberufler. Кому-то будет полезно, в сборе вопросов участвовали @ilya.n @wowa @Ghedeon. diff --git a/Электричество.md b/pages/Электричество.md similarity index 96% rename from Электричество.md rename to pages/Электричество.md index 8aef2ce..c86aac0 100644 --- a/Электричество.md +++ b/pages/Электричество.md @@ -1,3 +1,8 @@ +--- +title: Электричество +layout: default +--- + # Электричество ## Как подключить электричество в новую квартиру? diff --git a/Языковые курсы.md b/pages/Языковые курсы.md similarity index 99% rename from Языковые курсы.md rename to pages/Языковые курсы.md index 4a7b4cc..9b527fd 100644 --- a/Языковые курсы.md +++ b/pages/Языковые курсы.md @@ -1,3 +1,8 @@ +--- +title: Языковые курсы +layout: default +--- + ## Интеграционные курсы, языковые курсы: ### Языковые школы diff --git a/search.html b/search.html new file mode 100644 index 0000000..2c41b9d --- /dev/null +++ b/search.html @@ -0,0 +1,25 @@ +--- +layout: default +--- +
      + + + + \ No newline at end of file diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..624eb84 --- /dev/null +++ b/update.sh @@ -0,0 +1,25 @@ +DE_FAQ_DIR=/tmp/de_faq + +rm -rf $DE_FAQ_DIR + +git clone https://github.com/ru-de/faq.git $DE_FAQ_DIR --depth=1 + +rm $DE_FAQ_DIR/CONTRIBUTING.md +rm $DE_FAQ_DIR/README.md + +mkdir $DE_FAQ_DIR/tmp_pages + +for file in $DE_FAQ_DIR/*.md; do + bname=$(basename "$file") + title=$(basename "$file" .md) + (echo "---\ntitle: $title\nlayout: default\n---\n"; cat "$file") > "$DE_FAQ_DIR/tmp_pages/$bname" +done + +sed -i -- 's/ewgRa\/de_faq/ru-de\/faq/g' $DE_FAQ_DIR/tmp_pages/*.md + +rm -rf pages +mkdir pages +cp -R $DE_FAQ_DIR/files pages +sed -i -- 's/ewgRa\/de_faq/ru-de\/faq/g' pages/files/known_url.csv + +cp $DE_FAQ_DIR/tmp_pages/*.md pages