Browse Source

Феминизатор v1.0

master
Maxim Lihachev 9 years ago
commit
8da543026f
  1. 58
      css/feminitives.css
  2. 55
      gofem.html
  3. 248
      js/feminitives.js

58
css/feminitives.css

@ -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;
}

55
gofem.html

@ -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>

248
js/feminitives.js

@ -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…
Cancel
Save