reedach 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/rules.js +13 -0
- package/src/style.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reedach",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "Лёгкая проверка русского текста на канцелярит, штампы и воду: словарь правил, работает в браузере и в Node без зависимостей",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Dima Faller <dima@dimafaller.ru>",
|
package/src/rules.js
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
// Our own style rules, written from public advice on information style.
|
|
2
2
|
export const CATEGORIES={paronym:'Пароним',borrowing:'Заимствование',generalization:'Обобщение',euphemism:'Эвфемизм',preachy:'Назидание',filler:'Вода',slang:'Жаргон',stamp:'Штамп',bureaucratese:'Канцелярит',vague:'Неконкретно',evaluation:'Оценка',modality:'Модальность',intro:'Вводное',time:'Паразит времени',pleonasm:'Плеоназм',pronoun:'Местоимение',adjective:'Прилагательное',kotory:'«Который»',syntax:'Синтаксис',passive:'Страдательный залог',nominalization:'Отглагольное',repetition:'Повтор',length:'Длина',numbers:'Числа',structure:'Структура',mistake:'Частая ошибка',colloquial:'Просторечие',typography:'Типографика'};
|
|
3
|
+
// pattern: a regular expression over the lower-cased text (ё as е) for mistakes a word list cannot pin down.
|
|
4
|
+
const W='[а-яa-z]',NW='(?!'+W+')',BW='(?<!'+W+')';
|
|
5
|
+
// «что бы» is the conjunction before an infinitive or after «для того», but not after «не знаю, посоветуйте…»
|
|
6
|
+
// («не знаю, что бы почитать») and not in a question («что бы выбрать?»).
|
|
7
|
+
const ASK='(?:зна|дума|задума|подума|придума|реша|реши|выбира|выбра|выбер|спраш|спрос|посовет|совету|подскаж|подсказ|предлага|предлож|интересн|ищ|иска|гада|прикидыва|вспомина|вспомн|сообража|сообрази|понима|поня|угада|подбира|подобра|подбер)';
|
|
8
|
+
const NOT_INF='(?:опять|ведь|мать|дочь|путь|суть|часть|сеть|власть|смерть|память|пять|шесть|девять|десять|треть|кровать|тетрадь|площадь|лошадь|печать|зять|кисть|страсть|честь|месть|жесть|нить|рать)';
|
|
9
|
+
const INF=W+'*(?:ть|ться|чь|чься|(?:йти|идти|нести|вести|расти|спасти|цвести|плести|трясти|грести|пасти|везти|ползти)(?:сь)?)';
|
|
10
|
+
const CHTOBY='(?<='+BW+'для\\s+того,?\\s+)что\\s+бы'+NW+'|(?<!'+BW+ASK+W+'*,?\\s+)'+BW+'что\\s+бы(?=\\s+(?!'+W+'*ость'+NW+')(?!'+NOT_INF+NW+')'+INF+NW+')(?![^.!?…]*\\?)';
|
|
11
|
+
// «по-настоящему», «по-новому»: an adverb, unless a noun in the dative follows («по новому адресу», «по моему мнению»).
|
|
12
|
+
const PO='(?<!'+W+')по\\s+(?:настоящ|нов|стар|друг|разн|прежн|хорош|плох|честн|человеческ|дружеск|детск|взросл|домашн|летн|зимн|весенн|осенн|особ|всяк|ин|делов|прост|сво|мо|тво|наш|ваш)(?:ому|ему)(?!\\s+(?:же|ли|бы|шоссе|кафе|метро|радио|кино|такси|меню|депо|ателье|казино|фойе|бюро|пальто)'+NW+')(?=\\s*$|\\s*[^\\sа-яa-z0-9]|\\s+'+W+'*[а-зй-тф-эяa-z]'+NW+')';
|
|
3
13
|
export const RULES=[
|
|
4
14
|
// Time parasites
|
|
5
15
|
{id:'time-parasite-start',category:'time',start:true,message:'Вступление о нынешнем времени ничего не добавляет к предложению.',fix:'Убрать его или назвать конкретную дату или факт.',words:['в настоящее время','в настоящий момент','в наши дни','в наше время','в последнее время','в последние годы','нынче','до недавнего времени','в современном мире','в современных условиях']},
|
|
@@ -97,5 +107,8 @@ export const RULES=[
|
|
|
97
107
|
{id:'mistake-oplata',category:'mistake',message:'Оплачивают что-то, а платят за что-то: оплатить за услугу смешивает два оборота.',fix:'Писать оплатить работу или заплатить за работу. Оплатить за меня или за месяц вперёд — верно.',words:['оплатить за','оплатил за','оплатила за','оплатили за','оплачу за','оплатите за','оплачивать за','оплачиваем за','оплачивают за']},
|
|
98
108
|
{id:'mistake-oboih',category:'mistake',message:'Со словами женского рода пишут обеих, обеим, обеими.',fix:'Писать обеих сторон, обеим сторонам, обеими руками.',words:['обоих сторон','обоим сторонам','обоими сторонами','обоих рук','обоими руками']},
|
|
99
109
|
{id:'mistake-context',category:'mistake',message:'Если речь о времени или причине, пишется иначе: в течение, в продолжение, вследствие, несмотря на.',fix:'Оставить как есть, только если речь о течении реки, продолжении книги, следствии по делу или о том, кто куда смотрит.',words:['в течении','в продолжении','в следствии','не смотря на']},
|
|
110
|
+
{id:'mistake-chtoby',category:'mistake',message:'Союз чтобы пишется слитно. Раздельно что бы пишут, когда это вопрос о предмете: что бы ни случилось, что бы почитать.',fix:'Писать слитно, если подходит для того чтобы: чтобы рассказать, для того чтобы мы творили.',exact:true,swap:{'что бы':'чтобы'},pattern:CHTOBY},
|
|
111
|
+
{id:'mistake-takzhe',category:'mistake',message:'В значении и ещё пишется слитно: а также. Раздельно так же пишут при сравнении: так же, как раньше.',fix:'Писать а также, если можно заменить на и.',exact:true,swap:{'а так же':'а также'},pattern:BW+'а\\s+так\\s+же'+NW+'(?!\\s*,)(?![^.!?…]*'+BW+'как'+NW+')(?![^.!?…]*\\?)'},
|
|
112
|
+
{id:'mistake-po-hyphen',category:'mistake',message:'Наречие с по- и окончанием -ому или -ему пишется через дефис.',fix:'Писать по-настоящему, по-новому, по-моему. Раздельно — если дальше существительное: по новому адресу.',exact:true,swap:{'по *':'$1-$2'},pattern:PO},
|
|
100
113
|
{id:'colloquial-forms',category:'colloquial',message:'Просторечная форма: в письменном тексте выглядит как ошибка.',fix:'Литературно: их, класть или положить, поезжай, ездят, хотят, ляг, сейчас, его.',exact:true,swap:{'ихн':'их','ложить':'класть','ложит':'кладёт','ложишь':'кладёшь','ложат':'кладут','ложим':'кладём','ложите':'кладите, кладёте','ложил':'клал','ложила':'клала','ложили':'клали','ехай':'поезжай, езжай','ехайте':'поезжайте','едь':'поезжай','едьте':'поезжайте','ездию':'езжу','ездиют':'ездят','хочут':'хотят','ляжь':'ляг','ляжьте':'лягте','победю':'выиграю, одержу победу','щас':'сейчас','евонн':'его','евоный':'его','евоная':'его'},words:['ихн*','ложить','ложит','ложишь','ложат','ложим','ложите','ложил','ложила','ложили','ехай','ехайте','едь','едьте','ездию','ездиют','хочут','ляжь','ляжьте','победю','щас','евонн*','евоный','евоная']},
|
|
101
114
|
];
|
package/src/style.js
CHANGED
|
@@ -5,7 +5,7 @@ const norm=s=>s.toLowerCase().replace(/ё/g,'е');
|
|
|
5
5
|
const esc=s=>s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');
|
|
6
6
|
// "осуществл*" matches any ending; spaces between words may be any whitespace.
|
|
7
7
|
const tokenSource=t=>t.endsWith('*')?esc(norm(t.slice(0,-1)))+'['+L+']*':esc(norm(t));
|
|
8
|
-
function compile(rule){const alts=(rule.words||[]).map(w=>w.trim().split(/\s+/).map(tokenSource).join('\\s+'));return alts.length?new RegExp('(?<!['+L+'])(?:'+alts.join('|')+')(?!['+L+'])','g'):null;}
|
|
8
|
+
function compile(rule){if(rule.pattern)return new RegExp(rule.pattern,'g');const alts=(rule.words||[]).map(w=>w.trim().split(/\s+/).map(tokenSource).join('\\s+'));return alts.length?new RegExp('(?<!['+L+'])(?:'+alts.join('|')+')(?!['+L+'])','g'):null;}
|
|
9
9
|
// Paronyms: [forms, neighbours, where the neighbour stands (после, до, любой), right word, note]. Only the wrong
|
|
10
10
|
// word is marked, and only next to a neighbour that makes the mistake certain: «одеть пальто», not «одеть ребёнка».
|
|
11
11
|
const alt=list=>'(?:'+list.split('|').map(w=>w.trim().split(/\s+/).map(tokenSource).join('\\s+')).join('|')+')';
|