13 Commits

Author SHA1 Message Date
Storm Dragon
5b642cd9e2 Fixed error in settings file. 2025-02-26 17:41:01 -05:00
Storm Dragon
ed918a0334 Forgot to push one of the punctuation files.
?
2025-01-08 20:26:46 -05:00
Storm Dragon
760b873abe Updated emoticon handling to make it more accurate, fewer false positives. 2025-01-04 21:57:12 -05:00
Storm Dragon
46c348634c Post release switch code name back to master. 2024-12-21 18:01:42 -05:00
Storm Dragon
9da925c80d Fixed merge conflict. 2024-12-21 17:52:38 -05:00
Storm Dragon
9c45ca1b5f Fixed bug in Fenrir configuration tool. 2024-12-21 17:46:23 -05:00
Storm Dragon
d1be848ebb Merge branch 'testing' got rid of the scm dependency." 2024-12-20 14:11:51 -05:00
Storm Dragon
bc4319bf5e Forgot to get rid of the scm stuff since moving back to setup.py. 2024-12-20 14:08:25 -05:00
Storm Dragon
6f8139ed8f Change codename to stable for tag. 2024-12-20 13:33:23 -05:00
Storm Dragon
f1a6c75459 Merged setup fixes to master. Went back to setup.py just with some updates to minimize python's grumbling. Also, merged the locale setup. 2024-12-20 12:50:32 -05:00
Storm Dragon
1d746eb709 Minimal pyproject.tmol added. 2024-12-20 12:30:56 -05:00
Storm Dragon
80f549fde9 Hopefully final fix to setup. 2024-12-20 12:24:52 -05:00
Storm Dragon
9f57f7faec Revert back to setup.py because it worked. 2024-12-20 12:19:09 -05:00
11 changed files with 336 additions and 266 deletions

View File

@@ -46,28 +46,33 @@ _:===:Lienie unten
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)-_-(?:\s|$):===:annoyed
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)o_O(?:\s|$):===:confused
# example for arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)\\o/(?:\s|$):===:hurray
# or regex;(?:^|\s)<3(?:\s|$):===:heart
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF? regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,27 +46,33 @@ _:===:line
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)-_-(?:\s|$):===:annoyed
# example for arrow left regex;(?:^|\s)o_O(?:\s|$):===:confused
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
# or regex;(?:^|\s)\\o/(?:\s|$):===:hurray
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)<3(?:\s|$):===:heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s+|'|"](Oo)|(oO)[\s+|'|"]:===:WTF? regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,27 +46,33 @@ _:===:line
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)-_-(?:\s|$):===:annoyed
# example for arrow left regex;(?:^|\s)o_O(?:\s|$):===:confused
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
# or regex;(?:^|\s)\\o/(?:\s|$):===:hurray
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)<3(?:\s|$):===:heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s+|'|"][O|o][O|o][\s+|'|"]:===:WTF? regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,28 +46,33 @@ _:===:subrayado
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)-_-(?:\s|$):===:annoyed
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)o_O(?:\s|$):===:confused
# example for arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)\\o/(?:\s|$):===:hurray
# or regex;(?:^|\s)<3(?:\s|$):===:heart
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF? regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,28 +46,33 @@ _:===:souligné
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)-_-(?:\s|$):===:annoyed
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)o_O(?:\s|$):===:confused
# example for arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)\\o/(?:\s|$):===:hurray
# or regex;(?:^|\s)<3(?:\s|$):===:heart
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF? regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,28 +46,33 @@ _:===:podkreślnik
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)-_-(?:\s|$):===:annoyed
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)o_O(?:\s|$):===:confused
# example for arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)\\o/(?:\s|$):===:hurray
# or regex;(?:^|\s)<3(?:\s|$):===:heart
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF? regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -52,27 +52,33 @@ regex;(?i)shit:===:shitt
regex;(?i)slither:===:slitther regex;(?i)slither:===:slitther
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)-_-(?:\s|$):===:annoyed
# example for arrow left regex;(?:^|\s)o_O(?:\s|$):===:confused
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
# or regex;(?:^|\s)\\o/(?:\s|$):===:hurray
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)<3(?:\s|$):===:heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s+|'|"][O|o][O|o][\s+|'|"]:===:WTF? regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -1,52 +0,0 @@
[build-system]
requires = ["setuptools>=64.0.0", "wheel", "setuptools_scm[toml]>=6.2"]
build-backend = "setuptools.build_meta"
[project]
name = "fenrir-screenreader"
dynamic = ["version"]
description = "A TTY Screen Reader for Linux"
readme = "README.md"
requires-python = ">=3.8"
license = {text = "GNU General Public License v3 or later (GPLv3+)"}
keywords = ["screenreader", "a11y", "accessibility", "terminal", "TTY", "console"]
authors = [
{name = "Storm Dragon, Jeremiah, Chrys and others", email = "storm_dragon@stormux.org"}
]
classifiers = [
"Programming Language :: Python",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Development Status :: 5 - Production/Stable",
"Topic :: Multimedia :: Sound/Audio :: Speech",
"Environment :: Console",
]
dependencies = [
"evdev>=1.1.2",
"daemonize>=2.5.0",
"dbus-python>=1.2.8",
"pyudev>=0.21.0",
"setuptools",
"pexpect",
"pyttsx3",
"pyte>=0.7.0",
]
[project.urls]
Homepage = "https://git.stormux.org/storm/fenrir/"
[tool.setuptools]
package-dir = {"" = "src"}
include-package-data = true
zip-safe = false
[tool.setuptools.packages.find]
where = ["src"]
include = ["fenrirscreenreader*"]
namespaces = true
[tool.setuptools_scm]
write_to = "src/fenrirscreenreader/_version.py"
[tool.setuptools.data-files]
"usr/share/man/man1" = ["docs/fenrir.1"]
"usr/share/fenrirscreenreader/tools" = ["tools/*"]

160
setup.py
View File

@@ -1,46 +1,130 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os import os, glob, sys
import glob import os.path
from shutil import copyfile
from setuptools import find_namespace_packages
from setuptools import setup from setuptools import setup
def get_data_files(): # handle flags for package manager like aurman and pacaur.
data_files = [] # Allow both environment variable and command line flag
forceSettingsFlag = (
# Handle configuration files "--force-settings" in sys.argv or
directories = glob.glob('config/*') os.environ.get('FENRIR_FORCE_SETTINGS') == '1'
for directory in directories: )
files = glob.glob(directory+'/*') if "--force-settings" in sys.argv:
dest_dir = '' sys.argv.remove("--force-settings")
if 'config/punctuation' in directory:
dest_dir = 'etc/fenrirscreenreader/punctuation'
elif 'config/keyboard' in directory:
dest_dir = 'etc/fenrirscreenreader/keyboard'
elif 'config/settings' in directory:
dest_dir = 'etc/fenrirscreenreader/settings'
elif 'config/scripts' in directory:
dest_dir = 'usr/share/fenrirscreenreader/scripts'
if dest_dir and files:
data_files.append((dest_dir, files))
# Handle sound files dataFiles = []
files = glob.glob('config/sound/default/*')
if files:
data_files.append(('usr/share/sounds/fenrirscreenreader/default', files))
files = glob.glob('config/sound/template/*')
if files:
data_files.append(('usr/share/sounds/fenrirscreenreader/template', files))
# Handle tools directory # Handle locale files
files = glob.glob('tools/*') localeFiles = glob.glob('locale/*/LC_MESSAGES/*.mo')
if files: for localeFile in localeFiles:
data_files.append(('usr/share/fenrirscreenreader/tools', files)) lang = localeFile.split(os.sep)[1]
destDir = f'/usr/share/locale/{lang}/LC_MESSAGES'
dataFiles.append((destDir, [localeFile]))
# Add man page # Handle other configuration files
if os.path.exists('docs/fenrir.1'): directories = glob.glob('config/*')
data_files.append(('usr/share/man/man1', ['docs/fenrir.1'])) for directory in directories:
files = glob.glob(directory+'/*')
destDir = ''
if 'config/punctuation' in directory :
destDir = '/etc/fenrirscreenreader/punctuation'
elif 'config/keyboard' in directory:
destDir = '/etc/fenrirscreenreader/keyboard'
elif 'config/settings' in directory:
destDir = '/etc/fenrirscreenreader/settings'
if not forceSettingsFlag:
try:
files = [f for f in files if not f.endswith('settings.conf')]
except:
pass
elif 'config/scripts' in directory:
destDir = '/usr/share/fenrirscreenreader/scripts'
if destDir != '':
dataFiles.append((destDir, files))
return data_files files = glob.glob('config/sound/default/*')
destDir = '/usr/share/sounds/fenrirscreenreader/default'
dataFiles.append((destDir, files))
files = glob.glob('config/sound//template/*')
destDir = '/usr/share/sounds/fenrirscreenreader/template'
dataFiles.append((destDir, files))
files = glob.glob('tools/*')
dataFiles.append(('/usr/share/fenrirscreenreader/tools', files))
dataFiles.append(('/usr/share/man/man1', ['docs/fenrir.1']))
if __name__ == "__main__": def read(fname):
setup(data_files=get_data_files()) return open(os.path.join(os.path.dirname(__file__), fname)).read()
setup(
# Application name:
name="fenrir-screenreader",
# description
description="A TTY Screen Reader for Linux.",
long_description=read('README.md'),
long_description_content_type="text/markdown",
keywords=['screenreader', 'a11y', 'accessibility', 'terminal', 'TTY', 'console'],
license="License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
url="https://git.stormux.org/storm/fenrir/",
classifiers=[
"Programming Language :: Python",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Development Status :: 5 - Production/Stable",
"Topic :: Multimedia :: Sound/Audio :: Speech",
"Environment :: Console",
],
# Application author details:
author="Storm Dragon, Jeremiah, Chrys and others",
author_email="storm_dragon@stormux.org",
# Packages
package_dir={'': 'src'},
packages=find_namespace_packages(
where='src',
include=['fenrirscreenreader*']
),
scripts=['src/fenrir'],
# Include additional files into the package
include_package_data=True,
zip_safe=False,
data_files=dataFiles,
# Dependent packages (distributions)
python_requires='>=3.6',
install_requires=[
"evdev>=1.1.2",
"daemonize>=2.5.0",
"dbus-python>=1.2.8",
"pyudev>=0.21.0",
"setuptools",
"pexpect",
"pyte>=0.7.0",
],
)
if not forceSettingsFlag:
print('')
# create settings file from example if not exist
if not os.path.isfile('/etc/fenrirscreenreader/settings/settings.conf'):
try:
copyfile('/etc/fenrirscreenreader/settings/settings.conf.example', '/etc/fenrirscreenreader/settings/settings.conf')
print('create settings file in /etc/fenrirscreenreader/settings/settings.conf')
except:
pass
else:
print('settings.conf file found. It is not overwritten automatical')
print('')
print('To have Fenrir start at boot:')
print('sudo systemctl enable fenrir')
print('Pulseaudio users may want to run:')
print('/usr/share/fenrirscreenreader/tools/configure_pulse.sh')
print('once as their user account and once as root to configure Pulseaudio.')
print('Please install the following packages manually:')
print('- Speech-dispatcher: for the default speech driver')
print('- Espeak: as basic TTS engine')
print('- sox: is a player for the generic sound driver')

View File

@@ -4,5 +4,5 @@
# Fenrir TTY screen reader # Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributers. # By Chrys, Storm Dragon, and contributers.
version = "2024.12.20" version = "2025.02.26"
codeName = "testing" codeName = "master"

View File

@@ -201,7 +201,7 @@ class FenrirConfigTool:
# Test voice configuration # Test voice configuration
if self.test_voice(moduleChoice, voice): if self.test_voice(moduleChoice, voice):
config = configparser.ConfigParser() config = configparser.ConfigParser(interpolation=None)
config.read(self.settingsFile) config.read(self.settingsFile)
if 'speech' not in config: if 'speech' not in config:
@@ -244,7 +244,7 @@ class FenrirConfigTool:
def edit_general_config(self) -> None: def edit_general_config(self) -> None:
while True: while True:
config = configparser.ConfigParser() config = configparser.ConfigParser(interpolation=None)
config.read(self.settingsFile) config.read(self.settingsFile)
sections = config.sections() sections = config.sections()