lipsum-0.9.1/.cargo_vcs_info.json0000644000000001360000000000100123540ustar { "git": { "sha1": "2a607addab99814fc005c1e0685965e03b324421" }, "path_in_vcs": "" }lipsum-0.9.1/.github/dependabot.yml000064400000000000000000000010111046102023000153250ustar 00000000000000# Please see the documentation for all configuration options: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: cargo directory: / schedule: interval: weekly commit-message: prefix: cargo groups: minor: update-types: - minor patch: update-types: - patch - package-ecosystem: github-actions directory: / schedule: interval: weekly lipsum-0.9.1/.github/workflows/build.yml000064400000000000000000000035571046102023000163750ustar 00000000000000name: build on: pull_request: push: branches: - master env: CARGO_TERM_COLOR: always FORCE_COLOR: 3 RUSTFLAGS: -D warnings jobs: build: name: Build strategy: matrix: rust: - stable - nightly os: - ubuntu-latest - windows-latest exclude: - rust: nightly os: windows-latest fail-fast: false runs-on: ${{ matrix.os }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install ${{ matrix.rust }} Rust run: rustup default ${{ matrix.rust }} - uses: Swatinem/rust-cache@v2 - name: Test run: cargo test # This checks examples and benchmarks, which are not covered above. - name: Check all targets if: matrix.rust == 'nightly' run: cargo check --all-targets msrv: name: Build MSRV runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Rust run: rustup default 1.56 - uses: Swatinem/rust-cache@v2 - name: Build run: cargo build build-documentation: name: Build documentation runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - uses: Swatinem/rust-cache@v2 - name: Build documentation and check intra-doc links env: RUSTDOCFLAGS: --deny rustdoc::broken_intra_doc_links run: cargo doc --no-deps clippy: name: Clippy runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - uses: Swatinem/rust-cache@v2 - name: Clippy with default lints run: cargo clippy - name: Lint for left-over debug prints run: cargo clippy -- -D clippy::print_stdout -D clippy::print_stderr lipsum-0.9.1/.github/workflows/coverage.yml000064400000000000000000000006121046102023000170560ustar 00000000000000name: coverage on: push: branches: - master env: CARGO_TERM_COLOR: always jobs: coverage: name: Generate coverage runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Run cargo-tarpaulin uses: actions-rs/tarpaulin@v0.1 - name: Upload to codecov.io uses: codecov/codecov-action@v3 lipsum-0.9.1/.github/workflows/prepare-release.yml000064400000000000000000000005071046102023000203420ustar 00000000000000name: Prepare Release PR on: push: branches: - 'release-*' jobs: prepare-release: uses: mgeisler/rust-release-gh-action/.github/workflows/prepare-release.yml@main with: name: "Martin Geisler" email: "martin@geisler.net" changelog-file: "README.md" changelog-heading-level: "###" lipsum-0.9.1/.github/workflows/publish-crate.yml000064400000000000000000000003741046102023000200320ustar 00000000000000name: Publish Crate on: push: branches: - master paths: - Cargo.toml jobs: publish: uses: mgeisler/rust-release-gh-action/.github/workflows/publish-crate.yml@main secrets: CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} lipsum-0.9.1/.gitignore000064400000000000000000000000511046102023000131300ustar 00000000000000target/ Cargo.lock *~ *.orig *.rej *.bak lipsum-0.9.1/Cargo.lock0000644000000224360000000000100103360ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "aho-corasick" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] name = "bitflags" version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "form_urlencoded" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "getrandom" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "idna" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown", ] [[package]] name = "libc" version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "lipsum" version = "0.9.1" dependencies = [ "rand", "rand_chacha", "version-sync", ] [[package]] name = "memchr" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] [[package]] name = "pulldown-cmark" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ "bitflags", "memchr", "unicase", ] [[package]] name = "quote" version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] name = "regex" version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "semver" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_spanned" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] [[package]] name = "syn" version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "tinyvec" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", "serde_spanned", "toml_datetime", "toml_edit", ] [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "winnow", ] [[package]] name = "unicase" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-bidi" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] [[package]] name = "url" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] [[package]] name = "version-sync" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835169da0173ea373ddf5987632aac1f918967fbbe58195e304342282efa6089" dependencies = [ "proc-macro2", "pulldown-cmark", "regex", "semver", "syn", "toml", "url", ] [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "winnow" version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] lipsum-0.9.1/Cargo.toml0000644000000025240000000000100103550ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" rust-version = "1.56" name = "lipsum" version = "0.9.1" authors = ["Martin Geisler "] description = """ Lipsum is a lorem ipsum text generation library. It generates pseudo-random Latin text. Use this if you need filler or dummy text for your application. The text is generated using a simple Markov chain, which you can instantiate to generate your own pieces of pseudo-random text. """ documentation = "https://docs.rs/lipsum/" readme = "README.md" keywords = [ "random", "text", "markov", "typography", ] categories = ["text-processing"] license = "MIT" repository = "https://github.com/mgeisler/lipsum/" [dependencies.rand] version = "0.8.5" features = ["alloc"] default-features = false [dependencies.rand_chacha] version = "0.3.1" [dev-dependencies.rand] version = "0.8.5" [dev-dependencies.version-sync] version = "0.9.4" lipsum-0.9.1/Cargo.toml.orig000064400000000000000000000014701046102023000140350ustar 00000000000000[package] name = "lipsum" version = "0.9.1" authors = ["Martin Geisler "] description = """ Lipsum is a lorem ipsum text generation library. It generates pseudo-random Latin text. Use this if you need filler or dummy text for your application. The text is generated using a simple Markov chain, which you can instantiate to generate your own pieces of pseudo-random text. """ documentation = "https://docs.rs/lipsum/" repository = "https://github.com/mgeisler/lipsum/" readme = "README.md" keywords = ["random", "text", "markov", "typography"] categories = ["text-processing"] license = "MIT" edition = "2021" rust-version = "1.56" [dependencies] rand = {version = "0.8.5", default-features = false, features = ["alloc"]} rand_chacha = "0.3.1" [dev-dependencies] version-sync = "0.9.4" rand = "0.8.5" lipsum-0.9.1/LICENSE000064400000000000000000000020571046102023000121550ustar 00000000000000MIT License Copyright (c) 2017 Martin Geisler Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. lipsum-0.9.1/README.md000064400000000000000000000137661046102023000124400ustar 00000000000000# Lorem Ipsum [![](https://github.com/mgeisler/textwrap/workflows/build/badge.svg)][build-status] [![](https://codecov.io/gh/mgeisler/lipsum/branch/master/graph/badge.svg)][codecov] [![](https://img.shields.io/crates/v/lipsum.svg)][crates-io] [![](https://docs.rs/lipsum/badge.svg)][api-docs] Lipsum is a small Rust library for generating pseudo-Latin [lorem ipsum filler text][lorem ipsum]. This is a standard placeholder text used in publishing. It starts with: > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do > eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim > ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut > aliquip ex ea commodo consequat… The text is generated using a [Markov chain] that has been trained on the first book in Cicero's work _De finibus bonorum et malorum_ (_On the ends of good and evil_), of which the lorem ipsum text is a scrambled subset. ## Usage Add this to your `Cargo.toml`: ```toml [dependencies] lipsum = "0.9" ``` ## Documentation Please see the **[API documentation][api-docs]**. ## Getting Started Use the `lipsum` function to generate lorem ipsum text: ```rust use lipsum::lipsum; fn main() { // Print 25 random words of lorem ipsum text. println!("{}", lipsum(25)); } ``` This generates the lorem ipsum text show above: > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do > eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim > ad minim veniam, quis nostrud exercitation ullamco… The text becomes random after 18 words, so you might not see exactly the same text. Use `lipsum_title` instead if you just need a short text suitable for a document title or a section heading. The text generated by that function looks like this: > Refugiendi et Omnino Rerum Small words are kept uncapitalized and punctuation is stripped from all words. ## Release History This is a changelog with the most important changes in each release. ### Version 0.9.1 (2024-03-13) * [#100](https://github.com/mgeisler/lipsum/pull/100): Add `lipsum_title_with_rng` function. * [#102](https://github.com/mgeisler/lipsum/pull/102): Document MSRV in `Cargo.toml`. * [#103](https://github.com/mgeisler/lipsum/pull/103): Enable dependabot updates. ### Version 0.9.0 (2023-03-28) * [#90](https://github.com/mgeisler/lipsum/pull/90): Test minimum supported Rust version (Rust 1.56) in CI * [#91](https://github.com/mgeisler/lipsum/pull/91): Remove dependency on system randomness ### Version 0.8.2 (2022-06-06) * [#84](https://github.com/mgeisler/lipsum/pull/84): Fix build error on Rust 1.56. Thanks @WorldSEnder for the report. ### Version 0.8.1 (2022-04-19) * [#73](https://github.com/mgeisler/lipsum/pull/73): Add `lipsum_from_seed` and tweak capitalization. Thanks @reknih! * [#77](https://github.com/mgeisler/lipsum/pull/77): Update to Rust 2021 edition. ### Version 0.8.0 (2021-05-30) The random number generator has been separated from the `MarkovChain` implementation to allow using the same trained model to generate multiple outputs with different seeds. Thanks @Diggsey! ### Version 0.7.0 (2020-07-08) - The code has been updated to the [Rust 2018 edition][rust-2018]. - Each new release will only support the latest stable version of Rust. Trying to support older Rust versions has proven to be a fool's errand: our dependencies keep releasing new patch versions that require newer and newer versions of Rust. - [#65](https://github.com/mgeisler/lipsum/pull/65): A new `lipsum_words_from_seed` function was added. It generates random but deterministic lorem ipsum text. This is useful in unit tests when you need fixed inputs. ### Version 0.6.0 (2018-12-09) The new `lipsum_words` function can be used to generate random lorem ipsum text that doesn't always start with "Lorem ipsum". Dependencies were updated and the oldest supported version of Rust is now 1.22. ### Version 0.5.0 (2018-04-22) The new `lipsum_title` function can be used to generate a short string suitable for a document title or a section heading. Dependencies were updated and the oldest supported version of Rust is now 1.17. ### Version 0.4.0 (2017-09-24) The `generate` and `generate_from` now always generate proper sentences, meaning that they generate sentences that start with a capital letter and end with `.` or some other punctuation character. Use `iter` and `iter_from` directly if you need more control. ### Version 0.3.0 (2017-07-28) Performance is improved by about 50% when generating text, but training the Markov chain now takes about twice as long as before. The `MarkovChain` struct has many new methods: - `new_with_rng` makes it possible to specify the random number generator used by the Markov chain. Use this to get deterministic and thus reproducible output for tests. `MarkovChain` now owns the RNG it uses and as a consequence, it has an extra type parameter. This is a breaking change if you used struct directly in your code. - `iter` and `into_from` return iterators over words in the Markov chain. The `generate` and `generate_from` methods are now straight-forward convenience wrappers for the iterators. - `len` tells you the number of stats in the Markov chain and `is_empty` tells you if the Markov chain is empty, meaning that it hasn't been trained on anything yet. ### Version 0.2.0 (2017-07-10) Rust version 1.6.0 is now supported. This is checked with TravisCI. ### Version 0.1.0 (2017-07-2) First public release. ## License Lipsum can be distributed according to the [MIT license][mit]. Contributions will be accepted under the same license. [build-status]: https://github.com/mgeisler/lipsum/actions?query=workflow%3Abuild+branch%3Amaster [codecov]: https://codecov.io/gh/mgeisler/lipsum [crates-io]: https://crates.io/crates/lipsum [api-docs]: https://docs.rs/lipsum/ [lorem ipsum]: https://en.wikipedia.org/wiki/Lorem_ipsum [markov chain]: https://en.wikipedia.org/wiki/Markov_chain [rust-2018]: https://doc.rust-lang.org/edition-guide/rust-2018/ [mit]: LICENSE lipsum-0.9.1/benches/generate.rs000064400000000000000000000003651046102023000147170ustar 00000000000000#![feature(test)] extern crate test; use test::Bencher; #[bench] fn generate_lorem_ipsum_100(b: &mut Bencher) { b.iter(|| lipsum::lipsum(100)) } #[bench] fn generate_lorem_ipsum_200(b: &mut Bencher) { b.iter(|| lipsum::lipsum(200)) } lipsum-0.9.1/benches/learn.rs000064400000000000000000000006131046102023000142220ustar 00000000000000#![feature(test)] extern crate test; use test::Bencher; #[bench] fn learn_lorem_ipsum(b: &mut Bencher) { b.iter(|| { let mut chain = lipsum::MarkovChain::new(); chain.learn(lipsum::LOREM_IPSUM) }) } #[bench] fn learn_liber_primus(b: &mut Bencher) { b.iter(|| { let mut chain = lipsum::MarkovChain::new(); chain.learn(lipsum::LIBER_PRIMUS) }) } lipsum-0.9.1/examples/lipsum.rs000064400000000000000000000007561046102023000146510ustar 00000000000000fn main() { // Generate lorem ipsum text with Title Case. let title = lipsum::lipsum_title(); // Print underlined title and lorem ipsum text. println!("{}\n{}\n", title, str::repeat("=", title.len())); // First command line argument or "" if not supplied. let arg = std::env::args().nth(1).unwrap_or_default(); // Number of words to generate. let n = arg.parse().unwrap_or(25); // Print n words of lorem ipsum text. println!("{}", lipsum::lipsum(n)); } lipsum-0.9.1/src/lib.rs000064400000000000000000000565321046102023000130620ustar 00000000000000//! Lorem ipsum generator. //! //! This crate generates pseudo-Latin [lorem ipsum placeholder //! text][wiki]. The traditional lorem ipsum text start like this: //! //! > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do //! > eiusmod tempor incididunt ut labore et dolore magna aliqua. //! //! This text is in the [`LOREM_IPSUM`] constant. Random looking text //! like the above can be generated using the [`lipsum`] function. The //! function allows you to generate as much text as desired and each //! invocation will generate different text. //! //! The random looking text is generated using a [Markov chain] of //! order two, which simply means that the next word is based on the //! previous two words in the input texts. The Markov chain can be //! used with other input texts by creating an instance of //! [`MarkovChain`] and calling its [`learn`] method. //! //! [wiki]: https://en.wikipedia.org/wiki/Lorem_ipsum //! [`lipsum`]: fn.lipsum.html //! [`MarkovChain`]: struct.MarkovChain.html //! [`learn`]: struct.MarkovChain.html#method.learn //! [Markov chain]: https://en.wikipedia.org/wiki/Markov_chain #![doc(html_root_url = "https://docs.rs/lipsum/0.9.1")] #![forbid(unsafe_code)] #![deny(missing_docs)] use rand::seq::SliceRandom; use rand::{Rng, SeedableRng}; use rand_chacha::ChaCha20Rng; use std::collections::HashMap; /// A bigram is simply two consecutive words. pub type Bigram<'a> = (&'a str, &'a str); /// Simple order two Markov chain implementation. /// /// The [Markov chain] is a chain of order two, which means that it /// will use the previous two words (a bigram) when predicting the /// next word. This is normally enough to generate random text that /// looks somewhat plausible. The implementation is based on /// [Generating arbitrary text with Markov chains in Rust][blog post]. /// /// [Markov chain]: https://en.wikipedia.org/wiki/Markov_chain /// [blog post]: https://blakewilliams.me/posts/generating-arbitrary-text-with-markov-chains-in-rust #[derive(Debug, Clone, Default)] pub struct MarkovChain<'a> { map: HashMap, Vec<&'a str>>, keys: Vec>, } impl<'a> MarkovChain<'a> { /// Create a new empty Markov chain. /// /// # Examples /// /// ``` /// # fn main() { /// use lipsum::MarkovChain; /// use rand::SeedableRng; /// use rand_chacha::ChaCha20Rng; /// /// let mut chain = MarkovChain::new(); /// chain.learn("infra-red red orange yellow green blue indigo x-ray"); /// /// let mut rng = ChaCha20Rng::seed_from_u64(0); /// /// // The chain jumps consistently like this: /// assert_eq!(chain.generate_with_rng(&mut rng, 1), "Orange."); /// assert_eq!(chain.generate_with_rng(&mut rng, 1), "Infra-red."); /// assert_eq!(chain.generate_with_rng(&mut rng, 1), "Yellow."); /// # } /// ``` pub fn new() -> MarkovChain<'a> { Default::default() } /// Add new text to the Markov chain. This can be called several /// times to build up the chain. /// /// # Examples /// /// ``` /// use lipsum::MarkovChain; /// /// let mut chain = MarkovChain::new(); /// chain.learn("red green blue"); /// assert_eq!(chain.words(("red", "green")), Some(&vec!["blue"])); /// /// chain.learn("red green yellow"); /// assert_eq!(chain.words(("red", "green")), Some(&vec!["blue", "yellow"])); /// ``` pub fn learn(&mut self, sentence: &'a str) { let words = sentence.split_whitespace().collect::>(); for window in words.windows(3) { let (a, b, c) = (window[0], window[1], window[2]); self.map.entry((a, b)).or_default().push(c); } // Sync the keys with the current map. self.keys = self.map.keys().cloned().collect(); self.keys.sort_unstable(); } /// Returs the number of states in the Markov chain. /// /// # Examples /// /// ``` /// use lipsum::MarkovChain; /// /// let mut chain = MarkovChain::new(); /// assert_eq!(chain.len(), 0); /// /// chain.learn("red orange yellow green blue indigo"); /// assert_eq!(chain.len(), 4); /// ``` #[inline] pub fn len(&self) -> usize { self.map.len() } /// Returns `true` if the Markov chain has no states. /// /// # Examples /// /// ``` /// use lipsum::MarkovChain; /// /// let mut chain = MarkovChain::new(); /// assert!(chain.is_empty()); /// /// chain.learn("foo bar baz"); /// assert!(!chain.is_empty()); /// ``` pub fn is_empty(&self) -> bool { self.len() == 0 } /// Get the possible words following the given bigram, or `None` /// if the state is invalid. /// /// # Examples /// /// ``` /// use lipsum::MarkovChain; /// /// let mut chain = MarkovChain::new(); /// chain.learn("red green blue"); /// assert_eq!(chain.words(("red", "green")), Some(&vec!["blue"])); /// assert_eq!(chain.words(("foo", "bar")), None); /// ``` pub fn words(&self, state: Bigram<'a>) -> Option<&Vec<&str>> { self.map.get(&state) } /// Generate a sentence with `n` words of lorem ipsum text. The /// sentence will start from a random point in the Markov chain /// generated using the specified random number generator, /// and a `.` will be added as necessary to form a full sentence. /// /// See [`generate_with_rng_from`] if you want to control the /// starting point for the generated text and see [`iter_with_rng`] /// if you simply want a sequence of words. /// /// # Examples /// /// Generating the sounds of a grandfather clock: /// /// ``` /// use lipsum::MarkovChain; /// use rand_chacha::ChaCha20Rng; /// use rand::SeedableRng; /// /// let mut chain = MarkovChain::new(); /// chain.learn("Tick, Tock, Tick, Tock, Ding! Tick, Tock, Ding! Ding!"); /// println!("{}", chain.generate_with_rng(ChaCha20Rng::seed_from_u64(0), 15)); /// ``` /// /// The output looks like this: /// /// > Ding! Tick, Tock, Tick, Tock, Ding! Ding! Tock, Ding! Tick, /// > Tock, Tick, Tock, Tick, Tock. /// /// [`generate_with_rng_from`]: struct.MarkovChain.html#method.generate_with_rng_from /// [`iter_with_rng`]: struct.MarkovChain.html#method.iter_with_rng pub fn generate_with_rng(&self, rng: R, n: usize) -> String { join_words(self.iter_with_rng(rng).take(n)) } /// Generate a sentence with `n` words of lorem ipsum text. The sentence /// will start from a predetermined point in the Markov chain generated /// using the default random number generator and a `.` will be added as /// necessary to form a full sentence. /// /// See [`generate_from`] if you want to control the starting point for the /// generated text and see [`iter`] if you simply want a sequence of words. /// /// # Examples /// /// Generating the sounds of a grandfather clock: /// /// ``` /// use lipsum::MarkovChain; /// /// let mut chain = MarkovChain::new(); /// chain.learn("Tick, Tock, Tick, Tock, Ding! Tick, Tock, Ding! Ding!"); /// println!("{}", chain.generate(15)); /// ``` /// /// The output looks like this: /// /// > Ding! Tick, Tock, Tick, Tock, Ding! Ding! Tock, Ding! Tick, /// > Tock, Tick, Tock, Tick, Tock. /// /// [`generate_from`]: struct.MarkovChain.html#method.generate_from /// [`iter`]: struct.MarkovChain.html#method.iter pub fn generate(&self, n: usize) -> String { self.generate_with_rng(default_rng(), n) } /// Generate a sentence with `n` words of lorem ipsum text. The /// sentence will start from the given bigram and a `.` will be /// added as necessary to form a full sentence. /// /// Use [`generate_with_rng`] if the starting point is not important. See /// [`iter_with_rng_from`] if you want a sequence of words that you can /// format yourself. /// /// [`generate_with_rng`]: struct.MarkovChain.html#method.generate_with_rng /// [`iter_with_rng_from`]: struct.MarkovChain.html#method.iter_with_rng_from pub fn generate_with_rng_from(&self, rng: R, n: usize, from: Bigram<'a>) -> String { join_words(self.iter_with_rng_from(rng, from).take(n)) } /// Generate a sentence with `n` words of lorem ipsum text. The /// sentence will start from the given bigram and a `.` will be /// added as necessary to form a full sentence. /// /// Use [`generate`] if the starting point is not important. See /// [`iter_from`] if you want a sequence of words that you can /// format yourself. /// /// [`generate`]: struct.MarkovChain.html#method.generate /// [`iter_from`]: struct.MarkovChain.html#method.iter_from pub fn generate_from(&self, n: usize, from: Bigram<'a>) -> String { self.generate_with_rng_from(default_rng(), n, from) } /// Make a never-ending iterator over the words in the Markov /// chain. The iterator starts at a random point in the chain. pub fn iter_with_rng(&self, mut rng: R) -> Words<'_, R> { let initial_bigram = if self.is_empty() { ("", "") } else { *self.keys.choose(&mut rng).unwrap() }; self.iter_with_rng_from(rng, initial_bigram) } /// Make a never-ending iterator over the words in the Markov chain. The /// iterator starts at a predetermined point in the chain. pub fn iter(&self) -> Words<'_, impl Rng> { self.iter_with_rng(default_rng()) } /// Make a never-ending iterator over the words in the Markov /// chain. The iterator starts at the given bigram. pub fn iter_with_rng_from(&self, rng: R, from: Bigram<'a>) -> Words<'_, R> { Words { map: &self.map, rng, keys: &self.keys, state: from, } } /// Make a never-ending iterator over the words in the Markov /// chain. The iterator starts at the given bigram. pub fn iter_from(&self, from: Bigram<'a>) -> Words<'_, impl Rng> { self.iter_with_rng_from(default_rng(), from) } } /// Provide a default random number generator. This generator is seeded and will /// always produce the same sequence of numbers. The seed is chosen to yield /// good results for the included Markov chain. fn default_rng() -> impl Rng { ChaCha20Rng::seed_from_u64(97) } /// Never-ending iterator over words in the Markov chain. /// /// Generated with the [`iter`] or [`iter_from`] methods. /// /// [`iter`]: struct.MarkovChain.html#method.iter /// [`iter_from`]: struct.MarkovChain.html#method.iter_from pub struct Words<'a, R: Rng> { map: &'a HashMap, Vec<&'a str>>, rng: R, keys: &'a Vec>, state: Bigram<'a>, } impl<'a, R: Rng> Iterator for Words<'a, R> { type Item = &'a str; fn next(&mut self) -> Option<&'a str> { if self.map.is_empty() { return None; } let result = Some(self.state.0); while !self.map.contains_key(&self.state) { self.state = *self.keys.choose(&mut self.rng).unwrap(); } let next_words = &self.map[&self.state]; let next = next_words.choose(&mut self.rng).unwrap(); self.state = (self.state.1, next); result } } /// Check if `c` is an ASCII punctuation character. fn is_ascii_punctuation(c: char) -> bool { c.is_ascii_punctuation() } /// Capitalize the first character in a string. fn capitalize(word: &str) -> String { let idx = match word.chars().next() { Some(c) => c.len_utf8(), None => 0, }; let mut result = String::with_capacity(word.len()); result.push_str(&word[..idx].to_uppercase()); result.push_str(&word[idx..]); result } /// Join words from an iterator. The first word is always capitalized /// and the generated sentence will end with `'.'` if it doesn't /// already end with some other ASCII punctuation character. fn join_words<'a, I: Iterator>(mut words: I) -> String { match words.next() { None => String::new(), Some(word) => { // Punctuation characters which ends a sentence. let punctuation: &[char] = &['.', '!', '?']; let mut sentence = capitalize(word); let mut needs_cap = sentence.ends_with(punctuation); // Add remaining words. for word in words { sentence.push(' '); if needs_cap { sentence.push_str(&capitalize(word)); } else { sentence.push_str(word); } needs_cap = word.ends_with(punctuation); } // Ensure the sentence ends with either one of ".!?". if !sentence.ends_with(punctuation) { // Trim all trailing punctuation characters to avoid // adding '.' after a ',' or similar. let idx = sentence.trim_end_matches(is_ascii_punctuation).len(); sentence.truncate(idx); sentence.push('.'); } sentence } } } /// The traditional lorem ipsum text as given in [Wikipedia]. Using /// this text alone for a Markov chain of order two doesn't work very /// well since each bigram (two consequtive words) is followed by just /// one other word. In other words, the Markov chain will always /// produce the same output and recreate the lorem ipsum text /// precisely. However, combining it with the full text in /// [`LIBER_PRIMUS`] works well. /// /// [Wikipedia]: https://en.wikipedia.org/wiki/Lorem_ipsum /// [`LIBER_PRIMUS`]: constant.LIBER_PRIMUS.html pub const LOREM_IPSUM: &str = include_str!("lorem-ipsum.txt"); /// The first book in Cicero's work De finibus bonorum et malorum ("On /// the ends of good and evil"). The lorem ipsum text in /// [`LOREM_IPSUM`] is derived from part of this text. /// /// [`LOREM_IPSUM`]: constant.LOREM_IPSUM.html pub const LIBER_PRIMUS: &str = include_str!("liber-primus.txt"); thread_local! { // Markov chain generating lorem ipsum text. static LOREM_IPSUM_CHAIN: MarkovChain<'static> = { let mut chain = MarkovChain::new(); // The cost of learning increases as more and more text is // added, so we start with the smallest text. chain.learn(LOREM_IPSUM); chain.learn(LIBER_PRIMUS); chain } } /// Generate `n` words of lorem ipsum text. The output will always start with /// "Lorem ipsum". /// /// The text continues with the standard lorem ipsum text from [`LOREM_IPSUM`] /// and becomes randomly generated but deterministic if more than 18 words is /// requested. See [`lipsum_words`] if fully random text is needed. /// /// # Examples /// /// ``` /// use lipsum::lipsum; /// /// assert_eq!(lipsum(7), "Lorem ipsum dolor sit amet, consectetur adipiscing."); /// ``` /// /// [`LOREM_IPSUM`]: constant.LOREM_IPSUM.html /// [`lipsum_words`]: fn.lipsum_words.html pub fn lipsum(n: usize) -> String { LOREM_IPSUM_CHAIN.with(|chain| chain.generate_from(n, ("Lorem", "ipsum"))) } /// Generate `n` words of lorem ipsum text with a custom RNG. The output will /// always start with "Lorem ipsum". /// /// A custom RNG allows to base the markov chain on a different random number /// sequence. This also allows using a regular [`thread_rng`] random number /// generator. If that generator is used, the text will differ in each /// invocation. /// /// # Examples /// /// ``` /// use lipsum::lipsum_with_rng; /// use rand::thread_rng; /// /// println!("{}", lipsum_with_rng(thread_rng(), 23)); /// // -> "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do /// // eiusmod tempor incididunt ut labore et dolore magnam aliquam /// // quaerat voluptatem. Ut enim." /// ``` /// /// [`thread_rng`]: https://docs.rs/rand/latest/rand/fn.thread_rng.html pub fn lipsum_with_rng(rng: impl Rng, n: usize) -> String { LOREM_IPSUM_CHAIN.with(|chain| chain.generate_with_rng_from(rng, n, ("Lorem", "ipsum"))) } /// Generate `n` words of lorem ipsum text. /// /// The text is deterministically sampled from a Markov chain based on /// [`LOREM_IPSUM`]. Multiple sentences may be generated, depending on the /// punctuation of the words being selected. /// /// # Examples /// /// ``` /// use lipsum::lipsum_words; /// /// assert_eq!(lipsum_words(6), "Ullus investigandi veri, nisi inveneris, et."); /// ``` /// /// [`LOREM_IPSUM`]: constant.LOREM_IPSUM.html pub fn lipsum_words(n: usize) -> String { LOREM_IPSUM_CHAIN.with(|chain| chain.generate(n)) } /// Generate `n` words of lorem ipsum text with a custom RNG. /// /// A custom RNG allows to base the markov chain on a different random number /// sequence. This also allows using a regular [`thread_rng`] random number /// generator. If that generator is used, the text will differ in each /// invocation. /// /// # Examples /// /// ``` /// use lipsum::lipsum_words_with_rng; /// use rand::thread_rng; /// /// println!("{}", lipsum_words_with_rng(thread_rng(), 7)); /// // -> "Quot homines, tot sententiae; falli igitur possumus." /// ``` /// /// [`thread_rng`]: https://docs.rs/rand/latest/rand/fn.thread_rng.html pub fn lipsum_words_with_rng(rng: impl Rng, n: usize) -> String { LOREM_IPSUM_CHAIN.with(|chain| chain.generate_with_rng(rng, n)) } /// Minimum number of words to include in a title. const TITLE_MIN_WORDS: usize = 3; /// Maximum number of words to include in a title. const TITLE_MAX_WORDS: usize = 8; /// Words shorter than this size are not capitalized. const TITLE_SMALL_WORD: usize = 3; /// Generate a short lorem ipsum text with words in title case. /// /// The words are capitalized and stripped for punctuation characters. /// /// # Examples /// /// ``` /// use lipsum::lipsum_title; /// /// println!("{}", lipsum_title()); /// ``` /// /// This will generate a string like /// /// > Grate Meminit et Praesentibus /// /// which should be suitable for use in a document title for section /// heading. pub fn lipsum_title() -> String { lipsum_title_with_rng(default_rng()) } /// Generate a short lorem ipsum text with words in title case with a custom RNG. /// /// A custom RNG allows to base the markov chain on a different random number /// sequence. This also allows using a regular [`thread_rng`] random number /// generator. If that generator is used, the text will differ in each /// invocation. /// /// The words are capitalized and stripped for punctuation characters. /// /// # Examples /// /// ``` /// use lipsum::lipsum_title_with_rng; /// use rand::thread_rng; /// /// println!("{}", lipsum_title_with_rng(thread_rng())); /// ``` /// /// This will generate a string like /// /// > Grate Meminit et Praesentibus /// /// which should be suitable for use in a document title for section /// heading. /// /// [`thread_rng`]: https://docs.rs/rand/latest/rand/fn.thread_rng.html pub fn lipsum_title_with_rng(mut rng: impl Rng) -> String { LOREM_IPSUM_CHAIN.with(|chain| { let n = rng.gen_range(TITLE_MIN_WORDS..TITLE_MAX_WORDS); // The average word length with our corpus is 7.6 bytes so // this capacity will avoid most allocations. let mut title = String::with_capacity(8 * n); let words = chain .iter_with_rng(rng) .map(|word| word.trim_matches(is_ascii_punctuation)) .filter(|word| !word.is_empty()) .take(n); for (i, word) in words.enumerate() { if i > 0 { title.push(' '); } // Capitalize the first word and all long words. if i == 0 || word.len() > TITLE_SMALL_WORD { title.push_str(&capitalize(word)); } else { title.push_str(word); } } title }) } #[cfg(test)] mod tests { use super::*; use rand::thread_rng; #[test] fn starts_with_lorem_ipsum() { assert_eq!(&lipsum(10)[..11], "Lorem ipsum"); } #[test] fn generate_zero_words() { assert_eq!(lipsum(0).split_whitespace().count(), 0); } #[test] fn generate_one_word() { assert_eq!(lipsum(1).split_whitespace().count(), 1); } #[test] fn generate_two_words() { assert_eq!(lipsum(2).split_whitespace().count(), 2); } #[test] fn starts_differently() { // Check that calls to lipsum_words don't always start with // "Lorem ipsum". let idx = "Lorem ipsum".len(); assert_ne!( &lipsum_words_with_rng(thread_rng(), 5)[..idx], &lipsum_words_with_rng(thread_rng(), 5)[..idx] ); } #[test] fn generate_title() { for word in lipsum_title().split_whitespace() { assert!( !word.starts_with(is_ascii_punctuation) && !word.ends_with(is_ascii_punctuation), "Unexpected punctuation: {:?}", word ); if word.len() > TITLE_SMALL_WORD { assert!( word.starts_with(char::is_uppercase), "Expected small word to be capitalized: {:?}", word ); } } } #[test] fn capitalize_after_punctiation() { // The Markov Chain will yield a "habitut." as the second word. However, // the following "voluptatem" is not capitalized, which does not make // much sense, given that it appears after a full stop. The `join_words` // must ensure that every word appearing after sentence-ending // punctuation is capitalized. assert_eq!( lipsum_words_with_rng(ChaCha20Rng::seed_from_u64(5), 9), "Nullam habuit. Voluptatem cum summum bonum in voluptate est." ); } #[test] fn empty_chain() { let chain = MarkovChain::new(); assert_eq!(chain.generate(10), ""); } #[test] fn generate_from() { let mut chain = MarkovChain::new(); chain.learn("red orange yellow green blue indigo violet"); assert_eq!( chain.generate_from(5, ("orange", "yellow")), "Orange yellow green blue indigo." ); } #[test] fn generate_last_bigram() { // The bigram "yyy zzz" will not be present in the Markov // chain's map, and so we will not generate "xxx yyy zzz" as // one would expect. The chain moves from state "xxx yyy" to // "yyy zzz", but sees that as invalid state and resets itself // back to "xxx yyy". let mut chain = MarkovChain::new(); chain.learn("xxx yyy zzz"); assert_ne!(chain.generate_from(3, ("xxx", "yyy")), "xxx yyy zzz"); } #[test] fn generate_from_no_panic() { // No panic when asked to generate a chain from a starting // point that doesn't exist in the chain. let mut chain = MarkovChain::new(); chain.learn("foo bar baz"); chain.generate_from(3, ("xxx", "yyy")); } #[test] fn chain_map() { let mut chain = MarkovChain::new(); chain.learn("foo bar baz quuz"); let map = &chain.map; assert_eq!(map.len(), 2); assert_eq!(map[&("foo", "bar")], vec!["baz"]); assert_eq!(map[&("bar", "baz")], vec!["quuz"]); } #[test] fn new_with_rng() { let rng = ChaCha20Rng::seed_from_u64(1234); let mut chain = MarkovChain::new(); chain.learn("foo bar x y z"); chain.learn("foo bar a b c"); assert_eq!( chain.generate_with_rng(rng, 15), "A b bar a b a b bar a b x y b y x." ); } } lipsum-0.9.1/src/liber-primus.txt000064400000000000000000001376541046102023000151260ustar 00000000000000Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina philosophi Graeco sermone tractavissent, ea Latinis litteris mandaremus, fore ut hic noster labor in varias reprehensiones incurreret. nam quibusdam, et iis quidem non admodum indoctis, totum hoc displicet philosophari. quidam autem non tam id reprehendunt, si remissius agatur, sed tantum studium tamque multam operam ponendam in eo non arbitrantur. erunt etiam, et ii quidem eruditi Graecis litteris, contemnentes Latinas, qui se dicant in Graecis legendis operam malle consumere. postremo aliquos futuros suspicor, qui me ad alias litteras vocent, genus hoc scribendi, etsi sit elegans, personae tamen et dignitatis esse negent. Contra quos omnis dicendum breviter existimo. Quamquam philosophiae quidem vituperatoribus satis responsum est eo libro, quo a nobis philosophia defensa et collaudata est, cum esset accusata et vituperata ab Hortensio. qui liber cum et tibi probatus videretur et iis, quos ego posse iudicare arbitrarer, plura suscepi veritus ne movere hominum studia viderer, retinere non posse. Qui autem, si maxime hoc placeat, moderatius tamen id volunt fieri, difficilem quandam temperantiam postulant in eo, quod semel admissum coerceri reprimique non potest, ut propemodum iustioribus utamur illis, qui omnino avocent a philosophia, quam his, qui rebus infinitis modum constituant in reque eo meliore, quo maior sit, mediocritatem desiderent. Sive enim ad sapientiam perveniri potest, non paranda nobis solum ea, sed fruenda etiam sapientia est; sive hoc difficile est, tamen nec modus est ullus investigandi veri, nisi inveneris, et quaerendi defatigatio turpis est, cum id, quod quaeritur, sit pulcherrimum. etenim si delectamur, cum scribimus, quis est tam invidus, qui ab eo nos abducat? sin laboramus, quis est, qui alienae modum statuat industriae? nam ut Terentianus Chremes non inhumanus, qui novum vicinum non vult 'fodere aut arare aut aliquid ferre denique' -- non enim illum ab industria, sed ab inliberali labore deterret --, sic isti curiosi, quos offendit noster minime nobis iniucundus labor. Iis igitur est difficilius satis facere, qui se Latina scripta dicunt contemnere. in quibus hoc primum est in quo admirer, cur in gravissimis rebus non delectet eos sermo patrius, cum idem fabellas Latinas ad verbum e Graecis expressas non inviti legant. quis enim tam inimicus paene nomini Romano est, qui Ennii Medeam aut Antiopam Pacuvii spernat aut reiciat, quod se isdem Euripidis fabulis delectari dicat, Latinas litteras oderit? Synephebos ego, inquit, potius Caecilii aut Andriam Terentii quam utramque Menandri legam? A quibus tantum dissentio, ut, cum Sophocles vel optime scripserit Electram, tamen male conversam Atilii mihi legendam putem, de quo Lucilius: 'ferreum scriptorem', verum, opinor, scriptorem tamen, ut legendus sit. rudem enim esse omnino in nostris poetis aut inertissimae segnitiae est aut fastidii delicatissimi. mihi quidem nulli satis eruditi videntur, quibus nostra ignota sunt. an 'Utinam ne in nemore . . .' nihilo minus legimus quam hoc idem Graecum, quae autem de bene beateque vivendo a Platone disputata sunt, haec explicari non placebit Latine? Quid? si nos non interpretum fungimur munere, sed tuemur ea, quae dicta sunt ab iis quos probamus, eisque nostrum iudicium et nostrum scribendi ordinem adiungimus, quid habent, cur Graeca anteponant iis, quae et splendide dicta sint neque sint conversa de Graecis? nam si dicent ab illis has res esse tractatas, ne ipsos quidem Graecos est cur tam multos legant, quam legendi sunt. quid enim est a Chrysippo praetermissum in Stoicis? legimus tamen Diogenem, Antipatrum, Mnesarchum, Panaetium, multos alios in primisque familiarem nostrum Posidonium. quid? Theophrastus mediocriterne delectat, cum tractat locos ab Aristotele ante tractatos? quid? Epicurei num desistunt de isdem, de quibus et ab Epicuro scriptum est et ab antiquis, ad arbitrium suum scribere? quodsi Graeci leguntur a Graecis isdem de rebus alia ratione compositis, quid est, cur nostri a nostris non legantur? Quamquam, si plane sic verterem Platonem aut Aristotelem, ut verterunt nostri poetae fabulas, male, credo, mererer de meis civibus, si ad eorum cognitionem divina illa ingenia transferrem. sed id neque feci adhuc nec mihi tamen, ne faciam, interdictum puto. locos quidem quosdam, si videbitur, transferam, et maxime ab iis, quos modo nominavi, cum inciderit, ut id apte fieri possit, ut ab Homero Ennius, Afranius a Menandro solet. Nec vero, ut noster Lucilius, recusabo, quo minus omnes mea legant. utinam esset ille Persius, Scipio vero et Rutilius multo etiam magis, quorum ille iudicium reformidans Tarentinis ait se et Consentinis et Siculis scribere. facete is quidem, sicut alia; sed neque tam docti tum erant, ad quorum iudicium elaboraret, et sunt illius scripta leviora, ut urbanitas summa appareat, doctrina mediocris. Ego autem quem timeam lectorem, cum ad te ne Graecis quidem cedentem in philosophia audeam scribere? quamquam a te ipso id quidem facio provocatus gratissimo mihi libro, quem ad me de virtute misisti. Sed ex eo credo quibusdam usu venire; ut abhorreant a Latinis, quod inciderint in inculta quaedam et horrida, de malis Graecis Latine scripta deterius. quibus ego assentior, dum modo de isdem rebus ne Graecos quidem legendos putent. res vero bonas verbis electis graviter ornateque dictas quis non legat? nisi qui se plane Graecum dici velit, ut a Scaevola est praetore salutatus Athenis Albucius. Quem quidem locum comit multa venustate et omni sale idem Lucilius, apud quem praeclare Scaevola: Graecum te, Albuci, quam Romanum atque Sabinum, municipem Ponti, Tritani, centurionum, praeclarorum hominum ac primorum signiferumque, maluisti dici. Graece ergo praetor Athenis, id quod maluisti, te, cum ad me accedis, saluto: 'chaere,' inquam, 'Tite!' lictores, turma omnis chorusque: 'chaere, Tite!' hinc hostis mi Albucius, hinc inimicus. Sed iure Mucius. ego autem mirari satis non queo unde hoc sit tam insolens domesticarum rerum fastidium. non est omnino hic docendi locus; sed ita sentio et saepe disserui, Latinam linguam non modo non inopem, ut vulgo putarent, sed locupletiorem etiam esse quam Graecam. quando enim nobis, vel dicam aut oratoribus bonis aut poetis, postea quidem quam fuit quem imitarentur, ullus orationis vel copiosae vel elegantis ornatus defuit? Ego vero, quoniam forensibus operis, laboribus, periculis non deseruisse mihi videor praesidium, in quo a populo Romano locatus sum, debeo profecto, quantumcumque possum, in eo quoque elaborare, ut sint opera, studio, labore meo doctiores cives mei, nec cum istis tantopere pugnare, qui Graeca legere malint, modo legant illa ipsa, ne simulent, et iis servire, qui vel utrisque litteris uti velint vel, si suas habent, illas non magnopere desiderent. Qui autem alia malunt scribi a nobis, aequi esse debent, quod et scripta multa sunt, sic ut plura nemini e nostris, et scribentur fortasse plura, si vita suppetet; et tamen, qui diligenter haec, quae de philosophia litteris mandamus, legere assueverit, iudicabit nulla ad legendum his esse potiora. quid est enim in vita tantopere quaerendum quam cum omnia in philosophia, tum id, quod his libris quaeritur, qui sit finis, quid extremum, quid ultimum, quo sint omnia bene vivendi recteque faciendi consilia referenda, quid sequatur natura ut summum ex rebus expetendis, quid fugiat ut extremum malorum? qua de re cum sit inter doctissimos summa dissensio, quis alienum putet eius esse dignitatis, quam mihi quisque tribuat, quid in omni munere vitae optimum et verissimum sit, exquirere? An, partus ancillae sitne in fructu habendus, disseretur inter principes civitatis, P. Scaevolam M'.que Manilium, ab iisque M. Brutus dissentiet -- quod et acutum genus est et ad usus civium non inutile, nosque ea scripta reliquaque eiusdem generis et legimus libenter et legemus --, haec, quae vitam omnem continent, neglegentur? nam, ut sint illa vendibiliora, haec uberiora certe sunt. quamquam id quidem licebit iis existimare, qui legerint. nos autem hanc omnem quaestionem de finibus bonorum et malorum fere a nobis explicatam esse his litteris arbitramur, in quibus, quantum potuimus, non modo quid nobis probaretur, sed etiam quid a singulis philosophiae disciplinis diceretur, persecuti sumus. Ut autem a facillimis ordiamur, prima veniat in medium Epicuri ratio, quae plerisque notissima est. quam a nobis sic intelleges eitam, ut ab ipsis, qui eam disciplinam probant, non soleat accuratius explicari; verum enim invenire volumus, non tamquam adversarium aliquem convincere. accurate autem quondam a L. Torquato, homine omni doctrina erudito, defensa est Epicuri sententia de voluptate, a meque ei responsum, cum C. Triarius, in primis gravis et doctus adolescens, ei disputationi interesset. Nam cum ad me in Cumanum salutandi causa uterque venisset, pauca primo inter nos de litteris, quarum summum erat in utroque studium, deinde Torquatus: Quoniam nacti te, inquit, sumus aliquando otiosum, certe audiam, quid sit, quod Epicurum nostrum non tu quidem oderis, ut fere faciunt, qui ab eo dissentiunt, sed certe non probes, eum quem ego arbitror unum vidisse verum maximisque erroribus animos hominum liberavisse et omnia tradidisse, quae pertinerent ad bene beateque vivendum. sed existimo te, sicut nostrum Triarium, minus ab eo delectari, quod ista Platonis, Aristoteli, Theophrasti orationis ornamenta neglexerit. nam illud quidem adduci vix possum, ut ea, quae senserit ille, tibi non vera videantur. Vide, quantum, inquam, fallare, Torquate. oratio me istius philosophi non offendit; nam et complectitur verbis, quod vult, et dicit plane, quod intellegam; et tamen ego a philosopho, si afferat eloquentiam, non asperner, si non habeat, non admodum flagitem. re mihi non aeque satisfacit, et quidem locis pluribus. sed quot homines, tot sententiae; falli igitur possumus. Quam ob rem tandem, inquit, non satisfacit? te enim iudicem aequum puto, modo quae dicat ille bene noris. Nisi mihi Phaedrum, inquam, tu mentitum aut Zenonem putas, quorum utrumque audivi, cum mihi nihil sane praeter sedulitatem probarent, omnes mihi Epicuri sententiae satis notae sunt. atque eos, quos nominavi, cum Attico nostro frequenter audivi, cum miraretur ille quidem utrumque, Phaedrum autem etiam amaret, cotidieque inter nos ea, quae audiebamus, conferebamus, neque erat umquam controversia, quid ego intellegerem, sed quid probarem. Quid igitur est? inquit; audire enim cupio, quid non probes. Principio, inquam, in physicis, quibus maxime gloriatur, primum totus est alienus. Democritea dicit perpauca mutans, sed ita, ut ea, quae corrigere vult, mihi quidem depravare videatur. ille atomos quas appellat, id est corpora individua propter soliditatem, censet in infinito inani, in quo nihil nec summum nec infimum nec medium nec ultimum nec extremum sit, ita ferri, ut concursionibus inter se cohaerescant, ex quo efficiantur ea, quae sint quaeque cernantur, omnia, eumque motum atomorum nullo a principio, sed ex aeterno tempore intellegi convenire. Epicurus autem, in quibus sequitur Democritum, non fere labitur. quamquam utriusque cum multa non probo, tum illud in primis, quod, cum in rerum natura duo quaerenda sint, unum, quae materia sit, ex qua quaeque res efficiatur, alterum, quae vis sit, quae quidque efficiat, de materia disseruerunt, vim et causam efficiendi reliquerunt. sed hoc commune vitium, illae Epicuri propriae ruinae: censet enim eadem illa individua et solida corpora ferri deorsum suo pondere ad lineam, hunc naturalem esse omnium corporum motum. Deinde ibidem homo acutus, cum illud ocurreret, si omnia deorsus e regione ferrentur et, ut dixi, ad lineam, numquam fore ut atomus altera alteram posset attingere itaque ** attulit rem commenticiam: declinare dixit atomum perpaulum, quo nihil posset fieri minus; ita effici complexiones et copulationes et adhaesiones atomorum inter se, ex quo efficeretur mundus omnesque partes mundi, quaeque in eo essent. Quae cum tota res (est) ficta pueriliter, tum ne efficit quidem, quod vult. nam et ipsa declinatio ad libidinem fingitur -- ait enim declinare atomum sine causa; quo nihil turpius physico, quam fieri quicquam sine causa dicere, -- et illum motum naturalem omnium ponderum, ut ipse constituit, e regione inferiorem locum petentium sine causa eripuit atomis nec tamen id, cuius causa haec finxerat, assecutus est. Nam si omnes atomi declinabunt, nullae umquam cohaerescent, sive aliae declinabunt, aliae suo nutu recte ferentur, primum erit hoc quasi, provincias atomis dare, quae recte, quae oblique ferantur, deinde eadem illa atomorum, in quo etiam Democritus haeret, turbulenta concursio hunc mundi ornatum efficere non poterit. ne illud quidem physici, credere aliquid esse minimum, quod profecto numquam putavisset, si a Polyaeno, familiari suo, geometrica discere maluisset quam illum etiam ipsum dedocere. Sol Democrito magnus videtur, quippe homini erudito in geometriaque perfecto, huic pedalis fortasse; tantum enim esse censet, quantus videtur, vel paulo aut maiorem aut minorem. Ita, quae mutat, ea corrumpit, quae sequitur sunt tota Democriti, atomi, inane, imagines, quae eidola nominant, quorum incursione non solum videamus, sed etiam cogitemus; infinitio ipsa, quam apeirian vocant, tota ab illo est, tum innumerabiles mundi, qui et oriantur et intereant cotidie. Quae etsi mihi nullo modo probantur, tamen Democritum laudatum a ceteris ab hoc, qui eum unum secutus esset, nollem vituperatum. Iam in altera philosophiae parte. quae est quaerendi ac disserendi, quae logikh dicitur, iste vester plane, ut mihi quidem videtur, inermis ac nudus est. tollit definitiones, nihil de dividendo ac partiendo docet, non quo modo efficiatur concludaturque ratio tradit, non qua via captiosa solvantur ambigua distinguantur ostendit; iudicia rerum in sensibus ponit, quibus si semel aliquid falsi pro vero probatum sit, sublatum esse omne iudicium veri et falsi putat. Confirmat autem illud vel maxime, quod ipsa natura, ut ait ille, sciscat et probet, id est voluptatem et dolorem. ad haec et quae sequamur et quae fugiamus refert omnia. quod quamquam Aristippi est a Cyrenaicisque melius liberiusque defenditur, tamen eius modi esse iudico, ut nihil homine videatur indignius. ad maiora enim quaedam nos natura genuit et conformavit, ut mihi quidem videtur. ac fieri potest, ut errem, sed ita prorsus existimo, neque eum Torquatum, qui hoc primus cognomen invenerit, aut torquem illum hosti detraxisse, ut aliquam ex eo perciperet corpore voluptatem, aut cum Latinis tertio consulatu conflixisse apud Veserim propter voluptatem; quod vero securi percussit filium, privavisse se etiam videtur multis voluptatibus, cum ipsi naturae patrioque amori praetulerit ius maiestatis atque imperii. quid? T. Torquatus, is qui consul cum Cn. Octavio fuit, cum illam severitatem in eo filio adhibuit, quem in adoptionem D. Silano emancipaverat, ut eum Macedonum legatis accusantibus, quod pecunias praetorem in provincia cepisse arguerent, causam apud se dicere iuberet reque ex utraque parte audita pronuntiaret eum non talem videri fuisse in imperio, quales eius maiores fuissent, et in conspectum suum venire vetuit, numquid tibi videtur de voluptatibus suis cogitavisse? Sed ut omittam pericula, labores, dolorem etiam, quem optimus quisque pro patria et pro suis suscipit, ut non modo nullam captet, sed etiam praetereat omnes voluptates, dolores denique quosvis suscipere malit quam deserere ullam officii partem, ad ea, quae hoc non minus declarant, sed videntur leviora, veniamus. Quid tibi, Torquate, quid huic Triario litterae, quid historiae cognitioque rerum, quid poetarum evolutio, quid tanta tot versuum memoria voluptatis affert? nec mihi illud dixeris: 'Haec enim ipsa mihi sunt voluptati, et erant illa Torquatis.' Numquam hoc ita defendit Epicurus neque Metrodorus aut quisquam eorum, qui aut saperet aliquid aut ista didicisset. et quod quaeritur saepe, cur tam multi sint Epicurei, sunt aliae quoque causae, sed multitudinem haec maxime allicit, quod ita putant dici ab illo, recta et honesta quae sint, ea facere ipsa per se laetitiam, id est voluptatem. homines optimi non intellegunt totam rationem everti, si ita res se habeat. nam si concederetur, etiamsi ad corpus nihil referatur, ista sua sponte et per se esse iucunda, per se esset et virtus et cognitio rerum, quod minime ille vult expetenda. Haec igitur Epicuri non probo, inquam. De cetero vellem equidem aut ipse doctrinis fuisset instructior -- est enim, quod tibi ita videri necesse est, non satis politus iis artibus, quas qui tenent, eruditi appellantur -- aut ne deterruisset alios a studiis. quamquam te quidem video minime esse deterritum. Quae cum dixissem, magis ut illum provocarem quam ut ipse loquerer, tum Triarius leniter arridens: Tu quidem, inquit, totum Epicurum paene e philosophorum choro sustulisti. Quid ei reliquisti, nisi te, quoquo modo loqueretur, intellegere, quid diceret? Aliena dixit in physicis nec ea ipsa, quae tibi probarentur; si qua in iis corrigere voluit, deteriora fecit. disserendi artem nullam habuit. voluptatem cum summum bonum diceret, primum in eo ipso parum vidit, deinde hoc quoque alienum; nam ante Aristippus, et ille melius. addidisti ad extremum etiam indoctum fuisse. Fieri, inquam, Triari, nullo pacto potest, ut non dicas, quid non probes eius, a quo dissentias. quid enim me prohiberet Epicureum esse, si probarem, quae ille diceret? cum praesertim illa perdiscere ludus esset. Quam ob rem dissentientium inter se reprehensiones non sunt vituperandae, maledicta, contumeliae, tum iracundiae, contentiones concertationesque in disputando pertinaces indignae philosophia mihi videri solent. Tum Torquatus: Prorsus, inquit, assentior; neque enim disputari sine reprehensione nec cum iracundia aut pertinacia recte disputari potest. sed ad haec, nisi molestum est, habeo quae velim. An me, inquam, nisi te audire vellem, censes haec dicturum fuisse? Utrum igitur percurri omnem Epicuri disciplinam placet an de una voluptate quaeri, de qua omne certamen est? Tuo vero id quidem, inquam, arbitratu. Sic faciam igitur, inquit: unam rem explicabo, eamque maximam, de physicis alias, et quidem tibi et declinationem istam atomorum et magnitudinem solis probabo et Democriti errata ab Epicuro reprehensa et correcta permulta. nunc dicam de voluptate, nihil scilicet novi, ea tamen, quae te ipsum probaturum esse confidam. Certe, inquam, pertinax non ero tibique, si mihi probabis ea, quae dices, libenter assentiar. Probabo, inquit, modo ista sis aequitate, quam ostendis. sed uti oratione perpetua malo quam interrogare aut interrogari. Ut placet, inquam. Tum dicere exorsus est. Primum igitur, inquit, sic agam, ut ipsi auctori huius disciplinae placet: constituam, quid et quale sit id, de quo quaerimus, non quo ignorare vos arbitrer, sed ut ratione et via procedat oratio. quaerimus igitur, quid sit extremum et ultimum bonorum, quod omnium philosophorum sententia tale debet esse, ut ad id omnia referri oporteat, ipsum autem nusquam. hoc Epicurus in voluptate ponit, quod summum bonum esse vult, summumque malum dolorem, idque instituit docere sic: Omne animal, simul atque natum sit, voluptatem appetere eaque gaudere ut summo bono, dolorem aspernari ut summum malum et, quantum possit, a se repellere, idque facere nondum depravatum ipsa natura incorrupte atque integre iudicante. itaque negat opus esse ratione neque disputatione, quam ob rem voluptas expetenda, fugiendus dolor sit. sentiri haec putat, ut calere ignem, nivem esse albam, dulce mel. quorum nihil oportere exquisitis rationibus confirmare, tantum satis esse admonere. interesse enim inter argumentum conclusionemque rationis et inter mediocrem animadversionem atque admonitionem. altera occulta quaedam et quasi involuta aperiri, altera prompta et aperta iudicari. etenim quoniam detractis de homine sensibus reliqui nihil est, necesse est, quid aut ad naturam aut contra sit, a natura ipsa iudicari. ea quid percipit aut quid iudicat, quo aut petat aut fugiat aliquid, praeter voluptatem et dolorem? Sunt autem quidam e nostris, qui haec subtilius velint tradere et negent satis esse, quid bonum sit aut quid malum, sensu iudicari, sed animo etiam ac ratione intellegi posse et voluptatem ipsam per se esse expetendam et dolorem ipsum per se esse fugiendum. itaque aiunt hanc quasi naturalem atque insitam in animis nostris inesse notionem, ut alterum esse appetendum, alterum aspernandum sentiamus. Alii autem, quibus ego assentior, cum a philosophis compluribus permulta dicantur, cur nec voluptas in bonis sit numeranda nec in malis dolor, non existimant oportere nimium nos causae confidere, sed et argumentandum et accurate disserendum et rationibus conquisitis de voluptate et dolore disputandum putant. Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga. et harum quidem rerum facilis est et expedita distinctio. nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. Hanc ego cum teneam sententiam, quid est cur verear, ne ad eam non possim accommodare Torquatos nostros? quos tu paulo ante cum memoriter, tum etiam erga nos amice et benivole collegisti, nec me tamen laudandis maioribus meis corrupisti nec segniorem ad respondendum reddidisti. quorum facta quem ad modum, quaeso, interpretaris? sicine eos censes aut in armatum hostem impetum fecisse aut in liberos atque in sanguinem suum tam crudelis fuisse, nihil ut de utilitatibus, nihil ut de commodis suis cogitarent? at id ne ferae quidem faciunt, ut ita ruant itaque turbent, ut earum motus et impetus quo pertineant non intellegamus, tu tam egregios viros censes tantas res gessisse sine causa? Quae fuerit causa, mox videro; interea hoc tenebo, si ob aliquam causam ista, quae sine dubio praeclara sunt, fecerint, virtutem iis per se ipsam causam non fuisse. -- Torquem detraxit hosti. -- Et quidem se texit, ne interiret. -- At magnum periculum adiit. -- In oculis quidem exercitus. -- Quid ex eo est consecutus? -- Laudem et caritatem, quae sunt vitae sine metu degendae praesidia firmissima. -- Filium morte multavit. -- Si sine causa, nollem me ab eo ortum, tam inportuno tamque crudeli; sin, ut dolore suo sanciret militaris imperii disciplinam exercitumque in gravissimo bello animadversionis metu contineret, saluti prospexit civium, qua intellegebat contineri suam. atque haec ratio late patet. In quo enim maxime consuevit iactare vestra se oratio, tua praesertim, qui studiose antiqua persequeris, claris et fortibus viris commemorandis eorumque factis non emolumento aliquo, sed ipsius honestatis decore laudandis, id totum evertitur eo delectu rerum, quem modo dixi, constituto, ut aut voluptates omittantur maiorum voluptatum adipiscendarum causa aut dolores suscipiantur maiorum dolorum effugiendorum gratia. Sed de clarorum hominum factis illustribus et gloriosis satis hoc loco dictum sit. erit enim iam de omnium virtutum cursu ad voluptatem proprius disserendi locus. nunc autem explicabo, voluptas ipsa quae qualisque sit, ut tollatur error omnis imperitorum intellegaturque ea, quae voluptaria, delicata, mollis habeatur disciplina, quam gravis, quam continens, quam severa sit. Non enim hanc solam sequimur, quae suavitate aliqua naturam ipsam movet et cum iucunditate quadam percipitur sensibus, sed maximam voluptatem illam habemus, quae percipitur omni dolore detracto, nam quoniam, cum privamur dolore, ipsa liberatione et vacuitate omnis molestiae gaudemus, omne autem id, quo gaudemus, voluptas est, ut omne, quo offendimur, dolor, doloris omnis privatio recte nominata est voluptas. ut enim, cum cibo et potione fames sitisque depulsa est, ipsa detractio molestiae consecutionem affert voluptatis, sic in omni re doloris amotio successionem efficit voluptatis. Itaque non placuit Epicuro medium esse quiddam inter dolorem et voluptatem; illud enim ipsum, quod quibusdam medium videretur, cum omni dolore careret, non modo voluptatem esse, verum etiam summam voluptatem. quisquis enim sentit, quem ad modum sit affectus, eum necesse est aut in voluptate esse aut in dolore. omnis autem privatione doloris putat Epicurus terminari summam voluptatem, ut postea variari voluptas distinguique possit, augeri amplificarique non possit. At etiam Athenis, ut e patre audiebam facete et urbane Stoicos irridente, statua est in Ceramico Chrysippi sedentis porrecta manu, quae manus significet illum in hae esse rogatiuncula delectatum: 'Numquidnam manus tua sic affecta, quem ad modum affecta nunc est, desiderat?' -- Nihil sane. -- 'At, si voluptas esset bonum, desideraret.' -- Ita credo. -- 'Non est igitur voluptas bonum.' Hoc ne statuam quidem dicturam pater aiebat, si loqui posset. conclusum est enim contra Cyrenaicos satis acute, nihil ad Epicurum. nam si ea sola voluptas esset, quae quasi titillaret sensus, ut ita dicam, et ad eos cum suavitate afflueret et illaberetur, nec manus esse contenta posset nec ulla pars vacuitate doloris sine iucundo motu voluptatis. sin autem summa voluptas est, ut Epicuro placet, nihil dolere, primum tibi recte, Chrysippe, concessum est nihil desiderare manum, cum ita esset affecta, secundum non recte, si voluptas esset bonum, fuisse desideraturam. idcirco enim non desideraret, quia, quod dolore caret, id in voluptate est. Extremum autem esse bonorum voluptatem ex hoc facillime perspici potest: Constituamus aliquem magnis, multis, perpetuis fruentem et animo et corpore voluptatibus nullo dolore nec impediente nec inpendente, quem tandem hoc statu praestabiliorem aut magis expetendum possimus dicere? inesse enim necesse est in eo, qui ita sit affectus, et firmitatem animi nec mortem nec dolorem timentis, quod mors sensu careat, dolor in longinquitate levis, in gravitate brevis soleat esse, ut eius magnitudinem celeritas, diuturnitatem allevatio consoletur. Ad ea cum accedit, ut neque divinum numen horreat nec praeteritas voluptates effluere patiatur earumque assidua recordatione laetetur, quid est, quod huc possit, quod melius sit, accedere? Statue contra aliquem confectum tantis animi corporisque doloribus, quanti in hominem maximi cadere possunt, nulla spe proposita fore levius aliquando, nulla praeterea neque praesenti nec expectata voluptate, quid eo miserius dici aut fingi potest? quodsi vita doloribus referta maxime fugienda est, summum profecto malum est vivere cum dolore, cui sententiae consentaneum est ultimum esse bonorum eum voluptate vivere. nec enim habet nostra mens quicquam, ubi consistat tamquam in extremo, omnesque et metus et aegritudines ad dolorem referuntur, nec praeterea est res ulla, quae sua natura aut sollicitare possit aut angere. Praeterea et appetendi et refugiendi et omnino rerum gerendarum initia proficiscuntur aut a voluptate aut a dolore. quod cum ita sit, perspicuum est omnis rectas res atque laudabilis eo referri, ut cum voluptate vivatur. quoniam autem id est vel summum bonorum vel ultimum vel extremum -- quod Graeci telos nominant --, quod ipsum nullam ad aliam rem, ad id autem res referuntur omnes, fatendum est summum esse bonum iucunde vivere. Id qui in una virtute ponunt et splendore nominis capti quid natura postulet non intellegunt, errore maximo, si Epicurum audire voluerint, liberabuntur: istae enim vestrae eximiae pulchraeque virtutes nisi voluptatem efficerent, quis eas aut laudabilis aut expetendas arbitraretur? ut enim medicorum scientiam non ipsius artis, sed bonae valetudinis causa probamus, et gubernatoris ars, quia bene navigandi rationem habet, utilitate, non arte laudatur, sic sapientia, quae ars vivendi putanda est, non expeteretur, si nihil efficeret; nunc expetitur, quod est tamquam artifex conquirendae et comparandae voluptatis -- Quam autem ego dicam voluptatem, iam videtis, ne invidia verbi labefactetur oratio mea --. nam cum ignoratione rerum bonarum et malarum maxime hominum vita vexetur, ob eumque errorem et voluptatibus maximis saepe priventur et durissimis animi doloribus torqueantur, sapientia est adhibenda, quae et terroribus cupiditatibusque detractis et omnium falsarum opinionum temeritate derepta certissimam se nobis ducem praebeat ad voluptatem. sapientia enim est una, quae maestitiam pellat ex animis, quae nos exhorrescere metu non sinat. qua praeceptrice in tranquillitate vivi potest omnium cupiditatum ardore restincto. cupiditates enim sunt insatiabiles, quae non modo singulos homines, sed universas familias evertunt, totam etiam labefactant saepe rem publicam. Ex cupiditatibus odia, discidia, discordiae, seditiones, bella nascuntur, nec eae se foris solum iactant nec tantum in alios caeco impetu incurrunt, sed intus etiam in animis inclusae inter se dissident atque discordant, ex quo vitam amarissimam necesse est effici, ut sapiens solum amputata circumcisaque inanitate omni et errore naturae finibus contentus sine aegritudine possit et sine metu vivere. Quae est enim aut utilior aut ad bene vivendum aptior partitio quam illa, qua est usus Epicurus? qui unum genus posuit earum cupiditatum, quae essent et naturales et necessariae, alterum, quae naturales essent nec tamen necessariae, tertium, quae nec naturales nec necessariae. quarum ea ratio est, ut necessariae nec opera multa nec impensa expleantur; ne naturales quidem multa desiderant, propterea quod ipsa natura divitias, quibus contenta sit, et parabilis et terminatas habet; inanium autem cupiditatum nec modus ullus nec finis inveniri potest. Quodsi vitam omnem perturbari videmus errore et inscientia, sapientiamque esse solam, quae nos a libidinum impetu et a formidinum terrore vindicet et ipsius fortunae modice ferre doceat iniurias et omnis monstret vias, quae ad quietem et ad tranquillitatem ferant, quid est cur dubitemus dicere et sapientiam propter voluptates expetendam et insipientiam propter molestias esse fugiendam? Eademque ratione ne temperantiam quidem propter se expetendam esse dicemus, sed quia pacem animis afferat et eos quasi concordia quadam placet ac leniat. temperantia est enim, quae in rebus aut expetendis aut fugiendis ut rationem sequamur monet. nec enim satis est iudicare quid faciendum non faciendumve sit, sed stare etiam oportet in eo, quod sit iudicatum. plerique autem, quod tenere atque servare id, quod ipsi statuerunt, non possunt, victi et debilitati obiecta specie voluptatis tradunt se libidinibus constringendos nec quid eventurum sit provident ob eamque causam propter voluptatem et parvam et non necessariam et quae vel aliter pararetur et qua etiam carere possent sine dolore tum in morbos gravis, tum in damna, tum in dedecora incurrunt, saepe etiam legum iudiciorumque poenis obligantur. Qui autem ita frui volunt voluptatibus, ut nulli propter eas consequantur dolores, et qui suum iudicium retinent, ne voluptate victi faciant id, quod sentiant non esse faciendum, ii voluptatem maximam adipiscuntur praetermittenda voluptate. idem etiam dolorem saepe perpetiuntur, ne, si id non faciant, incidant in maiorem. ex quo intellegitur nec intemperantiam propter se esse fugiendam temperantiamque expetendam, non quia voluptates fugiat, sed quia maiores consequatur. Eadem fortitudinis ratio reperietur. nam neque laborum perfunctio neque perpessio dolorum per se ipsa allicit nec patientia nec assiduitas nec vigiliae nec ea ipsa, quae laudatur, industria, ne fortitudo quidem, sed ista sequimur, ut sine cura metuque vivamus animumque et corpus, quantum efficere possimus, molestia liberemus. ut enim mortis metu omnis quietae vitae status perturbatur, et ut succumbere doloribus eosque humili animo inbecilloque ferre miserum est, ob eamque debilitatem animi multi parentes, multi amicos, non nulli patriam, plerique autem se ipsos penitus perdiderunt, sic robustus animus et excelsus omni est liber cura et angore, cum et mortem contemnit, qua qui affecti sunt in eadem causa sunt, qua ante quam nati, et ad dolores ita paratus est, ut meminerit maximos morte finiri, parvos multa habere intervalla requietis, mediocrium nos esse dominos, ut, si tolerabiles sint, feramus, si minus, animo aequo e vita, cum ea non placeat, tamquam e theatro exeamus. quibus rebus intellegitur nec timiditatem ignaviamque vituperari nec fortitudinem patientiamque laudari suo nomine, sed illas reici, quia dolorem pariant, has optari, quia voluptatem. Iustitia restat, ut de omni virtute sit dictum. sed similia fere dici possunt. ut enim sapientiam, temperantiam, fortitudinem copulatas esse docui cum voluptate, ut ab ea nullo modo nec divelli nec distrahi possint, sic de iustitia iudicandum est, quae non modo numquam nocet cuiquam, sed contra semper afficit cum vi sua atque natura, quod tranquillat animos, tum spe nihil earum rerum defuturum, quas natura non depravata desiderat. et quem ad modum temeritas et libido et ignavia semper animum excruciant et semper sollicitant turbulentaeque sunt, sic inprobitas si cuius in mente consedit, hoc ipso, quod adest, turbulenta est; si vero molita quippiam est, quamvis occulte fecerit, numquam tamen id confidet fore semper occultum. plerumque improborum facta primo suspicio insequitur, dein sermo atque fama, tum accusator, tum iudex; Multi etiam, ut te consule, ipsi se indicaverunt. quodsi qui satis sibi contra hominum conscientiam saepti esse et muniti videntur, deorum tamen horrent easque ipsas sollicitudines, quibus eorum animi noctesque diesque exeduntur, a diis inmortalibus supplicii causa importari putant. quae autem tanta ex improbis factis ad minuendas vitae molestias accessio potest fieri, quanta ad augendas, cum conscientia factorum, tum poena legum odioque civium? et tamen in quibusdam neque pecuniae modus est neque honoris neque imperii nec libidinum nec epularum nec reliquarum cupiditatum, quas nulla praeda umquam improbe parta minuit, sed potius inflammat, ut coercendi magis quam dedocendi esse videantur. Invitat igitur vera ratio bene sanos ad iustitiam, aequitatem, fidem, neque homini infanti aut inpotenti iniuste facta conducunt, qui nec facile efficere possit, quod conetur, nec optinere, si effecerit, et opes vel fortunae vel ingenii liberalitati magis conveniunt, qua qui utuntur, benivolentiam sibi conciliant et, quod aptissimum est ad quiete vivendum, caritatem, praesertim cum omnino nulla sit causa peccandi. Quae enim cupiditates a natura proficiscuntur, facile explentur sine ulla iniuria, quae autem inanes sunt, iis parendum non est. nihil enim desiderabile concupiscunt, plusque in ipsa iniuria detrimenti est quam in iis rebus emolumenti, quae pariuntur iniuria. Itaque ne iustitiam quidem recte quis dixerit per se ipsam optabilem, sed quia iucunditatis vel plurimum afferat. nam diligi et carum esse iucundum est propterea, quia tutiorem vitam et voluptatem pleniorem efficit. itaque non ob ea solum incommoda, quae eveniunt inprobis, fugiendam inprobitatem putamus, sed multo etiam magis, quod, cuius in animo versatur, numquam sinit eum respirare, numquam adquiescere. Quodsi ne ipsarum quidem virtutum laus, in qua maxime ceterorum philosophorum exultat oratio, reperire exitum potest, nisi derigatur ad voluptatem, voluptas autem est sola, quae nos vocet ad se et alliciat suapte natura, non potest esse dubium, quin id sit summum atque extremum bonorum omnium, beateque vivere nihil aliud sit nisi cum voluptate vivere. Huic certae stabilique sententiae quae sint coniuncta explicabo brevi. nullus in ipsis error est finibus bonorum et malorum, id est in voluptate aut in dolore, sed in his rebus peccant, cum e quibus haec efficiantur ignorant. animi autem voluptates et dolores nasci fatemur e corporis voluptatibus et doloribus -- itaque concedo, quod modo dicebas, cadere causa, si qui e nostris aliter existimant, quos quidem video esse multos, sed imperitos --, quamquam autem et laetitiam nobis voluptas animi et molestiam dolor afferat, eorum tamen utrumque et ortum esse e corpore et ad corpus referri, nec ob eam causam non multo maiores esse et voluptates et dolores animi quam corporis. nam corpore nihil nisi praesens et quod adest sentire possumus, animo autem et praeterita et futura. ut enim aeque doleamus animo, cum corpore dolemus, fieri tamen permagna accessio potest, si aliquod aeternum et infinitum impendere malum nobis opinemur. quod idem licet transferre in voluptatem, ut ea maior sit, si nihil tale metuamus. Iam illud quidem perspicuum est, maximam animi aut voluptatem aut molestiam plus aut ad beatam aut ad miseram vitam afferre momenti quam eorum utrumvis, si aeque diu sit in corpore. Non placet autem detracta voluptate aegritudinem statim consequi, nisi in voluptatis locum dolor forte successerit, at contra gaudere nosmet omittendis doloribus, etiamsi voluptas ea, quae sensum moveat, nulla successerit, eoque intellegi potest quanta voluptas sit non dolere. Sed ut iis bonis erigimur, quae expectamus, sic laetamur iis, quae recordamur. stulti autem malorum memoria torquentur, sapientes bona praeterita grata recordatione renovata delectant. est autem situm in nobis ut et adversa quasi perpetua oblivione obruamus et secunda iucunde ac suaviter meminerimus. sed cum ea, quae praeterierunt, acri animo et attento intuemur, tum fit ut aegritudo sequatur, si illa mala sint, laetitia, si bona. O praeclaram beate vivendi et apertam et simplicem et directam viam! Cum enim certe nihil homini possit melius esse quam vacare omni dolore et molestia perfruique maximis et animi et corporis voluptatibus, videtisne quam nihil praetermittatur quod vitam adiuvet, quo facilius id, quod propositum est, summum bonum consequamur? clamat Epicurus, is quem vos nimis voluptatibus esse deditum dicitis; non posse iucunde vivi, nisi sapienter, honeste iusteque vivatur, nec sapienter, honeste, iuste, nisi iucunde. Neque enim civitas in seditione beata esse potest nec in discordia dominorum domus; quo minus animus a se ipse dissidens secumque discordans gustare partem ullam liquidae voluptatis et liberae potest. atqui pugnantibus et contrariis studiis consiliisque semper utens nihil quieti videre, nihil tranquilli potest. Quodsi corporis gravioribus morbis vitae iucunditas impeditur, quanto magis animi morbis impediri necesse est! animi autem morbi sunt cupiditates inmensae et inanes divitiarum, gloriae, dominationis, libidinosarum etiam voluptatum. accedunt aegritudines, molestiae, maerores, qui exedunt animos conficiuntque curis hominum non intellegentium nihil dolendum esse animo, quod sit a dolore corporis praesenti futurove seiunctum. nec vero quisquam stultus non horum morborum aliquo laborat, nemo igitur est non miser. Accedit etiam mors, quae quasi saxum Tantalo semper impendet, tum superstitio, qua qui est imbutus quietus esse numquam potest. praeterea bona praeterita non meminerunt, praesentibus non fruuntur, futura modo expectant, quae quia certa esse non possunt, conficiuntur et angore et metu maximeque cruciantur, cum sero sentiunt frustra se aut pecuniae studuisse aut imperiis aut opibus aut gloriae. nullas enim consequuntur voluptates, quarum potiendi spe inflammati multos labores magnosque susceperant. ecce autem alii minuti et angusti aut omnia semper desperantes aut malivoli, invidi, difficiles, lucifugi, maledici, monstruosi, alii autem etiam amatoriis levitatibus dediti, alii petulantes, alii audaces, protervi, idem intemperantes et ignavi, numquam in sententia permanentes, quas ob causas in eorum vita nulla est intercapedo molestiae. igitur neque stultorum quisquam beatus neque sapientium non beatus. Multoque hoc melius nos veriusque quam Stoici. illi enim negant esse bonum quicquam nisi nescio quam illam umbram, quod appellant honestum non tam solido quam splendido nomine, virtutem autem nixam hoc honesto nullam requirere voluptatem atque ad beate vivendum se ipsa esse contentam. Sed possunt haec quadam ratione dici non modo non repugnantibus, verum etiam approbantibus nobis. sic enim ab Epicuro sapiens semper beatus inducitur: finitas habet cupiditates, neglegit mortem, de diis inmortalibus sine ullo metu vera sentit, non dubitat, si ita melius sit, migrare de vita. his rebus instructus semper est in voluptate. neque enim tempus est ullum, quo non plus voluptatum habeat quam dolorum. nam et praeterita grate meminit et praesentibus ita potitur, ut animadvertat quanta sint ea quamque iucunda, neque pendet ex futuris, sed expectat illa, fruitur praesentibus ab iisque vitiis, quae paulo ante collegi, abest plurimum et, cum stultorum vitam cum sua comparat, magna afficitur voluptate. dolores autem si qui incurrunt, numquam vim tantam habent, ut non plus habeat sapiens, quod gaudeat, quam quod angatur. Optime vero Epicurus, quod exiguam dixit fortunam intervenire sapienti maximasque ab eo et gravissimas res consilio ipsius et ratione administrari neque maiorem voluptatem ex infinito tempore aetatis percipi posse, quam ex hoc percipiatur, quod videamus esse finitum. In dialectica autem vestra nullam existimavit esse nec ad melius vivendum nec ad commodius disserendum viam. In physicis plurimum posuit. ea scientia et verborum vis et natura orationis et consequentium repugnantiumve ratio potest perspici. omnium autem rerum natura cognita levamur superstitione, liberamur mortis metu, non conturbamur ignoratione rerum, e qua ipsa horribiles existunt saepe formidines. denique etiam morati melius erimus, cum didicerimus quid natura desideret. tum vero, si stabilem scientiam rerum tenebimus, servata illa, quae quasi delapsa de caelo est ad cognitionem omnium, regula, ad quam omnia iudicia rerum dirigentur, numquam ullius oratione victi sententia desistemus. Nisi autem rerum natura perspecta erit, nullo modo poterimus sensuum iudicia defendere. quicquid porro animo cernimus, id omne oritur a sensibus; qui si omnes veri erunt, ut Epicuri ratio docet, tum denique poterit aliquid cognosci et percipi. quos qui tollunt et nihil posse percipi dicunt, ii remotis sensibus ne id ipsum quidem expedire possunt, quod disserunt. praeterea sublata cognitione et scientia tollitur omnis ratio et vitae degendae et rerum gerendarum. sic e physicis et fortitudo sumitur contra mortis timorem et constantia contra metum religionis et sedatio animi omnium rerum occultarum ignoratione sublata et moderatio natura cupiditatum generibusque earum explicatis, et, ut modo docui, cognitionis regula et iudicio ab eadem illa constituto veri a falso distinctio traditur. Restat locus huic disputationi vel maxime necessarius de amicitia, quam, si voluptas summum sit bonum, affirmatis nullam omnino fore. de qua Epicurus quidem ita dicit, omnium rerum, quas ad beate vivendum sapientia comparaverit, nihil esse maius amicitia, nihil uberius, nihil iucundius. nec vero hoc oratione solum, sed multo magis vita et factis et moribus comprobavit. quod quam magnum sit fictae veterum fabulae declarant, in quibus tam multis tamque variis ab ultima antiquitate repetitis tria vix amicorum paria reperiuntur, ut ad Orestem pervenias profectus a Theseo. at vero Epicurus una in domo, et ea quidem angusta, quam magnos quantaque amoris conspiratione consentientis tenuit amicorum greges! quod fit etiam nunc ab Epicureis. sed ad rem redeamus; de hominibus dici non necesse est. Tribus igitur modis video esse a nostris de amicitia disputatum. alii cum eas voluptates, quae ad amicos pertinerent, negarent esse per se ipsas tam expetendas, quam nostras expeteremus, quo loco videtur quibusdam stabilitas amicitiae vacillare, tuentur tamen eum locum seque facile, ut mihi videtur, expediunt. ut enim virtutes, de quibus ante dictum est, sic amicitiam negant posse a voluptate discedere. nam cum solitudo et vita sine amicis insidiarum et metus plena sit, ratio ipsa monet amicitias comparare, quibus partis confirmatur animus et a spe pariendarum voluptatum seiungi non potest. Atque ut odia, invidiae, despicationes adversantur voluptatibus, sic amicitiae non modo fautrices fidelissimae, sed etiam effectrices sunt voluptatum tam amicis quam sibi, quibus non solum praesentibus fruuntur, sed etiam spe eriguntur consequentis ac posteri temporis. quod quia nullo modo sine amicitia firmam et perpetuam iucunditatem vitae tenere possumus neque vero ipsam amicitiam tueri, nisi aeque amicos et nosmet ipsos diligamus, idcirco et hoc ipsum efficitur in amicitia, et amicitia cum voluptate conectitur. nam et laetamur amicorum laetitia aeque atque nostra et pariter dolemus angoribus. Quocirca eodem modo sapiens erit affectus erga amicum, quo in se ipsum, quosque labores propter suam voluptatem susciperet, eosdem suscipiet propter amici voluptatem. quaeque de virtutibus dicta sunt, quem ad modum eae semper voluptatibus inhaererent, eadem de amicitia dicenda sunt. praeclare enim Epicurus his paene verbis: 'Eadem', inquit, 'scientia confirmavit animum, ne quod aut sempiternum aut diuturnum timeret malum, quae perspexit in hoc ipso vitae spatio amicitiae praesidium esse firmissimum.' Sunt autem quidam Epicurei timidiores paulo contra vestra convicia, sed tamen satis acuti, qui verentur ne, si amicitiam propter nostram voluptatem expetendam putemus, tota amicitia quasi claudicare videatur. itaque primos congressus copulationesque et consuetudinum instituendarum voluntates fieri propter voluptatem; cum autem usus progrediens familiaritatem effecerit, tum amorem efflorescere tantum, ut, etiamsi nulla sit utilitas ex amicitia, tamen ipsi amici propter se ipsos amentur. etenim si loca, si fana, si urbes, si gymnasia, si campum, si canes, si equos, si ludicra exercendi aut venandi consuetudine adamare solemus, quanto id in hominum consuetudine facilius fieri poterit et iustius? Sunt autem, qui dicant foedus esse quoddam sapientium, ut ne minus amicos quam se ipsos diligant. quod et posse fieri intellegimus et saepe etiam videmus, et perspicuum est nihil ad iucunde vivendum reperiri posse, quod coniunctione tali sit aptius. Quibus ex omnibus iudicari potest non modo non impediri rationem amicitiae, si summum bonum in voluptate ponatur, sed sine hoc institutionem omnino amicitiae non posse reperiri. Quapropter si ea, quae dixi, sole ipso illustriora et clariora sunt, si omnia dixi hausta e fonte naturae, si tota oratio nostra omnem sibi fidem sensibus confirmat, id est incorruptis atque integris testibus, si infantes pueri, mutae etiam bestiae paene loquuntur magistra ac duce natura nihil esse prosperum nisi voluptatem, nihil asperum nisi dolorem, de quibus neque depravate iudicant neque corrupte, nonne ei maximam gratiam habere debemus, qui hac exaudita quasi voce naturae sic eam firme graviterque comprehenderit, ut omnes bene sanos in viam placatae, tranquillae, quietae, beatae vitae deduceret? Qui quod tibi parum videtur eruditus, ea causa est, quod nullam eruditionem esse duxit, nisi quae beatae vitae disciplinam iuvaret. An ille tempus aut in poetis evolvendis, ut ego et Triarius te hortatore facimus, consumeret, in quibus nulla solida utilitas omnisque puerilis est delectatio, aut se, ut Plato, in musicis, geometria, numeris, astris contereret, quae et a falsis initiis profecta vera esse non possunt et, si essent vera, nihil afferrent, quo iucundius, id est quo melius viveremus, eas ergo artes persequeretur, vivendi artem tantam tamque et operosam et perinde fructuosam relinqueret? non ergo Epicurus ineruditus, sed ii indocti, qui, quae pueros non didicisse turpe est, ea putant usque ad senectutem esse discenda. Quae cum dixisset, Explicavi, inquit, sententiam meam, et eo quidem consilio, tuum iudicium ut cognoscerem, quoniam mihi ea facultas, ut id meo arbitratu facerem, ante hoc tempus numquam est data. lipsum-0.9.1/src/lorem-ipsum.txt000064400000000000000000000006761046102023000147560ustar 00000000000000Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. lipsum-0.9.1/tests/version-numbers.rs000064400000000000000000000005511046102023000160130ustar 00000000000000#[test] fn test_readme_deps() { version_sync::assert_markdown_deps_updated!("README.md"); } #[test] fn test_readme_changelog() { version_sync::assert_contains_regex!( "README.md", r"^### Version {version} \(20\d\d-\d\d-\d\d\)" ); } #[test] fn test_html_root_url() { version_sync::assert_html_root_url_updated!("src/lib.rs"); }