From 718b4c49ff519c7d5df40dafcd1ecaaf367b0138 Mon Sep 17 00:00:00 2001 From: zuma Date: Tue, 1 Jul 2025 16:42:46 +0200 Subject: [PATCH] First commit --- .gitignore | 2 + Cargo.lock | 578 +++++ Cargo.toml | 9 + README.md | 17 + assets/tapote.gif | Bin 0 -> 54431 bytes data/words_english.txt | 1000 ++++++++ data/words_french.txt | 5000 ++++++++++++++++++++++++++++++++++++++++ src/main.rs | 8 + src/typer.rs | 132 ++ src/typer/terminal.rs | 95 + src/typer/view.rs | 128 + src/typer/words.rs | 38 + 12 files changed, 7007 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 assets/tapote.gif create mode 100644 data/words_english.txt create mode 100644 data/words_french.txt create mode 100644 src/main.rs create mode 100644 src/typer.rs create mode 100644 src/typer/terminal.rs create mode 100644 src/typer/view.rs create mode 100644 src/typer/words.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b7959a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +debug +target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..de07f22 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,578 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags", + "crossterm_winapi", + "derive_more", + "document-features", + "mio", + "parking_lot", + "rustix", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "include-lines" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be037b494f74d7bded0680228b3133bc268cbe50282f51c25fa46b890cfedb9" +dependencies = [ + "include-lines-proc", +] + +[[package]] +name = "include-lines-proc" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1ff2792810c5bb1b591ae8ac768bda8b0238a3b61cb546d062709f2a6a4f77" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tapote" +version = "0.1.0" +dependencies = [ + "crossterm", + "include-lines", + "rand", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8c2c29c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "tapote" +version = "0.1.0" +edition = "2024" + +[dependencies] +crossterm = "0.29.0" +include-lines = "1.1.2" +rand = "0.9.1" diff --git a/README.md b/README.md new file mode 100644 index 0000000..c193a4d --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +![Gif d'utilisation de tapote](assets/tapote.gif) + +# Tapote + +Mon premier logiciel pour apprendre à coder en Rust. Il permet de tester ma rapidité au clavier ! +La base du code est largement inspirée de ce tutoriel [Hecto.rs](https://philippflenker.com/hecto/). + +# Instruction pour compiler +Afin de compiler le logiciel il vous faudra cargo, rustc et clippy sur votre système. Une fois installés vous pouvez compiler un executable avec : +```rust +cargo build +``` + +Et pour faire une version release il suffit d'ajouter le paramètre à la fin : +```rust +cargo build --release +``` diff --git a/assets/tapote.gif b/assets/tapote.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e76506235030b419a68f45209c26ccc6bdcd5e2 GIT binary patch literal 54431 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�pVv=$zB&+Scg)zR}}nqcb6t5Y6G- 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 literal 0 HcmV?d00001 diff --git a/data/words_english.txt b/data/words_english.txt new file mode 100644 index 0000000..dfac3fe --- /dev/null +++ b/data/words_english.txt @@ -0,0 +1,1000 @@ +the +be +and +a +of +to +in +i +you +it +have +to +that +for +do +he +with +on +this +n’t +we +that +not +but +they +say +at +what +his +from +go +or +by +get +she +my +can +as +know +if +me +your +all +who +about +their +will +so +would +make +just +up +think +time +there +see +her +as +out +one +come +people +take +year +him +them +some +want +how +when +which +now +like +other +could +our +into +here +then +than +look +way +more +these +no +thing +well +because +also +two +use +tell +good +first +man +day +find +give +more +new +one +us +any +those +very +her +need +back +there +should +even +only +many +really +work +life +why +right +down +on +try +let +something +too +call +woman +may +still +through +mean +after +never +no +world +in +feel +yeah +great +last +child +oh +over +ask +when +as +school +state +much +talk +out +keep +leave +put +like +help +big +where +same +all +own +while +start +three +high +every +another +become +most +between +happen +family +over +president +old +yes +house +show +again +student +so +seem +might +part +hear +its +place +problem +where +believe +country +always +week +point +hand +off +play +turn +few +group +such +against +run +guy +about +case +question +work +night +live +game +number +write +bring +without +money +lot +most +book +system +government +next +city +company +story +today +job +move +must +bad +friend +during +begin +love +each +hold +different +american +little +before +ever +word +fact +right +read +anything +nothing +sure +small +month +program +maybe +right +under +business +home +kind +stop +pay +study +since +issue +name +idea +room +percent +far +away +law +actually +large +though +provide +lose +power +kid +war +understand +head +mother +real +best +team +eye +long +long +side +water +young +wait +okay +both +yet +after +meet +service +area +important +person +hey +thank +much +someone +end +change +however +only +around +hour +everything +national +four +line +girl +around +watch +until +father +sit +create +information +car +learn +least +already +kill +minute +party +include +stand +together +back +follow +health +remember +often +reason +speak +ago +set +black +member +community +once +social +news +allow +win +body +lead +continue +whether +enough +spend +level +able +political +almost +boy +university +before +stay +add +later +change +five +probably +center +among +face +public +die +food +else +history +buy +result +morning +off +parent +office +course +send +research +walk +door +white +several +court +home +grow +better +open +moment +including +consider +both +such +little +within +second +late +street +free +better +everyone +policy +table +sorry +care +low +human +please +hope +TRUE +process +teacher +data +offer +death +whole +experience +plan +easy +education +build +expect +fall +himself +age +hard +sense +across +show +early +college +music +appear +mind +class +police +use +effect +season +tax +heart +son +art +possible +serve +break +although +end +market +even +air +force +require +foot +up +listen +agree +according +anyone +baby +wrong +love +cut +decide +republican +full +behind +pass +interest +sometimes +security +eat +report +control +rate +local +suggest +report +nation +sell +action +support +wife +decision +receive +value +base +pick +phone +thanks +event +drive +strong +reach +remain +explain +site +hit +pull +church +model +perhaps +relationship +six +fine +movie +field +raise +less +player +couple +million +themselves +record +especially +difference +light +development +federal +former +role +pretty +myself +view +price +effort +nice +quite +along +voice +finally +department +either +toward +leader +because +photo +wear +space +project +return +position +special +million +film +need +major +type +town +article +road +form +chance +drug +economic +situation +choose +practice +cause +happy +science +join +teach +early +develop +share +yourself +carry +clear +brother +matter +dead +image +star +cost +simply +post +society +picture +piece +paper +energy +personal +building +military +open +doctor +activity +exactly +american +media +miss +evidence +product +realize +save +arm +technology +catch +comment +look +term +color +cover +describe +guess +choice +source +mom +soon +director +international +rule +campaign +ground +election +face +uh +check +page +fight +itself +test +patient +produce +certain +whatever +half +video +support +throw +third +care +rest +recent +available +step +ready +opportunity +official +oil +call +organization +character +single +current +likely +county +future +dad +whose +less +shoot +industry +second +list +general +stuff +figure +attention +forget +risk +no +focus +short +fire +dog +red +hair +point +condition +wall +daughter +before +deal +author +truth +upon +husband +period +series +order +officer +close +land +note +computer +thought +economy +goal +bank +behavior +sound +deal +certainly +nearly +increase +act +north +well +blood +culture +medical +ok +everybody +top +difficult +close +language +window +response +population +lie +tree +park +worker +draw +plan +drop +push +earth +cause +per +private +tonight +race +than +letter +other +gun +simple +course +wonder +involve +hell +poor +each +answer +nature +administration +common +no +hard +message +song +enjoy +similar +congress +attack +past +hot +seek +amount +analysis +store +defense +bill +like +cell +away +performance +hospital +bed +board +protect +century +summer +material +individual +recently +example +represent +fill +state +place +animal +fail +factor +natural +sir +agency +usually +significant +help +ability +mile +statement +entire +democrat +floor +serious +career +dollar +vote +sex +compare +south +forward +subject +financial +identify +beautiful +decade +bit +reduce +sister +quality +quickly +act +press +worry +accept +enter +mention +sound +thus +plant +movement +scene +section +treatment +wish +benefit +interesting +west +candidate +approach +determine +resource +claim +answer +prove +sort +enough +size +somebody +knowledge +rather +hang +sport +tv +loss +argue +left +note +meeting +skill +card +feeling +despite +degree +crime +that +sign +occur +imagine +vote +near +king +box +present +figure +seven +foreign +laugh +disease +lady +beyond +discuss +finish +design +concern +ball +east +recognize +apply +prepare +network +huge +success +district +cup +name +physical +growth +rise +hi +standard +force +sign +fan +theory +staff +hurt +legal +september +set +outside +et +strategy +clearly +property +lay +final +authority +perfect +method +region +since +impact +indicate +safe +committee +supposed +dream +training +shit +central +option +eight +particularly +completely +opinion +main +ten +interview +exist +remove +dark +play +union +professor +pressure +purpose +stage +blue +herself +sun +pain +artist +employee +avoid +account +release +fund +environment +treat +specific +version +shot +hate +reality +visit +club +justice +river +brain +memory +rock +talk +camera +global +various +arrive +notice +bit +detail +challenge +argument +lot +nobody +weapon +best +station +island +absolutely +instead +discussion +instead +affect +design +little +anyway +respond +control +trouble +conversation +manage +close +date +public +army +top +post +charge +seat diff --git a/data/words_french.txt b/data/words_french.txt new file mode 100644 index 0000000..16d3dac --- /dev/null +++ b/data/words_french.txt @@ -0,0 +1,5000 @@ +un +à +en +le +et +être +de +avoir +que +ne +dans +ce +il +qui +pas +pour +sur +se +son +plus +pouvoir +par +je +avec +tout +faire +nous +mettre +autre +on +mais +leur +comme +ou +si +avant +y +dire +elle +devoir +donner +deux +même +prendre +où +aussi +celui +bien +cela +fois +vous +encore +vouloir +nouveau +aller +entre +premier +aucun +déjà +grand +mon +me +moins +quelque +lui +temps +très +savoir +falloir +voir +notre +sans +dont +raison +monde +non +monsieur +an +jour +trouver +demander +alors +après +venir +personne +rendre +part +dernier +lequel +pendant +passer +peu +depuis +suite +bon +comprendre +rester +point +ainsi +heure +année +toujours +tenir +porter +parler +seul +montrer +là +certain +fort +tu +continuer +pays +fin +penser +lieu +partie +quand +trois +contre +sous +côté +ensemble +chose +enfant +suivre +cause +place +seulement +moi +vie +politique +jusque +croire +homme +cas +connaître +commencer +compter +fait +tel +petit +question +donc +quel +général +entendre +beaucoup +chaque +droit +moment +travail +femme +attendre +remettre +jeune +permettre +occuper +gouvernement +eux +appeler +devenir +partir +décider +soit +ici +rien +plan +cours +nom +famille +effet +affaire +arriver +servir +mois +jamais +car +possible +tant +vers +besoin +revenir +sembler +moyen +groupe +problème +rapport +dès +peut-être +maintenant +pourquoi +meilleur +vue +trop +laisser +ordre +devant +recevoir +répondre +long +service +ministre +vivre +chez +te +rappeler +face +accepter +agir +simple +présenter +votre +important +présent +mieux +plusieurs +jouer +mot +reconnaître +poser +situation +offrir +près +force +national +projet +ni +choisir +toucher +train +aujourd'hui +comment +puis +gens +propre +grâce +idée +surtout +région +aimer +sens +selon +semaine +également +ci +retrouver +nombre +perdre +français +façon +quatre +compte +considérer +expliquer +ouvrir +gagner +exemple +lorsque +économique +mesure +histoire +ville +ensuite +guerre +loi +président +haut +sûr +refuser +plutôt +bureau +exister +quant +mort +mal +mauvais +réussir +marché +condition +lire +changer +oui +public +humain +international +cinq +système +travailler +souvent +vrai +représenter +madame +société +jeu +quoi +entreprise +coup +difficile +or +assurer +essayer +juste +étranger +social +million +manière +sortir +empêcher +terme +longtemps +reprendre +prix +intérêt +mener +information +courant +appartenir +liberté +assez +détail +chacun +concerner +maison +d'abord +risquer +niveau +rencontrer +ton +apprendre +créer +état +obtenir +œuvre +chercher +entrer +proposer +clair +programme +loin +ligne +apporter +libre +utiliser +atteindre +tenter +tête +enfin +différent +sorte +cependant +tard +importer +action +relation +sujet +livre +ajouter +ailleurs +vraiment +recherche +reste +début +présence +doute +produire +préparer +forme +décision +nombreux +dix +produit +américain +rôle +relever +peuple +second +minute +prochain +autant +écrire +position +développement +défendre +chef +particulier +effort +parmi +membre +tirer +économie +beau +plein +juger +éviter +ancien +personnel +titre +soir +parti +unique +souhaiter +afin +objet +malgré +période +engager +peine +parfois +lors +sérieux +aider +réaliser +terminer +base +espérer +main +voix +arrêter +retour +prêt +occasion +gros +regarder +plupart +deuxième +résultat +député +terre +valoir +dollar +intérieur +écouter +confiance +choix +prévoir +page +notamment +type +but +chance +grave +prise +européen +étude +matin +remplacer +avancer +six +nécessaire +activité +valeur +principe +entier +réponse +aide +marquer +élever +pourtant +commission +cesser +poursuivre +maintenir +principal +exprimer +ami +bas +époque +moitié +avenir +argent +imposer +mise +œil +eau +sauf +école +sécurité +milieu +presque +attention +cadre +lettre +mouvement +former +conduire +règle +poste +demande +futur +acte +disparaître +priver +constituer +centre +milliard +lier +obliger +accord +craindre +âge +déclarer +oublier +propos +passé +quitter +bout +population +troisième +responsable +route +tôt +lancer +toi +fonction +emploi +objectif +limite +journal +annoncer +lui-même +tour +voilà +volonté +envoyer +paraître +puisque +établir +changement +garder +partager +interdire +finir +placer +réalité +payer +esprit +domaine +diriger +sentir +nature +régime +charger +noter +parent +tomber +départ +mondial +court +disposer +parole +fond +public +entraîner +faux +genre +communauté +intéresser +c'est-à-dire +retenir +matière +sein +difficulté +parvenir +corps +appel +cœur +père +organisation +secteur +noir +événement +double +unité +nation +conseil +soutenir +paix +convaincre +partout +direction +manquer +actuel +opposer +nuit +journée +d'ailleurs +traiter +indiquer +signifier +technique +rapidement +autour +réduire +d'après +tuer +riche +préférer +rue +bref +violence +siècle +article +nommer +qualité +gauche +solution +voie +durer +canadien +erreur +livrer +capable +simplement +souvenir +conséquence +large +auprès +succès +élément +local +contraire +inviter +extérieur +pied +mission +été +fille +répéter +texte +débat +chambre +création +prouver +acheter +profiter +production +ignorer +directeur +santé +justice +précis +fixer +mère +croissance +risque +souffrir +estimer +endroit +comité +impossible +arme +véritable +amener +viser +retirer +preuve +image +date +travers +contrôle +total +conserver +réel +campagne +naître +énorme +tourner +participer +vieux +accorder +respecter +passage +essentiel +adopter +rapide +environ +expérience +admettre +découvrir +subir +assister +sénateur +dépasser +affirmer +couvrir +financier +processus +militaire +frais +soumettre +industrie +apparaître +responsabilité +réserver +porte +victime +territoire +pauvre +taux +posséder +matériel +cent +constater +prononcer +organiser +blanc +origine +vendre +vite +signe +dangereux +déplacer +importance +suffire +espoir +davantage +langue +énergie +réseau +mourir +faible +employer +saisir +spécial +accompagner +actuellement +union +supposer +possibilité +ceci +exiger +intervenir +fils +d'accord +fournir +différence +protéger +abandonner +discuter +battre +pire +adresser +préciser +intervention +avis +demeurer +chiffre +consacrer +attirer +divers +appliquer +frapper +peur +parlement +remplir +forcer +lutte +naturel +air +auteur +fermer +heureux +crise +numéro +résoudre +publier +opération +toutefois +pousser +quelqu'un +discours +banque +instant +reposer +opinion +classe +particulièrement +commun +compagnie +intention +autorité +anglais +échange +feu +satisfaire +observer +capacité +désigner +dépendre +neuf +construire +scène +durant +secret +plaisir +message +proposition +combien +dossier +absence +cher +plaire +derrière +connaissance +nul +entrée +signer +révéler +couper +salle +immédiatement +équipe +situer +souligner +source +pièce +crime +précédent +installer +facile +augmenter +respect +impression +octobre +médecin +fédéral +police +coût +réunir +contrat +normal +attitude +série +formation +lever +proche +direct +faute +figurer +pratique +finalement +allemand +pression +imaginer +champ +film +charge +envisager +accès +ressource +monter +promettre +motion +concentrer +commune +composer +chemin +zone +province +élection +exactement +conflit +hors +enquête +terrain +mars +tellement +usage +demain +hier +confier +remarquer +égard +supérieur +espace +condamner +capital +lien +voiture +discussion +huit +justifier +agent +sentiment +tâche +directement +limiter +raconter +décembre +développer +honorable +contact +conclure +euh +ouvert +investissement +insister +fruit +avantage +historique +probablement +voyage +sept +marche +garde +commercial +critique +ministère +baisser +vérité +culture +cacher +prêter +définir +somme +exposer +progrès +secrétaire +mer +rapporter +appuyer +client +rentrer +mémoire +caractère +détruire +civil +liste +juin +danger +complexe +commerce +transport +nécessité +institution +défense +janvier +échapper +négociation +attente +mai +septembre +environnement +séparer +réaction +franc +positif +scientifique +papier +expression +disposition +indépendant +carte +association +régler +modèle +protection +étudier +déterminer +budget +fonder +structure +commander +exercer +amour +manifester +menacer +conseiller +complet +opposition +maladie +outre +tandis +construction +bande +signal +réunion +réforme +rejeter +novembre +fonds +coûter +voisin +presse +rouge +majorité +autoriser +effectuer +reprise +central +procédure +faveur +éducation +officiel +document +bord +retourner +professionnel +aspect +animal +utile +inscrire +concurrence +déclaration +auparavant +mille +absolument +prison +armée +rejoindre +complètement +confirmer +salaire +lecture +revenu +attaquer +table +remonter +certes +contribuer +autrement +ferme +désormais +lourd +susciter +avril +dur +application +lutter +profit +contenir +république +déposer +communication +jugement +manque +modifier +traverser +transformer +engagement +frère +mardi +échec +vote +renvoyer +regretter +espèce +recommandation +consister +rencontre +surprendre +circonstance +témoin +améliorer +administration +réagir +lumière +vert +apprécier +combat +sensible +étudiant +réfléchir +malade +portée +élève +contrôler +merci +vitesse +visite +assemblée +émission +arrivée +puissance +certainement +contenter +perte +libéral +citoyen +citer +partenaire +camp +établissement +vendredi +avance +destiner +influence +nord +lundi +maître +interroger +conférence +causer +vente +ramener +soldat +collègue +provoquer +concevoir +poids +voici +acquérir +moindre +convenir +procéder +examiner +soin +mesurer +traitement +jeudi +impliquer +logique +individu +donnée +demi +combattre +violent +science +suivant +mériter +emprunter +conscience +comporter +sang +millier +emporter +initiative +nucléaire +traduire +vif +exact +exception +doubler +février +mode +industriel +musique +gestion +honneur +vaste +évoquer +tendre +étape +physique +accuser +parfaitement +méthode +fonctionner +envers +distribuer +existence +prétendre +global +professeur +crédit +tendance +chaîne +dommage +note +réserve +maximum +moteur +version +règlement +relatif +mercredi +régional +sinon +entreprendre +au-delà +étendre +couple +profond +décrire +etc +récent +télévision +retraite +sortie +frontière +égal +promesse +entretenir +habiter +quartier +art +accueillir +libérer +vivant +université +rire +avocat +crainte +commettre +précisément +soutien +facilement +urgence +clé +jeter +religieux +analyse +disponible +regard +prévenir +enlever +analyser +mariage +couleur +témoigner +sauver +bientôt +conclusion +bleu +dehors +remercier +actif +réclamer +parlementaire +récemment +fil +collectif +excellent +moral +habitude +code +puissant +recueillir +fabriquer +représentant +accident +extraordinaire +dimanche +vérifier +envie +enregistrer +rare +parc +impôt +sud +efficace +intéressant +île +cité +moderne +voter +traité +libération +nourrir +sérieusement +carrière +immédiat +exceptionnel +rechercher +palestinien +bras +producteur +garantir +geste +roman +augmentation +lendemain +policier +échelle +supplémentaire +pratiquer +pensée +facteur +néanmoins +bénéficier +vingt +revoir +extrême +défaut +précieux +retard +démocratie +renforcer +silence +perspective +qualifier +absolu +dégager +stratégie +bateau +troupe +course +exercice +fondamental +visage +printemps +machine +village +britannique +surveiller +édition +droite +organisme +leçon +décevoir +bataille +port +naissance +majeur +accomplir +hôpital +circuit +terrible +degré +exigence +rêve +froid +opérer +entièrement +chapitre +quotidien +clairement +inspirer +léger +permanent +juge +après-midi +joindre +juillet +ordinaire +candidat +rapprocher +résistance +russe +justement +habitant +formule +mur +tribunal +fier +manger +soulever +évidemment +travailleur +résolution +journaliste +marque +utilisation +offre +habituel +survivre +populaire +dirigeant +participation +évolution +totalement +gérer +constitution +informer +fou +attacher +renouveler +asseoir +samedi +transfert +renoncer +roi +soi +téléphone +oh +foi +motif +plaindre +tradition +net +victoire +arrêt +concours +vis-à-vis +institut +visiter +elle-même +démocratique +tentative +largement +aboutir +désirer +côte +génération +vent +technologie +échouer +dépit +équilibre +inquiet +obstacle +réflexion +inquiéter +affecter +revanche +ressembler +station +uniquement +supporter +catégorie +mine +législatif +ah +propriétaire +favoriser +privé +avion +minimum +criminel +photo +précéder +solide +priorité +navire +centaine +explication +transmettre +appareil +correspondre +associer +trait +référence +bois +publication +symbole +consommation +idéal +chômage +courage +identifier +entretien +encourager +kilomètre +dérouler +identité +reconnaissance +signaler +division +contexte +coupable +favorable +amendement +août +attribuer +courir +examen +personnage +obligation +inconnu +échanger +montant +éliminer +dénoncer +tableau +exclure +meurtre +exemplaire +propriété +final +site +séance +ouverture +élire +baisse +inquiétude +israélien +représentation +durée +mandat +quinze +vide +statut +essai +pareil +italien +suggérer +interrompre +au-dessus +agence +usine +unir +sourire +employé +sommet +franchir +évident +comportement +fête +rang +écarter +vague +réduction +culturel +coopération +sol +d'autant +leader +taille +vertu +distance +automne +arrière +vision +investir +diminuer +contenu +entourer +juif +considérable +conduite +convention +réfugier +prolonger +verser +évidence +essentiellement +démontrer +communiquer +approche +délai +accroître +bruit +humanité +radio +moi-même +négatif +prudent +soirée +vol +marcher +tiers +mètre +syndicat +occidental +suffisant +ciel +tromper +modeste +éloigner +aborder +malheureusement +évaluer +extrêmement +interne +voire +seconde +messieurs +effectivement +gaz +acteur +adapter +témoignage +dépense +souci +expert +sœur +relativement +comparer +cour +provenir +réellement +conscient +céder +médical +procès +colère +patient +notion +siège +hausse +diviser +traditionnel +quart +approcher +trafic +catholique +mécanisme +adulte +reprocher +métier +modification +peser +médias +foyer +définition +spécialiste +mari +supprimer +guère +douter +hiver +sexuel +consulter +renseignement +âgé +ressentir +fonctionnement +garçon +parfait +prévision +quatrième +fenêtre +incapable +hésiter +résumer +universel +jeunesse +voler +résister +profondément +menace +inutile +refus +poisson +révolution +séparation +avouer +saluer +fer +familial +cinéma +prisonnier +armé +enseignement +étonnant +dizaine +dessus +calcul +fonctionnaire +instruction +pratiquement +oser +rassembler +achever +fiscal +démarche +corriger +volume +réussite +désir +réalisation +exportation +prier +trente +âme +dominer +pur +instrument +indépendance +tort +hauteur +critiquer +autorisation +assurance +déficit +évoluer +drogue +concret +attaque +rythme +approuver +douze +juridique +espagnol +saison +percevoir +hypothèse +relier +financement +dos +consommateur +épreuve +volontaire +négocier +finance +rêver +indien +quantité +soviétique +persuader +interpréter +annuel +commentaire +marier +spectacle +pari +définitif +ouest +sexe +eh +recours +accent +introduire +communiste +célèbre +couverture +religion +appui +concert +saint +conséquent +équipement +descendre +théâtre +marge +abri +recette +généralement +vigueur +patron +soleil +électoral +ennemi +bourse +dimension +baser +dialogue +thème +circuler +porte-parole +présentation +déployer +outil +vacance +suffisamment +défi +front +suspendre +forêt +montagne +sévère +apparemment +présidence +magasin +commissaire +calme +monétaire +ouvrage +réputation +cabinet +écart +chien +écrivain +indispensable +conversation +surface +féliciter +sûrement +surveillance +efficacité +euro +phase +confusion +précision +bombe +bilan +immense +massif +chute +constant +compétence +intégrer +aérien +contrairement +pierre +socialiste +sain +régulier +boîte +financer +théorie +hôtel +nier +phénomène +là-bas +étonner +totalité +sort +accéder +église +fortement +doter +contribution +profondeur +émettre +test +récupérer +pêche +découverte +potentiel +agricole +intellectuel +essence +pencher +vice-président +coin +tension +don +artiste +fidèle +grève +achat +mentionner +exécution +uniforme +exploiter +administratif +effectif +communautaire +individuel +distinguer +original +surprise +veiller +dette +capitale +faciliter +chanter +pension +revue +clore +neige +figure +masse +maintien +étroit +goût +prestation +régner +catastrophe +ressortir +susceptible +manifestation +dormir +lit +bouche +excuse +veille +content +exploitation +triste +latin +classique +alliance +préoccupation +trace +logement +rassurer +plainte +chaud +taire +émotion +judiciaire +progresser +langage +confronter +strict +club +ouvrier +souffrance +observation +rétablir +secours +passion +rupture +office +compliquer +assumer +éprouver +immeuble +rendez-vous +argument +planète +partiel +délicat +attentat +boire +richesse +caisse +hasard +héros +maire +incident +café +annonce +régulièrement +oreille +foutre +apercevoir +refléter +bouger +foule +chrétien +isoler +pont +égalité +tenue +animer +norme +piste +préserver +hommage +inférieur +match +statistique +gouvernemental +exécuter +tragédie +distribution +scandale +pointe +chinois +bénéfice +billet +choc +proportion +irakien +briser +destruction +reculer +critère +gardien +adresse +canal +conservateur +ouais +transporter +brûler +manœuvre +monnaie +réception +quelconque +courrier +grandir +élaborer +doigt +illustrer +poche +transmission +éclater +honte +faiblesse +fédération +presser +affronter +bonheur +formuler +crier +pauvreté +bâtiment +époux +mêler +firme +élargir +électeur +plonger +véhicule +fuir +chercheur +médicament +personnalité +inventer +principalement +prudence +stade +liaison +varier +québécois +ordonner +bonjour +morale +contester +nécessairement +détermination +congrès +semblable +préoccuper +dépôt +consultation +multiplier +dame +joie +durable +faim +considération +recommander +concept +cerveau +truc +allié +excuser +arabe +diffuser +budgétaire +inquiétant +inclure +scolaire +style +combler +annuler +joueur +bloquer +interprétation +ombre +séjour +guider +spécialiser +bien +sport +climat +douleur +issue +généreux +absent +talent +normalement +amélioration +détourner +raisonnable +suprême +éventuel +blesser +orientation +remarque +secondaire +reporter +partisan +cinquième +distinction +impact +grec +compléter +mérite +naturellement +collaboration +procurer +officier +magazine +s'efforcer +tragique +anniversaire +issu +poursuite +nôtre +éclairer +remarquable +infirmier +caractéristique +dépenser +censé +fuite +conviction +nettement +consommer +évaluation +installation +innocent +fameux +cultiver +détenir +gouverner +jouir +parcourir +bloc +électrique +seuil +doux +classer +audience +multiple +minorité +phrase +croissant +hein +disparition +dynamique +renverser +trouble +désoler +provisoire +littérature +résider +adolescent +dessiner +rompre +agriculture +accélérer +aventure +armer +volet +bâtir +prime +résulter +gouverneur +japonais +emmener +alimentaire +occupation +lecteur +intermédiaire +vœu +dresser +conception +afficher +marin +satisfaction +survenir +publicité +arbre +univers +fragile +sauter +chasse +collège +garantie +morceau +aéroport +discipline +explosion +peau +commande +orienter +reproduire +salarié +radical +transférer +diffusion +spécialement +croître +paragraphe +copie +enseigner +rédiger +magnifique +initial +indice +promotion +tolérer +section +chanson +pair +contraindre +trancher +réformiste +branche +réjouir +punir +repartir +cellule +déclencher +uni +retarder +écouler +option +pétrole +laboratoire +étrange +coucher +connexion +génie +profession +rumeur +mien +drôle +plat +maman +département +célébrer +dignité +légitime +philosophie +verre +spécifique +docteur +incertitude +fréquence +urgent +trou +stratégique +mental +éditeur +provincial +hausser +probable +signature +forcément +conformément +croiser +plastique +casser +héritage +voyager +électronique +parallèle +répartir +courageux +autonome +réveiller +satellite +fondé +blessé +municipal +salut +songer +enfance +ordinateur +merveilleux +sien +commenter +inciter +prière +là-dessus +urbain +musée +pluie +précaution +anticiper +cheval +communiqué +nécessiter +rivière +avertir +rédaction +enceinte +substance +soigner +suicide +revendication +incroyable +sondage +mineur +composition +débarrasser +récit +invitation +présidentiel +concurrent +prévu +suisse +accusation +paiement +comparaison +musulman +déplacement +légal +dispositif +constitutionnel +franchement +tarder +refaire +pleurer +débattre +immigration +contrainte +lâcher +cercle +génétique +importation +tonne +dieu +cancer +perdu +obligé +visiteur +remporter +rond +étage +référendum +bébé +amitié +cinquante +zéro +drame +visible +intense +instance +cérémonie +ambition +recourir +sanction +haine +jardin +nourriture +engendrer +infrastructure +adversaire +africain +géant +mobile +significatif +circulation +cotisation +entente +royal +ralentir +cadeau +affirmation +cheveu +requérir +stabilité +louer +gars +fleur +agriculteur +poète +destination +vin +soudain +balle +inflation +sec +arrêté +enfermer +fabrication +paysan +transition +humanitaire +répandre +adoption +adorer +abattre +session +entamer +ménage +purement +enjeu +passager +transformation +appartement +misère +légèrement +écraser +enrichir +restaurant +calculer +discrimination +certitude +huile +sacré +autonomie +sac +stock +destin +compromettre +arracher +sombre +barre +contradiction +maîtriser +invoquer +souveraineté +épargner +concentration +téléphonique +remise +mec +violer +restreindre +décennie +aussitôt +officiellement +chasser +dîner +personnellement +solidarité +projeter +littéraire +présider +fortune +malheureux +numérique +fréquenter +soupçonner +merde +entrepreneur +exposition +marchand +cri +combattant +désert +vêtement +autrefois +surmonter +marchandise +autochtone +féminin +définitivement +heureusement +digne +guide +tabac +rendement +continent +pleinement +désastre +joli +promouvoir +ampleur +écho +innovation +sélection +confondre +honnête +tournant +fusion +collectivité +record +excessif +ridicule +modalité +automobile +fondation +terroriste +retrait +organe +protocole +paquet +gain +écran +sonner +protester +curieux +effacer +débuter +apparition +allusion +lancement +porteur +préalable +programmer +traîner +domicile +creuser +quarante +sacrifice +barrière +biais +feuille +délégation +épuiser +oiseau +librement +congé +taxe +onze +téléphoner +serrer +caractériser +champion +inverse +intituler +possession +rejet +enseignant +préparation +papa +collaborateur +gêner +technicien +cycle +accumuler +sauvage +s'avérer +prétexte +impressionnant +scénario +électricité +gratuit +révolutionnaire +jambe +alcool +privilège +week-end +équivalent +regrouper +invité +militant +insuffisant +blessure +privilégier +midi +disque +couche +dater +participant +inévitable +recommencer +race +vivement +beauté +atmosphère +épaule +habituer +circonscription +debout +influencer +recul +amoureux +mortel +horizon +délivrer +subvention +formel +aggraver +flux +alimenter +intelligent +équilibrer +bibliothèque +absurde +océan +quelques-uns +lait +tenant +stable +capitaine +solliciter +convoquer +prévention +dicter +utilisateur +obligatoire +terminal +choquer +primaire +vital +terrestre +patrimoine +conforme +adjoint +ultime +intégration +rarement +couler +destinée +amuser +complémentaire +satisfaisant +accueil +camion +douloureux +glisser +diversité +indication +exagérer +décès +parisien +psychologique +réviser +profil +rater +prêtre +tranquille +registre +contemporain +exclusif +performance +angle +divorce +fermeture +respectif +constamment +horreur +envahir +pétrolier +faculté +brillant +pacte +suspect +affaiblir +assistance +négliger +injuste +plaider +récompenser +suppression +coupure +lent +gare +drapeau +réparer +sensibilité +jaune +existant +procureur +informatique +glace +pacifique +bête +indicateur +racine +compenser +maritime +gravité +pénétrer +restriction +civilisation +rouler +technologique +football +décevant +législation +approprier +tactique +heurter +acceptable +surgir +prince +vidéo +semer +créateur +partenariat +thèse +chômeur +correct +cuisine +succéder +royaume +rebelle +provenance +file +dessin +viande +paramètre +gré +dessous +voyageur +réaliste +condamnation +fumer +employeur +paysage +discret +longueur +lentement +miracle +similaire +illégal +expansion +mutuel +sage +commandement +correspondant +déboucher +pause +répartition +sacrifier +chimique +compétition +combiner +touriste +ravir +grimper +filet +atomique +contribuable +progressivement +progression +nez +antérieur +pardon +progressif +adhésion +portrait +détailler +valable +coordination +inacceptable +rose +quête +compromis +investisseur +présumer +abandon +identique +sportif +mensonge +défaite +meurtrier +rigoureux +mentir +fréquent +exploser +ambassadeur +observateur +revêtir +accessoire +acquisition +tournée +tranche +œuf +inspecteur +tempête +tissu +souverain +distinct +survie +plage +repousser +plante +nuire +putain +imagination +accusé +repérer +directive +adaptation +persister +coalition +diplomatique +excellence +apparence +oriental +écriture +rural +républicain +embarquer +révolte +intéressé +formidable +tas +parcours +disputer +élite +malheur +aube +salon +infliger +repos +déjeuner +inhabituel +interdiction +consentir +variable +médecine +contradictoire +déranger +cible +détenu +volontiers +fauteuil +couloir +enthousiasme +exclusivement +éthique +révision +pointer +assassiner +optimiste +instaurer +télé +revendiquer +secouer +bizarre +abus +procédé +pêcheur +amateur +regret +isolé +trimestre +onde +spatial +brut +éventuellement +vache +accroissement +aise +agression +loisir +chaleur +ranger +partage +étoile +gris +quasi +description +serbe +biologique +universitaire +s'emparer +mystère +neutre +aîné +trahir +intelligence +admirer +licence +rigueur +maternel +dent +palais +belge +brutal +extraire +signification +filer +automatique +métal +pain +plateau +répétition +diminution +collection +gène +accrocher +reine +privatisation +correspondance +planter +strictement +permanence +compensation +lycée +con +combinaison +injustice +reportage +violation +soucier +plafond +opérateur +camarade +traduction +compréhension +réglementation +déception +mobiliser +encadrer +gentil +folie +terrorisme +illusion +portefeuille +déplorer +précipiter +clôture +piloter +agréable +télécommunication +désaccord +séduire +aliment +alimentation +pomme +ingénieur +vider +attentif +démarrer +coordonner +larme +sourd +cigarette +vallée +uranium +différer +honorer +entrevue +ressort +fixe +opportunité +artificiel +plaque +découler +décisif +piège +prédire +enterrer +robe +recouvrir +pente +album +mixte +clinique +spectateur +refuge +chasseur +chéri +peinture +déchet +axe +grand-chose +temporaire +affiche +massacre +actualité +siéger +crucial +marine +cadavre +fleuve +toit +mécanique +transparence +redevenir +détester +fondateur +charte +amorcer +succession +simplifier +briller +ambitieux +sale +consentement +productivité +calmer +mythe +alternative +soulager +scrutin +culpabilité +considérablement +bouleverser +introduction +dramatique +vaincre +chapeau +renseigner +ordonnance +aile +température +coupe +rayon +lèvre +pétition +boulot +correctement +colonne +arranger +lointain +danser +charbon +promener +colline +poésie +généraliser +transaction +extrémité +pénal +économiste +passionner +bancaire +défaire +calendrier +repas +cul +vouer +surprenant +paradis +banlieue +élu +tourisme +démonstration +gravement +infraction +tir +envoi +arrangement +transparent +collaborer +danse +tester +proclamer +genou +dominant +pardonner +préférence +vain +rentrée +coller +monopole +approfondir +incendie +péril +hélicoptère +bouteille +championnat +hériter +élémentaire +entité +souffler +proximité +mélange +pourcentage +permis +mélanger +proprement +enfoncer +clandestin +dit +encontre +syndical +deviner +tracer +sagesse +baiser +super +user +pilote +abonné +objection +correction +vocation +facture +enfer +luxe +nomination +poster +bar +tantôt +publiquement +relancer +comparable +sympathie +structurel +dispenser +copain +aligner +absorber +gueule +déroulement +dévoiler +opérationnel +freiner +rattraper +matinée +régir +compagnon +bassin +éteindre +ministériel +rage +enregistrement +débarquer +poème +énormément +respirer +dictature +acheteur +équiper +édifice +systématiquement +fondement +spirituel +fournisseur +détriment +unanime +agiter +lot +nazi +col +impressionner +accessible +résidence +dedans +élimination +loger +ouvertement +patience +stimuler +classement +arrestation +longuement +agressif +intensité +grandeur +entraînement +déborder +conducteur +pollution +islamique +ancêtre +caméra +dissimuler +chronique +ère +rappel +fabricant +utilité +ethnique +attribution +interlocuteur +spécifier +souple +rémunération +faillite +touchant +hostile +annexe +abuser +vérification +aveugle +jurer +trésor +vingtaine +séquence +imprimer +musicien +embrasser +échéance +surplus +prématuré +décrocher +rembourser +routier +défenseur +citation +reconstruction +retomber +pourvoir +systématique +adhérer +parallèlement +légume +francophone +émaner +souffle +lac +véritablement +prévaloir +sixième +enveloppe +extension +s'effondrer +apprêter +souhait +cibler +additionnel +excès +douzaine +turc +incertain +épouser +consensus +anonyme +avertissement +excédent +mondialisation +conventionnel +unanimité +romain +inégalité +chat +finale +mademoiselle +coûteux +ventre +soixante +bière +originaire +interrogation +voile +accentuer +rattacher +manuel +contracter +territorial +subsister +passif +voleur +centrale +pôle +délit +usager +musical +allumer +carré +disperser +déchirer +mépris +échantillon +continuité +fichier +conquête +quelquefois +supplément +sincère +optique +maximal +permission +méchant +contourner +interview +désespoir +humeur +demandeur +horrible +conquérir +idéologie +encouragement +motiver +plier +homologue +successif +manifestement +olympique +horaire +littéralement +propice +chèque +explorer +matériau +dépendance +nu +reproduction +abaisser +divergence +restant +détention +étouffer +inscription +poignée +approvisionnement +municipalité +consécutif +nuage +institutionnel +confédération +montée +vendeur +réplique +acquitter +intervalle +métro +coutume +quiconque +panique +abriter +variété +bulletin +flotte +décourager +poussière +fierté +fatiguer +détacher +interface +administrateur +doucement +quoique +projection +treize +épisode +tarif +remplacement +devise +optimisme +chanteur +décret +écrit +antenne +queue +durement +applaudir +sucre +prioritaire +chair +exécutif +suggestion +sable +corruption +blé +chaos +référer +obéir +fusil +taper +compétent +discrétion +odeur +identification +fêter +substantiel +asiatique +cohérent +photographie +exclusion +préconiser +tribune +bénéficiaire +historien +aspiration +tentation +gloire +vanter +coincer +silencieux +continu +chantier +seize +ennui +pompier +inspection +convertir +pouce +clientèle +croyance +atténuer +survivant +applicable +équitable +schéma +acier +vainqueur +révélation +sud-est +brancher +concession +mystérieux +assassinat +rive +dépendant +clarté +conjoint +fermement +redonner +assortir +change +tolérance +grain +compliqué +malaise +restaurer +ambassade +diplôme +miroir +star +restructuration +proie +domination +otage +moquer +allier +couvert +spectaculaire +placement +difficilement +grille +vieillir +abord +exigeant +primitif +demi-heure +mention +pertinent +brièvement +actionnaire +emprisonner +raisonnement +lune +quai +légende +spécialité +cruel +démission +quatorze +redouter +monstre +célibataire +impasse +contredire +atelier +amical +empire +redresser +médaille +ramasser +politicien +acheminer +comédie +propagande +colonie +désordre +invisible +savant +terreur +recruter +conformer +virus +reconnaissant +délibérer +infini +tunnel +cousin +puiser +géographique +réacteur +ajuster +œuvrer +inattendu +automatiquement +balance +dépression +pompe +contestation +sommeil +inconvénient +frein +candidature +armement +épargne +iranien +stupide +inspiration +surpris +interpeller +fréquemment +symbolique +pavillon +conférer +préliminaire +sensation +troubler +angoisse +générosité +chaise +pape +légitimité +emprunt +clause +clef +répression +tombe +hautement +évacuer +blocage +faille +fouiller +respectivement +dériver +intime +cerner +hostilité +manche +mathématique +gamin +éternel +temple +maîtrise +arbitrage +boucler +réparation +évêque +induire +solitude +miner +superbe +gonfler +missile +minuit +déléguer +veuf +comparaître +trame +bain +sûreté +composante +instituer +format +hiérarchie +estimation +mutation +imminent +hâte +esclave +marocain +menu +imaginaire +administrer +atteinte +héroïne +racheter +théorique +guise +scandaleux +vulnérable +démissionner +élan +nominal +manipuler +peiner +ennuyer +noble +hebdomadaire +approbation +protestant +faisceau +regagner +renouvellement +pilier +animateur +multinational +méfier +étroitement +jouet +dégât +formé +complice +toile +laver +empreinte +faillir +curiosité +passeport +creux +homosexuel +château +nous-mêmes +forum +via +coter +éclat +livraison +thé +préférable +attachement +liquide +gamme +motivation +sincèrement +demeure +adéquat +geler +défiler +peintre +volontairement +protestation +bien-être +cap +raide +maigre +artistique +aspirer +magique +quasiment +allure +deuil +énoncer +islamiste +prénom +habituellement +bilatéral +rétablissement +cynique +environnemental +constructeur +réussi +nœud +peindre +bâton +démocrate +précédemment +idiot +querelle +colonel +flic +solitaire +déceler +herbe +élevé +s'acharner +bombardement +explosif +singulier +capitalisme +suspension +mince +assimiler +plume +publicitaire +bagage +opter +habiller +trajet +sinistre +pis +reconstruire +tueur +tournoi +incarner +douane +domestique +soucieux +premièrement +complicité +décréter +cimetière +approprié +dix-huit +nouveauté +brusquement +coïncider +flamme +ménager +millénaire +alerte +déterminé +renforcement +guérir +immobilier +certificat +contaminer +pénurie +ange +perception +philosophe +planche +crédibilité +fiction +handicapé +boisson +tirage +habitation +représentatif +débrouiller +imposition +générer +ajustement +élaboration +virer +facilité +postal +perturber +répercussion +oncle +viol +princesse +gosse +équipage +carburant +canon +prometteur +apprentissage +soi-disant +culte +salarial +abolir +pâte +cohésion +ruine +percer +rassemblement +chaussure +soigneusement +pot +règne +impulsion +physiquement +minimal +malentendu +dépens +implanter +descendant +politiquement +crever +interruption +fossé +patrie +prélèvement +ex +studio +intégrité +prescrire +polonais +tribu +apaiser +sélectionner +familier +exhorter +quinzaine +globe +impatience +logiciel +visiblement +suicider +préjugé +impératif +paralyser +charme +atout +portugais +nord-ouest +affaiblissement +renvoi +peupler +cauchemar +pénible +venue +ballon +balayer +affrontement +expulser +resserrer +activement +décor +abstenir +compassion +couronne +plancher +trentaine +détresse +escalier +barrage +néant +descente +effondrement +encaisser +déduire +baptiser +incompatible +bienvenu +support +synthèse +conjoncture +défier +baie +récompense +étendue +espérance +carnet +banc +réformer +assise +énergétique +reléguer +tiens +deuxièmement +vedette +intervenant +séminaire +contrer +nerveux +assaut +architecte +arbitraire +vraisemblablement +propagation +masculin +imiter +embaucher +couteau +arbitre +manteau +implication +grand-père +reflet +primordial +décliner +rideau +fermé +manipulation +piquer +assiette +requête +rival +refermer +écu +confus +expédition +reconstituer +gigantesque +chant +diplomatie +lieutenant +réputé +indirect +apte +protégé +démentir +sud-ouest +envergure +touche +déterminant +sous-marin +acheminement +dépêcher +hôte +assassin +confirmation +tapis +corde +notable +rationnel +externe +endormir +épais +exposé +boutique +récolter +tchèque +autoroute +divin +là-dedans +différend +explicite +comté +par-dessus +maternité +tailler +apparent +s'enfuir +assistant +portion +allocation +quota +décéder +serré +enquêter +dix-sept +allonger +chauffeur +prospérité +spéculation +bourgeois +touristique +obscur +cou +invention +boucle +ambiguïté +redire +consultatif +torturer +carton +effrayer +flou +complexité +favori +noyau +brandir +repenser +timide +pitié +comptabilité +précaire +trône +insulter +saut +audition +différemment +programmation +crédible +justification +amende +transit +organisateur +galerie +aménagement +conservation +char +criminalité +masquer +masque +manifestant +festival +prôner +radicalement +franchise +ultérieur +expédier +dorénavant +propager +rectifier +tennis +avenue +axer +émouvoir +hé +génial +réduit +alléger +vierge +vengeance +rapprochement +confession +suspens +dégradation +meuble +agenda +grand-mère +phare +virtuel +gagnant +nettoyer +vingtième +poing +étiquette +tante +chemise +pile +diagnostic +citoyenneté +douceur +attester +attraper +prestigieux +kilo +ruiner +nullement +incorporer +débloquer +ficher +censure +croix +accompli +terriblement +main-d'œuvre +invasion +orange +jury +linguistique +rallier +roue +barrer +réaffirmer +assigner +bœuf +soupçon +constat +communisme +dynamisme +flagrant +souhaitable +loup +concerter +désespérer +subit +diplomate +paire +essuyer +exporter +étaler +reconduire +handicap +bonsoir +joue +autrui +bousculer +ériger +conversion +patte +planifier +casque +tardif +prédécesseur +natal +humour +défaillance +transitoire +cabine +fardeau +héritier +apport +remboursement +hélas +fondre +occurrence +authentique +attentivement +irlandais +confortable +échelon +fonctionnel +panne +adieu +entre-temps +insérer +au-dessous +litre +suivi +variation +productif +groupement +confrère +déploiement +impuissant +restauration +haïr +marée +souscrire +modernisation +suffrage +spontané +joyeux +concilier +tristesse +diable +sombrer +photographe +libanais +archives +asile +rapporteur +dix-neuvième +indemnisation +harceler +honteux +leadership +portable +précoce +qualification +insulte +planer +stage +dédier +cahier +exil +artisan +rassurant +remède +composant +carrément +hurler +yen +gras +médiatique +statue +frappe +économiquement +efficacement +golfe +ambiance +coopérer +bus +septième +industrialiser +charmant +marginal +comptable +isolement +modérer +façade +porc +appartenance +émeute +constructif +minime +volant +mobilisation +tâcher +racisme +mairie +aptitude +fumée +ralentissement +récession +convaincant +sou +analyste +prétendu +grossier +sauvetage +pervers +sensiblement +léguer +prélever +noyer +abbé +détecter +ignorance +sceptique +vôtre +problématique +voiler +nationalité +capter +s'envoler +pasteur +activer +chimie +erroné +fantôme +serment +yougoslave +explicitement +alerter +vigilance +rock +naviguer +revers +aviation +souplesse +respectueux +trahison +réconciliation +sursis +simultanément +techniquement +os +cote +débit +symptôme +délibérément +écoute +contingent +dictionnaire +émerger +instruire +inconscient +chaleureux +déguiser +fièvre +vitre +fantastique +équité +soustraire +instable +vapeur +beurre +monument +courbe +téléviser +consolider +muet +contrevenant +offensive +oral +coder +gel +rénovation +controverse +médiocre +routine +relais +opposant +aval +rubrique +préfet +provocation +filial +versant +réticence +grossesse +égyptien +timbre +découper +distributeur +élargissement +sommaire +colonial +pourparlers +incidence +béton +fiable +génocide +vingt-quatre +dégrader +indifférent +audacieux +poudre +teneur +inverser +naval +épouvantable +mécontent +vocabulaire +stabiliser +délégué +centrer +algérien +dérive +alentour +corrompre +commerçant +poitrine +couronner +relire +perpétuer +sympathique +compétitif +majesté +mouton +indifférence +omettre +typique +concurrentiel +doctrine +quotidiennement +architecture +éventualité +massacrer +réciproque +état-major +désarmement +englober +grossir +séparatiste +surcroît +sortant +plomb +s'attarder +nationaliste +exportateur +montre +ratifier +gorge +exploit +encourageant +aviser +épidémie +alarme +parier +écologique +lunette +climatique +sphère +confidentiel +sanctionner +recrutement +détendre +aisé +entourage +autobus +défavoriser +résistant +admiration +acide +banal +poulet +toilette +brigade +trembler +reçu +civiliser +relance +dose +pêcher +distorsion +octroyer +arrivant +standard +taxi +limitation +irréversible +loyer +furieux +verbal +contacter +commissariat +gai +confrontation +chier +fatal +rude +panneau +appréciation +réflexe +complément +atlantique +comédien +successeur +méfiance +replier +vérificateur +dictateur +initialement +rédacteur +avaler +extraction +banquier +prétention +stabilisation +mutuellement +légion +lacune +engin +mépriser +titulaire +idéologique +cloche +compatriote +affection +sel +majoritaire +minoritaire +paradoxe +chiffrer +catastrophique +magistrat +extrait +redressement +farce +compétitivité +enthousiaste +quarantaine +sous-sol +rat +flot +amant +partiellement +radioactif +passe +indépendamment +location +naïf +retraité +innocence +mordre +messe +coïncidence +torture +protecteur +rayonnement +récolte +bijou +danseur +expertise +minier +vitrine +ébranler +crâne +valise +vocal +unilatéral +combustible +économiser +tisser +poule +punition +anéantir +rentable +loyal +renfort +cohérence +souris +bombarder +hésitation +semestre +croyant +réalisateur +brutalement +lourdement +tente +goutte +éveiller +moine +modéré +négligeable +vice +symboliser +substituer +poussée +commandant +chuter +fidélité +basculer +gestionnaire +redoutable +subtil +polémique +alourdir +avancée +sévir +jumeau +piéger +confiant +immigrant +intact +rapidité +localité +récupération +vigoureux +rentabilité +pendre +incliner +affreux +révolter +conte +évasion +repère +delà +arrivé +ironie +serveur +bannir +insuffisance +librairie +philosophique +miser +stupéfiant +boursier +levée +déformer +menaçant +parenthèse +substitution +parer +avantageux +handicaper +filmer +délinquant +perdant +altitude +imputer +plaisanter +poétique +nord-est +desservir +connerie +sanglant +coude +ôter +report +créature +mensuel +globalement +convenable +itinéraire +purger +fâcher +repasser +aucunement +palier +prochainement +réglementaire +costume +thérapie +reproche +curé +alternatif +soulagement +dissoudre +avalanche +mark +brèche +incitation +contrôleur +éditorial +conjugal +pâle +relâcher +visa +vingt-cinq +péché +entraîneur +sécheresse +score +goûter +renier +juridiction +prostitution +fiche +déséquilibre +gendarme +entraver +sous-estimer +embargo +interdit +brouillard +syrien +jet +probabilité +occupant +ponctuel +défini +détachement +manuscrit +panier +trêve +immobile +fermeté +véhiculer +répliquer +passionnant +théologie +bouton +immigrer +tache +tendresse +privilégié +slogan +fromage +toxique +advenir +pharmaceutique +parfum +antique +controversé +instinct +incapacité +insupportable +opportun +parquet +navigation +contrarier +nouer +barreau +cinquantaine +improviser +désespéré +auto +troupeau +gendarmerie +frustration +analogue +venu +génétiquement +ironique +sonore +initier +mœurs +cessez-le-feu +bénévole +boue +sanitaire +empereur +dissiper +déclin +liquider +maintenance +prévisible +pneu +fraude +entrevoir +stipuler +remédier +flotter +fraction +coton +conditionnel +nuance +improbable +enquêteur +conjointement +éclaircir +impossibilité +impatient +versement +bosser +articuler +successivement +bordel +provision +amplifier +ceinture +intergouvernemental +délibération +mexicain +assurément +saisonnier +souterrain +merveille +restituer +démon +balancer +seigneur +infiniment +acquis +récepteur +glissement +auditeur +indigène +disponibilité +indirectement +obtention +grandissant +chagrin +prostitué +chocolat +soupe +bravo +appréhender +concitoyen +flèche +libéralisation +lumineux +signataire +ski +douanier +syndrome +météo +borner +triompher +complot +soumission +continuellement +dérober +romancier +sorcier +consigne +harmonie +concrétiser +pleuvoir +déplaire +innombrable +félicitation +inédit +lance +blond +diversifier +vélo +fatigue +instabilité +pénaliser +comte +désireux +amer +orchestre +dixième +est +envelopper +troublant +foncier +irrégulier +fouet +baigner +fixation +encadrement +déménager +photographier +insensé +moderniser +expérimental +incomber +retombée +esthétique +différencier +éventail +solde +gâcher +régiment +équivaloir +bouleversement +relater +décent +éminent +chiite +rayer +concrètement +coulisse +enchaîner +instituteur +emplacement +copier +inculper +renouveau +intégral +ratification +spécification +documentation +logiquement +spectre +néerlandais +suédois +rouvrir +débouché +croisé +fléau +traversée +harmoniser +secrétariat +mou +venger +détenteur +basque +soif +accumulation +solaire +essor +obséder +intolérable +rébellion +préventif +autoritaire +aimable +conformité +pantalon +anormal +inhérent +réconcilier +réservoir +désignation +emmerder +inondation +câble +poumon +humble +perturbation +brouiller +illustration +aveu +fermier +hanter +cordon +néfaste +lasser +influer +présentement +appliqué +stopper +kurde +amusant +tremblement +rail +fondamentalement +lampe +plate-forme +triple +supplier +multiplication +camoufler +cliché +diamant +guerrier +inchangé +comique +planification +éloge +regroupement +odieux +désastreux +figer +nocturne +configuration +escompter +intensif +scepticisme +plénier +athlète +poil +s'épanouir +minimiser +inévitablement +informé +croisière +échéant +murmurer +implantation +décerner +replacer +Islam +trottoir +vieillard +fillette +enchanter +singe +superficiel +rigide +vêtir +fourniture +taxer +milice +foire +élégant +crème +démographique +charité +borne +organique +dévouer +hâter +mobilité +exclu +boucher +mentalité +commencement +licenciement +chancelier +retenue +visée +dénonciation +bénéfique +exiler +rocher +mortalité +cruauté +regrettable +droguer +plaie +confort +compréhensible +tube +coffre +intimider +huitième +connecter +périr +notoire +graphique +annulation +acceptation +textile +forger +chirurgien +orage +boule +médiation +réprimer +hall +visuel +hormis +jadis +rémunérer +fasciner +dilemme +progressiste +semblant +ours +excéder +blâmer +duc +raciste +stress +inexistant +décharger +danois +concéder +retrancher +renfermer +vieillesse +théoriquement +traditionnellement +batterie +foie +gratuitement +incompréhensible +détour +navette +blague +mécontentement +inaugurer +repli +contrepartie +proportionnel +boulevard +triomphe +libre-échange +sincérité +serre +doré +convoi +aboutissement +psychologie +maltraiter +puits +intimité +équation +humide +bétail +prophète +terrien +gâteau +continental +réitérer +énumérer +embauche +verdict +dix-neuf +micro +frustrer +anglo-saxon +détente +questionner +injecter +préjudice +guetter +exploration +caresser +hymne +sécuritaire +famine +s'écrier +couramment +précipitation +caution +affectation +salaud +cave +bond +enclin +foudre +justesse +rente +hépatite +blindé +clan +accélération +garage +résolument +négociateur +romantique +obscurité +vulgaire +nettoyage +féroce +perpétuel +militer +jungle +case +craquer +soixante-dix +clarifier +traite +démarrage +oubli +procès-verbal +crête +formalité +distant +émetteur +montage +énergique +claquer +insensible +buter +bulle +défavorable +promoteur +albanais +obsession +exciter +simplicité +savoir-faire +sévèrement +écrasant +vendu +munition +capturer +compliment +voisinage +scandaliser +cassette +résident +s'empresser +inonder +réglementer +sonder +vigilant +allouer +cage +réglé +téléspectateur +golf +forestier +hum +ravager +rhétorique +réveil +ensuivre +relevé +ajourner +détérioration +viable +cochon +racial +atroce +civique +ancrer +raccrocher +cirque +législature +barbare +confiner +agrandir +occasionner +allégement +malin +performant +audiovisuel +cuire +raser +ha +revivre +piano +concertation +vaisseau +interaction +sérénité +sillage +synonyme +hisser +agréer +comble +pessimiste +insignifiant +décoller +solidaire +ferroviaire +dépouiller +bosniaque +aménager +agitation +exode +aire +céréale +socialisme +harmonisation +provisoirement +cocktail +moyenne +rigoler +orgueil +compression +expérimenter +détériorer +exprès +réfléchi +écrouler diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e8381a6 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,8 @@ +#![warn(clippy::all, clippy::pedantic, clippy::print_stdout)] +mod typer; + +use typer::Typer; + +fn main() { + Typer::default().run(); +} diff --git a/src/typer.rs b/src/typer.rs new file mode 100644 index 0000000..a02d928 --- /dev/null +++ b/src/typer.rs @@ -0,0 +1,132 @@ +use crossterm::event::{read, Event, Event::Key, KeyCode::{Char, Backspace}, KeyEvent, KeyModifiers}; +mod terminal; +use terminal::{Terminal, Position}; +mod view; +use view::{View, TyperInfo, ResultInfo}; +mod words; +use words::WordList; +use std::io::Error; +use std::time::{SystemTime}; + +pub struct Typer { + should_quit: bool, + should_display_result: bool, + words_to_write: WordList, + chars_written: Vec, + current_num_of_words: u16, + wpm: u16, + errors: u16, + start_timestamp: Option, +} + +impl Typer { + pub fn default() -> Self { + + Typer{ + should_quit: false, + should_display_result: false, + words_to_write: WordList::new(50), + chars_written: Vec::new() as Vec, + current_num_of_words: 0, + wpm: 0, + errors: 0, + start_timestamp: None + } + } + + pub fn run(&mut self) { + Terminal::initialize().unwrap(); + let result = self.repl(); + Terminal::terminate().unwrap(); + result.unwrap(); + } + + fn repl(&mut self) -> Result<(), Error> { + loop { + self.refresh_screen()?; + if self.should_quit { + break; + } + let event = read()?; + self.evaluate_event(&event); + } + Ok(()) + } + + fn evaluate_event(&mut self, event: &Event) { + if let Key(KeyEvent { code, modifiers, .. }) = event { + match code { + Char('q') if *modifiers == KeyModifiers::CONTROL => { + self.should_quit = true; + } + Backspace => { + if self.chars_written.pop().unwrap() == ' ' && self.current_num_of_words > 0 { + self.current_num_of_words -= 1; + } + } + _ => { + if code.as_char().is_some() { + if self.chars_written.len() < self.words_to_write.chars.len() - 2 { + // Start the timer for WPM + if self.start_timestamp.is_none() { + self.start_timestamp = Some(SystemTime::now()); + } + + let c = code.as_char().unwrap(); + + // Add an error if the character written is not the correct. + if c != *self.words_to_write.chars.get(self.chars_written.len()).unwrap() { + self.errors += 1; + } + + // Increase the number of written words on space. + if c == ' ' { + self.current_num_of_words += 1; + } + + // Update WPM + match self.start_timestamp.unwrap().elapsed() { + Ok(elapsed) => { + if elapsed.as_secs() != 0 { + self.wpm = (f32::from(self.current_num_of_words) / (elapsed.as_secs() as f32 / 60_f32)) as u16; + } + } + Err(_e) => { + panic!("Problem with the timer"); + } + } + + self.chars_written.push(c); + } else { + self.should_display_result = true; + } + } + }, + } + } + } + + fn refresh_screen(&mut self) -> Result<(), Error> { + if self.should_quit { + Terminal::clear_screen()?; + Terminal::print("Goodbye.\r\n")?; + } else if self.should_display_result { + Terminal::clear_screen()?; + View::render_result(ResultInfo { + wpm: self.wpm, + errors: self.errors, + accuracy: 100_f32 * (1_f32 - (self.errors as f32 / self.words_to_write.chars.len() as f32)), + })?; + } else { + View::render_typer(TyperInfo { + words_to_write: self.words_to_write.words.clone(), + words_written: self.chars_written.clone(), + wpm: self.wpm, + errors: self.errors + })?; + Terminal::move_cursor_to(Position {x: 0, y: 0})?; + } + Terminal::execute()?; + Ok(()) + } +} diff --git a/src/typer/terminal.rs b/src/typer/terminal.rs new file mode 100644 index 0000000..6662ef1 --- /dev/null +++ b/src/typer/terminal.rs @@ -0,0 +1,95 @@ +use crossterm::cursor::{Hide, Show, MoveTo}; +use crossterm::queue; +use crossterm::style::{Print, ResetColor, SetForegroundColor, Color}; +use crossterm::terminal::{disable_raw_mode, enable_raw_mode, size, Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen}; +use std::io::{stdout, Error, Write}; + +#[derive(Copy, Clone)] +pub struct Size { + pub height: u16, + pub width: u16, +} + +#[derive(Copy, Clone)] +pub struct Position { + pub x: u16, + pub y: u16, +} + +pub struct Terminal; + +impl Terminal { + pub fn terminate() -> Result<(), Error> { + Self::show_cursor()?; + Self::execute()?; + Self::leave_alternate_screen()?; + disable_raw_mode()?; + Ok(()) + } + + pub fn initialize() -> Result<(), Error> { + enable_raw_mode()?; + Self::enter_alternate_screen()?; + Self::clear_screen()?; + Self::move_cursor_to(Position {x: 0, y: 0})?; + Self::hide_cursor()?; + Self::execute()?; + Ok(()) + } + + pub fn leave_alternate_screen() -> Result<(), Error> { + queue!(stdout(), LeaveAlternateScreen)?; + Ok(()) + } + + pub fn enter_alternate_screen() -> Result<(), Error> { + queue!(stdout(), EnterAlternateScreen)?; + Ok(()) + } + + + pub fn clear_screen() -> Result<(), Error> { + queue!(stdout(), Clear(ClearType::All))?; + Ok(()) + } + + pub fn reset_color() -> Result<(), Error> { + queue!(stdout(), ResetColor)?; + Ok(()) + } + + pub fn set_foreground_color(color: Color) -> Result<(), Error> { + queue!(stdout(), SetForegroundColor(color))?; + Ok(()) + } + + pub fn move_cursor_to(position: Position) -> Result<(), Error> { + queue!(stdout(), MoveTo(position.x,position.y))?; + Ok(()) + } + + pub fn hide_cursor() -> Result<(), Error> { + queue!(stdout(), Hide)?; + Ok(()) + } + + pub fn show_cursor() -> Result<(), Error> { + queue!(stdout(), Show)?; + Ok(()) + } + + pub fn print(string: &str) -> Result<(), Error> { + queue!(stdout(), Print(string))?; + Ok(()) + } + + pub fn size() -> Result { + let (width, height) = size()?; + Ok(Size { height, width }) + } + + pub fn execute() -> Result<(), Error> { + stdout().flush()?; + Ok(()) + } +} diff --git a/src/typer/view.rs b/src/typer/view.rs new file mode 100644 index 0000000..4daedcd --- /dev/null +++ b/src/typer/view.rs @@ -0,0 +1,128 @@ +use super::terminal::{Size, Position, Terminal}; +use crossterm::style::Color; +use std::io::Error; +const NAME: &str = env!("CARGO_PKG_NAME"); +const VERSION: &str = env!("CARGO_PKG_VERSION"); + +pub struct TyperInfo { + pub words_to_write: Vec, + pub words_written: Vec, + pub wpm: u16, + pub errors: u16, +} + +pub struct ResultInfo { + pub wpm: u16, + pub errors: u16, + pub accuracy: f32, +} + +pub struct View; + +impl View { + pub fn render_typer(info: TyperInfo) -> Result<(), Error> { + Self::draw_static_ui()?; + Self::draw_dynamic_ui(&info)?; + Ok(()) + } + + pub fn render_result(info: ResultInfo) -> Result<(), Error> { + Self::draw_footer()?; + + let Size{width, ..} = Terminal::size()?; + let title = "Bravo ! Voici vos résultats."; + + #[allow(clippy::cast_possible_truncation)] + Terminal::move_cursor_to(Position {x: (width - title.len() as u16) / 2, y: 5})?; + Terminal::print(title)?; + + let x_padding = width / 4; + + let min_x = x_padding; + let min_y = 7; + Terminal::move_cursor_to(Position {x: min_x, y: min_y})?; + Terminal::print(&format!("WPM: {} ", info.wpm))?; + + Terminal::move_cursor_to(Position {x: min_x, y: min_y + 1})?; + Terminal::print(&format!("Erreurs: {}", info.errors))?; + + Terminal::move_cursor_to(Position {x: min_x, y: min_y + 2})?; + Terminal::print(&format!("Précision: {:.2}%", info.accuracy))?; + + Ok(()) + } + + fn draw_static_ui() -> Result<(), Error> { + let Size{width, ..} = Terminal::size()?; + let title = "C'est parti !"; + + #[allow(clippy::cast_possible_truncation)] + Terminal::move_cursor_to(Position {x: (width - title.len() as u16) / 2, y: 5})?; + Terminal::print(title)?; + + Self::draw_footer()?; + Ok(()) + } + + fn draw_footer() -> Result<(), Error> { + let Size{width, height} = Terminal::size()?; + let version_name = NAME.to_owned() + " - " + VERSION; + + #[allow(clippy::cast_possible_truncation)] + Terminal::move_cursor_to(Position {x: width - version_name.len() as u16, y: height - 1})?; + Terminal::print(&version_name)?; + Terminal::move_cursor_to(Position {x: 0, y: height - 1})?; + Terminal::print("Appuyez sur CTRL+Q pour quitter")?; + Ok(()) + } + + fn draw_dynamic_ui(info: &TyperInfo) -> Result<(), Error> { + let Size{width, ..} = Terminal::size()?; + + let x_padding = width / 4; + + let min_x = x_padding; + let min_y = 7; + let max_x = width - x_padding; + let mut x_offset = 0; + let mut y_offset = 2; + let mut char_offset = 0; + Terminal::move_cursor_to(Position {x: min_x, y: min_y})?; + Terminal::print(&format!("Erreurs: {}", info.errors))?; + + Terminal::move_cursor_to(Position {x: min_x + 20, y: min_y})?; + Terminal::print(&format!("WPM: {} ", info.wpm))?; + + Terminal::move_cursor_to(Position {x: min_x, y: min_y + y_offset})?; + + for i in 0..info.words_to_write.len() { + let current_word = info.words_to_write.get(i).unwrap(); + #[allow(clippy::cast_possible_truncation)] + if min_x + x_offset + current_word.len() as u16 > max_x { + x_offset = 0; + y_offset += 1; + Terminal::move_cursor_to(Position {x: min_x + x_offset, y: min_y + y_offset})?; + } + for c in current_word.chars() { + if char_offset < info.words_written.len() { + if *info.words_written.get(char_offset).unwrap() == c { + Terminal::set_foreground_color(Color::White)?; + } else { + Terminal::set_foreground_color(Color::Red)?; + } + } else { + Terminal::set_foreground_color(Color::DarkGrey)?; + } + Terminal::print(&format!("{c}"))?; + char_offset += 1; + x_offset += 1; + } + Terminal::print(" ")?; + char_offset += 1; + x_offset += 1; + } + Terminal::reset_color()?; + + Ok(()) + } +} diff --git a/src/typer/words.rs b/src/typer/words.rs new file mode 100644 index 0000000..3ce6e74 --- /dev/null +++ b/src/typer/words.rs @@ -0,0 +1,38 @@ +use include_lines::{static_include_lines}; +use rand::Rng; +static_include_lines!(WORD_LIST_ENGLISH, "data/words_english.txt"); +static_include_lines!(WORD_LIST_FRENCH, "data/words_french.txt"); + +pub struct WordList { + pub words: Vec, + pub chars: Vec +} + +impl WordList { + pub fn new(num_of_words: u16) -> WordList { + let mut rng = rand::rng(); + let mut chars_to_write: Vec = Vec::new(); + let mut words_to_write: Vec = Vec::new(); + let words = Self::get_words(); + for _ in 0..num_of_words { + let i = rng.random_range(0..words.len()); + let word = words.get(i).unwrap(); + words_to_write.push(word.to_owned()); + for c in word.chars() { + chars_to_write.push(c); + } + chars_to_write.push(' '); + } + WordList{ words: words_to_write, chars: chars_to_write } + } + + fn get_words() -> Vec { + let mut words: Vec = Vec::new(); + + for word in WORD_LIST_FRENCH { + words.push(word.to_owned()); + } + + words + } +}