Add multi language support, match file ext with language, log file
This commit is contained in:
parent
3a5587dbcc
commit
3a39fab87a
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
/target
|
||||
**/*.rs.bk
|
||||
.idea
|
||||
log
|
||||
|
241
Cargo.lock
generated
241
Cargo.lock
generated
@ -1,3 +1,11 @@
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.6.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "argon2rs"
|
||||
version = "0.2.5"
|
||||
@ -15,6 +23,16 @@ dependencies = [
|
||||
"nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atty"
|
||||
version = "0.2.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "0.1.1"
|
||||
@ -74,6 +92,11 @@ dependencies = [
|
||||
"constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "c_vec"
|
||||
version = "1.3.2"
|
||||
@ -89,6 +112,16 @@ name = "cfg-if"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cloudabi"
|
||||
version = "0.0.3"
|
||||
@ -113,16 +146,15 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "editor"
|
||||
version = "0.1.0"
|
||||
name = "env_logger"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"sdl2 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -159,6 +191,14 @@ name = "fuchsia-zircon-sys"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "humantime"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "0.4.3"
|
||||
@ -174,11 +214,34 @@ name = "lazy_static"
|
||||
version = "0.2.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nodrop"
|
||||
version = "0.1.13"
|
||||
@ -236,6 +299,11 @@ dependencies = [
|
||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-error"
|
||||
version = "1.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "0.6.10"
|
||||
@ -303,6 +371,14 @@ name = "redox_syscall"
|
||||
version = "0.1.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "redox_termios"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_users"
|
||||
version = "0.2.0"
|
||||
@ -314,6 +390,42 @@ dependencies = [
|
||||
"redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rider"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"sdl2 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"simplelog 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-demangle"
|
||||
version = "0.1.13"
|
||||
@ -376,6 +488,16 @@ dependencies = [
|
||||
"serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "simplelog"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "0.14.9"
|
||||
@ -407,16 +529,76 @@ dependencies = [
|
||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "term"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termcolor"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termion"
|
||||
version = "1.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thread_local"
|
||||
version = "0.3.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.1.41"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ucd-util"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "utf8-ranges"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "vec_map"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.6"
|
||||
@ -431,14 +613,33 @@ name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "wincolor"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[metadata]
|
||||
"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e"
|
||||
"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"
|
||||
"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71"
|
||||
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
|
||||
"checksum autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e5f34df7a019573fb8bdc7e24a2bfebe51a2a1d6bfdbaeccedb3c41fc574727"
|
||||
"checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5"
|
||||
"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6"
|
||||
@ -447,20 +648,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
|
||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
||||
"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400"
|
||||
"checksum byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d"
|
||||
"checksum c_vec 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6c32b15e95ce816aaf991a41420854e6ba772a2679a9296d906eab1114f1b4e9"
|
||||
"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749"
|
||||
"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
|
||||
"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878"
|
||||
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
|
||||
"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
|
||||
"checksum dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "88972de891f6118092b643d85a0b28e0678e0f948d7f879aa32f2d5aafe97d2a"
|
||||
"checksum env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afb070faf94c85d17d50ca44f6ad076bce18ae92f0037d350947240a36e9d42e"
|
||||
"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
|
||||
"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
|
||||
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
|
||||
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
|
||||
"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114"
|
||||
"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
|
||||
"checksum lalr 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "106d7548f95adbe3019b4fc4954554d7b72535867aa9ce326d2f766b68958de7"
|
||||
"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
|
||||
"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1"
|
||||
"checksum libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d2857ec59fadc0773853c664d2d18e7198e83883e7060b63c924cb077bd5c74"
|
||||
"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
|
||||
"checksum memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db4c41318937f6e76648f42826b1d9ade5c09cafb5aef7e351240a70f39206e9"
|
||||
"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
|
||||
"checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e"
|
||||
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
|
||||
@ -468,6 +676,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
|
||||
"checksum plex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "59d79bd74b3d0be2619e58217e8b2b96372e3feca8426e5c560623205d70c146"
|
||||
"checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09"
|
||||
"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
|
||||
"checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c"
|
||||
"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1"
|
||||
"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd"
|
||||
@ -476,7 +685,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db"
|
||||
"checksum redfa 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "29cc2771cc9f5fb0061cdedc05a37170254694dffec6b89920a6e767f08c4220"
|
||||
"checksum redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)" = "52ee9a534dc1301776eff45b4fa92d2c39b1d8c3d3357e6eb593e0d795506fc2"
|
||||
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
||||
"checksum redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "214a97e49be64fd2c86f568dd0cb2c757d2cc53de95b273b6ad0a1c908482f26"
|
||||
"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f"
|
||||
"checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1"
|
||||
"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619"
|
||||
"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7"
|
||||
"checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
|
||||
@ -485,11 +697,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)" = "0e732ed5a5592c17d961555e3b552985baf98d50ce418b7b655f31f6ba7eb1b7"
|
||||
"checksum serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d6115a3ca25c224e409185325afc16a0d5aaaabc15c42b09587d6f1ba39a5b"
|
||||
"checksum serde_json 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)" = "bdf540260cfee6da923831f4776ddc495ada940c30117977c70f1313a6130545"
|
||||
"checksum simplelog 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e95345f185d5adeb8ec93459d2dc99654e294cc6ccf5b75414d8ea262de9a13"
|
||||
"checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741"
|
||||
"checksum syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9545a6a093a3f0bd59adb472700acc08cad3776f860f16a897dfce8c88721cbc"
|
||||
"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
|
||||
"checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561"
|
||||
"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f"
|
||||
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
|
||||
"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
|
||||
"checksum time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "847da467bf0db05882a9e2375934a8a55cffdc9db0d128af1518200260ba1f6c"
|
||||
"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86"
|
||||
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
||||
"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737"
|
||||
"checksum vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cac5efe5cb0fa14ec2f84f83c701c562ee63f6dcc680861b21d65c682adfb05f"
|
||||
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
||||
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab"
|
||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba"
|
||||
|
@ -1,5 +1,5 @@
|
||||
[package]
|
||||
name = "editor"
|
||||
name = "rider"
|
||||
version = "0.1.0"
|
||||
authors = ["Adrian Wozniak <adrian.wozniak@ita-prog.pl>"]
|
||||
edition = "2018"
|
||||
@ -11,6 +11,9 @@ dirs = "*"
|
||||
serde = "*"
|
||||
serde_json = "*"
|
||||
serde_derive = "*"
|
||||
log = "*"
|
||||
env_logger = "*"
|
||||
simplelog = "*"
|
||||
|
||||
[dependencies.sdl2]
|
||||
version = "0.31.0"
|
||||
|
@ -1,15 +1,17 @@
|
||||
use crate::app::caret_manager;
|
||||
use crate::app::file_content_manager;
|
||||
use crate::app::{UpdateResult, WindowCanvas};
|
||||
use crate::config::Config;
|
||||
use crate::renderer::Renderer;
|
||||
use crate::ui::caret::Caret;
|
||||
use crate::ui::caret::{CaretPosition, MoveDirection};
|
||||
use crate::ui::file::editor_file::EditorFile;
|
||||
use crate::ui::file::*;
|
||||
use crate::ui::menu_bar::MenuBar;
|
||||
use crate::ui::caret::{CaretPosition, MoveDirection};
|
||||
use crate::ui::text_character::TextCharacter;
|
||||
use crate::ui::*;
|
||||
use sdl2::rect::{Point, Rect};
|
||||
use sdl2::VideoSubsystem;
|
||||
use sdl2::VideoSubsystem as VS;
|
||||
use std::boxed::Box;
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
@ -35,152 +37,37 @@ impl AppState {
|
||||
|
||||
pub fn open_file(&mut self, file_path: String) {
|
||||
use std::fs::read_to_string;
|
||||
|
||||
if let Ok(buffer) = read_to_string(&file_path) {
|
||||
let file = EditorFile::new(file_path.clone(), buffer, self.config.clone());
|
||||
self.current_file = self.files.len();
|
||||
self.files.push(file);
|
||||
} else {
|
||||
eprintln!("Failed to open file: {}", file_path);
|
||||
};
|
||||
}
|
||||
|
||||
pub fn caret(&mut self) -> &mut Caret {
|
||||
pub fn config(&self) -> &Rc<Config> {
|
||||
&self.config
|
||||
}
|
||||
|
||||
pub fn caret(&self) -> &Caret {
|
||||
&self.caret
|
||||
}
|
||||
|
||||
pub fn caret_mut(&mut self) -> &mut Caret {
|
||||
&mut self.caret
|
||||
}
|
||||
|
||||
pub fn delete_front(&mut self) {
|
||||
let file: &mut EditorFile = if let Some(file) = self.files.get_mut(self.current_file) {
|
||||
file
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
let mut buffer: String = file.buffer();
|
||||
let caret: &mut Caret = &mut self.caret;
|
||||
let position: CaretPosition = caret.position().clone();
|
||||
if position.text_position() == 0 {
|
||||
return;
|
||||
}
|
||||
let c: char = buffer.chars().collect::<Vec<char>>()[position.text_position() - 1];
|
||||
buffer.remove(position.text_position() - 1);
|
||||
let position = match c {
|
||||
'\n' => CaretPosition::new(
|
||||
position.text_position() - 1,
|
||||
position.line_number() - 1,
|
||||
0,
|
||||
),
|
||||
_ => CaretPosition::new(
|
||||
position.text_position() - 1,
|
||||
position.line_number(),
|
||||
position.line_position(),
|
||||
)
|
||||
};
|
||||
|
||||
match file.get_character_at(position.text_position()) {
|
||||
Some(character) => {
|
||||
let dest: &Rect = character.dest();
|
||||
caret.move_caret(position, Point::new(dest.x(), dest.y()));
|
||||
}
|
||||
_ => {
|
||||
caret.reset_caret();
|
||||
}
|
||||
}
|
||||
let new_file = EditorFile::new(file.path(), buffer, self.config.clone());
|
||||
self.files[self.current_file] = new_file;
|
||||
}
|
||||
|
||||
pub fn delete_back(&mut self) {
|
||||
let file: &mut EditorFile = if let Some(file) = self.files.get_mut(self.current_file) {
|
||||
file
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
let mut buffer: String = file.buffer();
|
||||
let caret: &mut Caret = &mut self.caret;
|
||||
let position: usize = caret.text_position();
|
||||
if position >= buffer.len() {
|
||||
return;
|
||||
}
|
||||
buffer.remove(position);
|
||||
let new_file = EditorFile::new(file.path(), buffer, self.config.clone());
|
||||
self.files[self.current_file] = new_file;
|
||||
}
|
||||
|
||||
pub fn insert_text(&mut self, text: String, renderer: &mut Renderer) {
|
||||
let file: &mut EditorFile = if let Some(file) = self.files.get_mut(self.current_file) {
|
||||
file
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
let mut buffer: String = file.buffer();
|
||||
let caret: &mut Caret = &mut self.caret;
|
||||
|
||||
let current = match file.get_character_at(caret.text_position()) {
|
||||
Some(c) => c,
|
||||
_ => return,
|
||||
};
|
||||
let mut pos = Point::new(current.dest().x(), current.dest().y());
|
||||
let mut position: CaretPosition = caret.position().clone();
|
||||
for character in text.chars() {
|
||||
buffer.insert(position.text_position(), character);
|
||||
if let Some(rect) = get_text_character_rect(character, renderer) {
|
||||
pos = pos + Point::new(rect.width() as i32, 0);
|
||||
position = CaretPosition::new(
|
||||
position.text_position() + 1,
|
||||
position.line_number(),
|
||||
position.line_position(),
|
||||
);
|
||||
caret.move_caret(position, pos.clone());
|
||||
}
|
||||
}
|
||||
|
||||
let new_file = EditorFile::new(file.path(), buffer, self.config.clone());
|
||||
self.files[self.current_file] = new_file;
|
||||
}
|
||||
|
||||
pub fn insert_new_line(&mut self, renderer: &mut Renderer) {
|
||||
let file: &mut EditorFile = if let Some(file) = self.files.get_mut(self.current_file) {
|
||||
file
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
let mut buffer: String = file.buffer();
|
||||
let caret: &mut Caret = &mut self.caret;
|
||||
|
||||
let current = match file.get_character_at(caret.text_position()) {
|
||||
Some(c) => c,
|
||||
_ => return,
|
||||
};
|
||||
let mut pos = Point::new(current.dest().x(), current.dest().y());
|
||||
let mut position: CaretPosition = caret.position().clone();
|
||||
buffer.insert(position.text_position(), '\n');
|
||||
if let Some(rect) = get_text_character_rect('\n', renderer) {
|
||||
pos = Point::new(
|
||||
self.config.editor_left_margin(),
|
||||
pos.y() + rect.height() as i32,
|
||||
);
|
||||
position = CaretPosition::new(
|
||||
position.text_position(),
|
||||
position.line_number() + 1,
|
||||
0,
|
||||
);
|
||||
caret.move_caret(position, pos.clone());
|
||||
}
|
||||
|
||||
let new_file = EditorFile::new(file.path(), buffer, self.config.clone());
|
||||
self.files[self.current_file] = new_file;
|
||||
}
|
||||
|
||||
fn current_file(&self) -> Option<&EditorFile> {
|
||||
pub fn current_file(&self) -> Option<&EditorFile> {
|
||||
self.files.get(self.current_file)
|
||||
}
|
||||
|
||||
fn current_file_mut(&mut self) -> Option<&mut EditorFile> {
|
||||
pub fn current_file_mut(&mut self) -> Option<&mut EditorFile> {
|
||||
self.files.get_mut(self.current_file)
|
||||
}
|
||||
|
||||
fn on_editor_clicked(
|
||||
&mut self,
|
||||
point: &Point,
|
||||
video_subsystem: &mut VideoSubsystem,
|
||||
) -> UpdateResult {
|
||||
fn on_editor_clicked(&mut self, point: &Point, video_subsystem: &mut VS) -> UpdateResult {
|
||||
let current_file: &mut EditorFile = if let Some(current_file) = self.current_file_mut() {
|
||||
current_file
|
||||
} else {
|
||||
@ -204,49 +91,30 @@ impl AppState {
|
||||
pub fn move_caret(&mut self, dir: MoveDirection) {
|
||||
match dir {
|
||||
MoveDirection::Left => {}
|
||||
MoveDirection::Right =>
|
||||
self.move_caret_right(),
|
||||
MoveDirection::Right => caret_manager::move_caret_right(self),
|
||||
MoveDirection::Up => {}
|
||||
MoveDirection::Down => {}
|
||||
}
|
||||
}
|
||||
|
||||
fn move_caret_right(&mut self) {
|
||||
let file: &EditorFile = match self.current_file() {
|
||||
None => return,
|
||||
Some(f) => f,
|
||||
};
|
||||
let line = self.caret.line_number().clone();
|
||||
let characters: Vec<&TextCharacter> = match file.get_line(&line) {
|
||||
None =>
|
||||
return,
|
||||
Some(characters) => characters,
|
||||
};
|
||||
let mut idx = 0;
|
||||
for (i, c) in characters.iter().enumerate() {
|
||||
if c.position() == self.caret.text_position() {
|
||||
idx = i + 1;
|
||||
break;
|
||||
}
|
||||
};
|
||||
let text_character: &TextCharacter = match characters.get(idx) {
|
||||
Some(text_character) => text_character,
|
||||
None => return,
|
||||
};
|
||||
let line = text_character.line() - self.caret.line_number();
|
||||
let pos = self.caret
|
||||
.position()
|
||||
.moved(1, line, 0);
|
||||
let mut d: Rect = text_character.dest().clone();
|
||||
if text_character.is_new_line() {
|
||||
let prev = match characters.get(idx - 1) {
|
||||
Some(c) => c,
|
||||
_ => return,
|
||||
};
|
||||
d = prev.dest().clone();
|
||||
d.set_x(d.x() + d.width() as i32);
|
||||
}
|
||||
self.caret.move_caret(pos, Point::new(d.x(), d.y()));
|
||||
pub fn delete_front(&mut self) {
|
||||
file_content_manager::delete_front(self);
|
||||
}
|
||||
|
||||
pub fn delete_back(&mut self) {
|
||||
file_content_manager::delete_back(self);
|
||||
}
|
||||
|
||||
pub fn insert_text(&mut self, text: String, renderer: &mut Renderer) {
|
||||
file_content_manager::insert_text(self, text, renderer);
|
||||
}
|
||||
|
||||
pub fn insert_new_line(&mut self, renderer: &mut Renderer) {
|
||||
file_content_manager::insert_new_line(self, renderer);
|
||||
}
|
||||
|
||||
pub fn replace_current_file(&mut self, file: EditorFile) {
|
||||
self.files[self.current_file] = file;
|
||||
}
|
||||
}
|
||||
|
||||
@ -273,11 +141,7 @@ impl Update for AppState {
|
||||
}
|
||||
|
||||
impl AppState {
|
||||
pub fn on_left_click(
|
||||
&mut self,
|
||||
point: &Point,
|
||||
video_subsystem: &mut VideoSubsystem,
|
||||
) -> UpdateResult {
|
||||
pub fn on_left_click(&mut self, point: &Point, video_subsystem: &mut VS) -> UpdateResult {
|
||||
if self.menu_bar.is_left_click_target(point) {
|
||||
video_subsystem.text_input().stop();
|
||||
return self.menu_bar.on_left_click(point);
|
||||
|
54
src/app/caret_manager.rs
Normal file
54
src/app/caret_manager.rs
Normal file
@ -0,0 +1,54 @@
|
||||
use crate::app::AppState;
|
||||
use crate::ui::file::editor_file::EditorFile;
|
||||
use crate::ui::text_character::TextCharacter;
|
||||
use sdl2::rect::{Point, Rect};
|
||||
|
||||
pub fn move_caret_right(app_state: &mut AppState) {
|
||||
let file: &EditorFile = match app_state.current_file() {
|
||||
None => return,
|
||||
Some(f) => f,
|
||||
};
|
||||
let line = match file.get_character_at(app_state.caret().text_position()) {
|
||||
Some(t) if t.is_new_line() => app_state.caret().line_number().clone() + 1,
|
||||
Some(_) => app_state.caret().line_number().clone(),
|
||||
None => 0,
|
||||
};
|
||||
|
||||
let characters: Vec<&TextCharacter> = match file.get_line(&line) {
|
||||
None => return,
|
||||
Some(characters) => characters,
|
||||
};
|
||||
let mut idx = 0;
|
||||
for (i, c) in characters.iter().enumerate() {
|
||||
if c.position() == app_state.caret().text_position() {
|
||||
idx = i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
let text_character: &TextCharacter = match characters.get(idx) {
|
||||
Some(text_character) => text_character,
|
||||
None => return,
|
||||
};
|
||||
let line = line - app_state.caret().line_number();
|
||||
let pos = app_state.caret().position().moved(1, line as i32, 0);
|
||||
let mut d: Rect = text_character.dest().clone();
|
||||
if text_character.is_new_line() && idx > 0 {
|
||||
let prev = match characters.get(idx - 1) {
|
||||
Some(c) => c,
|
||||
_ => return,
|
||||
};
|
||||
d = prev.dest().clone();
|
||||
d.set_x(d.x() + d.width() as i32);
|
||||
}
|
||||
app_state
|
||||
.caret_mut()
|
||||
.move_caret(pos, Point::new(d.x(), d.y()));
|
||||
}
|
||||
|
||||
pub fn move_caret_left(app_state: &mut AppState) {
|
||||
let _file: &EditorFile = match app_state.current_file() {
|
||||
None => return,
|
||||
Some(f) => f,
|
||||
};
|
||||
let _line = app_state.caret().line_number();
|
||||
}
|
143
src/app/file_content_manager.rs
Normal file
143
src/app/file_content_manager.rs
Normal file
@ -0,0 +1,143 @@
|
||||
use crate::app::AppState;
|
||||
use crate::renderer::Renderer;
|
||||
use crate::ui::caret::Caret;
|
||||
use crate::ui::caret::CaretPosition;
|
||||
use crate::ui::file::editor_file::EditorFile;
|
||||
use crate::ui::get_text_character_rect;
|
||||
use crate::ui::text_character::TextCharacter;
|
||||
use sdl2::rect::Point;
|
||||
use sdl2::rect::Rect;
|
||||
|
||||
fn get_character_at(app_state: &mut AppState, index: usize) -> Option<&TextCharacter> {
|
||||
match app_state.current_file() {
|
||||
None => return None,
|
||||
Some(f) => f,
|
||||
}
|
||||
.get_character_at(index)
|
||||
}
|
||||
|
||||
fn current_file_path(app_state: &mut AppState) -> String {
|
||||
match app_state.current_file() {
|
||||
Some(f) => f.path(),
|
||||
_ => String::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn delete_front(app_state: &mut AppState) {
|
||||
let mut buffer: String = if let Some(file) = app_state.current_file() {
|
||||
file
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
.buffer();
|
||||
let position: CaretPosition = app_state.caret().position().clone();
|
||||
if position.text_position() == 0 {
|
||||
return;
|
||||
}
|
||||
let c: char = buffer.chars().collect::<Vec<char>>()[position.text_position() - 1];
|
||||
buffer.remove(position.text_position() - 1);
|
||||
let position = match c {
|
||||
'\n' if position.text_position() > 0 && position.line_number() > 0 => {
|
||||
position.moved(-1, -1, 0)
|
||||
}
|
||||
'\n' => position.clone(),
|
||||
_ if position.text_position() > 0 => position.moved(-1, 0, 0),
|
||||
_ => position.moved(0, 0, 0),
|
||||
};
|
||||
|
||||
let move_to = match get_character_at(app_state, position.text_position()) {
|
||||
Some(character) => {
|
||||
let dest: &Rect = character.dest();
|
||||
Some((position, Point::new(dest.x(), dest.y())))
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
match move_to {
|
||||
Some((position, point)) => app_state.caret_mut().move_caret(position, point),
|
||||
None => app_state.caret_mut().reset_caret(),
|
||||
};
|
||||
let new_file = EditorFile::new(
|
||||
current_file_path(app_state),
|
||||
buffer,
|
||||
app_state.config().clone(),
|
||||
);
|
||||
app_state.replace_current_file(new_file);
|
||||
}
|
||||
|
||||
pub fn delete_back(app_state: &mut AppState) {
|
||||
let file: &EditorFile = if let Some(file) = app_state.current_file() {
|
||||
file
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
let mut buffer: String = file.buffer();
|
||||
let position: usize = app_state.caret().text_position();
|
||||
if position >= buffer.len() {
|
||||
return;
|
||||
}
|
||||
buffer.remove(position);
|
||||
let new_file = EditorFile::new(file.path(), buffer, app_state.config().clone());
|
||||
app_state.replace_current_file(new_file);
|
||||
}
|
||||
|
||||
pub fn insert_text(app_state: &mut AppState, text: String, renderer: &mut Renderer) {
|
||||
let mut buffer: String = if let Some(file) = app_state.current_file() {
|
||||
file
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
.buffer();
|
||||
let current = match get_character_at(app_state, app_state.caret().text_position()) {
|
||||
Some(c) => c,
|
||||
_ => return,
|
||||
};
|
||||
let mut pos = Point::new(current.dest().x(), current.dest().y());
|
||||
let mut position: CaretPosition = app_state.caret().position().clone();
|
||||
for character in text.chars() {
|
||||
buffer.insert(position.text_position(), character);
|
||||
if let Some(rect) = get_text_character_rect(character, renderer) {
|
||||
pos = pos + Point::new(rect.width() as i32, 0);
|
||||
position = position.moved(1, 0, 0);
|
||||
app_state.caret_mut().move_caret(position, pos.clone());
|
||||
}
|
||||
}
|
||||
|
||||
let new_file = EditorFile::new(
|
||||
current_file_path(app_state),
|
||||
buffer,
|
||||
app_state.config().clone(),
|
||||
);
|
||||
|
||||
app_state.replace_current_file(new_file);
|
||||
}
|
||||
|
||||
pub fn insert_new_line(app_state: &mut AppState, renderer: &mut Renderer) {
|
||||
let mut buffer: String = if let Some(file) = app_state.current_file() {
|
||||
file
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
.buffer();
|
||||
let current = match get_character_at(app_state, app_state.caret().text_position()) {
|
||||
Some(c) => c,
|
||||
_ => return,
|
||||
};
|
||||
let mut pos = Point::new(current.dest().x(), current.dest().y());
|
||||
let mut position: CaretPosition = app_state.caret().position().clone();
|
||||
buffer.insert(position.text_position(), '\n');
|
||||
if let Some(rect) = get_text_character_rect('\n', renderer) {
|
||||
pos = Point::new(
|
||||
app_state.config().editor_left_margin(),
|
||||
pos.y() + rect.height() as i32,
|
||||
);
|
||||
position = position.moved(0, 1, 0);
|
||||
app_state.caret_mut().move_caret(position, pos.clone());
|
||||
}
|
||||
|
||||
let new_file = EditorFile::new(
|
||||
current_file_path(app_state),
|
||||
buffer,
|
||||
app_state.config().clone(),
|
||||
);
|
||||
app_state.replace_current_file(new_file);
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
use crate::app::app_state::AppState;
|
||||
use crate::config::Config;
|
||||
use crate::renderer::Renderer;
|
||||
pub use crate::app::app_state::AppState;
|
||||
pub use crate::config::Config;
|
||||
pub use crate::renderer::Renderer;
|
||||
use crate::themes::*;
|
||||
use crate::ui::caret::{CaretPosition, MoveDirection};
|
||||
use crate::ui::*;
|
||||
use crate::ui::caret::{CaretPosition,MoveDirection};
|
||||
|
||||
use std::rc::Rc;
|
||||
use std::thread::sleep;
|
||||
@ -22,6 +22,8 @@ use sdl2::EventPump;
|
||||
use sdl2::{Sdl, TimerSubsystem, VideoSubsystem};
|
||||
|
||||
pub mod app_state;
|
||||
pub mod caret_manager;
|
||||
pub mod file_content_manager;
|
||||
|
||||
pub type WindowCanvas = Canvas<Window>;
|
||||
|
||||
@ -202,4 +204,8 @@ impl Application {
|
||||
}
|
||||
UpdateResult::NoOp
|
||||
}
|
||||
|
||||
pub fn config(&self) -> &Rc<Config> {
|
||||
&self.config
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,10 @@ pub fn create() {
|
||||
.unwrap_or_else(|_| panic!("Cannot create fonts config directory"));
|
||||
write_default_fonts();
|
||||
}
|
||||
|
||||
if !log_dir().exists() {
|
||||
fs::create_dir_all(&log_dir()).unwrap_or_else(|_| panic!("Cannot create log directory"));
|
||||
}
|
||||
}
|
||||
|
||||
fn write_default_fonts() {
|
||||
|
@ -1,6 +1,12 @@
|
||||
use dirs;
|
||||
use std::path::PathBuf;
|
||||
|
||||
pub fn log_dir() -> PathBuf {
|
||||
let mut log_dir = config_dir();
|
||||
log_dir.push("log");
|
||||
log_dir
|
||||
}
|
||||
|
||||
pub fn themes_dir() -> PathBuf {
|
||||
let mut themes_dir = config_dir();
|
||||
themes_dir.push("themes");
|
||||
|
@ -1,10 +1,14 @@
|
||||
use crate::lexer::Language;
|
||||
use crate::themes::Theme;
|
||||
use dirs;
|
||||
use std::collections::HashMap;
|
||||
use std::fs;
|
||||
|
||||
mod creator;
|
||||
pub mod directories;
|
||||
|
||||
type LanguageMapping = HashMap<String, Language>;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct EditorConfig {
|
||||
character_size: u16,
|
||||
@ -19,7 +23,7 @@ impl EditorConfig {
|
||||
let mut default_font_path = directories::fonts_dir();
|
||||
default_font_path.push("DejaVuSansMono.ttf");
|
||||
Self {
|
||||
character_size: 24,
|
||||
character_size: 16,
|
||||
font_path: default_font_path.to_str().unwrap().to_string(),
|
||||
current_theme: "railscasts".to_string(),
|
||||
margin_left: 10,
|
||||
@ -55,18 +59,25 @@ pub struct Config {
|
||||
menu_height: u16,
|
||||
editor_config: EditorConfig,
|
||||
theme: Theme,
|
||||
extensions_mapping: LanguageMapping,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
pub fn new() -> Self {
|
||||
creator::create();
|
||||
let editor_config = EditorConfig::new();
|
||||
let mut extensions_mapping = HashMap::new();
|
||||
extensions_mapping.insert(".".to_string(), Language::PlainText);
|
||||
extensions_mapping.insert("txt".to_string(), Language::PlainText);
|
||||
extensions_mapping.insert("rs".to_string(), Language::Rust);
|
||||
|
||||
Self {
|
||||
width: 1024,
|
||||
height: 860,
|
||||
menu_height: 60,
|
||||
theme: Theme::load(editor_config.current_theme().clone()),
|
||||
editor_config,
|
||||
extensions_mapping,
|
||||
}
|
||||
}
|
||||
pub fn width(&self) -> u32 {
|
||||
@ -96,4 +107,8 @@ impl Config {
|
||||
pub fn editor_left_margin(&self) -> i32 {
|
||||
self.editor_config().margin_left() as i32
|
||||
}
|
||||
|
||||
pub fn extensions_mapping(&self) -> &LanguageMapping {
|
||||
&self.extensions_mapping
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ pub mod rust_lang;
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Language {
|
||||
PlainText,
|
||||
Rust,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
@ -144,11 +145,14 @@ impl Token {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse(text: String, language: Language) -> Vec<TokenType> {
|
||||
pub fn parse(text: String, language: &Language) -> Vec<TokenType> {
|
||||
match language {
|
||||
Language::PlainText => plain::lexer::Lexer::new(text.as_str())
|
||||
&Language::PlainText => plain::lexer::Lexer::new(text.as_str())
|
||||
// .inspect(|tok| println!("tok: {:?}", tok))
|
||||
.map(|t| t.0)
|
||||
.collect(),
|
||||
&Language::Rust => rust_lang::lexer::Lexer::new(text.as_str())
|
||||
.map(|t| t.0)
|
||||
.collect(),
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,11 @@ pub mod lexer {
|
||||
token: Token::new(text.to_string(), 0, 0, 0, 0)
|
||||
}, text),
|
||||
|
||||
r"(let|fn|type|struct|pub|impl|for|self|Self)" => (TokenType::Keyword {
|
||||
r"[+-/*%=]" => (TokenType::Operator {
|
||||
token: Token::new(text.to_string(), 0, 0, 0, 0)
|
||||
}, text),
|
||||
|
||||
r"(let|fn|type|struct|pub|impl|for|self|Self|mod|use|enum)" => (TokenType::Keyword {
|
||||
token: Token::new(text.to_string(), 0, 0, 0, 0)
|
||||
}, text),
|
||||
|
||||
|
29
src/main.rs
29
src/main.rs
@ -10,8 +10,16 @@ extern crate serde;
|
||||
extern crate serde_derive;
|
||||
#[macro_use]
|
||||
extern crate serde_json;
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate simplelog;
|
||||
|
||||
use crate::app::Application;
|
||||
use crate::config::directories::log_dir;
|
||||
use log::Level;
|
||||
use simplelog::*;
|
||||
use std::fs::create_dir_all;
|
||||
use std::fs::File;
|
||||
|
||||
pub mod app;
|
||||
pub mod config;
|
||||
@ -20,9 +28,28 @@ pub mod renderer;
|
||||
pub mod themes;
|
||||
pub mod ui;
|
||||
|
||||
fn init_logger() {
|
||||
let mut log_file_path = log_dir();
|
||||
log_file_path.push("rider.log");
|
||||
|
||||
CombinedLogger::init(vec![
|
||||
TermLogger::new(LevelFilter::Warn, Config::default()).unwrap(),
|
||||
WriteLogger::new(
|
||||
LevelFilter::Info,
|
||||
Config::default(),
|
||||
File::create(log_file_path).unwrap(),
|
||||
),
|
||||
])
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut app = Application::new();
|
||||
app.init();
|
||||
app.open_file("./tests/example.txt".to_string());
|
||||
|
||||
init_logger();
|
||||
|
||||
// app.open_file("./assets/examples/example.txt".to_string());
|
||||
app.open_file("./assets/examples/test.rs".to_string());
|
||||
app.run();
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ impl<'l> ResourceLoader<'l, Font<'l, 'static>> for Sdl2TtfContext {
|
||||
type Args = FontDetails;
|
||||
|
||||
fn load(&'l self, data: &FontDetails) -> Result<Font<'l, 'static>, String> {
|
||||
println!("Loading font {}...", data.path);
|
||||
info!("Loading font {}...", data.path);
|
||||
self.load_font(&data.path, data.size)
|
||||
}
|
||||
}
|
||||
@ -149,7 +149,9 @@ impl<'l, T> TextureManager<'l, T> {
|
||||
let texture = self.loader.create_texture_from_surface(&surface).unwrap();
|
||||
let resource = Rc::new(texture);
|
||||
self.cache.insert(key, resource.clone());
|
||||
println!("texture for '{}' created", details.text);
|
||||
for c in details.text.chars() {
|
||||
info!("texture for '{:?}' created", c);
|
||||
}
|
||||
Ok(resource)
|
||||
},
|
||||
Ok,
|
||||
|
@ -102,9 +102,9 @@ fn railscasts_theme() -> Theme {
|
||||
},
|
||||
identifier: ThemeConfig {
|
||||
color: SerdeColor {
|
||||
r: 21,
|
||||
g: 21,
|
||||
b: 21,
|
||||
r: 121,
|
||||
g: 121,
|
||||
b: 121,
|
||||
a: 0,
|
||||
},
|
||||
italic: false,
|
||||
@ -112,9 +112,9 @@ fn railscasts_theme() -> Theme {
|
||||
},
|
||||
literal: ThemeConfig {
|
||||
color: SerdeColor {
|
||||
r: 21,
|
||||
g: 21,
|
||||
b: 21,
|
||||
r: 121,
|
||||
g: 121,
|
||||
b: 121,
|
||||
a: 0,
|
||||
},
|
||||
italic: false,
|
||||
@ -142,9 +142,9 @@ fn railscasts_theme() -> Theme {
|
||||
},
|
||||
separator: ThemeConfig {
|
||||
color: SerdeColor {
|
||||
r: 21,
|
||||
g: 21,
|
||||
b: 21,
|
||||
r: 121,
|
||||
g: 121,
|
||||
b: 121,
|
||||
a: 0,
|
||||
},
|
||||
italic: false,
|
||||
|
@ -6,8 +6,8 @@ use crate::ui::*;
|
||||
use sdl2::pixels::Color;
|
||||
use sdl2::rect::{Point, Rect};
|
||||
use sdl2::render::Texture;
|
||||
use std::rc::Rc;
|
||||
use std::ops::Deref;
|
||||
use std::rc::Rc;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq)]
|
||||
enum CaretState {
|
||||
@ -20,7 +20,7 @@ pub enum MoveDirection {
|
||||
Left,
|
||||
Right,
|
||||
Up,
|
||||
Down
|
||||
Down,
|
||||
}
|
||||
|
||||
//#[derive(Clone, Debug, PartialEq)]
|
||||
@ -42,11 +42,11 @@ pub struct CaretPosition {
|
||||
}
|
||||
|
||||
impl CaretPosition {
|
||||
pub fn new(text_position: usize, line_number: usize, line_position: usize,) -> Self {
|
||||
pub fn new(text_position: usize, line_number: usize, line_position: usize) -> Self {
|
||||
Self {
|
||||
text_position,
|
||||
line_number,
|
||||
line_position
|
||||
line_position,
|
||||
}
|
||||
}
|
||||
|
||||
@ -80,11 +80,11 @@ impl CaretPosition {
|
||||
self.line_position = n;
|
||||
}
|
||||
|
||||
pub fn moved(&self, text_position: usize, line_number: usize, line_position: usize) -> Self {
|
||||
pub fn moved(&self, text_position: i32, line_number: i32, line_position: i32) -> Self {
|
||||
Self {
|
||||
text_position: self.text_position + text_position,
|
||||
line_number: self.line_number + line_number,
|
||||
line_position: self.line_position + line_position
|
||||
text_position: (self.text_position as i32 + text_position) as usize,
|
||||
line_number: (self.line_number as i32 + line_number) as usize,
|
||||
line_position: (self.line_position as i32 + line_position) as usize,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,9 +19,18 @@ pub struct EditorFile {
|
||||
|
||||
impl EditorFile {
|
||||
pub fn new(path: String, buffer: String, config: Rc<Config>) -> Self {
|
||||
let sections = vec![EditorFileSection::new(buffer.clone(), config.clone())];
|
||||
use std::path::Path;
|
||||
|
||||
let p = Path::new(&path);
|
||||
let ext = match p.extension() {
|
||||
Some(s) => s.to_str().unwrap_or("txt"),
|
||||
None => "txt",
|
||||
}
|
||||
.to_string();
|
||||
let sections = vec![EditorFileSection::new(buffer.clone(), ext, config.clone())];
|
||||
let x = config.editor_left_margin();
|
||||
let y = config.editor_top_margin();
|
||||
|
||||
Self {
|
||||
path,
|
||||
sections,
|
||||
|
@ -17,9 +17,14 @@ pub struct EditorFileSection {
|
||||
}
|
||||
|
||||
impl EditorFileSection {
|
||||
pub fn new(buffer: String, config: Rc<Config>) -> Self {
|
||||
pub fn new(buffer: String, ext: String, config: Rc<Config>) -> Self {
|
||||
use crate::lexer;
|
||||
let lexer_tokens = lexer::parse(buffer.clone(), Language::PlainText);
|
||||
|
||||
let language = config
|
||||
.extensions_mapping()
|
||||
.get(ext.as_str())
|
||||
.unwrap_or(&Language::PlainText);
|
||||
let lexer_tokens = lexer::parse(buffer.clone(), language);
|
||||
|
||||
let mut tokens: Vec<EditorFileToken> = vec![];
|
||||
for token_type in lexer_tokens {
|
||||
|
@ -45,21 +45,28 @@ impl EditorFileToken {
|
||||
pub fn get_line(&self, line: &usize) -> Option<Vec<&TextCharacter>> {
|
||||
let mut vec: Vec<&TextCharacter> = vec![];
|
||||
for c in self.characters.iter() {
|
||||
let _tmp = (line.clone(), c.line().clone(), self.token_type.is_new_line(), c.text_character());
|
||||
match (line.clone(), c.line().clone(), self.token_type.is_new_line()) {
|
||||
let _tmp = (
|
||||
line.clone(),
|
||||
c.line().clone(),
|
||||
self.token_type.is_new_line(),
|
||||
c.text_character(),
|
||||
);
|
||||
match (
|
||||
line.clone(),
|
||||
c.line().clone(),
|
||||
self.token_type.is_new_line(),
|
||||
) {
|
||||
(0, 0, true) => {
|
||||
vec.push(c);
|
||||
},
|
||||
}
|
||||
(a, b, true) if (a + 1) == b => {
|
||||
vec.push(c);
|
||||
},
|
||||
(a, b, true) if a != (b + 1) =>
|
||||
(),
|
||||
}
|
||||
(a, b, true) if a != (b + 1) => (),
|
||||
(a, b, false) if a == b => {
|
||||
vec.push(c);
|
||||
}
|
||||
_t =>
|
||||
(),
|
||||
_t => (),
|
||||
}
|
||||
}
|
||||
if vec.is_empty() {
|
||||
|
@ -1,10 +1,10 @@
|
||||
use crate::app::{UpdateResult, WindowCanvas};
|
||||
use crate::config::Config;
|
||||
use crate::lexer::TokenType;
|
||||
use crate::renderer::managers::{TextDetails, FontDetails};
|
||||
use crate::renderer::managers::{FontDetails, TextDetails};
|
||||
use crate::renderer::Renderer;
|
||||
use crate::ui::*;
|
||||
use crate::ui::caret::CaretPosition;
|
||||
use crate::ui::*;
|
||||
|
||||
use sdl2::pixels::Color;
|
||||
use sdl2::rect::{Point, Rect};
|
||||
@ -168,11 +168,7 @@ impl ClickHandler for TextCharacter {
|
||||
fn on_left_click(&mut self, _point: &Point) -> UpdateResult {
|
||||
UpdateResult::MoveCaret(
|
||||
self.dest().clone(),
|
||||
CaretPosition::new(
|
||||
self.position(),
|
||||
self.line(),
|
||||
0,
|
||||
),
|
||||
CaretPosition::new(self.position(), self.line(), 0),
|
||||
)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user