commit
8da543026f
3 changed files with 361 additions and 0 deletions
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
.ending { |
||||
color: olive; |
||||
} |
||||
|
||||
.queer { |
||||
color: MediumOrchid; |
||||
} |
||||
|
||||
#definition { |
||||
text-align: center; |
||||
height: 40px; |
||||
font-size: 18px; |
||||
} |
||||
|
||||
#definition-card { |
||||
width: 50%; |
||||
margin: 0 auto; |
||||
border-top: solid 3px; |
||||
border-bottom: solid 3px; |
||||
border-color: MediumOrchid; |
||||
height: 220px; |
||||
width: 400px; |
||||
} |
||||
|
||||
#definition-card h1 { |
||||
position: relative; |
||||
text-align: right; |
||||
margin-top: 204px; |
||||
margin-right: 15px; |
||||
height: 20px; |
||||
line-height: 20px; |
||||
font-size: 14px; |
||||
color: MediumOrchid; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
#definition-card h1 span{ |
||||
background-color: white; |
||||
padding-left: 5px; |
||||
padding-right: 5px; |
||||
} |
||||
|
||||
#definition-content { |
||||
position: relative; |
||||
margin-top: -150px; |
||||
text-align: center; |
||||
font-size: 36px; |
||||
color: black; |
||||
font-weight: regular; |
||||
text-transform: capitalize; |
||||
} |
||||
|
||||
#definition-full { |
||||
font-style: italic; |
||||
font-size: 12px; |
||||
height: 20px; |
||||
} |
||||
|
@ -0,0 +1,55 @@
@@ -0,0 +1,55 @@
|
||||
<!doctype html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<title></title> |
||||
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet"> |
||||
<link href="css/feminitives.css" rel="stylesheet"> |
||||
</head> |
||||
|
||||
<body> |
||||
<div class="row"> |
||||
<div class="col-md-3"></div> |
||||
<div class="col-md-6 text-center"> |
||||
<br /> |
||||
<h4>Больше феминитивов богинюшке</h4> |
||||
<em><small>Каждый раз, когда вы создаёте феминитив, в мире умирает одна ♂-мразь.</small></em> |
||||
<br /> |
||||
|
||||
<div class="input-group" style="text-align: center;"> |
||||
<input id="word" type="text" class="form-control" placeholder="Нормальное слово" value="металлург"> |
||||
<span class="input-group-btn"> |
||||
<button class="btn btn-success" type="button" onclick="tr('word', 'definition')"> |
||||
Феминитивь! |
||||
</button> |
||||
</span> |
||||
</div> |
||||
</div> |
||||
<div class="col-md-3"></div> |
||||
</div> |
||||
|
||||
<div class="row"> |
||||
<div class="col-md-3"></div> |
||||
<div class="col-md-6 text-center"> |
||||
<br /> |
||||
<div id="definition"></div><br /> |
||||
<div id="definition-full"></div><br /> |
||||
<div id="definition-card"> |
||||
<h1><span> ф — феминитивы </span></h1> |
||||
<div id="definition-content"></div> |
||||
</div> |
||||
|
||||
</div> |
||||
<div class="col-md-3"></div> |
||||
</div> |
||||
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> |
||||
<script src="js/bootstrap.min.js"></script> |
||||
<script src="js/feminitives.js"></script> |
||||
</body> |
||||
</html> |
||||
|
@ -0,0 +1,248 @@
@@ -0,0 +1,248 @@
|
||||
// [ ] TODO: сохранение изображения
|
||||
// [ ] TODO: разбор переданного адреса
|
||||
// [ ] TODO: vk.com
|
||||
// [ ] TODO: валидация
|
||||
// [ ] TODO: jQuery (?)
|
||||
|
||||
//Подготовка запросов к cors.how.sh
|
||||
$.ajaxPrefilter(function (options) { |
||||
if (options.crossDomain && jQuery.support.cors) { |
||||
var http = (window.location.protocol === 'http:' ? 'http:' : 'https:'); |
||||
options.url = http + '//cors.now.sh/' + options.url; |
||||
} |
||||
}); |
||||
|
||||
var FEM = {}; |
||||
|
||||
//Правила создания феминитивов
|
||||
FEM.endings = { |
||||
'ка' : [ |
||||
['[аео]р', 0], |
||||
['ан', 0], |
||||
['рг', 1], |
||||
['ст', 0], //специалист -> специалистка
|
||||
['ец', 2] //канадец -> канадка
|
||||
], |
||||
'иня' : [ |
||||
['[аео]р', 0], |
||||
['[ои]к', 0], |
||||
['ог', 0], //биолог -> биологиня
|
||||
['рг', 0], |
||||
['ач', 0], //врач -> врачиня
|
||||
['ст', 0], //специалист -> специалистиня
|
||||
['ец', 2] //канадец -> канадиня
|
||||
], |
||||
'киня' : [ |
||||
['[аео]р', 0], |
||||
['ок', 0], |
||||
['ст', 0], //специалист -> специалисткиня
|
||||
['ан', 0] |
||||
], |
||||
'есса' : [ |
||||
['[аео]р', 0], |
||||
['[ои]к', 0], |
||||
['ог', 0], //биолог -> биологиня
|
||||
['ан', 0], |
||||
['рг', 0], |
||||
['ач', 0], //врач -> врачесса
|
||||
['ый', 2], //учёный -> учёнесса
|
||||
['ст', 0], //специалист -> специалистесса
|
||||
['ец', 2] //канадец -> канадесса
|
||||
], |
||||
'ица' : [ |
||||
['[аео]р', 0], |
||||
['уч', 0], |
||||
['ик', 2], |
||||
['ог', 0], //биолог -> биологиня
|
||||
['ан', 0], |
||||
['ив', 0], |
||||
['рг', 0], |
||||
['ач', 0], //врач -> врачица
|
||||
['ст', 2], //специалист -> специалица
|
||||
['ец', 2] //канадец -> канадица
|
||||
], |
||||
'ница' : [ |
||||
['ль', 0], |
||||
['ец', 2] //канадец -> канадница
|
||||
], |
||||
'ая' : [ |
||||
['[ыи]й', 2], //учёный -> учёная, знающий -> знающая
|
||||
], |
||||
//----- ДАЛЬШЕ ИДЁТ ШИЗА -----
|
||||
'ии' : [ |
||||
['и[ия]', 2], //металлургии -> металлург_ии, произведения -> произведении
|
||||
], |
||||
'ми' : [ |
||||
['ми', 2] //знаниями -> знания_ми
|
||||
], |
||||
'ой' : [ |
||||
['го', 3] //художественного -> художественн_ой
|
||||
], |
||||
'инь' : [ |
||||
['ей', 2] //людей -> люд_ей
|
||||
], |
||||
'ти' : [ |
||||
['ти', 2] //области -> облас_ти
|
||||
], |
||||
'ю' : [ |
||||
['ью', 2] //матерью -> матерь_ю
|
||||
], |
||||
}; |
||||
|
||||
//Слова для замены
|
||||
FEM.words = { |
||||
'тот' : 'т_а', |
||||
'того' : 'т_у', |
||||
'кто' : 'котор_ая', |
||||
'её' : 'е_ё', |
||||
'ее' : 'е_е', |
||||
'ий' : 'ая' |
||||
}; |
||||
|
||||
FEM.words.convert = function(string) { |
||||
for (var fem_w in this) { |
||||
string = string.replace(new RegExp(fem_w, "ig"), this[fem_w]) |
||||
.replace(/(.)/, s => s.toUpperCase()); |
||||
} |
||||
return string; |
||||
} |
||||
|
||||
//Первый элемент списка - окончание (в виде регулярного выражения)
|
||||
function ending(tuple) { |
||||
return new RegExp("^.*" + tuple[0] + "$", "i"); |
||||
} |
||||
|
||||
//Второй элемент списка - смещение
|
||||
function offset(tuple) { |
||||
return tuple[1]; |
||||
} |
||||
|
||||
//Случайный элемент списка
|
||||
function random_word(wordlist) { |
||||
return wordlist[Math.floor(Math.random() * wordlist.length)]; |
||||
} |
||||
|
||||
//Оборачивание в <span> с указанным классом
|
||||
function html_wrap(str, cl) { |
||||
return "<span class=\"" + cl + "\">" + str + "</span>"; |
||||
} |
||||
|
||||
//Цветовое выделение текста
|
||||
function css_end(ending) { return html_wrap(ending, "text-warning"); } |
||||
|
||||
//Символ gender gap
|
||||
function css_gender_gap() { return html_wrap(' \u26A7 ', "queer"); } |
||||
|
||||
//Конструирование феминитива с gender_gap
|
||||
function construct_feminitive(stem, ending, gap) { |
||||
if (gap) { |
||||
return stem + css_gender_gap() + css_end(ending); |
||||
} else { |
||||
return stem + "_" + ending; |
||||
} |
||||
} |
||||
|
||||
//Создание феминитива
|
||||
function make_feminitives(word) { |
||||
var stem = ""; //Основа слова
|
||||
var current_ending = word.slice(-2); //Текущее окончание
|
||||
var feminitives = new Array(); //Массив феминитивов
|
||||
var femicards = new Array(); //Массив феминитивов для карточки
|
||||
|
||||
for (var fem_ending in FEM.endings) { |
||||
FEM.endings[fem_ending].forEach(function(end) { |
||||
if (ending(end).test(current_ending)) { |
||||
//Удаление лишних букв из основы
|
||||
stem = offset(end) == 0 ? word : word.slice(0, -offset(end)); |
||||
|
||||
//Добавление фем-варианта слова в массив
|
||||
feminitives.push(construct_feminitive(stem, fem_ending, 1)); |
||||
femicards.push(construct_feminitive(stem, fem_ending, 0)); |
||||
} |
||||
}); |
||||
}; |
||||
//При отсутствии феминитивов считать корректным исходное слово
|
||||
if (feminitives.length === 0) { |
||||
femicards.push(word); |
||||
}; |
||||
|
||||
var femicard = random_word(femicards); |
||||
|
||||
return [femicard, feminitives]; |
||||
} |
||||
|
||||
//Запрос значения слова в викисловаре
|
||||
function get_wiktionary(term, ui) { |
||||
var wiki_url = "https://ru.wiktionary.org/w/index.php?title=" + term + "&action=raw"; |
||||
|
||||
return $.get(wiki_url, function (data) { |
||||
var wiki = data.split("\\n"); |
||||
var definition = ""; |
||||
|
||||
for(var line = 0; line < wiki.length; line++){ |
||||
if (wiki[line].match(/^.*==== Значение ====.*$/)) { |
||||
console.log(wiki[line+1]); //DEBUG
|
||||
definition = wiki[line+1] |
||||
.replace(/^# ?/, "") //# дефиниция
|
||||
.replace(/\[{2}([^\]\|]*)\]{2}/g, "$1") //[[1]]
|
||||
.replace(/\[{2}[^\|]*\|([^\]]*)\]{2}/, "$1") //[[1|2]]
|
||||
.replace(/\[{2}([^\]\|]*)\}{2}/g, "$1") //{{1}}
|
||||
.replace(/\{{2}[^\{\}]*\}{2} ?/g, "") //{{1|2}}
|
||||
.replace(/\{{2}[^\{\}]*\}{2} ?/g, "") //~ : возможна вложенность
|
||||
.replace(/\[[0-9]{1,}\]/g, "") //ссылки [n]
|
||||
.replace(/ ?$/,".") //Точка в конце предложения
|
||||
break; |
||||
} |
||||
} |
||||
|
||||
var w = ""; |
||||
var ww = new Array(); |
||||
for (var l = 0; l <= definition.length; l++) { |
||||
if (/[^\wа-яА-Я]/.test(definition[l])) { |
||||
ww.push(w); |
||||
ww.push(definition[l]); |
||||
w = ""; |
||||
continue; |
||||
} else { |
||||
w += definition[l]; |
||||
} |
||||
} |
||||
|
||||
var dd = new Array(); |
||||
ww.forEach(function(word) { |
||||
if (word.length > 2) { |
||||
dd.push(make_feminitives(word)[0]); |
||||
} else { |
||||
dd.push(word); |
||||
} |
||||
}); |
||||
|
||||
//DEBUG
|
||||
console.log(ww.join("")); |
||||
console.log(dd); |
||||
|
||||
//Замена местоимений, предлогов и проч.
|
||||
var article = FEM.words.convert(dd.join("")); |
||||
console.log(article); |
||||
|
||||
$("#" + ui).html(article); |
||||
}); |
||||
} |
||||
|
||||
//Создание и вывод феминитива
|
||||
function tr(word, descr) { |
||||
//Исходное слово
|
||||
var wd = $("#" + word).val().trim().split(" ")[0]; |
||||
|
||||
//Вывод дефиниции
|
||||
get_wiktionary(wd, descr + "-full"); |
||||
|
||||
$("#" + descr).empty(); |
||||
|
||||
var feminitives = make_feminitives(wd); |
||||
|
||||
//Вывод информации
|
||||
$("#" + descr).html(feminitives[1].join(" | ")); |
||||
$("#" + descr + "-content").html(feminitives[0]); |
||||
} |
||||
|
Loading…
Reference in new issue