Browse Source

Множественные синтаксические правки

master
Maxim Lihachev 9 years ago
parent
commit
c93c3c3776
  1. 208
      js/feminitives.js

208
js/feminitives.js

@ -16,9 +16,12 @@
// [ ] TODO: валидация // [ ] TODO: валидация
// [ ] TODO: адаптивная вёрстка // [ ] TODO: адаптивная вёрстка
// [ ] TODO: favico
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
'use strict';
//Вывод справки с примерами использования //Вывод справки с примерами использования
function show_help() { function show_help() {
HTML.content().innerHTML = "<div id='definition-help'>" HTML.content().innerHTML = "<div id='definition-help'>"
@ -45,11 +48,36 @@ var HTML = {
content: function() { return this._select("content"); }, content: function() { return this._select("content"); },
full: function() { return this._select("full"); }, full: function() { return this._select("full"); },
image: function() { return this._select("image"); } image: function() { return this._select("image"); }
} };
var FEM = {}; //Инициализация документа
HTML.init = function(root) {
//Задание базового id для всех элементов
this.container = root;
//Конвертирование по нажатию <Enter>
this.input().addEventListener("keyup", event => {
event.preventDefault();
event.keyCode == 13 && tr();
});
};
//Разбор параметров
var URL = {opt: {}};
URL.parse = function() {
var gy = window.location.search.substring(1).split("&");
gy.forEach(arg => {
let ft = arg.split("=");
this.opt[ft[0]] = this.opt[ft[0]] || decodeURIComponent(ft[1]);
});
};
//------------------------------------------------------------------------------
//Правила создания феминитивов //Правила создания феминитивов
var FEM = {};
FEM.endings = { FEM.endings = {
'ка' : [ 'ка' : [
['[аео]р', 0], ['[аео]р', 0],
@ -130,23 +158,25 @@ FEM.endings = {
//Слова со специфичными определениями //Слова со специфичными определениями
FEM.exceptions = { FEM.exceptions = {
'феминист' : [['профеминист', 'союзник'], "Мифическое создание, якобы поддерживающее феминизм."] 'феминист' : [ ['профеминист', 'союзник'],
} "Мифическое создание, якобы поддерживающее феминизм. В реальности не встречается."
]
};
//Проверка на исключение //Проверка на исключение
FEM.exceptions.contains = function(word) { FEM.exceptions.contains = function(word) {
return Object.keys(this).indexOf(word) === -1 ? false : true; return Object.keys(this).includes(word);
} };
//Список значений //Список значений
FEM.exceptions.feminitives = function(word) { FEM.exceptions.feminitives = function(word) {
return [random_word(this[word][0]), this[word][0]]; return [random_word(this[word][0]), this[word][0]];
} };
//Дефиниция слова-исключения //Дефиниция слова-исключения
FEM.exceptions.definition = function(word) { FEM.exceptions.definition = function(word) {
return this[word][1]; return this[word][1];
} };
//Слова для замены //Слова для замены
FEM.words = { FEM.words = {
@ -166,141 +196,120 @@ FEM.words.convert = function(string) {
.replace(/(.)/, s => s.toUpperCase()); .replace(/(.)/, s => s.toUpperCase());
} }
return string; return string;
} };
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
//Первый элемент списка - окончание (в виде регулярного выражения) //Первый элемент списка - окончание (в виде регулярного выражения)
function ending(tuple) { let ending = tuple => new RegExp("^.*" + tuple[0] + "$", "i");
return new RegExp("^.*" + tuple[0] + "$", "i");
}
//Второй элемент списка - смещение //Второй элемент списка - смещение
function offset(tuple) { let offset = tuple => tuple[1];
return tuple[1];
}
//Случайный элемент списка //Случайный элемент списка
function random_word(wordlist) { let random_word = wordlist => wordlist[Math.floor(Math.random() * wordlist.length)];
return wordlist[Math.floor(Math.random() * wordlist.length)];
}
//Оборачивание в <span> с указанным классом //Оборачивание в <span> с указанным классом
function html_wrap(str, cl) { let html_wrap = (str, cl) => `<span class="${cl}">${str}</span>`;
return "<span class=\"" + cl + "\">" + str + "</span>";
}
//Цветовое выделение текста //Цветовое выделение текста
function css_end(ending) { return html_wrap(ending, "ending"); } let css_end = ending => html_wrap(ending, "ending");
//Символ gender gap //Символ gender gap
function css_gender_gap() { return html_wrap(' \u26A7 ', "queer"); } let css_gender_gap = html_wrap(' \u26A7 ', "queer");
//------------------------------------------------------------------------------
//Конструирование феминитива с gender_gap //Конструирование феминитива с gender_gap
function construct_feminitive(stem, ending, gap) { function construct_feminitive(stem, ending, gap) {
return gap ? stem + css_gender_gap() + css_end(ending) : stem + "_" + ending; return gap ? stem + css_gender_gap + css_end(ending) : stem + "_" + ending;
} }
//Сохранение изображения с феминитивом //Сохранение изображения с феминитивом
function download_image() { function download_image() {
html2canvas(HTML.image(), { html2canvas(HTML.image(), {
onrendered: function (canvas) { onrendered: canvas => {
var a = document.createElement('a'); let a = document.createElement('a');
a.href = canvas.toDataURL(); a.href = canvas.toDataURL();
a.download = HTML.content().innerHTML + '.png'; a.download = HTML.content().innerHTML + '.png';
a.click(); a.click();
} }
}); });
}; }
//Создание феминитива //Создание феминитива
function make_feminitives(word) { function make_feminitives(word) {
//Обрабатываем только слова длиннее трёх символов
if (word.length < 3) return word;
var stem = ""; //Основа слова var stem = ""; //Основа слова
var current_ending = word.slice(-2); //Текущее окончание var current_ending = word.slice(-2); //Текущее окончание
var feminitives = new Array(); //Массив феминитивов var feminitives = []; //Массив феминитивов
var femicards = new Array(); //Массив феминитивов для карточки var femicards = []; //Массив феминитивов для карточки
for (var fem_ending in FEM.endings) { for (let fem_ending in FEM.endings) {
FEM.endings[fem_ending].forEach(function(end) { FEM.endings[fem_ending].forEach(end => {
if (ending(end).test(current_ending)) { if (ending(end).test(current_ending)) {
//Удаление лишних букв из основы //Удаление лишних букв из основы
stem = offset(end) == 0 ? word : word.slice(0, -offset(end)); stem = offset(end) === 0 ? word : word.slice(0, -offset(end));
//Добавление фем-варианта слова в массив //Добавление фем-варианта слова в массив
feminitives.push(construct_feminitive(stem, fem_ending, 1)); feminitives.push(construct_feminitive(stem, fem_ending, 1));
femicards.push(construct_feminitive(stem, fem_ending, 0)); femicards.push(construct_feminitive(stem, fem_ending, 0));
} }
}); });
}; }
//При отсутствии феминитивов считать корректным исходное слово //При отсутствии феминитивов считать корректным исходное слово
return [random_word(femicards) || word, feminitives]; return [random_word(femicards) || word, feminitives];
} }
//Запрос значения слова в викисловаре //Поиск и феминизация дефиниции в викистранице
function get_wiktionary(term) { function parseWikiPage(page) {
var cors_url = "https://cors.now.sh/"; var wiki = page.split("\\n");
var wiki_url = cors_url + "https://ru.wiktionary.org/w/index.php?title=" + term + "&action=raw";
var definition = ""; var definition = "";
var parseWikiPage = function(page) { wiki.some((line, n) => {
var wiki = page.split("\\n"); if (line.match(/^.*==== Значение ====.*$/)) {
console.log(wiki[n+1]); //DEBUG
for(var line = 0; line < wiki.length; line++){ definition = wiki[n+1]
if (wiki[line].match(/^.*==== Значение ====.*$/)) { .replace(/^# ?/, "") //# дефиниция
console.log(wiki[line+1]); //DEBUG .replace(/\[{2}([^\]\|]*)\]{2}/g, "$1") //[[1]]
definition = wiki[line+1] .replace(/\[{2}[^\|]*\|([^\]]*)\]{2}/g, "$1") //[[1|2]]
.replace(/^# ?/, "") //# дефиниция .replace(/\[{2}([^\]\|]*)\}{2}/g, "$1") //{{1}}
.replace(/\[{2}([^\]\|]*)\]{2}/g, "$1") //[[1]] .replace(/\{{2}[^\{\}]*\}{2} ?/g, "") //{{1|2}}
.replace(/\[{2}[^\|]*\|([^\]]*)\]{2}/g, "$1") //[[1|2]] .replace(/\{{2}[^\{\}]*\}{2} ?/g, "") //~ : возможна вложенность
.replace(/\[{2}([^\]\|]*)\}{2}/g, "$1") //{{1}} .replace(/\[[0-9]{1,}\]/g, "") //ссылки [n]
.replace(/\{{2}[^\{\}]*\}{2} ?/g, "") //{{1|2}} .replace(/^ *, */g, "") //^, ...
.replace(/\{{2}[^\{\}]*\}{2} ?/g, "") //~ : возможна вложенность .replace(/ ?$/,"."); //Точка в конце предложения
.replace(/\[[0-9]{1,}\]/g, "") //ссылки [n] return true;
.replace(/^ *, */g, "") //^, ...
.replace(/ ?$/,".") //Точка в конце предложения
break;
}
}
//Разделение дефиниции на массив слов и знаков препинания
var current_word = "";
var tokens = new Array();
for (var l = 0; l <= definition.length; l++) {
if (/[^\wа-яА-Я]/.test(definition[l])) {
tokens.push(current_word);
tokens.push(definition[l]);
current_word = "";
continue;
} else {
current_word += definition[l];
}
} }
});
//Феминизация слов //Разделение дефиниции на массив слов и знаков препинания и феминизация слов
var true_definition = new Array(); var tokens = definition.match(/[\wа-яА-Яё]+|\d+| +|[^ \w\d\t]+/ig) || [];
tokens.forEach(function(word) {
true_definition.push((word.length > 3) ? make_feminitives(word)[0] : word);
});
//Замена местоимений, предлогов и проч. //Замена местоимений, предлогов и проч.
var article = FEM.words.convert(true_definition.join("")); HTML.full().innerHTML = FEM.words.convert(tokens.map(w => make_feminitives(w)[0]).join(""));
//DEBUG //DEBUG
console.log(tokens.join("")); console.log(definition);
console.log(true_definition); console.log(tokens);
console.log(article); }
HTML.full().innerHTML = article; //Запрос значения слова в викисловаре
} function get_wiktionary(term) {
var cors_url = "https://cors.now.sh/";
var wiki_url = cors_url + "https://ru.wiktionary.org/w/index.php?action=raw&title=" + term;
xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); var xmlhttp = window.XMLHttpRequest
? new XMLHttpRequest()
: new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange = function() { xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
parseWikiPage(xmlhttp.responseText); parseWikiPage(xmlhttp.responseText);
} }
} };
xmlhttp.open("GET", wiki_url, true); xmlhttp.open("GET", wiki_url, true);
xmlhttp.send(); xmlhttp.send();
@ -336,32 +345,11 @@ function tr(word) {
//Инициализация с разбором адресной строки //Инициализация с разбором адресной строки
function init(container) { function init(container) {
//Задание базового id для всех элементов HTML.init(container);
HTML.container = container; URL.parse();
//Конвертирование по нажатию <Enter>
HTML.input().addEventListener("keyup", function(event) {
event.preventDefault();
if (event.keyCode == 13) {
tr();
}
});
//Разбор адреса
querySt = function(option) {
gy = window.location.search.substring(1).split("&");
for (i=0; i < gy.length; i++) {
ft = gy[i].split("=");
if (ft[0] == option) {
return ft[1];
}
}
}
var query = decodeURIComponent(querySt("word")); if (URL.opt.word) {
if (query !== 'undefined') { HTML.input().value = URL.opt.word.replace(/\+/g," ");
HTML.input().value = query.replace(/\+/g," ");
tr(); tr();
} else { } else {
show_help(); show_help();

Loading…
Cancel
Save