lightproof/ 0000755 0001750 0001750 00000000000 13231171777 011710 5 ustar rene rene lightproof/VERSION 0000644 0001750 0001750 00000000004 13231171520 012734 0 ustar rene rene 1.6
lightproof/description.xml 0000644 0001750 0001750 00000001331 13231171520 014735 0 ustar rene rene
${name}
${provider}
lightproof/src/ 0000755 0001750 0001750 00000000000 13231171520 012461 5 ustar rene rene lightproof/src/hu_HU/ 0000755 0001750 0001750 00000000000 13231171520 013471 5 ustar rene rene lightproof/src/hu_HU/hu_HU.dlg 0000644 0001750 0001750 00000010316 13231171520 015172 0 ustar rene rene # Options and title texts for the Settings and conditional rules
#
# The Lightproof dialogs contain only grouped checkboxes.
#
# Format of the dialog definition:
#
# GroupID: OptionID, OptionID ...
# Group2ID: OptionID, OptionID ...
# ...
# [Language_code=title of the window]
# OptionID=title of the option
# Option2ID=title of the option
#
# The first language is the default language for other locales
# (use en_US or the common language of your country)
#
# The OptionIDs declared here are used in the rules, too. For example:
#
# foo <- option("style") -> bar # bar is far better
#
# this rule depends from the state of the "style" checkbox.
# options (starred options are default checked ones)
spelling: cap par, quot wordpart, *dash comma, numpart grammar
proofreading: style *dup0, compound dup, allcompound dup2, *money dup3, SI hyphen
typography: *apost *spaces frac ligature, elli spaces2 thin noligature, idx minus - -
# titles
[en_US=Hungarian sentence checking]
spelling=Spelling
cap=Capitalization
par=Parentheses
wordpart=Word parts of compounds
comma=Comma usage
proofreading=Proofreading
style=Style checking
compound=Underline typo-like compound words
allcompound=Underline all generated compound words
grammar=Possible mistakes
money=Consistency of money amounts
duplication=Word duplication
dup0=Word duplication
dup=Duplication within clauses
dup2=Duplication within sentences
dup3=Allow previous checkings with affixes
numpart=Thousand separation of numbers
typography=Typography
quot=Quotation marks
apost=Apostrophe
dash=En dash
elli=Ellipsis
ligature=Ligature suggestion
noligature=Underline ligatures
frac=Fractions
thin=Thin space
spaces=Double spaces
spaces2=More spaces
idx=Indices
minus=Minus
SI=Measurements
hyphen=Hyphenation of ambiguous words
[hu_HU=Magyar mondatellenőrzés]
spelling=Helyesírás
cap=Nagy kezdőbetű\nMondatok nagy kezdőbetűjének ellenőrzése.
par=Zárójelek\nZárójelpárok ellenőrzése.
wordpart=Egybe- és különírási javaslatok
comma=Vesszőhasználatra vonatkozó javaslatok\nA valószínűleg hiányzó és felesleges vesszők jelzése.
numpart=Nagy számok tagolása szóközökkel\nEzrestagolás nem-törő szóközökkel (10000 → 10 000).
proofreading=Korrektúra
style=Stílusellenőrzés
compound=Egyszerű nem szótári összetett szavak\nRövid, vagy rövid tagot tartalmazó, szóösszetételi szabályok alapján gyakran hibásan elfogadott alakok aláhúzása.
allcompound=Minden nem szótári összetett szó\nMinden szóösszetételi szabály alapján elfogadott alak aláhúzása.
grammar=Javaslat kevésbé egyértelmű esetben is
dup0=Szóismétlés\nSzóismétlés egymást közvetlenül követő szavak esetében.
dup=Szóismétlés tagmondaton belül
dup2=Szóismétlés mondaton belül
dup3=Szóismétlés eltérő toldalékok esetén is
money=Számok és átírásuk\nA számmal és számnévvel is leírt mennyiség megegyezik-e? (Pl. 10, azaz tíz Ft.)
typography=Tipográfia
quot=Idézőjelek\nA magyar „külső” és »belső« idézőjelek ellenőrzése.
apost=Aposztróf\nAz írógépes aposztróf cseréje a tipográfiailag megfelelőre (' → ’).
dash=Nagykötőjel és gondolatjel\nA kiskötőjel cseréje a nagykötőjelre (- → –).
elli=Három pont\nHárom pont cseréje az egalizált három pont karakterre (...→…).
frac=Törtek\nPerjellel elválasztott törtek cseréje Unicode karakterre (1/2 → ½).
thin=Keskeny szóköz\nKeskeny szóköz (spácium) használata ezrestagoláshoz és más esetekben.
ligature=f-ligatúra javaslata\nCsere Unicode f-ligatúrára.
noligature=f-ligatúra tiltása\nUnicode f-ligatúra cseréje különálló betűkre.
spaces=Dupla szóköz\nKét vagy három ismétlődő szóköz cseréje egyre.
spaces2=Sok szóköz\nNégy vagy több ismétlődő szóköz cseréje egy tabulátorra.
idx=Indexek\nSzámok cseréje mértékegységekben és kémiai képletekben valódi indexekre (m2 → m²).
minus=Mínuszjel\nKötőjelek cseréje Unicode mínuszjelre a számok előtt.
SI=Mértékegységek\nNem SI mértékegységek átalakítása (°F, mérföld, yard, láb, hüvelyk, gallon, pint, font súlyú).
hyphen=Hiányzó elválasztás megadása\nNem egyértelműen elválasztható szóalakok elválasztásának megadása (pl. megint, fölül).
lightproof/src/hu_HU/hu_HU.dat 0000644 0001750 0001750 00000153217 13231171520 015204 0 ustar rene rene # magyar szabályok (írta: Németh László)
###################### szóismétlés ###################
a a -> a # Szóismétlés.
és és -> és # Szóismétlés.
############## hogy (l. még vesszőhasználat) #########
hogy[ -]hogy nem -> hogyhogy nem/hogy, hogy nem # Hiányzó vessző vagy egybeírás
hogy-hogy -> hogyhogy # Egybeírás.
[char]
# hogy előtt vessző (csak igékre és főnevekre, vessző ne kövesse, mint a hogy, hogy nemben
([-\w]+) hogy\b(?![-]) <- word(1) and morph(\1, r"po:(vrb|noun)\b") and not \1 in [u"feltéve", "kell"] -> \1, hogy # Hiányzó vessző?
[word]
# még több vessző
([-\w]+) hogy <- option("comma") and
not re.match(u"(feltéve|ahelyett|anélkül|aszerint|hogy)$", \1)
-> \1, hogy # Hiányzó vessző?
# túl sok vessző
([-\w]+), (ahelyett|anélkül|aszerint), hogy -> \1, \2 hogy|\1 \2, hogy # Kötőszószerű kapcsolat esetén nem írunk a „hogy” elé vesszőt. | http://helyesiras.mta.hu/helyesiras/default/akh12#244
([-\w]+), illetve, (ha|hogy) -> \1, illetve \2 # Kötőszószerű kapcsolat esetén nem írunk az „illetve” után vesszőt. | http://helyesiras.mta.hu/helyesiras/default/akh12#244
###################### nagybetűsítés #################
[code]
abbrev=re.compile(r"(?i)\b([a-zöüóőúéáűíÖÜÓŐÚÉÁŰÍ]|Áe|Áht|AkH|al|ált|ápr|aug|Avtv|bek|Bp|br|bt|Btk|cca|ci(i|ii|v|x)?|cl(i|ii|iii|iv|ix|v|vi|vii|viii|x|xi|xii|xiii|xiv|xix|xv|xvi|xvii|xviii|xx|xxi|xxii|xxiii|xxiv|xxix|xxv|xxvi|xxvii|xxviii|xxx|xxxi|xxxii|xxxiii|xxxiv|xxxix|xxxv|xxxvi|xxxvii|xxxviii)?|Co|cv(i|ii|iii)?|cx(c|ci|cii|ciii|civ|cix|cv|cvi|cvii|cviii|i|ii|iii|iv|ix|l|li|lii|liii|liv|lix|lv|lvi|lvii|lviii|v|vi|vii|viii|x|xi|xii|xiii|xiv|xix|xv|xvi|xvii|xviii|xx|xxi|xxii|xxiii|xxiv|xxix|xxv|xxvi|xxvii|xxviii)?|cs|Csjt|Cstv|csüt|dec|dk|dny|dr|du|dz(s)?|egy|ék|ÉKsz|em|ény|Épt|érk|etc|Etv|eü|ev|évf|febr|felv|Flt|ford|főisk|fsz(la|t)?|Ftv|gimn|gör|gr|Gt|gy|Gyvt|habil|hg|hiv|Hjt|honv|Hpt|hrsz|hsz|Hszt|htb|id|ifj|ig(h)?|ii(i)?|ill|Inc|ind|isk|iv|ix|izr|jan|jegyz|júl|jún|kat|kb|Kbt|ker|kft|kgy|kht|kir|kiv|Kjt|kk(t)?|koll|korm|köv|kp|Kr|krt|Kt(v)?|ld|li(i|ii|v|x)?|Ltd|ltp|Ltv|luth|lv(i|ii|iii)?|lx(i|ii|iii|iv|ix|v|vi|vii|viii|x|xi|xii|xiii|xiv|xix|xv|xvi|xvii|xviii|xx|xxi|xxii|xxiii|xxiv|xxix|xxv|xxvi|xxvii|xxviii)?|ly|máj|márc|mat|max|mb|megh|megj|MHSz|min|mk|Mo|Mt|NB|nov|ny(á)?|Nyilv|nyrt|okl|okt|olv|op|orsz|ort|ov(h)?|össz|Ötv|özv|Pf|pl(d)?|prof|prot|Ptk|pu|ref|rk(p)?|róm|röv|rt|sgt|spec|stb|sz(ept|erk)?|Szjt|szoc|Szt(v)?|szül|Tbj|tc|tel|tkp|tszf|tvr|ty|ua|ui|úm|ún|uo|Ve|Vhr|vi(i|ii)?|vö|vsz|Vt(v)?|xc(i|ii|iii|iv|ix|v|vi|vii|viii)?|xi(i|ii|v|x)?|xl(i|ii|iii|iv|ix|v|vi|vii|viii)?|xv(i|ii|iii)?|xx(i|ii|iii|iv|ix|v|vi|vii|viii|x|xi|xii|xiii|xiv|xix|xv|xvi|xvii|xviii)?|zrt)\.")
# pattern for paragraph checking
paralcap = re.compile(u"(?u)^[a-zöüóőúéáűí].*[.?!] [A-ZÖÜÓŐÚÉÁŰÍ].*[.?!][)”]?$")
[word]
low [a-zöüóőúéáűí]+
^{low} <- paralcap.search(TEXT) and not abbrev.search(TEXT) -> = {low}.capitalize() # Hiányzó nagy kezdőbetű?
# optional sentence capitalization
^{low} <- option("cap") and not abbrev.search(TEXT) -> = {low}.capitalize() # Hiányzó nagy kezdőbetű?
###################### központozás ###################
[char]
abc [a-zöüóűőúéáí]
ABC [A-ZÖÜÓŰŐÚÉÁÍ]
Abc [a-zöüóűőúéáíA-ZÖÜÓŰŐÚÉÁÍ]
word [a-zöüóűőúéáíA-ZÖÜÓŰŐÚÉÁÍ]+
punct [?!,:;%‰‱°„”]
"^[-—] " <- option("dash") -> "– " # A gondolatjel nagykötőjel | http://helyesiras.mta.hu/helyesiras/default/akh12#240l
" [-—]([ ,;])" <- option("dash") -> " –\1" # A gondolatjel nagykötőjel | http://helyesiras.mta.hu/helyesiras/default/akh12#240l
# És - hogy is mondjam -, jó. -> És – hogy is mondjam –, jó.
^[-–]{word} <- option("dash") -> – {word} # Gondolatjel szóközzel a felsorolásnál | http://helyesiras.mta.hu/helyesiras/default/akh12#259
"[[][.][.][.]]" <- option("elli") -> […] # Három pont | http://helyesiras.mta.hu/helyesiras/default/akh12#241b
# [...] -> […]
[.][.][.] <- option("elli") -> … # Három pont | http://helyesiras.mta.hu/helyesiras/default/akh12#241b
# Vége... -> Vége…
" +([.?!,:;)”])\b" -> "\1 " # Felcserélt szóköz és írásjel?
" +([.?!,:;)”])" -> \1 # Szóköz nélkül tapadó írásjel | http://helyesiras.mta.hu/helyesiras/default/akh12#240
# A ( kicsit ) más. -> A (kicsit) más.
E ( |$) # space or end of sentence
"[:,;]([.?!,;:]){E}" -> \1{E} # Felesleges írásjel.
"\b[.][.]{E}" -> .{E}|…{E} # Pont vagy három pont? | http://helyesiras.mta.hu/helyesiras/default/akh12#241b
#"\b[.]([?!]){E}" -> \1{E} # Felesleges írásjel.
# És,, stb.? -> És, stb.?
# És.. -> És.|…
(\w){punct}{Abc} -> \1{punct} {Abc} # Hiányzó szóköz?
{abc}[.]{ABC} -> {abc}. {ABC} # Hiányzó szóköz?
# macska,bár -> macska, bár
# macska.Bár -> macska. Bár
(^|\b|{punct}|[.]) {2,3}(\b|$) <- option("spaces") -> "\1 " # Felesleges szóköz.
# dupla szóköz. Itt három. -> dupla szóköz. Itt három.
(^|\b|{punct}|[.]) {4,}(\b|$) <- option("spaces2") -> "\1 |\1 " # Szóközök cseréje egy szóközre vagy tabulátorra:
(?i)(\d+)(x| x )(\d+(-\w+)?) -> \1×\3|\1 · \3 # Szorzásjel. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#275.
# a · jelet kivették a 12-ből, × nincs és nem is volt. most mi legyen?
# 5 x 6 -> 5 × 6
# 800x600-as -> 800×600-as
b {Abc}*
(?i){word}['´]{b} <- option("apost") -> {word}’{b} # Valódi aposztróf. | http://helyesiras.mta.hu/helyesiras/default/akh12#275
# biz' isten -> biz’ isten
# ’79-ben
['´](\d\d(-\w+)?) <- option("apost") -> ’\1 # Valódi aposztróf. | http://helyesiras.mta.hu/helyesiras/default/akh12#275
[)] <- option("par") and not "(" in TEXT -> # Felesleges zárójel?
######################## idézés ######################
(?i)[\"“”‟„]({word}[^\"“”‟„]*)[\"“‟] <- option("quot") -> „\1” # Idézőjelek. | http://helyesiras.mta.hu/helyesiras/default/akh12#240j
(?i)[\"“”‟]({word}[^\"“”‟„]*)[\"“”‟] <- option("quot") -> „\1” # Idézőjelek. | http://helyesiras.mta.hu/helyesiras/default/akh12#240j
# A "kicsi" macska. -> A „kicsi” macska.
# ASCII idézőjelek cseréje (,,vmi'', >>vmi<<)
(?i),,({word}[^\"“”‟„><']*)'' -> „\1” # Idézőjelek. | http://helyesiras.mta.hu/helyesiras/default/akh12#240j
(?i)>>({word}[^\"“”‟„><']*)<< -> »\1« # Idézőjelek. | http://helyesiras.mta.hu/helyesiras/default/akh12#240j
# angolszász idézőjelek cseréje
(?i)‘+({word}[^\"“”‟„’]*)’+ -> „\1”|»\1« # Idézőjelek. | http://helyesiras.mta.hu/helyesiras/default/akh12#240j
[Word]
"([(„»]) +" -> \1 # Szóköz nélkül tapadó írásjel. | http://helyesiras.mta.hu/helyesiras/default/akh12#240
" +([«])" -> \1 # Szóköz nélkül tapadó írásjel. | http://helyesiras.mta.hu/helyesiras/default/akh12#240
(?i)«({word}[^\"“”‟„’]*)» -> »\1« # Felcserélt belső idézőjelek. | http://helyesiras.mta.hu/helyesiras/default/akh12#240j
############### pénz #################################
[Word]
# 1 Ft (azaz két forint) -> 1 Ft (azaz egy forint)
# 200.000,- Ft, azaz egyszázezer forint -> 100.000,- Ft, azaz kétszázezer forint
(\d[\d .]*)(,?(?:[-–]|00?)? Ft(?:-\w+)?(?: \(|, )(?:azaz|vagyis) )([-\w]+)( forint\w*\)?) <- option("money") and
# test NUMBERTEXT function access
calc("NUMBERTEXT", ("1", "hu")) and
calc("NUMBERTEXT", (re.sub(u"[ .]", "", \1), "hu")).replace(u"kettő", u"két").replace(u"ezeregyszáz", u"ezerszáz") !=
# változatok: száz vagy egyszáz, ezer vagy egyezer, kettő vagy két
re.sub(r"\begy(száz|ezer)", r"\g<1>", \3).replace(u"ezeregyszáz", u"ezerszáz").replace(u"kettő", u"két")
-> = \1 + \2 + calc("NUMBERTEXT", (re.sub(u"[ .]", "", \1), "hu")) + \4
# A két összeg nem egyezik.
#################### ritkított szöveg ################
# r i t k í t o t t -> ritkított
({Abc}[ ]){4,}{Abc}\b <- option("thin") -> =re.sub("[ ]", "", \0) + "\n" + re.sub("[ ]", " ", \0) # Ritkítás nélkül vagy nem törő keskeny szóközökkel:
######################## számok ######################
[Word]
# nagy számok tagolása nem törő szóközökkel (U+00A0)
d1 −?\d{1,3} # 1, 2 vagy 3 számjegy (opcionális mínusszal)
d2 −?\d{2,3} # 2 vagy 3 számjegy (opcionális mínusszal)
d3 \d{3} # 3 számjegy
dn \d{3}(?![ ][0-9])(,\w{1,4})?[%‰‱°]?(-\w+)? # 3 számjegy, toldalékkal is
{d2}{dn} <- option("numpart") and not option("thin") -> {d2} {dn} # Nagy számok tagolása. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
{d1}{d3}{dn} <- option("numpart") and not option("thin") -> {d1} {d3} {dn} # Nagy számok tagolása. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
{d1}{d3}{d3}{dn} <- option("numpart") and not option("thin") -> {d1} {d3} {d3} {dn} # Nagy számok tagolása. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
# Az 1234567890 -> Az 1 234 567 890
# nagy számok tagolása nem törő keskeny szóközökkel (U+202F) (thin opciótól függően)
{d2} ?{dn} <- option("numpart") and option("thin") -> {d2} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
{d1} ?{d3} ?{dn} <- option("numpart") and option("thin") -> {d1} {d3} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
{d1} ?{d3} ?{d3} ?{dn} <- option("numpart") and option("thin") -> {d1} {d3} {d3} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
# nagy számok tagolása nem törő szóközökkel (U+00A0)
d1 \d{1,3} # 1, 2 vagy 3 számjegy (opcionális mínusszal)
d2 \d{2,3} # 2 vagy 3 számjegy (opcionális mínusszal)
d3 \d{3} # 3 számjegy
dn \d{3}(,\w+)?[%‰‱°]?(-\w+)? # 3 számjegy, toldalékkal is
-{d2}{dn} <- option("numpart") and not option("thin") -> −{d2} {dn} # Nagy számok tagolása. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
-{d1}{d3}{dn} <- option("numpart") and not option("thin") -> −{d1} {d3} {dn} # Nagy számok tagolása. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
-{d1}{d3}{d3}{dn} <- option("numpart") and not option("thin") -> −{d1} {d3} {d3} {dn} # Nagy számok tagolása. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
# nagy számok tagolása nem törő keskeny szóközökkel (U+202F)
-{d2} ?{dn} <- option("numpart") and option("thin") -> −{d2} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
-{d1} ?{d3} ?{dn} <- option("numpart") and option("thin") -> −{d1} {d3} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
-{d1} ?{d3} ?{d3} ?{dn} <- option("numpart") and option("thin") -> −{d1} {d3} {d3} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. | http://helyesiras.mta.hu/helyesiras/default/akh12#274
([-−]?\d[\d,]*)[ ]([%‰‱°](-\w*)?)
-> \1\2 # Szóköz nélkül tapadó írásjel. | http://helyesiras.mta.hu/helyesiras/default/akh12#275
([-−]?\d\d*)[.](\d\d*)\b(?![.])([%‰‱°](-\w*)?) <- option("comma")
-> \1,\2\3 # Tizedesvessző a helyes írásjel. | http://helyesiras.mta.hu/helyesiras/default/akh12#293
(\d\d*)[.](\d)\b(?![.])
# kivéve, ha tulajdonnév előzi meg (pl. Firefox 3.5
<- option("comma") and (not word(-1) or not re.match("[A-Z]", word(-1)))
-> \1,\2|\1.\2. # Tizedestört vagy sorszám? | http://helyesiras.mta.hu/helyesiras/default/akh12#293
((\d\d*[.]){2}\d)\b(?![.])
# kivéve, ha tulajdonnév előzi meg (pl. Hunspell 1.2.8,
<- option("comma") and option("grammar") and not word(-1) or not re.match("[A-Z]", word(-1))
-> \1. # A sorszámot pont követi.
(\d\d\d+)[.](\d\d)\b(?![.]) <- option("comma")
-> \1,\2|\1.\2. # Tizedestört vagy sorszám? | http://helyesiras.mta.hu/helyesiras/default/akh12#293
# 25.30˚, de 10.20-kor -> 25,30˚, de 10.20-kor
# 1.5 -> 1,5|1.5.
# 123.5 -> 123,5|123.5.
# mínuszjel
-(\d+([ ]\d\d\d){0,3}(,\d+)?[%‰‱°]?(-\w+)?) <- option("minus") -> −\1 # Mínuszjel kiskötőjel helyett.
-(\d+([ ]\d\d\d){0,3})[.](\d+[%‰‱°]?(-\w+)?) <- option("minus") -> −\1,\2 # Mínuszjel és tizedesvessző. | http://helyesiras.mta.hu/helyesiras/default/akh12#293
(−\d+([ ]\d\d\d){0,3})[.](\d+[%‰‱°]?(-\w+)?) -> \1,\2 # Tizedesvessző pont helyett. | http://helyesiras.mta.hu/helyesiras/default/akh12#293
######################## fok #########################
[word]
# 12°-kal
([-−]?\d+(?:,\d+)?)[ ](°(-\w+)) -> \1\2 # Szóköz nélkül tapadó írásjel | http://helyesiras.mta.hu/helyesiras/default/akh12#240
# 12 °C-kal
([-−]?\d+(?:,\d+)?)((°C|°F|℃|℉)(-\w+)?) -> \1 \2 # Nem törő szóközzel elválasztott mértékegység.
######################## %-al ########################
# 10%-al, 10-20%-al
(([-−]?\d+(,\d+)?[-–])?[-−]?\d+(,\d+)?)%-al -> \1%-kal # Hiányos toldalék.
######################## dátumok #####################
[word]
year [12]\d\d\d
monthnum 0?[1-9]|1[012]
month január|február|március|április|május|június|július|augusztus|szeptember|október|november|december|jan[.]|febr[.]|márc[.]|ápr[.]|máj[.]|jún[.]|júl[.]|aug[.]|szept[.]|okt[.]|nov[.]|dec[.]
Month Január|Február|Március|Április|Május|Június|Július|Augusztus|Szeptember|Október|November|December
day [12]\d|3[01]|0?[1-9]
notmonthposs (|[^-–jaáeé][a-zöüóűőúéáí]*)
# 2010 június-július
notmonthcomp [-–]{month}{notmonthposs}
# XXX: sentence boundary modification
\b{year}[.] {Month}\b -> = {year} + ". " + {Month}.lower() # A hónap nevét kisbetűvel írjuk. | http://helyesiras.mta.hu/helyesiras/default/akh12#296
year2 \d\d
{year} {month}{notmonthposs} -> {year}. {month}{notmonthposs} # Az évszám után itt pontot írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#296
{year} {month}{notmonthcomp} -> {year}. {month}{notmonthcomp} # Az évszám után itt pontot írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#296
{year} évi -> {year}. évi # Az évszám után itt pontot írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#296
{year}[-–]{year2} évi -> {year}–{year2}. évi # Az évszám után itt pontot írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#296
# 2005 január -> 2005. január
# 1999 augusztusban -> 1999. augusztusban
# 2009-10 évi -> 2009–10. évi
nu folyamán|előtti?|utáni?|közötti?|nyara|nyará\w+|tele|telé\w+|tavasza|tavaszá\w+|ősze|őszé\w+
\b{year}[.] {nu}\b -> {year} \g # Az évszám után itt nem írunk pontot. | http://helyesiras.mta.hu/helyesiras/default/akh12#297
# 1974. előtti -> 1974 előtti
monthposs ([jaáe]|é\w)\w*
\b{year}[.] {month}{monthposs}\b -> {year} {month}{monthposs} # Az évszám után itt nem írunk pontot. | http://helyesiras.mta.hu/helyesiras/default/akh12#297
# 1999. augusztusában -> 1999 augusztusában
[char]
optdot ([.]|)
text [^\s][^\s]*
w \w*
djel [ ,;:?!]
(?i)\b{month} {day}[.]-{w} -> {month} {day}-{w} # A nap után itt nem írunk pontot. | http://helyesiras.mta.hu/helyesiras/default/akh12#298
(?i)\b{month} {day}{djel} -> {month} {day}.{djel} # Ha dátum, hiányzik a pont. | http://helyesiras.mta.hu/helyesiras/default/akh12#295
# március 15.-én -> március 15-én
# március 15 volt. -> március 15. volt.
nu óta|előtti?|utáni?|közötti?
(?i)\b{month} {day} {nu} -> {month} {day}. {nu} # A nap után itt pontot írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#299
# március 15 óta -> március 15. óta
(?i)\b{month} {day}[.] és {day} {nu} -> {month} {day}. és {day}. {nu} # A nap után itt pontot írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#299
(?i)\b{month} {day} és {day}[.]? {nu} -> {month} {day}. és {day}. {nu} # A nap után itt pontot írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#299
# március 15. és 27 között -> március 15. és 27. között
# március 15 és 27. között -> március 15. és 27. között
# március 15 és 27 között -> március 15. és 27. között
(?i)\b{month} {day}[-–]{day} {nu} -> {month} {day}–{day}. {nu} # A nap után itt pontot írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#299
(?i)\b{month} {day}-{day}. {nu} -> {month} {day}–{day}. {nu} # A napok közé nagykötőjelet írunk. | http://helyesiras.mta.hu/helyesiras/default/akh12#299
# március 15-22. között -> március 15–22. között
# március 15-22 között -> március 15–22. között
\b{year}[.]{monthnum}[.]{day}{optdot}{text} -> {year}. {monthnum}. {day}{optdot}{text} # Szóköz a dátumban. | http://helyesiras.mta.hu/helyesiras/default/akh12#295
# 2009.05.12. -> 2009. 05. 12.
# Hibás dátum: 1-a, 1-án, 2-e, 2-én, 2-je, 2-jén -> 1-e, 1-én, 2-a, 2-án, 2-a, 2-án, de! but-2-én
(?<=\s)\b([14579]|10|[12][124579]|31)(-a|-á\w+) <- stem("2" + \2) == ["2"] -> = \1 + \2.replace("a", "e").replace(u"á", u"é").replace("o", "e").replace(u"ó", u"ő") # Hibás dátum?
(?<=\s)\b([2368]|[23]0|[12][368])(-j?e|-j?é\w+) <- stem("1" + \2) == ["1"] -> = \1 + \2.replace("j", "").replace("e", "a").replace("haz", "hoz").replace(u"é", u"á").replace(u"ő", u"ó") # Hibás dátum?
########################## stb. ######################
#W \w+ # word
# tagmondatok és mondatrészek megkülönböztetéséhez mondatelemzés kell
#([(]|\w+: )(({W}, )+{W};( {W}[,;])* {W})[,]? stb. -> \1\2; stb. # Stb. előtt itt pontosvessző van. | http://helyesiras.mta.hu/helyesiras/default/akh12#248b
#([(]|\w+: )(({W}, )*{W}), stb. -> \1\2 stb. # Stb. előtt itt nincs vessző. | http://helyesiras.mta.hu/helyesiras/default/akh12#248d
\bstb[.], stb[.] -> stb. stb.|stb.; stb. # Két stb. közé nem teszünk vesszőt.
## Madarak: rigó, cinke, veréb, stb. -> Madarak: rigó, cinke, veréb stb.
## Állatok (rigó, cinke; nyúl, pocok stb.) -> Állatok (rigó, cinke; nyúl, pocok; stb.)
# stb., stb. -> stb. stb.|stb.; stb.
#################### rövidítések #####################
[word]
(db|Ft)[.](?= {abc}) -> \1 # Nem ponttal írjuk ezt a rövidítést.
(db|Ft)[.](?=[,;:]) -> \1 # Nem ponttal írjuk ezt a rövidítést.
# 25 db. vmi -> 25 db vmi
##################### nagykötőjel ####################
[char]
country albán|amerikai|angol|belga|bolgár|bosnyák|brit|ciprusi|cseh|dán|észt|finn|francia|görög|holland|horvát|ír|japán|kínai|lengyel|lett|litván|macedón|magyar|máltai|német|norvég|olasz|orosz|osztrák|portugál|román|spanyol|svájci|svéd|szerb|szlovák|szlovén|török|ukrán
(?i)\b{country}-{country}\b -> {country}–{country} # Népnevek közé nagykötőjelet teszünk.
# magyar-német -> magyar–német
# year2: Az 1000-1500 vagylagos összetételek kizárására
year2 (1\d\d[1-9]|1\d[1-9]\d|20\d[1-9]|20[1-9]\d)
"\b{year2}-{year}\b " -> "{year}–{year} " # Évszámok közé nagykötőjelet teszünk.
"\b{year}-{year2}\b " -> "{year}–{year} " # Évszámok közé nagykötőjelet teszünk.
"\b{year}-(\d\d)\b " -> "{year}–\2 " # Évszámok közé nagykötőjelet teszünk.
# 1998-2000 -> 1998–2000
# 1998-99 -> 1998–99
([A-ZÖÜÓŰŐÚÉÁÍ]\w*)-(\d+(-\w+)?) -> \1–\2 # Típusnév és -szám közé nagykötőjelet teszünk. | http://helyesiras.mta.hu/helyesiras/default/akh12#294
# UTF-8 -> UTF–8
# Apolló-13-nak -> Apolló–13-nak
pp[.] (\d+)-(\d+)[.] -> pp. \1–\2. # Oldalszámok közé nagykötőjelet teszünk. | http://helyesiras.mta.hu/helyesiras/default/akh12#264c
(\d+)-(\d+)[.] (o[.]|oldal\w*) -> \1–\2. \3 # Oldalszámok közé nagykötőjelet teszünk. | http://helyesiras.mta.hu/helyesiras/default/akh12#264c
# 10-12. oldalon -> 10–12. oldalon
" (u[.]|utca|út|tér) (\d\d*)-(\d\d*)[.]" -> " \1 \2–\3." # Nagykötőjel a házszámban. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#298.
# Széna tér 123-125. -> Széna tér 123–125.
# Ezt a szabályt kidobták a 12-ből!
###################### helyesírás ####################
[Word]
ne játs(zunk|zatok|zanak) -> ne játss\1 # Helyesírási hiba.
###################### kifejezések ###################
[Word]
[aá] la carte -> à la carte # Helyesen à la carte.
álltat -> áltat # Áltat, hiteget értelemben egy l-lel írjuk.
önáll(tat[óá]\w*) -> önál\1 # Helyesen egy l-lel.
belsőséges -> bensőséges|belsőségből készült # Szótévesztés vagy szójáték?
b[.] ?ú[.] ?é[.] ?k[.]? -> !CASE!BÚÉK # Helyesen egybeírva.
dehogy is -> dehogyis # Egybeírás „egyáltalán nem” jelentésben.
dehogy nem -> dehogynem # Egybeírás „de igen” jelentésben.
dehogyis nem -> dehogyisnem # Egybeírás „de igen” jelentésben.
eképpen -> ekképpen # Helyesen két k-val.
egyel (több\w*|kevesebb\w*) -> eggyel \1 # 1-gyel értelemben hosszú gy-vel írjuk.
egyenlőre -> egyelőre|egyformára|döntetlenre|egyenlő számúra|azonos méretűre # Helyesírási (egyelőre) vagy stílushiba (egyformára).
egyi(vású\w*) -> egyí\1 # Hosszú í-vel helyes.
egytől-egyig -> egytől egyig # Kötőjel nélkül írjuk.
előre hátra -> előre-hátra # Kötőjellel írjuk.
előre láthatólag -> előreláthatólag # Egybeírás.
email: -> ímél:\ne-mail: # ímél vagy e-mail (elektronikus levél)
email-lel -> íméllel\ne-maillel # ímél vagy e-mail (elektronikus levél)
e(mail[ -]|-mail |-mail)(cím\w*) -> ímél\2\ne-mail-\2 # Helyesen ímélcím vagy e-mail-cím. | http://helyesiras.mta.hu/helyesiras/default/akh12#140
ex[- ](\w+) <- spell("ex" + \1) -> ex\1 # Egybeírás.
figyelemre(méltó\w*) <- word(-1) != "igen" -> figyelemre \1 # Különírás (kivéve: „igen figyelemreméltó”).
igen figyelemre (méltó\w*) -> igen figyelemre\1 # Egybeírás.
(állat|csepp|csillag|ék|ellipszis|ember|félgömb|félkör|gáz|gömb|gúla|harang|háromszög|hasáb|hatszög|henger|kagyló|kereszt|kocka|korong|kör|körte|kúp|négyszög|négyzet|nyereg|patkó|piramis|piskóta|szivar|tojás|tölcsér|trapéz|vese)-?(formájú|alakú) -> \1 \2 # Különírás.
([A-Z])-(formájú\w*|alakú\w*|alakzat\w*) -> \1 \2 # Különírás.
([A-Z])-(alak\w*) <- stem(\2) == ["alak"] -> \1 \2 # Különírás.
(x|y) (kromoszóm\w+) -> = \1.upper() + "-" + \2 # Kötőjellel írjuk.
(x|y|z)-(koordinát\w+|tengel\w+|változó\w*) -> = "!CASE!" + \1.lower() + " " + \2 # Különírás kurzivált változónévvel.
(X|Y|Z) (koordinát\w+|tengel\w+|változó\w*) -> = "!CASE!" + \1.lower() + " " + \2 # Kisbetűvel írjuk, kurzivált változónévvel.
x (lábú\w*|szárnyú\w*) -> !CASE!x-\1 # Kötőjellel írjuk.
fő(irány\w*|közlekedés\w*|szabály\w*|szervező\w*) -> fő \1 # A „fő mű”-höz hasonlóan különírjuk.
hátba (támadás\w*) -> hátba\1 # Egybeírás.
időről-időre -> időről időre # Különírás.
jing és jang -> jin és jang # Helyesen jin és jang.
kőr((öz|út|ut)\w*) <- morph(\0, r"st:kőr\b") -> kör\1 # Rövid ö-vel a kör összetételeiben.
légyszíves -> légy szíves|legyél szíves # Legyél szíves értelemben különírjuk.
legalább is -> legalábbis # Egybeírás.
Lichten(stein\w*) -> Liechten\1 # Helyesen Liechtenstein.
mellékhely(ség\w*) -> mellékhelyi\1 # Helyiség, mint szoba.
mú(landó\w*) -> mu\1 # Helyesen rövid u-val.
nembiztos -> nem biztos # Különírás.
originált -> originál|eredeti|bontatlan # Ha nem tárgyesetben van, „t” nélkül írjuk.
(szén|kén|mangán|nitrogén|ón|titán|tórium)(dioxid\w*) -> \1-\2 # Kötőjeles alak.
(szén|kén|nitrogén)(monoxid\w*) -> \1-\2 # Kötőjeles alak.
továbbittunk -> továbbítunk|tovább ittunk # Helyesírási hiba.
orleans-i (szűz\w*) <- word(-1) != "New" -> !CASE!orléans-i \1|Orléans-i \1 # Helyesen orléans-i szűz.
vis (\w+) <- \1[:5] != "maior" -> = "vis " + \1.replace("major", "maior") # Helyesen vis maior.
(árú\w*) <- word(-1).lower() == "az" and stem(\0) == [u"ár"] -> = \0.replace("árú", "áru") # Helyesen áru. | http://helyesiras.mta.hu/helyesiras/default/akh12#23
[word]
([xy]-kromoszóm\w+) -> = \1.capitalize() # Nagybetűvel írjuk.
[char]
# Mivel az "un." rövidítésként szerepel az OpenOffice.org-ban, nagybetűs folytatás esetén nem húzzuk alá
\bun[.] <- word(1) and not re.match(u"[A-ZÖÜÓŰŐÚÉÁÍ]", word(1)) -> ún. # Úgy nevezett rövidítése ún. | http://helyesiras.mta.hu/helyesiras/default/akh12#284
(?i)\bvíz(hang\w*)\b -> vissz\1 # Szótévesztés?
#################### nyelvtani szabályok ##################
# az "a" névelő (kivétel: a 4. a osztályban, a II. világháború, az A alaphang...)
a [aA]
aword [aáeéiíoóöőuúüűAÁEÉIÍOÓÖŐUÚÜŰ]\w*
^[aA] {aword} <- not re.match(r"(?i)i(ii?|[vx])$|Unicode$|Unix\w*$", {aword}) and spell({aword}) -> az {aword} # Hibás névelő?
(? {a}z {aword}|{aword} # Hibás vagy felesleges névelő?
# A 4. a osztály a órán az A alaphangot -> A 4. a osztály az órán|órán az A alaphangot
# névelők és számok
[Word]
a(?! 1,5\b) <- word(1) and re.match(r"(1|5\d*|[15]\d\d\d)[.]?$", word(1)) -> az # Hibás névelő.
az <- not option("grammar") and word(2) and
re.match(r"(alfejezet|alszakasz|ábr|bekezdés|diagram|fejezet|kép|lap|oldal|paragrafus|szakasz|táblázat)\w*", word(2)) and
re.match(r"([02-46-9]|[1-46-9]\d|[1-46-9]\d\d|[2346-9]\d\d\d)[.]", word(1)) -> a # Hibás névelő?
az <- option("grammar") and word(1) and
re.match(r"([02-46-9]|[1-46-9]\d|[1-46-9]\d\d|[2346-9]\d\d\d)[.]", word(1)) -> a # Hibás névelő?
# g = gramm
num \d+|\d+,\d+
{num} gr[.]?-mal -> {num} g-mal # A grammal rövidítése g-mal | http://helyesiras.mta.hu/helyesiras/default/akh12#288
# 25 gr-mal -> 25 g-mal
# 25,2 gr.-mal -> 25,2 g-mal
[char]
hw [a-zA-ZöüóűőúéáíÖÜÓŰŐÚÉÁÍ][a-zA-ZöüóűőúéáíÖÜÓŰŐÚÉÁÍ]*
" A vitamin{w}" -> " A-vitamin{w}" # Kötőjeles név.
[word]
([B-Z]) vitamin{w} -> \1-vitamin{w} # Kötőjeles név.
([A-Z])-(vitamin)(\w+) <- morph(\2+\3, "pa:") -> \1-vitamin-\2 # Két kötőjellel írt alak.
# vitaminhiány külön szerepel a szótárban, ezért szóköz nélkül is javítani kell
([A-Z])-(vitamin) *((túl)?adagolás|bevitel|felszívódás|forrás|hiány|készítmény|szedés|szükséglet|tartalom) -> \1-\2-\3 # Két kötőjellel írt alak. | http://helyesiras.mta.hu/helyesiras/default/akh12#140
[char]
(?i)\bnyílt szívű{w} -> nyíltszívű{w} # Egybeírás.
(?i)\bjó szándékú{w} -> jószándékú{w} # Egybeírás.
(?i)közös lónak túrós -> közös lónak túros # Helyes kifejezés.
(?i)\blobot vet{w}\b -> lobbot vet{w} # Helyes kifejezés.
(?i)\bnejlon harisnya\b -> nejlonharisnya # Egybeírás.
(?i)\boda-vissza{hw} -> oda-vissza {hw} # Különírás.
(?i)\bpro és kontra\b -> pró és kontra # Helyes latin kifejezés.
(?i)\brákövetkez{hw} -> rá következ{hw} # Különírás.
(?i)\btáj jellegű{w} -> tájjellegű{w} # Egybeírás.
(?i)([stluv])-alakú{w} -> \1 alakú{w} # Különírás.
# B vitamin -> B-vitamin
# Pro és kontra -> Pró és kontra
# oda-visszamentek -> oda-vissza mentek
# S-alakúakat -> S alakúakat
(\d\d*)-szobás{w} -> \1 szobás{w} # Különírás.
(\d\d*)-részes{w} -> \1 részes{w} # Különírás.
# 5-szobásat -> 5 szobásat
[word]
event (Advent|Húsvét|Karácsony|Mindenszentek|Pünkösd|(Anyák|Apák|Halottak|Nők) [Nn]apj){abc}+
{event} <- word(-1) and word(1) == word(1).lower() -> = {event}.lower() # Kisbetűs kifejezés, ha nem cím. | http://helyesiras.mta.hu/helyesiras/default/akh12#144
# Nemsokára Anyák napja. -> Nemsokára anyák napja.
[char]
kw ([-][a-zA-ZöüóűőúéáíÖÜÓŰŐÚÉÁÍ][a-zA-ZöüóűőúéáíÖÜÓŰŐÚÉÁÍ]*)?
foci ([Ev])[bB]{kw} -> foci-\1b{kw} # Kötőjeles kifejezés.
# foci EB -> foci-Eb
# foci vb-ről -> foci-vb-ről
^Kétség kívül -> Kétségkívül # Egybeírás.
# Kétség kívül -> Kétségkívül
[Word]
alig alig -> alig-alig # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
ki ki -> ki-ki # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
is is -> is-is # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
kinek kinek -> kinek-kinek # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
körbe körbe -> körbe-körbe # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
közbe közbe -> közbe-közbe # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
külön külön -> külön-külön # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
már már -> már-már # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
más más -> más-más # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
messze messze -> messze-messze # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
nagyon nagyon -> nagyon-nagyon # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
néha néha -> néha-néha # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
olykor olykor -> olykor-olykor # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
túl túl -> túl-túl # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
sok sok -> sok-sok # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
úgy úgy -> úgy-úgy # Kötőjeles szókettőzés. | http://helyesiras.mta.hu/helyesiras/default/akh12#97
csip csup -> csip-csup # Kötőjeles ikerszó. | http://helyesiras.mta.hu/helyesiras/default/akh12#104
éhen szomjan -> éhen-szomjan # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
ingó bingó -> ingó-bingó # Kötőjeles ikerszó. | http://helyesiras.mta.hu/helyesiras/default/akh12#104
sebbel lobbal -> sebbel-lobbal # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
szegről végről -> szegről-végről # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
széltében hosszában -> széltében-hosszában # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
szőröstül bőröstül -> szőröstül-bőröstül # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
szőrén szálán -> szőrén-szálán # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
télen nyáron -> télen-nyáron # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
testestől lelkestől -> testestől-lelkestől # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
testestül lelkestül -> testestül-lelkestül # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
többé kevésbé -> többé-kevésbé # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
törik szakad -> törik-szakad # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
tűzön vízen -> tűzön-vízen # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
tűzzel vassal -> tűzzel-vassal # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
véges végig -> véges-végig # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
tüskén bokron -> tüskén-bokron # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
végre valahára -> végre-valahára # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
imígy amúgy -> imígy-amúgy # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
innen onnan -> innen-onnan # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
itt ott -> itt-ott # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
ízig vérig -> ízig-vérig # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
ízzé porrá -> ízzé-porrá # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
jajjal bajjal -> jajjal-bajjal # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
jóban rosszban -> jóban-rosszban # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
jobbra balra -> jobbra-balra # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
jól rosszul -> jól-rosszul # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
kékre zöldre -> kékre-zöldre # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
kénytelen kelletlen -> kénytelen-kelletlen # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
kézen közön -> kézen-közön # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
körös körül -> körös-körül # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
kézzel lábbal -> kézzel-lábbal # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
kurtán furcsán -> kurtán-furcsán # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
lépten nyomon -> lépten-nyomon # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
menet jövet -> menet-jövet # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
nyakra főre -> nyakra-főre # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
örökkön-örökké -> örökkön örökké # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
sülve főve -> sülve-főve # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
úton útfélen -> úton-útfélen # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
üggyel bajjal -> üggyel-bajjal # Mellérendelő szókapcsolat. | http://helyesiras.mta.hu/helyesiras/default/akh12#101
# alig alig -> alig-alig
# Úgy úgy -> Úgy-úgy
# ágat-bogat
(ág\w*) (bog\w*) <- stem(\1) == [u"ág"] and stem(\2) == ["bog"] -> \1-\2 # Kötőjeles ikerszó. | http://helyesiras.mta.hu/helyesiras/default/akh12#104
# idegen
[code]
foreign=["ab ovo", "ars poetica", "casus belli", "categoricus imperativus",
"coming out", "cash flow", "circulus vitiosus", "corpus delicti", "de facto", "de jure",
"delirium tremens", "doctor honoris causa", "et cetera", "fait accompli", "fixa idea",
"horribile dictu", "hot dog", "in flagranti", "in medias res", "in memoriam", "in vitro",
"in vivo", "magna cum laude", "mea culpa", "memento mori", "mountain bike", "nota bene",
"persona non grata", "plein air", "pro bono", "salto mortale", "status quo", "tabula rasa",
"terminus technicus", "vice versa", "vis maior"]
def suggest_foreign(word):
return "\n".join([i for i in foreign if word == i.split(" ")[0]]) # Idegen eredetű kifejezésekben előforduló szó.
[word]
(ab|ars|casus|categoricus|coming|cash|circulus|corpus|delirium|doctor|et|fait|fixa|horribile|hot|in|magna|mea|memento|mountain|nota|persona|plein|pro|salto|tabula|vice|vis) (\w+) <- not re.match(u"^(ovo|poetica|belli|imperativus|out|flow|vitiosus|delicti|facto|jure|tremens|honoris|cetera|accompli|idea|ideá|dictu|dog|flagranti|medias|memoriam|vitro|vivo|cum|culpa|mori|bike|bene|non|air|bono|mortal|quo|quó|rasa|rasá|versa|maior)", \2) ->
= suggest_foreign(\1) # Idegen eredetű kifejezés?
###################### Földrajzi nevek ######################
[word]
(Északi|Déli)(?:-S| [Ss])ark{w} -> \1-sark{w} # Földrajzi név.
# Az Északi sarkon -> Az Északi-sarkon # Földrajzi név.
# Az Északi-Sarkon -> Az Északi-sarkon # Földrajzi név.
dir észak|dél|kelet|nyugat|északkelet|északnyugat|délkelet|délnyugat
Dir Észak|Dél|Kelet|Nyugat|Északkelet|Északnyugat|Délkelet|Délnyugat
cap {ABC}{abc}+
sc {abc}+
w {Abc}+
# Észak-Amerikai Észak-amerikai helyett
{Dir}-{cap} <- morph({cap}, r"po:noun_prs.*is:i_PLACE", False) -> = {Dir} + "-" + {cap}.lower() # Kisbetűvel írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#178
# észak-Amerika Észak-Amerika helyett
{dir}-{cap} <- morph({cap}, r"po:noun_prs", False) and not morph({cap},"is:i_PLACE", False) ->
= {dir}.capitalize() + "-" + {cap} # Nagybetűvel írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#178
# Észak-amerikai csak akkor nagybetűs, ha mondatkezdő és nem nagybetűs az utána jövő szó
{Dir}-{sc} <- word(-1) and word(1) and not word(1) == word(1).capitalize() and
morph({sc}, r"po:noun_prs.*is:i_PLACE", False) -> = {Dir}.lower() + "-" + {sc} # Kisbetűvel írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#178
# hiányzó kötőjel
{Dir} {w} <- morph({w}, r"po:noun_prs") -> {Dir}-{w} # Kötőjellel írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#178
# köznevek
prop Tenger|Óceán|Sziget|Félsziget|Középhegység
{cap}-{prop} -> = {cap} + "-" + {prop}.lower() # Kisbetűsen írt köznévi tag. | http://helyesiras.mta.hu/helyesiras/default/akh12#175
# AkH. 181.
(Árpád|Erzsébet|Hajógyári|Margit|Megyeri|Petőfi|Rákóczi|Szabadság)-(híd\w*) -> \1 \2 # Különírás. | http://helyesiras.mta.hu/helyesiras/default/akh12#181
(Szabadság)(híd\w*) -> \1 \2 # Különírás. | http://helyesiras.mta.hu/helyesiras/default/akh12#181
(Szabadság ?)(szobo?r\w*) -> \1-\2 # Kötőjeles összetétel. | http://helyesiras.mta.hu/helyesiras/default/akh12#166
# AkH. 182.
(Fertő)-(([tT]ó|[tT]av)\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#182
(Góbi|Kalahári|Szahara)-([sS]ivatag\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#182
(Börzsöny|Bükk|Mátra|Mecsek|Pilis|Zemplén|Vértes)-([Hh]egység\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#182
(Duna)-(folyam\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#182
(Bodrog|Duna|Dráva|Ipoly|Körös|Maros|Rába|Sajó|Tisza|Zala)-(([Ff]olyó|[Ff]olyam)\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://helyesiras.mta.hu/helyesiras/default/akh12#182
Budapest (Liszt Ferenc )([Nn]emzetközi [Rr]epülőt[eé])(r\w*) -> =
\1 + \2.lower() + \3 +
"|ferihegyi " + \1 + \2.lower() + \3 + "|" +
\3.replace("r", "Ferihegy", 1).replace("gyrel", "ggyel").replace(u"gyré", u"ggyé") +
"|Budapest, " + \1 + \2.lower() + \3
# A köznévi tag kisbetűs, a címet vesszővel tagoljuk. (AkH. 190., 248.; FNB 74.) | http://helyesiras.mta.hu/helyesiras/default/akh12#248
# FIXME mi az az FNB? és vajon meg lehetne itt adni több magyarázó linket? egyelőre marad, de az AkH.-ozást innen is kiirtanám
([Oo])rlea(ns-?\w*) <- word(-1) != "New" -> \1rléa\2 # Orléans vagy New Orleans.
New [Oo]rléa(ns-?\w*) -> New Orlea\1 # New Orleans
########################## vesszők ##########################
(olya\w+) (aki\w*|ami\w*) <- morph(\2, r"st:(aki|ami|amilyen)\b") -> \1, \2 # Hiányzó vessző a tagmondatok határán?
##################### nyelvtani szabályok ###################
W \w+ # word
W2 \w+ # word
############### egybeírt segédigék és igekötők #############
# megszabad csinálni -> meg szabad csinálni
# megtudta volna tenni -> meg tudta volna tenni
# megfogja majd tudni -> meg fogja majd tudni
# megszeretném még enni -> meg szeretném még enni
# -> Megpróbálom megcsinálni.
igekoto abba|agyon|alá|által|át|be|bele|benn|egybe|együtt|el|ellen|elő|előre|fel|föl|félbe|félre|felül|fölül|fenn|fönn|hátra|haza|helyre|hozzá|ide|jóvá|keresztül|ketté|ki|kölcsön|körbe|körül|közbe|közre|külön|le|meg|mellé|neki|oda|össze|rá|rajta|széjjel|szembe|szerte|szét|tele|tova|tovább|túl|újjá|újra|utána|végbe|végig|vissza
segedige (akar|bír|fog|legy|lehet|lenn|lesz|lett|szabad|szeret|talál|tud|van|vol)\w*
szavak ( \w+){0,}
igenev (\w+ni)
[Word]
{igekoto}{segedige}{szavak} {igenev}
<- morph({igenev}, "INFINITIVE") and
morph({igekoto}+{segedige}, r"is:[/\w]*DEF|ds:tt")
-> {igekoto} {segedige}{szavak} {igenev} # Az igekötőt nem írjuk egybe a segédigével.
# elvan ez már rég felejtve
letige (legy|lehet|lenn|lesz|lett|van|vol)\w*
igenev (\w+v[ea])
{igekoto}{letige}{szavak} {igenev}
<- morph({igenev}, "_PART") and
morph({igekoto}+{letige}, r"is:[/\w]*DEF|ds:tt")
-> {igekoto} {letige}{szavak} {igenev} # Az igekötő a lenni + -va/-ve szerkezetben nem a létigéhez kapcsolódik.
############### had -> hadd ################
# Eltusolták az ügyet. -> Eltussolták az ügyet.
# Had legyen meglepetés! -> Hadd legyen meglepetés!
(had|hagy)( (ne )?){W} <- morph({W}, r"(IMPER[_\w]*SG_1|is:[_/\w]*DEF_PL)") or
(not word(-1) and morph({W}, r"is:[_/\w]*DEF_SG_[23]"))
-> \1d\2{W} # Hadd helyesen.
############### *Áld meg! stb. ###################
(\w+[lnrz]d) {igekoto} <- (not word(-1) or word(-1).lower() == "ne") and
morph(\1, "st:" + \1.lower() + r"\b") and morph(\1+"d", r"IMPER") -> \1d \2 # Felszólító mód.
############### kér, kérd ########################
kérdd el -> kérd el # „kér” felszólító módja.
############### megfedd, eltussol ##########
# Aztán jól megfedte. -> Aztán jól megfeddte.
# Eltusolták az ügyet. -> Eltussolták az ügyet.
(megfe)(d\w*) <- morph(\1+\2, r"st:fed\b") -> \1d\2 # Megfedd helyesen.
(eltus)(ol\w*) <- morph(\1+\2, r"st:tusol\b") -> \1s\2 # Eltussol helyesen (kivéve, ha zuhanyzásról van szó).
############## főkép -> főképp #############
főké(p|pen) <- word(-1) != "a" and word(-1) != "A"
-> főkép\1 # Ha határozószó, akkor főképp.
############# számok ######################
[char]
\b0-á(\w+) -> 0-\1 # Hibás toldalék?
(\d*[14])-el\b -> \1-gyel # Hibás toldalék?
(\d*2)-ő(\w+) -> \1-\2 # Hibás toldalék?
(\d*3)-á\b -> \1-má # Hibás toldalék?
(\d*3)-al\b -> \1-mal # Hibás toldalék?
(\d*[57])-el\b -> \1-tel # Hibás toldalék?
(\d*6)-á\b -> \1-tá # Hibás toldalék?
(\d*8)-á\b -> \1-cá # Hibás toldalék?
(\d*9)-el\b -> \1-cel # Hibás toldalék?
(\d*10)-el\b -> \1-zel # Hibás toldalék?
(\d*20)-á\b -> \1-szá # Hibás toldalék?
(\d*30)-á\b -> \1-cá # Hibás toldalék?
(\d*[4579]0)-el\b -> \1-nel # Hibás toldalék?
(\d*[68]0)-á\b -> \1-ná # Hibás toldalék?
\b(\d)00-á\b <- \1 != "0" -> \100-zá # Hibás toldalék?
\b(\d)000-el\b <- \1 != "0" -> \1000-rel # Hibás toldalék?
#(\d*\d)0000-el\b <- \1 != "0" -> \1\2000-rel # Hibás toldalék?
#(\d*)(\d)00000-el\b <- \1 != "0" -> \1\2000-rel # Hibás toldalék?
############## több mint #######################
# több, mint testőr -> több mint testőr XXX tavaly, délután stb. miatt nincs kezelve
# -> több, mint tavaly
# több, mint unalmas -> több mint unalmas
# több, mint kiváló -> több mint kiváló
# több, mint 70%-uk -> több mint 70%-uk
# több, mint négyen -> több mint négyen
# -> öt több, mint négy
# több, mint 25 ezren -> több mint 25 ezren
# több, mint két embert -> több mint két embert
# több, mint 9 embert -> több mint 9 embert
# több, mint 9 ezer fát -> több mint 9 ezer fát
[Word]
több, mint <-
# (több mint jó), több mint nyolcan, több mint 12-en
morph(word(1), r"(po:noun.*ds:s_\w*|po:adj|PRESPART_adj|po:adj_num.*(is:|An_MODE_adv))\b") or
# több mint 25 ezren, több mint 25 ezerről, több mint száz birkát
# (fix: "ezer" adj-ként is szerepel, ezért külön kezelve XXX)
(morph(word(1), r"(po:adj_num|^\d+$)") and morph(word(2), r"(po:noun\b.*is:|(po:adj_num|st:ezer\b).*(is:|An_MODE_adv))")) or
# több mint 25 ezer birkát
(re.match(r"\d+$", word(1)) and morph(word(2), r"po:adj_num|st:ezer\b") and morph(word(3), r"po:noun\b.*is:")) or
# több mint 75%-a
re.match(r"\d+%-", word(1)) -> több mint # Ha nem összehasonlítás,
hanem a mondanivaló erősítése, itt nem használunk vesszőt. |
http://helyesiras.mta.hu/helyesiras/default/akh12#244
############ avagy, illetve, ill., valamint ##########
(\w+)( avagy) -> \1,\2 # Az avagy kötőszó elé vesszőt teszünk.
(\w+)( illetve) -> \1,\2 # Az illetve kötőszó elé vesszőt teszünk.
(\w+)( ill[.]) -> \1,\2|\1, illetve # Az illetve kötőszó elé vesszőt teszünk.
(\w+)( valamint) -> \1,\2 # A valamint kötőszó elé vesszőt teszünk.
############ mellet -> mellett ##################
# a fa mellet -> a fa mellett
# -> De! feszes mellet
mellet <- morph(word(-1), r"po:noun.*:NOM(?!.*[di]s:)|_noun\s+ts:NOM$") -> mellett # Nem inkább mellett (vagy hibás különírás)?
############ kellet -> kellett ##################
# nem kellet volna -> nem kellett volna
kellet <- morph(word(-1), r"INF_|_inf") or morph(word(-2), r"INF_|_inf") -> kellett # Helyesírási hiba.
kellet <- morph(word(1), r"INF_|_inf") or morph(word(2), r"INF_|_inf") or word(1) == "volna" -> kellett # Helyesírási hiba.
############### helyett kapott #######################
# is helyett kapott -> is helyet kapott
# a csomagban helyett kapott -> a csomagban helyet kapott
(\w+) helyett (kap\w*) <- morph(\1, r"st:(is|ismét|mellett|még)\b|is:INE") and morph(\2, r"st:kap\b") -> \1 helyet \2 # Helyesen: helyet kap.
############## halott -> hallott ##################
(?<=[Nn]em )halott(am|unk) -> hallott\1 # Helyesírási hiba?
(hal)(ott\w*)(?= róla\w*) -> \1l\2 # Helyesírási hiba?
############### összetett szavak #################################
[Word]
# rövid összetett szó
W \w{4,5}
{W} <- option("compound") and morph({W}, "pa:") -> =suggest({W}) # Biztos, hogy helyes összetett szó?
# rövid (kétbetűs) tagot tartalmazó összetett szó
W \w{4,}
{W} <- option("compound") and morph({W}, r"(?u)pa:\w\w\b") -> =suggest({W}) # Biztos, hogy helyes összetett szó?
# minden képzett összetett szó
{W} <- option("allcompound") and morph({W}, "pa:") -> =suggest({W}) # Biztos, hogy helyes összetett szó?
############### vesszőhasználat ########################
############### Stílus #################################
[Word]
#asszem -> azt hiszem|azt hiszem, hogy # Helyesírási hiba.
#h <- option("style") -> hogy # Hibás rövidítés?
#szar\w* <- option("style") and morph(\0, r"st:szar\b") -> rossz # Stílushiba.
médiák <- option("style") -> médiák|média|hírek|lapok|hírcsatornák # Vitatott stílusértékű alak.
unszimpatikus <- option("style") -> unszimpatikus|ellenszenves|antipatikus # Vitatott stílusértékű alak.
# ezresek számjegyekkel
#(\d{2,3})[ ]?000-(\w+) <- option("style") and (not word(-1) or not re.match("[0-9]+$", word(-1))) and spell("ezer" + \2) and not morph("ezer" + \2, "_adj") -> \1 ezer\2 # Ha szám, javasolt betűkkel írni.
#(\d{2,3})[ ]?000[ ]?000-(\w+)
# <- option("style") and (not word(-1) or not re.match("[0-9]+$", word(-1))) and spell(u"millió" + \2) -> \1 millió\2 # Ha szám, javasolt betűkkel írni.
############### különírás ###############################
[char]
" (-\w+)" <- option("wordpart") and morph(\0, "st:-e|po:(suffix|punct)")
-> \1 # A toldalékot szóköz nélkül írjuk.
[Word]
(a|az|egy) (\w+) (\w+) <- option("wordpart") and spell(\2 + \3) and
morph(word(1), "po:vrb") and
affix(\2, "ts:NOM$") and not morph(\2, "ts:PLUR") and
affix(\3, "[it]s:NOM$") -> \1 \2\3 # Hibás különírás?
############### szóismétlés ###############################
W [-\w]{3,}
[word]
{W} \1 <- option("dup0") and (not word(-1) or
not word(-1).lower() in ["a", "az", "minden"]) and word(1) != u"hátán" and word(1) != u"hátán." and
not morph(word(1), "po:post", False) -> {W}|{W}-\1 # Szóismétlés vagy hiányzó kötőjel?
{W}(?: [-–\w„”]+)* \1 <- option("dup") -> {W} # Túlzott szóismétlés?
{W}[;,:]?(?: [-–\w„”]+[;,:]?)* \1 <- option("dup2") -> {W} # Túlzott szóismétlés?
# toldalékolva is (de nem összetett szó)
([-\w]{4})([-\w]+)(?: [-–\w„”]+)* \1(\w+) <- option("dup3") and
option("dup") and morph(\1+\2, r"(?u)st:\w+") ==
morph(\1+\3, r"(?u)st:\w+") and not morph(\1+\3, "pa:") and not morph(\1+\2, "pa:") -> \1\2 # Túlzott szóismétlés?
([-\w]{4})([-\w]+)[;,:]?(?: [-–\w„”]+[;,:]?)* \1(\w+) <- option("dup3") and
option("dup2") and morph(\1+\2, r"(?u)st:\w+") ==
morph(\1+\3, r"(?u)st:\w+") and not morph(\1+\3, "pa:") and not morph(\1+\2, "pa:") -> \1\2 # Túlzott szóismétlés?
################# ligatúrák #################################
[word]
[-\w]*f[fil][-\w]* <- option("ligature") -> =\0.replace("ffi",u"ffi").replace("ffl",u"ffl").replace("ff",u"ff").replace("fi",u"fi").replace("fl",u"fl")
# A szó unicode-os f-ligatúrákkal:
[-\w]*(ffi|ffl|ff|fi|fl)[-\w]* <- option("noligature") -> =\0.replace(u"ffi","ffi").replace(u"ffl","ffl").replace(u"ff","ff").replace(u"fi","fi").replace(u"fl","fl")
# A szó unicode-os f-ligatúrák nélkül:
################# indexek, törtek ##############################
[word]
1/2((-\w+)?) <- option("frac") -> ½\1 # Tipográfiai jel:
1/3((-\w+)?) <- option("frac") -> ⅓\1 # Tipográfiai jel:
1/4((-\w+)?) <- option("frac") -> ¼\1 # Tipográfiai jel:
3/4((-\w+)?) <- option("frac") -> ¾\1 # Tipográfiai jel:
2/3((-\w+)?) <- option("frac") -> ⅔\1 # Tipográfiai jel:
1/5((-\w+)?) <- option("frac") -> ⅕\1 # Tipográfiai jel:
1/6((-\w+)?) <- option("frac") -> ⅙\1 # Tipográfiai jel:
5/6((-\w+)?) <- option("frac") -> ⅚\1 # Tipográfiai jel:
1/8((-\w+)?) <- option("frac") -> ⅛\1 # Tipográfiai jel:
3/8((-\w+)?) <- option("frac") -> ⅜\1 # Tipográfiai jel:
5/8((-\w+)?) <- option("frac") -> ⅝\1 # Tipográfiai jel:
7/8((-\w+)?) <- option("frac") -> ⅞\1 # Tipográfiai jel:
1/(\d{1,3})((-\w+)?) <- option("frac") -> = u"⅟" + \1.replace("0", u"₀").replace("1", u"₁").replace("2",
u"₂").replace("3", u"₃").replace("4", u"₄").replace("5", u"₅").replace("6", u"₆").replace("7",
u"₇").replace("8", u"₈").replace("9", u"₉") + \2 # Tört tipográfiai jelekkel:
([2-9]|\d{2,3})/(\d{1,3})((-\w+)?) <- option("frac") -> = \1.replace("0", u"⁰").replace("1", u"¹").replace("2", u"²").replace("3",
u"³").replace("4", u"⁴").replace("5", u"⁵").replace("6", u"⁶").replace("7", u"⁷").replace("8", u"⁸").replace("9", u"⁹") +
u"⁄" + \2.replace("0", u"₀").replace("1", u"₁").replace("2", u"₂").replace("3", u"₃").replace("4",
u"₄").replace("5", u"₅").replace("6", u"₆").replace("7", u"₇").replace("8", u"₈").replace("9", u"₉") + \3 # Tört tipográfiai jelekkel:
[µmck]?m[23](-\w+)? <- option("idx") -> =\0.replace("2", u"²").replace("3", u"³") # Index tipográfiai jellel:
(Ca(CO3|SO4)|CO2|(H2|Na2)(CO3|O|SO4)|[HNO]2|HNO3|Fe2O3|KMnO4|NO2|SiO2|SO[23])(-\w+)? <- option("idx") -> =\0.replace("2", u"₂").replace("3", u"₃").replace("4", u"₄") # Index tipográfiai jellel.
[word]
kedvel <- word(-1).lower() == u"jó" or word(-1).lower() == "rossz" -> kedvvel # Szótévesztés?
################### mértékegységek ##########################
([-−]?\d+(?:,\d+)?) (°F(-\w+)?) <- option("SI") -> = measurement(\1, "F", "C", " " + \2.replace("F", "C")) # Váltás SI mértékegységre
([-−]?\d+(?:,\d+)?) (℉(-\w+)?) <- option("SI") -> = measurement(\1, "F", "C", " °C" + \2[1:]) # Váltás SI mértékegységre
([-−]?\d(?:,\d+)?) (láb\w*) <- option("SI") and stem(\2) == [u"láb"] -> =
measurement(\1, "ft", "cm", " " + generate(u"centiméter", \2)[0]) + "|" +
measurement(\1, "ft", "m", " " + generate(u"méter", \2)[0]) # Váltás SI mértékegységre
([-−]?\d\d+(?:,\d+)?) (láb\w*) <- option("SI") and stem(\2) == [u"láb"] -> = measurement(\1, "ft", "m",
" " + generate(u"méter", \2)[0]) # Váltás SI mértékegységre
([-−]?\d+(?:,\d+)?) (hüvelyk\w*) <- option("SI") -> = measurement(\1, "in", "cm",
" " + generate(u"centiméter", \2)[0]) # Váltás SI mértékegységre
([-−]?\d+(?:,\d+)?) (mérföld\w*) <- option("SI") -> = measurement(\1, "mi", "km",
" " + generate(u"kilométer", \2)[0]) # Váltás SI mértékegységre
([-−]?\d+(?:,\d+)?) (yard\w*) <- option("SI") -> = measurement(\1, "yd", "m",
" " + generate(u"méter", \2)[0]) # Váltás SI mértékegységre
([-−]?\d+(?:,\d+)?) (font (súlyú\w*)) <- option("SI") -> = measurement(\1, "lbm", "kg",
" " + generate("kilogramm", u"szomor" + \3[4:])[0]) # Váltás SI mértékegységre
([-−]?\d+(?:,\d+)?) (gallon\w*) <- option("SI") -> = measurement(\1, "gal", "l",
" " + generate("liter", \2)[0]) # Váltás SI mértékegységre
([-−]?\d+(?:,\d+)?) (pint\w*) <- option("SI") -> =
measurement(\1, "uk_pt", "dl", " " + generate("deciliter", \2)[0]) + "|" +
measurement(\1, "us_pt", "dl", " " + generate("deciliter", \2)[0]) # Váltás SI mértékegységre (angol és amerikai pint)
# elválasztás
adatút <- option("hyphen") -> adatút|adatút # Elválasztás:
felett(em|ed|e|ünk|ük) <- option("hyphen") -> felett\1|felett\1 # Elválasztás:
felettetek <- option("hyphen") -> felettetek|felettetek # Elválasztás:
fölül <- option("hyphen") -> fölül|fölül # Elválasztás:
gépelem <- option("hyphen") -> gépelem|gépelem # Elválasztás:
karóra <- option("hyphen") -> karóra|karóra # Elválasztás:
megás <- option("hyphen") -> megás|megás # Elválasztás:
megint <- option("hyphen") -> megint|megint # Elválasztás:
[code]
def measurement(mnum, min, mout, mstr):
m = calc("CONVERT_ADD", (float(mnum.replace(",", ".").replace(u"−", "-")), min, mout))
a = list(set([str(calc("ROUND", (m, 0)))[:-2], str(calc("ROUND", (m, 1))), str(calc("ROUND", (m, 2))), str(m)])) # remove duplicated rounded items
a.sort(key=lambda x: len(x)) # sort by string length
return (mstr + "|").join(a).replace(".", ",").replace("-", u"−") + mstr
lightproof/src/hu_HU/ChangeLog 0000644 0001750 0001750 00000017144 13231171520 015252 0 ustar rene rene 2018-01-17 Németh László :
- AkH. 12. kiadásának megfelelő javítások:
örökkön-örökké -> örökkön örökké
e-mail cím -> e-mail-cím vagy ímélcím
január 1-e, 1-én is helyes, nemcsak január 1-je, 1-jén
- hibás dátumok (2-e, 3-e, 4-án stb.) javítása
(Vajna Miklós javaslatára)
- Tesztdokumentum ehhez és az egyéb javításokhoz:
https://bugs.documentfoundation.org/attachment.cgi?id=139147
(Hibajegy: https://bugs.documentfoundation.org/show_bug.cgi?id=95024)
2016-11-22 Kelemen Gábor
- magyarázatok javítása az AkH 12. kiadásának megfelelően
- AkH. hibaszám helyett hivatkozás mta.hu-ra
2014-01-20 László Németh :
- űlltatok nincs aláhúzva hibaként, csak álltat (OOO-875: OpenScope.org)
2013-12-16 László Németh :
- r i t k í t o t t szöveg felismerése (keskeny szóköz opció bekapcsolásánál),
majd cserejavaslat nem törő keskeny szóközökre, ill. szóközök nélkülire.
A funkciót Pénzes Dávid javasolta.
- elromlott keskeny szóközös opció működésének visszaállítása
- hosszú szavak hibás exponenciális idejű elemzésének javítása (lefagyást
okozott más Python komponensek, pl. LibreLogo együttes használatával),
a Lightproof lefagyását Pénzes Dávid, a LibreOffice lefagyást Lakó Viktória jelezte
- tizedestört vagy sorszám: nem figyelmeztet, ha pont követi, tehát sorszám
- nagy számok ezrestagolásánál többszörös illeszkedés javítása
2012-12-04 László Németh :
- Python 3.3 támogatás
2012-08-23 László Németh :
- „a 1,5” („a másfél”) nem névelőhasználati hiba. Pénzes Dávid hívta fel a
figyelmet a problémára.
- A 10%-al, 10-20%-al hibás alakok javítása, Pénzes Dávid javaslatára.
2012-02-02 László Németh :
- rövidebb magyarázat a „több mint” esetén + URL
- "-szám" alakoknál nem feltételez kötőjeles felsorolást
2011-12-16 László Németh :
- beállítások csak a kiterjesztéskezelőben hozzáférhetők ideiglenesen
- webes bővebb magyarázatok támogatása (FullCommentURL) a LibO 3.5-ben,
pl. Fertő-tavi -> AkH. a Wikipédiában.
- új opciók:
- nagy kezdőbetű: mondatok kis kezdőbetűjének keresése
- zárójelpárok és idézőjelek ellenőrzése
- nem elválasztott szavak elválasztását kínálja fel (pl.
megint -> me-gint, meg-int)
- új szabályok:
- időről-időre, egytől-egyig -> időről időre, egytől egyig
- földrajzi nevek (Dél-Ázsiai -> Dél-ázsiai, Árpád-híd -> Árpád híd stb.)
- 1-e -> 1-je
- egyel kevesebb/több -> eggyel
- előre hátra -> előre-hátra
- ex-alelnök -> exalelnök stb.
- "kell hogy" esetén nem erőlteti az esetenként hibás vesszőt
- javított szabályok:
- a/az névelőt csak a helyesírási szótárban meglévő szavak előtt ellenőriz
- új licenc: MPL/GPL/LGPL
2011-07-11 László Németh :
- javított csomagnév (Magyar nyelvi ellenőrzés)
- új opciók:
- három pont
- dupla szóköz, sok szóköz
- idézőjelek, nagykötőjel
- törtek, indexek
- mínuszjel
- szóismétlés (egymást közvetlenül követő szavak)
- mértékegységek
- 2003. Március -> 2003. március: hónap neve kisbetűvel jelenik meg a javaslatban is
- javaslat: a Unikum -> nagybetűvel jelenik meg, ahogy a szövegben szerepelt
- 2005 március-júniusa már nem hibásnak jelezve
- a Unicode, a Unix most már nem hibás a névelővel sem
- illetve hogy, illetve ha vessző nélkül
- áld meg, mond el -> áldd meg, mondd el, ha a felszólítás felismerhető (mondat,
tagmondathatár, esetleg "ne" szócskával bevezetve)
- jó kedvel, rossz kedvel -> jó kedvvel, rossz kedvvel
- halott róla, nem halottunk semmit -> hallott róla, nem hallottunk semmit
- C-vitamin hiány -> C-vitamin-hiány
- C-vitaminhiány -> C-vitamin-hiány (minden egybeírt összetételnél)
- médiák, unszimpatikus kijelzése az opcionális stílusellenőrzésbe került
- Budapest Liszt Ferenc Nemzetközi Repülőtér -> a többszörös helyesírási hiba kijelzése
- felsorolások kötőjele, nagykötőjele aláhúzva egybeírás esetén: -Egy -> – Egy
- 2011 július -> 2011. július (a július hiányzott az ellenőrzőtt hónapnevek közül)
- kellet -> kellett (*nem kellet volna, *meg kellet ezt csinálnom, *várni is kellet
- mértékegységek (mérföld, yard, láb, hüvelyk, °F, font súlyú, gallon, pint) átalakítása
2010-05-06 László Németh :
- alapértelmezett ezreselválasztó-ellenőrzés kikapcsolása (Magyar
Linux Libertine G Graphite automatikus ezreselválasztása miatt)
2010-02-19 László Németh :
* hu_HU.dat:
- "a" névelő + szám szabály javítása ("a 10")
a regex match hiányzó $ jelének pótlásával
- nem törő szóköz beillesztése a Celsius fok elé
- a törtekre és egyéb jelekre vonatkozó tipográfiai opció bekapcsolása
esetén nem törő szóköz helyett nem törő keskeny szóközt javasol a számok
ezrestagolójaként, és ezt felismeri a pénzegység
konzisztenciaellenőrzésénél is, valamint a régi nem törő szóközök
cseréjét is javasolja.
- Unicode vessző ékezet felvétele a valódi aposztrófot javasló szabályba
(U+00B4 kódja miatt elöl van, és emiatt tévedésből könnyen beilleszthető)
- idézőjeles szabályok bővítése:
- ASCII idézőjelek cseréje:
,,valami >>volt<< ott.'' -> „valami »volt« ott.”
- felcserélt belső idézőjelek cseréje
- angolszász nem dupla idézőjelek cseréje
- számok konzisztencia-ellenőrzésénél nem törő szóközök helyes felismerése
2010-02-12 László Németh :
* hu_HU.dat:
- sorszámok névelőjének ellenőrzése ("az" esetén alapból még szükséges
az "oldal" stb. a sorszám után: pl. *"az 2. oldalon")
* lightproof_handler.py: segédosztály megszüntetése a Mac OS X PyUNO hiba
lehetséges okának kiküszöbölésére
2010-02-09 László Németh :
* hu_HU.dat:
- mínuszjel
- szorzásjel javítása szóközök esetén is: 5 x 6 -> 5×6
- hibás névelőjavaslat tiltása római számoknál (a II., a III. stb.)
- új feltételes szabályok: ligatúrák javaslata és elutasítása
- nem törő szóköz és toldalékolás esetén is javasolva van a százalékjel
tapadása;
- javaslat évszámok előtti aposztróf esetén is ('76-ban)
- pénznemek 1234,00 Ft és sima szóköz elfogadása, mint ezres tagoló
(nem törő szóköz már korábban így volt kezelve): 34 500 Ft
- fokjel javítása és egybeírása
- törtek (ha van csak Unicode karakterrel, pl. 1/2,
egyébként ha 1/x-ed, akkor "1/" Unicode karakterrel és alsó index
Unicode karakterrel, különben felső index, törtjel és alsó index
karakterekkel), indexek (H2O, H2SO4 stb.), fokok (Celsius, Fahrenheit
jele külön Unicode karakterrel (szebb tipográfiájú pl. a Linux Libertine
betűtípusban)
* hu_HU.dlg: új feltételes szabályok:
- ligatúrák javaslata és elutasítása
- törtek, indexek, fokok menüpont
- átcsoportosítás
2009-12-16 László Németh :
* hu_HU.dlg:
- Beállítások menü a magyar nyelvi ellenőrzéshez
* hu_HU.dat:
- opcionális szabályok: szóismétlés, képzett
összetett szavak, (tizedes)vesszők ellenőrzése, stb.
lightproof/src/hu_HU/README_lightproof_hu_HU.txt 0000644 0001750 0001750 00000000250 13231171520 020511 0 ustar rene rene Hungarian sentence checker for LibreOffice
see git://anongit.freedesktop.org/libreoffice/lightproof
2009-2012 (c) László Németh, license: MPL 1.1 / GPLv3+ / LGPLv3+
lightproof/src/hu_HU/hu_HU.cfg 0000644 0001750 0001750 00000000352 13231171520 015162 0 ustar rene rene [args]
lang = hu_HU
locales = hu_HU
name = Lightproof grammar checker (magyar)
version = 1.6.2
author = Laszlo Nemeth
provider = FSF.hu
implname = lightproof_hu
link = http://www.fsf.hu
extras = README_lightproof_hu_HU.txt, ChangeLog
lightproof/src/ru_RU/ 0000755 0001750 0001750 00000000000 13231171520 013515 5 ustar rene rene lightproof/src/ru_RU/README_lightproof_ru_RU.txt 0000644 0001750 0001750 00000000340 13231171520 020561 0 ustar rene rene Russian grammar checker
(developed by the Lightproof grammar checker extension generator,
see http://launchpad.net/lightproof)
2009, 2011, 2012, 2014 (c) Yakov Reztsov , license: MPL 1.1 / GPL / LGPL
lightproof/src/ru_RU/ru_RU.dlg 0000644 0001750 0001750 00000005377 13231171520 015255 0 ustar rene rene # Options and title texts for the Settings and conditional rules
# for Russian (translated by Yakov Reztsov 2011)
# The Lightproof dialogs contain only grouped checkboxes.
#
# Format of the dialog definition:
#
# GroupID: OptionID, OptionID ...
# Group2ID: OptionID, OptionID ...
# ...
# [Language_code=title of the window]
# OptionID=title of the option
# Option2ID=title of the option
#
# The first language is the default language for other locales
# (use en_US or the common language of your country)
#
# The OptionIDs declared here are used in the rules, too. For example:
#
# foo <- option("style") -> bar # bar is far better
#
# this rule depends from the state of the "style" checkbox.
# options (starred options are checked)
grammar: *hyphen *comma, *multiword *together
proofreading: *common *space, *abbreviation *dup
others: numsep, *typographica, quotation
# titles
[en_US=Russian sentence checking]
abbreviation=Abbreviation
grammar=Grammar
hyphen=Compound words with hyphen
comma=Comma usage
common=General error
multiword=Multiword expressions
together=Together/separately
proofreading=Proofreading
space=Space mistake
typographica=Typographica
dup=Word duplication
others=Others
numsep=Separation of large numbers (ISO)
quotation=Quotation
[ru_RU=Проверка грамматики (Русский язык)]
abbreviation=Аббревиатуры \n Аббревиатуры, сокращения и знаки пунктуации.
grammar=Грамматика
hyphen=Дефис \n Правописание слов через дефис, слитно или раздельно.
comma=Пунктуация \n Поиск ошибок в расстановке знаков препинания.
common=Общие ошибки \n Поиск прочих ошибок
multiword=Словосочетания \n Правописание словосочетаний и устойчивых оборотов.
together=Слитно/раздельно \n Правописание слов слитно или раздельно.
proofreading=Стилистика
space=Пробел \n Поиск ошибок с пробелом: двойной пробел, пробел перед знаками пунктуации.
typographica=Типографика \n Предлагать замену сочетаний знаков на специальные символы.
dup=Повтор слов \n Поиск повторяющихся слов
others=Прочее
numsep=Разделители групп разрядов (ISO) для чисел \n Разделители групп разрядов (ISO) для больших чисел
quotation=Кавычки \n Предлагать замену кавычек на кавычки-«ёлочки» или парные кавычки.
lightproof/src/ru_RU/ChangeLog 0000644 0001750 0001750 00000000421 13231171520 015264 0 ustar rene rene 2014-06-17 Yakov Reztsov :
- New grammar rules
- Fix some rules
2012-08-21 Yakov Reztsov :
- New grammar rules
- Fix some rules
2012-02-04 Yakov Reztsov :
- Update and rewrite rules
- Update settings dialog lightproof/src/ru_RU/ru_RU.cfg 0000644 0001750 0001750 00000000524 13231171520 015233 0 ustar rene rene [args]
lang = ru_RU
locales = ru_RU
name = Lightproof grammar checker (Russian)
version = 0.3.4
author = Yakov Reztsov
provider = LibreOffice
implname = lightproof_ru_RU
link = http://www.libreoffice.org
description = Russian grammar checker for LibreOffice
extras = README_lightproof_ru_RU.txt
# logo =
# sourcefiles = lightproof/src/ru_RU/ru_RU.dat 0000644 0001750 0001750 00000046546 13231171520 015262 0 ustar rene rene # Proofreading rules for Russian (by Yakov Reztsov 2009-2012,2014)
# test
\bfoo\b -> bar # test
# foo -> bar
# punctuation
" ([.?!,:;)”]($| ))" <- option("space") -> \1 # Лишний пробел перед знаком пунктуации.
"([(“]) " <- option("space") -> \1 # Лишний пробел после знака пунктуации.
# ( item ) -> (item)
[word]
abbr руб|коп|грн|тыс|ул|кв|пос|ст|пр|просп|ед|экз|тел|исп
novvod авось|буквально|будто|вдобавок|вдруг|ведь|вот|даже|исключительно|именно|небось|приблизительно|примерно|притом|почти|поэтому|просто|решительно|словно|якобы|в довершение|в конечном счете|в конечном счёте|вряд ли|все-таки|как будто|как бы|как раз|к тому же|между тем|по предложению|по постановлению|по решению
vvod итак|следовательно|во-первых|во-вторых|в-третьих|в-четвертых|в-четвёртых|в-пятых|пожалуйста|как нарочно|как исключение|как правило
adv1 кто|что|где|зачем|кое
[Word]
# definitions
abc [a-zа-я][a-zа-я]+
ABC [A-ZА-Я][a-zа-я]+
Abc [a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]+
punct [?!,:;%‰‱˚“”‘„]
w \w*
W \W*
{Abc}{punct}{Abc} <- option("space") -> {Abc}{punct} {Abc} # Пропущен пробел?
{Abc}[.]{ABC} <- option("space") -> {Abc}. {ABC} # Пропущен пробел?
# missing,space -> missing, space
# missing.Space -> missing. Space
[word]
# typography
"[.]{3}" <- option("typographica") -> "…" # Символ троеточия.
(\d+)x(\d+) <- option("typographica") -> \1×\2 # Знак умножения.
"^[-—] " <- option("typographica") -> "– " # Заменить на тире (n-dash)?
" [-—]([ ,;])" <- option("typographica") -> " –\1" # Заменить на тире (n-dash)?
# 800x600 -> 800×600
# End... -> End…
# A small - but reliable - example. -> A small – but reliable – example.
"[,]{2}" <- option("comma") -> "," # Две запятые подряд.
[ ]{abbr}[ ] <- option("abbreviation") -> " {abbr}. " # Точка после сокращений.
(^|\b|{punct}|[.]) {2,3}(\b|$) <- option("space") -> "\1 " # Лишний пробел.
# Extra space -> Extra space
# " коп " -> " коп. "
# quotation
\"(\w[^\"“”]*[\w.?!,])\" <- option("quotation") -> «\1» # Кавычки.
\B'(\w[^']*[\w.?!,])'\B <- option("quotation") -> ‘\1’ # Кавычки.
# "The 'old' boy" -> «The ‘old’ boy»
# apostrophe
w \w*
(?i){Abc}'{w} <- option("quotation") -> {Abc}’{w} # Апостроф.
# o'clock -> o’clock
# singers' voices -> singers’ voices
# words
# punctuation
{abc}[ ]а[ ] <- option("comma") -> "{abc}, а " # Пропущена запятая перед а.
{abc}[ ]но[ ] <- option("comma") -> "{abc}, но " # Пропущена запятая перед но.
# nopunctuation
"{abc}, {novvod}," <- option("comma") -> "{abc} {novvod}" # Слова, не являющиеся вводными.
# думали, авось, -> думали авось
# vvodpunctuation
{abc} {vvod} <- option("comma") -> {abc}, {vvod}, # Слова, являющиеся вводными, выделяются запятыми.
# дому следовательно -> дому, следовательно,
# frequent mistakes
\bложить\b <- option("common") -> класть # Общие ошибки
\bляжь\b <- option("common") -> ляг # Общие ошибки
\bехай\b <- option("common") -> поезжай # Общие ошибки
\bихн{abc}\b <- option("common") -> их # Притяжательное местоимение не склоняется
# common rules
жы <- option("common") -> жи # Через "и"
шы <- option("common") -> ши # Через "и"
# жыр -> жир
# multiword expressions
\bнорд ост\b <- option("hyphen") -> норд-ост # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# норд ост -> норд-ост # Suggestions separated by new lines (\n)
\bнорд вест\b <- option("hyphen") -> норд-вест # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# норд вест -> норд-вест # Suggestions separated by new lines (\n)
\bзюйд ост\b <- option("hyphen") -> зюйд-ост # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# зюйд ост -> зюйд-ост # Suggestions separated by new lines (\n)
\bзюйд вест\b <- option("hyphen") -> зюйд-вест # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# зюйд вест -> зюйд-вест # Suggestions separated by new lines (\n)
\bсеверо западн{abc}\b <- option("hyphen") -> северо-западн{abc} # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# северо западный -> северо-западный # Suggestions separated by new lines (\n)
\bюго западн{abc}\b <- option("hyphen") -> юго-западн{abc} # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# юго западный -> юго-западный # Suggestions separated by new lines (\n)
\bсеверо восточн{abc}\b <- option("hyphen") -> северо-восточн{abc} # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# северо восточный -> северо-восточный # Suggestions separated by new lines (\n)
\bюго восточн{abc}\b <- option("hyphen") -> юго-восточн{abc} # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# юго восточный -> юго-восточный # Suggestions separated by new lines (\n)
\b{adv1} нибудь\b <- option("hyphen") -> {adv1}-нибудь # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# что нибудь -> что-нибудь # Suggestions separated by new lines (\n)
\b{adv1} либо\b <- option("hyphen") -> {adv1}-либо # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# что либо -> что-либо # Suggestions separated by new lines (\n)
\b{adv1} то\b <- option("hyphen") -> {adv1}-то # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# кто то -> кто-то # Suggestions separated by new lines (\n)
\bточь в точь\b <- option("hyphen") -> точь-в-точь # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# точь в точь -> точь-в-точь # Suggestions separated by new lines (\n)
\bиз за\b <- option("hyphen") -> из-за # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# из за -> из-за # Suggestions separated by new lines (\n)
\bвсё таки\b <- option("hyphen") -> всё-таки # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# всё таки -> всё-таки # Suggestions separated by new lines (\n)
\bкое кто\b <- option("hyphen") -> кое-кто # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# кое кто -> кое-кто # Suggestions separated by new lines (\n)
\bкое что\b <- option("hyphen") -> кое-что # Дефис? \n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81
# кое что -> кое-что # Suggestions separated by new lines (\n)
\bво что бы то нe стало\b <- option("multiword") -> во что бы то ни стало # Оборот
\bво чтобы то нe стало\b <- option("multiword") -> во что бы то ни стало # Оборот
\bво чтобы то ни стало\b <- option("multiword") -> во что бы то ни стало # Оборот
\bтакже как и\b <- option("multiword") -> так же как и # Сложный союз.
\bво избежании\b<- option("multiword") -> во избежание # Сложный предлог.
\bравноправны друг другу\b<- option("multiword") -> равноправны друг c другом # Равноправны друг c другом.
\bни кто иной как\b<- option("multiword") -> не кто иной, как # Оборот.
\bни что иное как\b<- option("multiword") -> не что иное, как # Оборот.
\bне кто иной как\b<- option("multiword") -> не кто иной, как # Оборот.
\bне что иное как\b<- option("multiword") -> не что иное, как # Оборот.
\bникто иной, не\b<- option("multiword") -> никто иной не # Оборот.
\bничто иное, не\b<- option("multiword") -> ничто иное не # Оборот.
\bнекто иной, не\b<- option("multiword") -> никто иной не # Оборот.
\bнечто иное, не\b<- option("multiword") -> ничто иное не # Оборот.
\bнекто иной не\b<- option("multiword") -> никто иной не # Оборот.
\bнечто иное не\b<- option("multiword") -> ничто иное не # Оборот.
\bне кто иной, не\b<- option("multiword") -> никто иной не # Оборот.
\bне что иное, не\b<- option("multiword") -> ничто иное не # Оборот.
\bне кто иной не\b<- option("multiword") -> никто иной не # Оборот.
\bне что иное не\b<- option("multiword") -> ничто иное не # Оборот.
\bникто иной, не\b<- option("multiword") -> никто иной не # Оборот.
\bничто иное, не\b<- option("multiword") -> ничто иное не # Оборот.
\bни кто иной, не\b<- option("multiword") -> никто иной не # Оборот.
\bни что иное, не\b<- option("multiword") -> ничто иное не # Оборот.
(в) (течение) (реки|потока|воды|ручья) <- option("multiword") -> \1 течении \3 # Грамматическая ошибка
(в) (течении) (часа|минуты|промежутка|секунды|дня|времени|недели|месяца|года|столетия|тысячелетия) <- option("multiword") -> \1 течение \3 # Грамматическая ошибка
(в) (продолжении) (часа|минуты|промежутка|секунды|дня|времени|недели|месяца|года|столетия|тысячелетия|разговора|беседы) <- option("multiword") -> \1 продолжение \3 # Грамматическая ошибка
\bкакбудто<- option("together") -> как будто # Составная частица
\bпо мимо\b <- option("together") -> помимо # Пишется слитно
\bна кануне\b<- option("together") -> накануне # Слитно
\bна подобие\b<- option("together") -> наподобие # Слитно
\bна против\b<- option("together") -> напротив # Слитно
\bв низу\b<- option("together") -> внизу # Слитно
\bс низу\b<- option("together") -> снизу # Слитно
\bна верху\b<- option("together") -> наверху # Слитно
\bв верху\b<- option("together") -> вверху # Слитно
\bс верху\b<- option("together") -> сверху # Слитно
\bс верх\b<- option("together") -> сверх # Слитно
\bс выше\b<- option("together") -> свыше # Слитно
\bсо гласно\b<- option("together") -> согласно # Слитно
\bв глубь\b<- option("together") -> вглубь # Слитно
\bв доль\b<- option("together") -> вдоль # Слитно
\bв замен\b<- option("together") -> взамен # Слитно
\bв место\b<- option("together") -> вместо # Слитно
\bза место\b<- option("together") -> заместо # Слитно
\bни же\b<- option("together") -> ниже # Слитно
\bпо середине\b<- option("together") -> посередине # Слитно
# formats
# Thousand separators: 10000 -> 10,000 (common) or 10 000 (ISO standard)
# definitions
d \d\d\d # name definition: 3 digits
d2 \d\d # 2 digits
D \d|\d\d|\d\d\d # 1, 2 or 3 digits
# ISO thousand separatos: space, here: no-break space (U+00A0)
\b{d2}{d}\b <- option("numsep") -> {d2} {d} # Добавить разделитель разрядов (ISO)?
\b{D}{d}{d}\b <- option("numsep") -> {D} {d} {d} # Добавить разделитель разрядов (ISO)?
\b{D}{d}{d}{d}\b <- option("numsep") -> {D} {d} {d} {d} # Добавить разделитель разрядов (ISO)?
# 1234567890 -> 1 234 567 890
\bблизкий свет\b <- option("multiword") -> ближний свет # Опечатка?
\bближний друг\b <- option("multiword") -> близкий друг # Опечатка?
\bщекотливая дилемма\b <- option("multiword") -> щекотливый вопрос # Фразеологизм.
\bпоёт в одну дуду\b <- option("multiword") -> поёт в один голос # Фразеологизм.
\bпоет в одну дуду\b <- option("multiword") -> поёт в один голос # Фразеологизм.
\bне упасть лицом в грязь\b <- option("multiword") -> не ударить лицом в грязь # Фразеологизм.
\bотдал руку и сердце\b <- option("multiword") -> предложил руку и сердце # Фразеологизм.
\bизбиение грешников\b <- option("multiword") -> избиение младенцев # Фразеологизм.
\bзакадычная подруга\b <- option("multiword") -> лучшая подруга # Фразеологизм.
\bпромокли до костей\b <- option("multiword") -> промокли до нитки # Фразеологизм.
\bпромёрзли до нитки\b <- option("multiword") -> промёрзли до костей # Фразеологизм.
\bпромерзли до нитки\b <- option("multiword") -> промёрзли до костей # Фразеологизм.
\bзамёрзли до нитки\b <- option("multiword") -> замёрзли до костей # Фразеологизм.
\bзамерзли до нитки\b <- option("multiword") -> замёрзли до костей # Фразеологизм.
\bглас, вопиющий в пустыне\b <- option("multiword") -> глас вопиющего в пустыне # Фразеологизм.
\bни кто иной, как\b <- option("multiword") ->не кто иной, как # Оборот.
\bрешит эту затянувшуюся проблему\b <- option("multiword") -> ускорит затянувшееся решение проблемы # Логическая ошибка.
\bрешит затянувшуюся проблему\b <- option("multiword") -> ускорит затянувшееся решение проблемы # Логическая ошибка.
\bподорожали цены\b <- option("multiword") -> цены выросли # Логическая ошибка.
\bподнял тост\b <- option("multiword") -> произнёс тост # Логическая ошибка.
\bулучшение отмеченных недостатков\b <- option("multiword") -> устранение отмеченных недостатков # Логическая ошибка.
\bв этой связи\b <- option("multiword") -> в связи с этим # Логическая ошибка.
\bодел рубашку\b <- option("multiword") -> надел рубашку # Логическая ошибка
\bодеть рубашку\b <- option("multiword") -> надеть рубашку # Логическая ошибка
\bодела платье\b <- option("multiword") -> надела платье # Логическая ошибка
\bодеть платье\b <- option("multiword") -> надеть платье # Логическая ошибка
\bодела юбку\b <- option("multiword") -> надела юбку # Логическая ошибка
\bодеть юбку\b <- option("multiword") -> надеть юбку # Логическая ошибка
\bодел куртку\b <- option("multiword") -> надел куртку # Логическая ошибка
\bодела куртку\b <- option("multiword") -> надела куртку # Логическая ошибка
\bодеть куртку\b <- option("multiword") -> надеть куртку # Логическая ошибка
\bодел пальто\b <- option("multiword") -> надел пальто # Логическая ошибка
\bодела пальто\b <- option("multiword") -> надела пальто # Логическая ошибка
\bодеть пальто\b <- option("multiword") -> надеть пальто # Логическая ошибка
\bхрабрая идея\b <- option("multiword") -> смелая идея # Логическая ошибка
\bхрабрая мысль\b <- option("multiword") -> смелая мысль # Логическая ошибка
\bхрабрая решение\b <- option("multiword") -> смелая решение # Логическая ошибка
", что угодно" <- option("multiword") -> " что угодно" # Запятая не нужна
", как попало" <- option("multiword") -> " как попало" # Запятая не нужна
(не|совсем|совершенно|почти|именно), как <- option("multiword") -> \1 как # Запятая не нужна
и то, и се <- option("multiword") -> и то и се # Запятая не нужна
и то, и сё <- option("multiword") -> и то и сё # Запятая не нужна
ни то, ни се <- option("multiword") -> ни то ни се # Запятая не нужна
ни то, ни сё <- option("multiword") -> ни то ни сё # Запятая не нужна
ни свет, ни заря <- option("multiword") -> ни свет ни заря # Запятая не нужна
и так, и сяк <- option("multiword") -> и так и сяк # Запятая не нужна
и туда, и сюда <- option("multiword") -> и туда и сюда # Запятая не нужна
ни рыба, ни мясо <- option("multiword") -> ни рыба ни мясо # Запятая не нужна
ни жив, ни мертв <- option("multiword") -> ни жив ни мертв # Запятая не нужна
ни жив, ни мёртв <- option("multiword") -> ни жив ни мёртв # Запятая не нужна
# word duplication
[Word]
W [-\w]{3,}
# within clauses
{W} \1 <- option("dup") -> {W} # Повтор слова?
"кВт/ч" <- option("common") -> "кВт⋅ч" # Опечатка?
"мА/ч" <- option("common") -> "мА⋅ч" # Опечатка?
"А/ч" <- option("common") -> "А⋅ч" # Опечатка?
lightproof/src/en/ 0000755 0001750 0001750 00000000000 13231171520 013063 5 ustar rene rene lightproof/src/en/en.cfg 0000644 0001750 0001750 00000000621 13231171520 014145 0 ustar rene rene [args]
lang = en
locales = en_GB en_US en_PH en_ZA en_NA en_ZW en_AU en_CA en_IE en_IN en_BZ en_BS en_GH en_JM en_NZ en_TT
name = Lightproof grammar checker (English)
version = 0.4.3
author = Laszlo Nemeth
provider = LibreOffice
implname = lightproof_en
link = http://www.libreoffice.org
description = English grammar checker for LibreOffice
extras = README_lightproof_en.txt
# logo =
# sourcefiles =
lightproof/src/en/README_lightproof_en.txt 0000644 0001750 0001750 00000000246 13231171520 017502 0 ustar rene rene English sentence checker for LibreOffice
see git://anongit.freedesktop.org/libreoffice/lightproof
2011-2012 (c) László Németh, license: MPL 1.1 / GPLv3+ / LGPLv3+
lightproof/src/en/en.dat 0000644 0001750 0001750 00000041635 13231171520 014170 0 ustar rene rene # English sentence checking
# word-level rules (case-sensitive)
[word]
# basic syntax of the rules:
#
# pattern -> suggestion # warning message
# pattern <- condition -> suggestion # warning message
#
# duplicates
and and -> and # Did you mean:
or or -> or # Did you mean:
for for -> for # Did you mean:
the the -> the # Did you mean:
# word-level rules (case-insensitive)
[Word]
# multiword expressions
ying and yang -> yin and yang # Did you mean:
# multiple suggestions separated by "\n"
scot free -> scot-free\nscotfree # Did you mean:
# possessive pronouns
# Your's -> Yours
(your|her|our|their)['’]s -> \1s # Possessive pronoun: \n http://en.wikipedia.org/wiki/Possessive_pronoun
# a or an (rules for articles)#
###############################
[word]
# pattern "a" matches "a" or "A":
a [Aa]
# pattern "_" matches space and optional quotation marks:
_ [ ]['‘"“]?
# pattern "vow" matches words beginning with vowels:
vow [aeiouAEIOU]\w*
# pattern "con" matches words beginning with consonants:
con [bcdfghj-np-tv-zBCDFGHJ-NP-TV-Z]\w*
# pattern "etc" matches other word parts separated by hyphen, endash or apostrophes:
etc [-–'’\w]*
# rules ("aA", "aAN", "aB" sets are defined at the end of the file)
{a}n{_}{vow}{etc} <- {vow} in aA or {vow}.lower() in aA -> {a}{_}{vow}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
a{_}{vow}{etc} <- ({vow} != {vow}.upper()) and not ({vow} in aA or
{vow}.lower() in aA) and spell({vow}) -> an{_}{vow}{etc} # Bad article? \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
a{_}{con}{etc} <- {con} in aAN or {con}.lower() in aAN -> an{_}{con}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
{a}n{_}{con}{etc} <- ({con} != {con}.upper()) and not ({con} in aA or
{con}.lower() in aAN) and not {con} in aB and spell({con}) -> {a}{_}{con}{etc} # Bad article? \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
# rules for sentences beginning with "A"
^A{_}{vow}{etc} <- ({vow} != {vow}.upper()) and not ({vow} in aA or
{vow}.lower() in aA) and spell({vow}) -> An{_}{vow}{etc} # Bad article? \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
^A{_}{con}{etc} <- {con} in aAN or {con}.lower() in aAN -> An{_}{con}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
# check numbers
nvow (8[0-9]*|1[18](000)*)(th)? # 8, 8th, 11, 11th, 18, 18th, 11000, 11000th...
a{_}{nvow}{etc} -> an{_}{nvow}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
^A{_}{nvow}{etc} -> An{_}{nvow}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
ncon [0-79][0-9]*
{a}n{_}{ncon}{etc} <- not {ncon}[:2] in ["11", "18"] -> {a}{_}{ncon}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an
# paragraph capitalization
[code]
# pattern matching for common English abbreviations
abbrev = re.compile("(?i)\b([a-z]|acct|approx|appt|apr|apt|assoc|asst|aug|ave|avg|co(nt|rp)?|ct|dec|defn|dept|dr|eg|equip|esp|est|etc|excl|ext|feb|fri|ft|govt?|hrs?|ib(id)?|ie|in(c|t)?|jan|jr|jul|lit|ln|mar|max|mi(n|sc)?|mon|Mrs?|mun|natl?|neg?|no(rm|s|v)?|nw|obj|oct|org|orig|pl|pos|prev|proj|psi|qty|rd|rec|rel|reqd?|resp|rev|sat|sci|se(p|pt)?|spec(if)?|sq|sr|st|subj|sun|sw|temp|thurs|tot|tues|univ|var|vs)\.")
# pattern for paragraph checking
paralcap = re.compile(u"(?u)^[a-z].*[.?!] [A-Z].*[.?!][)”]?$")
[word]
# condition: the paragraph begins with a lowercase letter and it contains real sentence boundaries.
low [a-z]+
(^){low} <- paralcap.search(TEXT) and not abbrev.search(TEXT) -> = {low}.capitalize() # Missing capitalization?
# optional sentence capitalization
^{low} <- option("cap") and not abbrev.search(TEXT) -> = {low}.capitalize() # Missing capitalization?
# punctuation
[code]
punct = { "?": "question mark", "!": "exclamation mark",
",": "comma", ":": "colon", ";": "semicolon",
"(": "opening parenthesis", ")": "closing parenthesis",
"[": "opening square bracket", "]": "closing square bracket",
u"“": "opening quotation mark", u"”": "closing quotation mark"}
[char]
" ([.?!,:;)”\]])\b" -> "\1 " # Reversed space and punctuation?
" +[.]" <- LOCALE.Country == "US" -> . # Extra space before the period?
" +[.]" <- LOCALE.Country != "US" -> . # Extra space before the full stop?
" +([?!,:;)”\]])" -> \1 # = "Extra space before the " + punct[\1] + "?"
"([([“]) " -> \1 # = "Extra space after the " + punct[\1] + "?"
# ( item ) -> (item)
# A small - but important - example. -> A small – but important – example.
# En dash and em dash
\b(---?| --? )\b <- not option("ndash") and not option("mdash") -> " – \n—" # En dash or em dash:
\b(---?| --? |—)\b <- option("ndash") and not option("mdash") -> " – " # En dash:
\b(---?| --? | – )\b <- option("mdash") -> — # Em dash:
# multiplication sign
number \d+([.]\d+)?
{number}(x| x ){number} <- option("times") -> {number}×{number} # Multiplication sign. \n http://en.wikipedia.org/wiki/Multiplication_sign
# 800x600 -> 800×600
# missing space
abc [a-z]+
ABC [A-Z]+
Abc [a-zA-Z]+
pun [?!,:;%‰‱˚“”‘]
{Abc}{pun}{Abc} -> {Abc}{pun} {Abc} # Missing space?
{abc}[.]{ABC} -> {abc}. {ABC} # Missing space?
# missing,space -> missing, space
# missing.Space -> missing. Space
[)] <- option("pair") and not "(" in TEXT -> # Extra closing parenthesis?
[(] <- option("pair") and TEXT[-1] in u"?!;:”’" and not ")" in TEXT -> # Extra opening parenthesis?
(? # Extra quotation mark?
(?<=[0-9])” <- option("apostrophe") and not u"“" in TEXT -> ″\n # Bad double prime or extra quotation mark?
“ <- option("pair") and TEXT[-1] in u"?!;:”’" and not u"”" in TEXT -> # Extra quotation mark?
"[.]{3}" <- option("ellipsis") -> "…" # Ellipsis.
\b {2,3}(\b|$) <- option("spaces") -> "\1 " # Extra space.
# Extra space -> Extra space
# End... -> End…
(^|\b|{pun}|[.]) {2,3}(\b|$) <- option("spaces2") -> "\1 " # Extra space.
# Extra space -> Extra space
# End... -> End…
(^|\b|{pun}|[.]) {4,}(\b|$) <- option("spaces3") -> "\1 \n " # Change multiple spaces to a single space or a tabulator:
# quotation
# Using typographic quotation marks is the
(?i)[\"“”‟„]({abc}[^\"“”‟„]*)[\"“‟] <- option("quotation") -> “\1” # Quotation marks.
(?i)[\"”‟„]({abc}[^\"“”‟„]*)[\"“”‟] <- option("quotation") -> “\1” # Quotation marks.
(?i)'{abc}' <- option("apostrophe") -> ‘{abc}’ # Quotation marks.
(?i)[\"”‟„]({abc}[^\"“”‟„]*)[\"“”‟] <- option("apostrophe") -> “\1” # Quotation marks.
# apostrophe
w \w*
(?i){Abc}'{w} <- option("apostrophe") -> {Abc}’{w} # Replace typewriter apostrophe or quotation mark:
# o'clock -> o’clock
# singers' voices -> singers’ voices
(?<= )'{Abc} <- option("apostrophe") -> ‘{Abc}\n’{Abc} # Replace typewriter quotation mark or apostrophe:
^'{Abc} <- option("apostrophe") -> ‘{Abc}\n’{Abc} # Replace typewriter quotation mark or apostrophe:
# formats
# Thousand separators: 10000 -> 10,000 (common) or 10 000 (ISO standard)
# definitions
d \d\d\d # name definition: 3 digits
d2 \d\d # 2 digits
D \d{1,3} # 1, 2 or 3 digits
# ISO thousand separators: space, here: narrow no-break space (U+202F)
\b{d2}{d}\b <- option("numsep") -> {d2},{d}\n{d2} {d} # Use thousand separator (common or ISO).
\b{D}{d}{d}\b <- option("numsep") -> {D},{d},{d}\n{D} {d} {d} # Use thousand separators (common or ISO).
\b{D}{d}{d}{d}\b <- option("numsep") -> {D},{d},{d},{d}\n{D} {d} {d} {d} # Use thousand separators (common or ISO).
# 1234567890 -> 1,234,567,890\n1 234 567 890
# word duplication
[word]
{Abc} \1 <- option("dup") -> {Abc} # Word duplication?
# Optional grammar checking
([Tt])his {abc} <- option("grammar") and morph({abc}, "Ns") -> \1hese {abc}\n\1his, {abc} # Did you mean:
with it['’]s <- option("grammar") -> with its\nwith, it’s # Did you mean:
[Word]
(it|s?he) don['’]t <- option("grammar") -> \1 doesn’t # Did you mean:
################### measurements ##########################
[word]
# Temperature
([-−]?\d+(?:[,.]\d+)*) (°F|Fahrenheit) <- option("metric") -> = measurement(\1, "F", "C", u" °C", ".", ",") # Convert to Celsius:
([-−]?\d+(?:[,.]\d+)*) (°C|Celsius) <- option("nonmetric") -> = measurement(\1, "C", "F", u" °F", ".", ",") # Convert to Fahrenheit:
# Length
([-−]?\d+(?:[,.]\d+)*(?: 1/2| ?½)?) (ft|foot|feet)(?! [1-9]) <- option("metric") -> =
measurement(\1, "ft", "cm", " cm", ".", ",") + "\n" +
measurement(\1, "ft", "m", " m", ".", ",") # Convert to metric:
([-−]?\d+(?:[,.]\d+)*(?: 1/2| ?½)?) ft[.]? ([0-9]+(?: 1/2| ?½)?) in <- option("metric") -> =
measurement(\1 + "*12+" + \2, "in", "cm", " cm", ".", ",") + "\n" +
measurement(\1 + "*12+" + \2, "in", "m", " m", ".", ",") # Convert to metric:
([-−]?\d+(?:[,.]\d+)*(?: 1/2| ?½)?) in <- option("metric") -> =
measurement(\1, "in", "mm", " mm", ".", ",") + "\n" +
measurement(\1, "in", "cm", " cm", ".", ",") + "\n" +
measurement(\1, "in", "m", " m", ".", ",") # Convert to metric:
([-−]?\d+(?:[,.]\d+)*) mm <- option("nonmetric") -> =
measurement(\1, "mm", "in", " in", ".", ",") # Convert from metric:
([-−]?\d+(?:[,.]\d+)*) cm <- option("nonmetric") -> =
measurement(\1, "cm", "in", " in", ".", ",") + "\n" +
measurement(\1, "cm", "ft", " ft", ".", ",") # Convert from metric:
([-−]?\d+(?:[,.]\d+)*) (m|meter|metre) <- option("nonmetric") -> =
measurement(\1, "m", "in", " in", ".", ",") + "\n" +
measurement(\1, "m", "ft", " ft", ".", ",") + "\n" +
measurement(\1, "m", "mi", " mi", ".", ",") # Convert from metric:
([-−]?\d+(?:[,.]\d+)*(?: 1/2| ?½)?) miles? <- option("metric") -> =
measurement(\1, "mi", "m", " m", ".", ",") + "\n" +
measurement(\1, "mi", "km", " km", ".", ",") # Convert to metric:
([-−]?\d+(?:[,.]\d+)*) km <- option("nonmetric") -> =
measurement(\1, "km", "mi", " mi", ".", ",") # Convert to miles:
([-−]?\d+(?:,\d+)?) (yd|yards?) <- option("metric") -> = measurement(\1, "yd", "m", " m", ".", ",") # Convert to metric:
# Volume
([-−]?\d+(?:,\d+)?) (gal(lons?)?) <- option("metric") -> =
measurement(\1, "gal", "l", " l", ".", ",") + "\n" +
measurement(\1, "uk_gal", "l", " l (in UK)", ".", ",") # Convert to metric:
([-−]?\d+(?:,\d+)?) (pint) <- option("metric") -> =
measurement(\1, "pt", "dl", " dl", ".", ",") + "\n" +
measurement(\1, "uk_pt", "dl", " dl (in UK)", ".", ",") + "\n" +
measurement(\1, "pt", "l", " l", ".", ",") + "\n" +
measurement(\1, "uk_pt", "l", " l (in UK)", ".", ",") # Convert to metric:
([-−]?\d+(?:,\d+)?) (l|L|litres?|liters?) <- option("nonmetric") -> =
measurement(\1, "l", "gal", " gal", ".", ",") + "\n" +
measurement(\1, "l", "gal", " gal (in UK)", ".", ",") # Convert to gallons:
# Weight
([-−]?\d+(?:[,.]\d+)*) lbs?[.]? <- option("metric") -> =
measurement(\1, "lbm", "kg", " kg", ".", ",") # Convert to metric:
([-−]?\d+(?:[,.]\d+)*) kg[.]? <- option("nonmetric") -> =
measurement(\1, "kg", "lbm", " lb", ".", ",") # Convert to pounds:
# Speed
([-−]?\d+(?:[,.]\d+)*) mph <- option("metric") -> = measurement(\1, "mph", "km/h", " km/h", ".", ",") # Convert to km/hour:
([-−]?\d+(?:[,.]\d+)*) km/h <- option("nonmetric") -> = measurement(\1, "km/h", "mph", " mph", ".", ",") # Convert to miles/hour:
[code]
aA = set(["eucalypti", "eucalyptus", "Eucharist", "Eucharistic",
"euchre", "euchred", "euchring", "Euclid", "euclidean", "Eudora",
"eugene", "Eugenia", "eugenic", "eugenically", "eugenicist",
"eugenicists", "eugenics", "Eugenio", "eukaryote", "Eula", "eulogies",
"eulogist", "eulogists", "eulogistic", "eulogized", "eulogizer",
"eulogizers", "eulogizing", "eulogy", "eulogies", "Eunice", "eunuch",
"eunuchs", "Euphemia", "euphemism", "euphemisms", "euphemist",
"euphemists", "euphemistic", "euphemistically", "euphonious",
"euphoniously", "euphonium", "euphony", "euphoria", "euphoric",
"Euphrates", "euphuism", "Eurasia", "Eurasian", "Eurasians", "eureka",
"eurekas", "eurhythmic", "eurhythmy", "Euridyce", "Euripides", "euripus",
"Euro", "Eurocentric", "Euroclydon", "Eurocommunism", "Eurocrat",
"eurodollar", "Eurodollar", "Eurodollars", "Euromarket", "Europa",
"Europe", "European", "Europeanisation", "Europeanise", "Europeanised",
"Europeanization", "Europeanize", "Europeanized", "Europeans", "europium",
"Eurovision", "Eustace", "Eustachian", "Eustacia", "euthanasia",
"Ewart", "ewe", "Ewell", "ewer", "ewers", "Ewing", "once", "one",
"oneness", "ones", "oneself", "onetime", "oneway", "oneyear", "u",
"U", "UART", "ubiquitous", "ubiquity", "Udale", "Udall", "UEFA",
"Uganda", "Ugandan", "ugric", "UK", "ukase", "Ukraine", "Ukrainian",
"Ukrainians", "ukulele", "Ula", "ululated", "ululation", "Ulysses",
"UN", "unanimity", "unanimous", "unanimously", "unary", "Unesco",
"UNESCO", "UNHCR", "uni", "unicameral", "unicameralism", "Unicef",
"UNICEF", "unicellular", "Unicode", "unicorn", "unicorns", "unicycle",
"unicyclist", "unicyclists", "unidimensional", "unidirectional",
"unidirectionality", "unifiable", "unification", "unified", "unifier",
"unifilar", "uniform", "uniformally", "uniformed", "uniformer",
"uniforming", "uniformisation", "uniformise", "uniformitarian",
"uniformitarianism", "uniformity", "uniformly", "uniformness", "uniforms",
"unify", "unifying", "unijugate", "unilateral", "unilateralisation",
"unilateralise", "unilateralism", "unilateralist", "unilaterally",
"unilinear", "unilingual", "uniliteral", "uniliteralism", "uniliteralist",
"unimodal", "union", "unionism", "unionist", "unionists", "unionisation",
"unionise", "unionised", "unionising", "unionization", "unionize",
"unionized", "unionizing", "unions", "unipolar", "uniprocessor",
"unique", "uniquely", "uniqueness", "uniquer", "Uniroyal", "unisex",
"unison", "Unisys", "unit", "Unitarian", "Unitarianism", "Unitarians",
"unitary", "unite", "united", "unitedly", "uniter", "unites", "uniting",
"unitize", "unitizing", "unitless", "units", "unity", "univ", "Univac",
"univalent", "univalve", "univariate", "universal", "universalisation",
"universalise", "universalised", "universaliser", "universalisers",
"universalising", "universalism", "universalist", "universalistic",
"universality", "universalisation", "universalization", "universalize",
"universalized", "universalizer", "universalizers", "universalizing",
"universally", "universalness", "universe", "universes", "universities",
"university", "univocal", "Unix", "uracil", "Urals", "uranium", "Uranus",
"uranyl", "urate", "urea", "uremia", "uremic", "ureter", "urethane",
"urethra", "urethral", "urethritis", "Urey", "Uri", "uric", "urinal",
"urinalysis", "urinary", "urinated", "urinating", "urination", "urine",
"urogenital", "urokinase", "urologist", "urologists", "urology",
"Uruguay", "Uruguayan", "Uruguayans", "US", "USA", "usability",
"usable", "usably", "usage",
"usages", "use", "used", "useful", "usefulness", "usefully", "useless",
"uselessly", "uselessness", "Usenet", "user", "users", "uses", "using",
"usual", "usually", "usurer", "usurers", "usuress", "usurial", "usurious",
"usurp", "usurpation", "usurped", "usurper", "usurping", "usurps",
"usury", "Utah", "utensil", "utensils", "uterine", "uterus", "Utica",
"utilitarian", "utilitarianism", "utilities", "utility", "utilizable",
"utilization", "utilize", "utilized", "utilizes", "utilizing", "utopia",
"utopian", "utopians", "utopias", "Utrecht", "Uttoxeter", "uvula",
"uvular"])
aAN = set(["f", "F", "FBI", "FDA", "heir", "heirdom", "heired",
"heirer", "heiress", "heiring", "heirloom", "heirship", "honest",
"honester", "honestly", "honesty", "honor", "honorable", "honorableness",
"honorably", "honorarium", "honorary", "honored", "honorer", "honorific",
"honoring", "honors", "honour", "honourable", "honourableness",
"honourably", "honourarium", "honourary", "honoured", "honourer",
"honourific", "honouring", "Honours", "hors", "hour", "hourglass", "hourlong",
"hourly", "hours", "l", "L", "LCD", "m", "M", "MBA", "MP", "mpg", "mph",
"MRI", "MSc", "MTV", "n", "N", "NBA", "NBC", "NFL", "NGO", "NHL", "r",
"R", "s", "S", "SMS", "sos", "SOS", "SPF", "std", "STD", "SUV", "x",
"X", "XML"])
aB = set(["H", "habitual", "hallucination", "haute", "hauteur", "herb", "herbaceous", "herbal",
"herbalist", "herbalism", "heroic", "hilarious", "historian", "historic", "historical",
"homage", "homophone", "horrendous", "hospitable", "horrific", "hotel", "hypothesis", "Xmas"])
def measurement(mnum, min, mout, mstr, decimal, remove):
if min == "ft" or min == "in" or min == "mi":
mnum = mnum.replace(" 1/2", ".5").replace(u" ½", ".5").replace(u"½",".5")
m = calc("CONVERT_ADD", (float(eval(mnum.replace(remove, "").replace(decimal, ".").replace(u"−", "-"))), min, mout))
a = list(set([str(calc("ROUND", (m, 0)))[:-2], str(calc("ROUND", (m, 1))), str(calc("ROUND", (m, 2))), str(m)])) # remove duplicated rounded items
a.sort(key=lambda x: len(x)) # sort by string length
return (mstr + "\n").join(a).replace(".", decimal).replace("-", u"−") + mstr
lightproof/src/en/en.dlg 0000644 0001750 0001750 00000004330 13231171520 014155 0 ustar rene rene # Options and title texts for the Settings and conditional rules
#
# THe dialog windows contain only grouped checkboxes.
#
# Format of the dialog definition:
#
# GroupID: OptionID, OptionID ...
# Group2ID: OptionID, OptionID ...
# ...
# [Language_code=[title of the node/]title of the window]
# OptionID=title of the option
# Option2ID=title of the option
#
# The first language is the default language for other locales
# (use en_US or the common language of your country)
#
# The OptionIDs declared here are used in the rules, too. For example:
#
# foo <- option("style") -> bar # bar is far better
#
# this rule depends from the state of the "style" checkbox.
# options (starred options are checked)
spelling: grammar cap dup pair
punctuation: *spaces mdash quotation *times, spaces2 ndash apostrophe ellipsis, spaces3 minus - -
others: metric numsep, nonmetric
# titles
[en_US=English sentence checking]
spelling=Grammar checking
grammar=Possible mistakes \n Check more grammar errors.
cap=Capitalization \n Check missing capitalization of sentences.
dup=Word duplication \n Check repeated words.
pair=Parentheses \n Check missing or extra parentheses and quotation marks.
punctuation=Punctuation
spaces=Word spacing\nCheck single spaces between words.
mdash=Em dash\nForce unspaced em dash instead of spaced en dash.
ndash=En dash\nForce spaced en dash instead of unspaced em dash.
quotation=Quotation marks\nCheck double quotation marks: "x" → “x”
times=Multiplication sign\nCheck true multipliction sign: 5x5 → 5×5
spaces2=Sentence spacing\nCheck single spaces between sentences.
spaces3=More spaces\nCheck more than two extra space characters between words and sentences.
minus=Minus sign\nChange hyphen characters to real minus signs.
apostrophe=Apostrophe\nChange typewriter apostrophe, single quotation marks and correct double primes.
ellipsis=Ellipsis\nChange three dots with ellipsis.
others=Others
metric=Convert to metric (°C, km/h, m, kg, l)\nMeasurement conversion from °F, mph, ft, in, lb, gal and miles.
numsep=Thousand separation of large numbers\nCommon (1000000 → 1,000,000) or ISO (1000000 → 1 000 000).
nonmetric=Convert to non-metric (°F, mph, ft, lb, gal)\nMeasurement conversion from °C; km/h; cm, m, km; kg; l.
lightproof/src/converter/ 0000755 0001750 0001750 00000000000 13231171520 014470 5 ustar rene rene lightproof/src/converter/xml2reexp.py 0000644 0001750 0001750 00000052701 13231171520 016775 0 ustar rene rene # -*- coding: UTF-8 -*-
import lxml.etree as ET
import sys
import os
import codecs
import copy
did_you_mean = False
number = 0
amount = 0
to_implement = 0
no_support = 0
class RuleModel(object):
'''parse() method returns rule'''
def __init__(self, rule):
self.rule = rule
self.pattern = rule.find('pattern')
self.pattern_descendants = RuleModel.element_descendants(self.pattern)
self.message = rule.find('message')
self.message_descendants = RuleModel.element_descendants(self.message)
self.items = RuleModel.nesting_list_killer(
[i.items() for i in self.message.iterdescendants()]
+ [i.items() for i in self.pattern.iterdescendants()])
self.keys = RuleModel.nesting_list_killer(
[i.keys() for i in self.message.iterdescendants()]
+ [i.keys() for i in self.pattern.iterdescendants()])
@staticmethod
def nesting_list_killer(lst):
result = []
for element in lst:
if isinstance(element, (str, unicode, tuple)):
result.append(element)
else:
result += RuleModel.nesting_list_killer(element)
return set(result)
@staticmethod
def key_remover(iterable, keys_list):
keys = copy.copy(keys_list)
it = list(copy.copy(iterable))
for key in keys:
try:
it.remove(key)
except ValueError:
pass
return it
@staticmethod
def space_killer(old_result):
'''space killer, char dealer'''
result = [i.strip() for i in old_result[1:]]
for item in result:
if (item in ('.', ',', ':', '!', '?', "'", '"', '([.])')
and item in result
or item.startswith('\\n')
):
indx = result.index(item)
if indx != 0:
result[indx - 1] += item
result.remove(item)
else:
result = [(item + result[:][1]), ] + result[2:]
for item in result:
if '\\n' in item:
result[result.index(item)] = '\\n'.join(i.strip()
for i in item.split('\\n'))
if item.startswith('([.])') or item.endswith('([.]))'):
indx = result.index(item)
if indx != 0:
result[indx - 1] += item
result.remove(item)
for item in result:
if item.endswith('([.]))'):
indx = result.index(item)
if indx != 0:
result[indx - 1] += item
result.remove(item)
# if '|' in item:
# result[result.index(item)] = '\\n'.join(i.strip()
# for i in item.split('|'))
for item in result:
if item.endswith("'") and (len(result) - result.index(item) >= 2):
indx = result.index(item)
result[indx] += result[indx + 1]
result.remove(result[indx + 1])
result.insert(0, old_result[0])
return result
@staticmethod
def element_descendants(element):
return ((i, i.tag, tuple(i.keys()), i.getchildren(), i.text, i.tail)
for i in element.iterdescendants())
def parse(self, attr):
result = []
suggestions = []
if attr == 'pattern':
target = self.pattern_descendants
elif attr == 'message':
target = self.message_descendants
else:
raise AttributeError("wrong attr for parse()'s target ")
for (element, tag, keys, _children, text,
tail) in target:
# start for #
'''unsupported pattern keys'''
if (self.keys
and 'postag' in self.keys
or 'postag_regexp' in self.keys
or 'negate_pos' in self.keys
):
if ('postag', 'SENT_START') in self.items:
r = copy.copy(self.items)
r.remove(('postag', 'SENT_START'))
r = [i[0] for i in RuleModel.nesting_list_killer(r)]
if ('postag' in r
or 'postag_regexp' in r
or 'negate_pos' in r):
result = [[], 'Not supported', ]
return result
else:
pass
else:
result = [[], 'Not supported', ]
return result
'''not implemented features'''
if (self.keys
and 'regexp_match' in self.keys
or 'regexp_replace' in self.keys
or 'regexp_replace' in self.keys
or 'case_conversion' in self.keys
# or tag == 'match'
# or 'skip' in self.keys
# or 'negate' in keys
# or 'spacebefore' in keys
# or 'inflected' in keys
# or tag == 'exception'
or ('postag', 'SENT_START') in self.items
):
if not 'Not supported' in result:
result = [[], 'Not implemented', ]
return result
if not len(result):
result.append(element.items())
else:
result[0] += element.items()
#exception tag with scope attr rule
if (tag == 'exception' and 'scope' in keys
and not RuleModel.key_remover(keys, ['scope', ])):
''' exception tag with only the scope key'''
if element.get('scope') == 'previous':
result.append('(? error'''
raise TypeError("'markered' elements in %s"
% self.rule.get('id'))
if element.getparent().tag == 'marker':
children_list = element.getparent().getchildren()
if len(children_list) == 1:
pass
#result[-1] = '(' + result[-1] + ')'
else:
if children_list[0] == element:
if "regexp" not in element.keys():
if result[-1][0] != '(':
result[-1] = '((' + result[-1] + ')'
else:
result[-1] = '(' + result[-1]
elif len(result) > 2:
if (element in children_list[1:-1]
and "regexp" not in element.keys()):
if not result[-1][0] == '(':
result[-1] = '(' + result[-1] + ')'
elif children_list[-1] == element:
""" ')' after last element"""
if result[-1][0] != '(':
result[-1] = '(' + result[-1] + '))'
elif result[-1][0] == '(':
result[-1] += ')'
#negate attr rule
if (('negate', 'yes') in element.items()
and not RuleModel.key_remover(keys, ['regexp',
'default',
'skip',
'negate'])):
'''negate="yes" attribute'''
if not RuleModel.key_remover([i for i in text],
('.', ',', ':', '!', '?', "'", '"',)):
result.append('([^%s])' % text)
elif 'regexp' in keys:
result.append('(^(%s))' % text)
else:
result.append('(^%s)' % text)
#spacebefore attr rule
if ('spacebefore' in keys
and not RuleModel.key_remover(keys, ['default',
'spacebefore',
'skip',
'inflected'])):
if text and text.strip():
if not self.pattern.getchildren()[0] == element:
if element.get('spacebefore') == 'no':
result[-1] += text.strip()
else:
result[-1] = result[-1] + ' ' + text.strip()
else:
if element.get('spacebefore') == 'no':
result.append('(w*)%s' % text.strip())
else:
result.append('(w*) %s' % text.strip())
#spacebefore + regexp attr rule
if ('spacebefore' in keys
and 'regexp' in keys
and not RuleModel.key_remover(keys, ['default',
'spacebefore',
'regexp',
'skip',
'inflected'])):
if text and text.strip():
if not self.pattern.getchildren()[0] == element:
if element.get('spacebefore') == 'no':
result[-1] = ('(%s%s)'
% (result[-1].translate(None, '()'),
text.strip()))
else:
result[-1] = ('(%s %s)'
% (result[-1].translate(None, '()'),
text.strip()))
else:
if element.get('spacebefore') == 'no':
result.append('()%s' % text.strip())
else:
result.append('(() %s)' % text.strip())
# skip attr rule
if 'skip' in keys:
if element.get('skip') == '-1':
result.append('(\w+ )*')
else:
result.append('(\w+ ){0,%d}' % int(element.get('skip')))
# rules for message
# suggestion tag with no attrs or suggestion match tag with 1 attr
if tag == 'suggestion' and not RuleModel.key_remover(keys, 'no'):
if text and text.strip() and not keys:
'''message suggestions appearance'''
if [item.startswith('=') for item in result[1:]]:
result.append('\\n%s' % text.strip())
suggestions.append('%s' % text.strip())
else:
result.append('%s' % text.strip())
suggestions.append('%s' % text.strip())
# suggestion match rules
for el in element.getchildren():
if el.tag == "match":
match_no = int(el.get('no'))
# match_el = self.pattern.getchildren()[match_no- 1]
# print 'ZZZ', match_el.text
result.append('\\%s' % (match_no))
suggestions.append('\\%s' % (match_no))
if el.tail and el.tail.strip():
result.append('%s' % el.tail.strip())
suggestions.append('%s' % el.tail.strip())
if tail and tail.strip():
suggestions.append(tail.strip())
# end for #
if attr == 'message':
if self.message.getchildren() and not result:
'''in case of empty message'''
raise TypeError('empty message!')
'''message verbosity'''
global did_you_mean
if did_you_mean:
result.append('#Did you mean?')
else:
result.append('#%s' % self.message.text.strip())
if self.message.tail and self.message.tail.strip():
result.append('%s' % self.message.tail.strip())
if suggestions is not None:
for suggestion in suggestions:
if suggestion is not None:
result.append('%s' % suggestion)
result = RuleModel.space_killer(result)
return result
class RuleView(object):
'''adaptes rule's API, printer() method prints rule'''
def __init__(self, rule, category):
self.parse_pattern = RuleModel(rule).parse('pattern')
self.pref = self.parse_pattern[0]
self.pattern = self.parse_pattern[1:]
self.parse_message = RuleModel(rule).parse('message')
self.ix = self.parse_message[0]
self.message = self.parse_message[1:]
self.prefix = list(self.pref) + list(self.ix)
self.id = rule.get('id')[0:15] if rule.get('id') else 'Unknown'
self.rule = rule
self.category = category
self.supported_keys = ['regexp', 'scope', 'spacebefore', 'negate']
self.key_to_print = None
self.keys = RuleModel.nesting_list_killer([i.keys()
for i in self.rule.iterdescendants()])
@staticmethod
def aggregate(iter1, iter2):
set1 = set(iter1)
set2 = set(iter2)
aggregate = set1 & set2
return list(aggregate)
def sys_argv(self):
supported_args = {'-short': 'Print \"Did you mean?\". '
'Default: Print full message',
'-file': 'Dump rules to \'rules.txt\' file',
'-attr': 'Print tags\'s attr list '
'before rule if any',
'-show=attr': 'Incompatible with other '
' keys except maybe -short :)'}
if len(sys.argv) > 1:
if '-short' in sys.argv:
global did_you_mean
did_you_mean = True
if '-file' in sys.argv:
sys.stdout = codecs.open('rules.txt',
encoding='utf-8', mode='a+')
if '-attr' in sys.argv:
if self.prefix:
print sorted(list(set(self.prefix))), '=>',
show_attr = [i for i in sys.argv if i.startswith('-show=')]
if show_attr:
if len(show_attr) == 1:
self.key_to_print = show_attr[0][6:]
else:
raise TypeError('Too many "show" arguments')
if False in [el in supported_args.keys() for el in sys.argv[1:]
if not el.startswith('-show=')]:
print '\n-*-sys.argv Error-*-'
print '\nYou printed: python',
for i in sys.argv:
print i,
print ('\nUsage: python %s [ Keys ]\n\n Keys:'
% sys.argv[0])
for i, j in sorted(supported_args.items()):
print '{0:<20}{1}'.format(i, j)
sys.exit(1)
@staticmethod
def print_element(element):
for el in element:
print el,
def printer(self):
if (self.pattern and self.message
and 'Not supported' not in self.pattern
and 'Not supported' not in self.message
and 'Not implemented' not in self.pattern
and 'Not implemented' not in self.message):
sys.stdout = open('ok.txt', 'a+')
ET.dump(self.rule)
sys.stdout = sys.__stdout__
RuleView.sys_argv(self)
'''
if not did_you_mean:
print (self.rule.get('id') if self.rule.get('id')
else self.rule.getparent().get('id'))
'''
if self.key_to_print:
if self.key_to_print in self.prefix:
if self.key_to_print in self.supported_keys:
sys.stdout = sys.__stdout__
else:
sys.stdout = codecs.open(os.devnull, encoding='utf-8',
mode='w')
global number
global amount
number += 1
###############
''' API's "marker" difference handler'''
if ('marker' in [el.tag
for el in self.rule.find('pattern').getchildren()]):
''' regexp in marker => suggestion_counters +=1'''
for string in self.message:
if '\\' in string:
try:
parts = string.split('\\')
rest = []
for el in parts[1:]:
el = str(int(el[0]) + 1) + el[1:]
rest.append(el)
result = '\\'.join([parts[0], ] + rest)
self.message[self.message.index(string)] = result
except ValueError:
pass
self.message.append('\n')
###############
RuleView.print_element(self.pattern)
###############
''' API's '<- option[...] ->' handler'''
print '<- option("%s")' % self.category.get('name'),
try:
''' marker in pattern => -%d> in result'''
marker = [el.tag for el
in self.rule.find('pattern').getchildren()].index('marker') + 1
if not 'skip' in self.keys:
print '-%d>' % marker,
else:
print '-%d>' % (marker + 1),
except ValueError:
print '->',
###############
RuleView.print_element(self.message)
############### For debug purposes only.
elif ('Not implemented' in self.pattern
or 'Not implemented' in self.message
and 'Not supported' not in self.pattern
and 'Not supported' not in self.message):
global to_implement
to_implement += 1
# print ET.dump(self.rule)
sys.stdout = open('notimplemented.txt', 'a+')
ET.dump(self.rule)
sys.stdout = sys.__stdout__
elif ('Not supported' in self.pattern
or 'Not supported' in self.message
and 'Not implemented' not in self.pattern
and 'Not implemented' not in self.message):
global no_support
no_support += 1
sys.stdout = open('unsupported.txt', 'a+')
ET.dump(self.rule)
sys.stdout = sys.__stdout__
class RuleController(object):
'''flow control'''
def __init__(self):
try:
os.remove(os.path.join(os.getcwd(), 'unsupported.txt'))
except OSError:
pass
try:
os.remove(os.path.join(os.getcwd(), 'notimplemented.txt'))
except OSError:
pass
try:
os.remove(os.path.join(os.getcwd(), 'rules.txt'))
except OSError:
pass
self.categories = ET.iterparse("grammar.xml", events=('end',),
tag='category')
def process(self):
global number
global amount
for _event, category in self.categories:
for rule in category.iter('rule'):
amount += 1
RuleView(rule, category).printer()
if not did_you_mean:
percent = float(number) / amount * 100
print '\n%.3f %s of rules covered (%s/%s)' % (percent, chr(37),
number, amount)
global to_implement
print '%s rules left to cover' % to_implement
global no_support
print '%s unsupported rules' % no_support
RuleController().process()
lightproof/src/editor/ 0000755 0001750 0001750 00000000000 13231171520 013747 5 ustar rene rene lightproof/src/editor/lightproof_editor/ 0000755 0001750 0001750 00000000000 13231171520 017472 5 ustar rene rene lightproof/src/editor/lightproof_editor/RegisteredFlag 0000644 0001750 0001750 00000000000 13231171520 022272 0 ustar rene rene lightproof/src/editor/lightproof_editor/dialog.xlb 0000644 0001750 0001750 00000000472 13231171520 021443 0 ustar rene rene