diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 8ceff2133..bbc5b59a6 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -15,10 +15,16 @@ ] }, "dotnet-fsharplint": { - "version": "0.14.2", + "version": "0.16.1", "commands": [ "dotnet-fsharplint" ] + }, + "fornax": { + "version": "0.13.1", + "commands": [ + "fornax" + ] } } } diff --git a/.gitattributes b/.gitattributes index 206349c5a..f25a7ef0e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,6 @@ +docs/static/* linguist-documentation # Auto detect text files -* text=auto +* text=auto # Custom for Visual Studio *.cs diff=csharp text=auto eol=lf diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..33ff2a036 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,25 @@ +name: .NET Core 3.1 + +on: [push, pull_request] + +jobs: + build: + + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] + dotnet: [3.1.200] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v1 + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: ${{ matrix.dotnet }} + - name: Restore tools + run: dotnet tool restore + - name: Restore dependencies + run: dotnet restore + - name: Run build + run: dotnet fake build -t Test diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..5dee9edac --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,35 @@ +name: Release docs + +on: + push: + tags: + - '*' + +jobs: + build: + + strategy: + matrix: + os: [windows-latest] + dotnet: [3.1.200] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.200 + - name: Restore tools + run: dotnet tool restore + - name: Restore dependencies + run: dotnet restore + - name: Run Fornax + run: dotnet fake build -t Docs + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + personal_token: ${{ secrets.PERSONAL_TOKEN }} + publish_dir: ./docs/_public + publish_branch: gh-pages + force_orphan: true diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 000000000..4bfa11494 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,57 @@ +name: Publish + +on: + push: + tags: + - '*' # Publish on any new tag + +jobs: + build: + + strategy: + matrix: + os: [windows-latest] + dotnet: [3.1.200] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v1 + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: ${{ matrix.dotnet }} + - name: Restore tools + run: dotnet tool restore + - name: Run Test + run: dotnet fake build + - name: Run build + run: dotnet fake build -t Pack + - name: Get Changelog Entry + id: changelog_reader + uses: mindsers/changelog-reader-action@v1.1.0 + with: + version: ${{ github.ref }} + path: ./CHANGELOG.md + - name: Create Release + id: create_release + uses: actions/create-release@latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + body: ${{ steps.changelog_reader.outputs.log_entry }} + draft: false + prerelease: false + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v1-release + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: out/*.nupkg + tag: ${{ github.ref }} + overwrite: true + file_glob: true + - name: Upload binaries to nuget + env: + nuget-key: ${{ secrets.NUGET_KEY }} + run: dotnet fake build -t Push diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index eac1cf9e6..000000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: csharp - -sudo: false # use the new container-based Travis infrastructure - -dotnet: 3.1.200 - -script: - - ./build.sh - -branches: - only: - - master - diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..ff22d477b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,355 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] +- Fix bugs in Indentation rule +- Check record fields in TypedItemSpacing rule + +## [0.16.1] - 2020-06-10 +- Fix RecordFieldNames rule incorrectly checking Union Case fields + +## [0.16.0] - 2020-06-10 +- Use `Dotnet.ProjInfo.Workspace` to load project info. + +## [0.15.0] - 2020-06-08 +- Update FCS to 36.0.1 [@baronfel] +- Check record fields in TypedItemSpacing rule +- Fixes for issues in Indentation rule + +## [0.14.2] - 2020-05-20 +- Fixes for exceptional indentation cases + +## [0.14.1] - 2020-05-19 +- .NET Core 3.1 support [@milbrandt] +- Performance optimizations +- Handle exceptional cases for indentation rule +- Fix issue with active pattern naming rule running against measure types + +## [0.14.0] - 2020-04-11 +- Update FCS to 35 [@baronfel] + +## [0.13.3] - 2020-02-25 +- Fix for suppression comment parsing + +## [0.13.2] - 2020-02-25 +- Remove support for multiple overriding configs +- Update FCS to 34.0.1 [@baronfel] + +## [0.13.1] - 2020-02-24 +- Use structured comments for warning suppression +- Use Argu library for command line argument parsing + +## [0.13.0] - 2020-02-20 +- Add `-format` flag to specify output format (standard or MSBuild). + +## [0.12.10] - 2020-01-23 +- Return non-zero error code when there are lint warnings + +## [0.12.9] - 2020-01-23 +- Fix linting of solution in non-Windows systems + +## [0.12.8] - 2020-01-23 +- Pass release configuration to dotnet proj info + +## [0.12.7] - 2020-01-07 +- Add `-c` flag for specifying MSBuild release configuration + +## [0.12.6] - 2019-12-05 +- Update FCS to 33.0 [@baronfel] + +## [0.12.5] - 2019-10-07 +- Addressed issue: [@jrr] + +## [0.12.4] - 2019-10-05 +- Update FCS to 32.0 [@Krzysztof-Cieslak] + +## [0.12.3] - 2019-08-15 +- Update FCS to 31.0 [@baronfel] + +## [0.12.2] - 2019-07-03 +- Add API to convert XmlConfiguration to new config type [@milbrandt] +- Ignore active patterns in PublicValues naming conventions rule +- Update FCS to 30.0 [@baronfel] +- Use Newtonsoft.Json for config parsing + +## [0.12.1] - 2019-05-31 +- Implement linting of all projects in solution using `-sol` flag, or programmatically using `lintSolution` function +- Return non-zero exit code if lint warnings exist +- Fix bug in converting XML config with no hints defined +- Add `XmlConfiguration.tryLoadConfigurationForProject` to support backwards compatability in external applications + +## [0.12.0] - 2019-05-29 +- Update `FSharp.Compiler.Service` + +## [0.11.1] - 2019-05-14 +- Fix issue in loading default configuration + +## [0.11.0] - 2019-05-14 +- Add ability to disable previously defined hints +- Ignore members implementing interface when checking member naming +- Change config from XML to JSON +- Refactor and redesign linter internals + +## [0.10.8] - 2019-04-01 +- Fixed bug: by jgardella +- Update `FSharp.Compiler.Service`, by enricosada + +## [0.10.7] - 2019-02-26 +- Fixed bug: + +## [0.10.6] - 2019-02-26 +- Update `FSharp.Compiler.Service` + +## [0.10.5] - 2019-02-13 +- Update `FSharp.Compiler.Service`, by baronfel + +## [0.10.4] - 2019-02-11 +- Improve tuple item spacing check, by jgardella +- Ignore pattern matching in function parameters, by jgardella +- Fix using FSharpLint.Core targeting `net`, by enricosada +- Fix match indentation calculation, by jgardella +- Produce tuple type string correctly, by jgardella +- Fix false positive for tuple instantiation with cons operator, by jgardella +- Take comments into account when checking spacing, by jgardella + +## [0.10.3] - 2019-01-29 +- Update configuration defaults to exclude formatting rules for now. + +## [0.10.2] - 2018-12-20 +- API C# interop, thanks to [@jgardella](https://github.com/jgardella) +- Fix guard indentation in FormattingMatchExpressionIndentation rule, thanks to [@jgardella](https://github.com/jgardella) +- Command line interface improvements. + +## [0.10.1] - 2018-10-18 +- Pack console application as tool. + +## [0.10.0] - 2018-10-07 +- Move solution to dotnet core. + +## [0.9.1-beta] - 2018-02-22 +- Fixed by [@SteveGilham](https://github.com/SteveGilham) +- Fixed by [@SteveGilham](https://github.com/SteveGilham) + +## [0.9.0] - 2018-01-28 +- .net standard 2.0 support, thanks to [@enricosada](https://github.com/enricosada) + +## [0.9.0-beta] - 2017-10-19 +- .net standard 2.0 support, thanks to [@enricosada](https://github.com/enricosada) + +## [0.8.1] - 2017-10-10 +- Fixed + +## [0.8.0] - 2017-09-05 +- Updated `FSharp.Compiler.Service` + +## [0.7.7] - 2017-08-20 +- Fixed + +## [0.7.6] - 2017-07-02 +- Fixed +- Fixed +- Updated `FSharp.Compiler.Service` + +## [0.7.5-beta] - 2017-03-31 +- Updated `FSharp.Compiler.Service` + +## [0.7.4-beta] - 2017-03-03 +- Updated `FSharp.Compiler.Service` + +## [0.7.3-beta] - 2017-02-23 +- Updated `FSharp.Compiler.Service` + +## [0.7.2-beta] - 2017-02-23 +- Updated `FSharp.Compiler.Service` + +## [0.7.1-beta] - 2017-02-20 +- Added suggestion for redundant usages of the `new` keyword. + +## [0.7.0-beta] - 2017-02-12 +- Type checks performed at end of lint in parallel +- Linter now cancellable. + +## [0.6.5-beta] - 2017-02-11 +- Updated `FSharp.Compiler.Service` +- New hints by [@ErikSchierboom](https://github.com/ErikSchierboom) + +## [0.6.4-beta] - 2017-01-30 +- Updated `FSharp.Compiler.Service` + +## [0.6.3-beta] - 2017-01-22 +- Improved performance of naming analyser. + +## [0.6.2-beta] - 2017-01-21 +- Added suggested fixes for naming rules. +- New hint by [@smoothdeveloper](https://github.com/smoothdeveloper): + +## [0.6.1-beta] - 2017-01-17 +- Naming rules now customisable thanks to [@Krzysztof-Cieslak](https://github.com/Krzysztof-Cieslak). + +## [0.5.1-beta] - 2016-12-31 +- Introduced automated fix information to API. + +## [0.4.12] - 2016-11-16 +- Fixed bug: + +## [0.4.11] - 2016-11-10 +- Bug fixed by [@rexcfnghk](https://github.com/rexcfnghk): + +## [0.4.10] - 2016-10-24 +- Updated FSharp.Compiler.Service + +## [0.4.9] - 2016-10-08 +- Fixed bug: + +## [0.4.8] - 2016-09-13 +- Updated wording of warnings. +- Disabled `RecordFieldNamesMustBePascalCase` naming rule by default. + +## [0.4.7-beta] - 2016-09-09 +- Included FSharp.Core.sigdata and FSharp.Core.optdata in the FSharpLint.MSBuild package. + +## [0.4.6] - 2016-08-21 +- Bug fixed by [@Krzysztof-Cieslak](https://github.com/Krzysztof-Cieslak): + +## [0.4.5] - 2016-08-05 +- Added missing app.config file to FSharpLint.MSBuild package + +## [0.4.5-beta] - 2016-08-04 +- Run linter in separate AppDomain in MSBuild package so that we can add binding redirects to get the correct version of FSharp.Core + +## [0.4.4] - 2016-07-23 +- Fixed structure of FSharpLint.MSBuild package + +## [0.4.3] - 2016-07-23 +- Updated FSharp.Compiler.Service + +## [0.4.2] - 2016-07-16 +- Fixed name convention bug which warned for DU names inside patterns. + +## [0.4.2-beta] - 2016-07-14 +- Added required project cracker files to FSharpLint.Fake package. + +## [0.4.1-beta] - 2016-07-09 +- Updated FSharp.Compiler.Service +- Brought back configuration manager api. +- Targets FSharp.Core 4.4.0.0 + +## [0.4.0-beta] - 2016-06-26 +- Added initial dotnet core support. + +## [0.3.0-beta] - 2016-06-19 +- Improved overall performance of linter. +- Updated default configuration to have opinionated rules off by default. + +## [0.2.7] - 2015-09-27 +- Fixed bug: +- Fixed bug: +- Added feature - now able to write a message as a suggestion in hints: +- Added feature - nulls can now be matched against in hints: +- Fixed bug - lambda length warnings would be repeated for each argument: +- Enhancement - display operators as symbols in eta reduction suggestions: +- Enhancement - updated warning messages: +- Partially fixed bug (fixed when type checking enabled): +- Partially fixed bug (fixed when type checking enabled): +- Configuration can now be written back to XML. +- Configuration API updated to provide management of configuration files. + +## [0.2.6] - 2015-07-18 +- Fixed bug: +- `Default` property now static: + +## [0.2.5] - 2015-07-07 +- FSharp.Core.dll is now included again + +## [0.2.4] - 2015-07-06 +- Fixed bug: +- Fixed bug: +- Fixed bug: +- Fixed bug: + +## [0.2.3] - 2015-07-02 +- Fixed bug: + +## [0.2.2] - 2015-06-09 +- Fixed bug: +- XmlDoc rules now configurable to apply to code with certain access levels e.g. private or public. Thanks goes to Jon Hamm for implementing this feature + +## [0.2.1] - 2015-05-31 +- Included FSharp.Core +- Fixed bug where hints would accidentally match named parameters and property initialisers + +## [0.2.0] - 2015-05-31 +- Configuration has been updated to be simpler and verifiable via an XSD. +- Type checking is now optional and off by default to speed up the linting. +- More XML documentation rules have been added thanks to [jhamm](https://github.com/jhamm) +- Files can now be ignored by specifying git ignore like globs in the configuration file. +- Fixed bug: +- Fixed bug: + +## [0.1.16] - 2015-03-11 +- Handling of project files is now performed by FSharp.Compiler.Service + +## [0.1.15] - 2015-02-08 +- Added `Enabled` config option to all analysers. + +## [0.1.14] - 2015-01-18 +- Added a new rule `CanBeReplacedWithComposition` to the `FSharpLint.FunctionReimplementation` analyser: +- Fixed bug: + +## [0.1.13] - 2015-01-11 +- Fixed bug: +- Fixed bug: +- Files can now be ignored via the .fsproj file: +- FAKE task now reports on how many files were linted and how many warnings were found. +- FAKE task now includes more detailed information on failure. +- FAKE task now includes an option to fail the build if any warnings are found. + +## [0.1.12] - 2014-12-16 +- Fixed bug: + +## [0.1.11] - 2014-11-23 +- FSharp.Compiler.Service now included as a strongly named assembly. +- TargetFrameworkVersion now taken from the project file: + +## [0.1.10] - 2014-11-19 +- Dropped MSBuild tools back down from 12 to 4 to support VS2010 + +## [0.1.9] - 2014-11-17 +- Updated `FSharp.Compiler.Service` for compatibility with VisualFSharpPowerTools: + +## [0.1.8] - 2014-11-15 +- FSharp.Core lookup now supports F# 4, the package is now a single click install in VS 2015 preview + +## [0.1.7] - 2014-11-14 +- Added support for SuppressMessageAttribute for the Typography analyser +- Fixed bug: +- Fixed bug: +- Attempted to fix assembly resolution issues by including FParsec built against FSharp.Core 4.3.0.0 +- Added FAKE task to the nuget package + +## [0.1.6] - 2014-10-25 +- Added `FSharpLint.Binding.TupleOfWildcards` rule +- Fixed bug: + +## [0.1.5] - 2014-10-24 +- Added support for `SuppressMessageAttribute` for all analysers except `FSharpLint.Typography` +- Added FAKE task, thanks to [@archaeron](https://github.com/archaeron) for this contribution + +## [0.1.4] - 2014-10-21 +- Fixed bug: + +## [0.1.3] - 2014-10-16 +- Implemented new analyser: `FSharpLint.RaiseWithTooManyArguments` +- Implemented new rule: `FSharpLint.Binding.WildcardNamedWithAsPattern` + +## [0.1.2] - 2014-10-14 +- More hints and support added for matching if statements, tuples, lists, array, and patterns with hints + +## [0.1.1] - 2014-09-28 +- Fixed bug: literals in pattern matches were generating lint warnings saying that they should be camel case, whereas they must be pascal case. + +## [0.1.0] - 2014-09-25 +- First release diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..4e8b58242 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,149 @@ +# Contributing to FSharpLint + +Please take a moment to review this document in order to make the contribution +process easy and effective for everyone involved! + +## Using the issue tracker + +Use the issues tracker for: + +* [bug reports](#bug-reports) +* [feature requests](#feature-requests) +* [submitting pull requests](#pull-requests) + +Please **do not** use the issue tracker for personal or commercial support requests. + +## Bug reports + +A bug is either a _demonstrable problem_ that is caused by the code in the repository, +or indicate missing, unclear, or misleading documentation. Good bug reports are extremely +helpful - thank you! + +Guidelines for bug reports: + +1. **Use the GitHub issue search** — check if the issue has already been + reported. + +2. **Check if the issue has been fixed** — try to reproduce it using the + `master` branch in the repository. + +3. **Isolate and report the problem** — ideally create a reduced test + case. + +Please try to be as detailed as possible in your report. Include information about +your Operating System, as well as your `dotnet` (or `mono` \ .Net Framework), F# and project versions. Please provide steps to +reproduce the issue as well as the outcome you were expecting! All these details +will help developers to fix any potential bugs. + +Example: + +> Short and descriptive example bug report title +> +> A summary of the issue and the environment in which it occurs. If suitable, +> include the steps required to reproduce the bug. +> +> 1. This is the first step +> 2. This is the second step +> 3. Further steps, etc. +> +> `` - a link to the reduced test case (e.g. a GitHub Gist) +> +> Any other information you want to share that is relevant to the issue being +> reported. This might include the lines of code that you have identified as +> causing the bug, and potential solutions (and your opinions on their +> merits). + +## Feature requests + +Feature requests are welcome and should be discussed on issue tracker. But take a moment to find +out whether your idea fits with the scope and aims of the project. It's up to *you* +to make a strong case to convince the community of the merits of this feature. +Please provide as much detail and context as possible. + + +## Pull requests + +Good pull requests - patches, improvements, new features - are a fantastic +help. They should remain focused in scope and avoid containing unrelated +commits. + +**IMPORTANT**: By submitting a patch, you agree that your work will be +licensed under the license used by the project. + +If you have any large pull request in mind (e.g. implementing features, +refactoring code, etc), **please ask first** otherwise you risk spending +a lot of time working on something that the project's developers might +not want to merge into the project. + +Please adhere to the coding conventions in the project (indentation, +accurate comments, etc.) and don't forget to add your own tests and +documentation. When working with git, we recommend the following process +in order to craft an excellent pull request: + +1. [Fork](https://help.github.com/articles/fork-a-repo/) the project, clone your fork, + and configure the remotes: + + ```bash + # Clone your fork of the repo into the current directory + git clone https://github.com//FSharpLint + # Navigate to the newly cloned directory + cd FSharpLint + # Assign the original repo to a remote called "upstream" + git remote add upstream https://github.com/fsprojects/FSharpLint + ``` + +2. If you cloned a while ago, get the latest changes from upstream, and update your fork: + + ```bash + git checkout master + git pull upstream master + git push + ``` + +3. Create a new topic branch (off of `master`) to contain your feature, change, + or fix. + + **IMPORTANT**: Making changes in `master` is discouraged. You should always + keep your local `master` in sync with upstream `master` and make your + changes in topic branches. + + ```bash + git checkout -b + ``` + +4. Commit your changes in logical chunks. Keep your commit messages organized, + with a short description in the first line and more detailed information on + the following lines. Feel free to use Git's + [interactive rebase](https://help.github.com/articles/about-git-rebase/) + feature to tidy up your commits before making them public. + + +5. Make sure all the tests are still passing. + + ```bash + dotnet tool restore + dotnet tool build + ``` + +6. Push your topic branch up to your fork: + + ```bash + git push origin + ``` + +7. [Open a Pull Request](https://help.github.com/articles/about-pull-requests/) + with a clear title and description. + +8. If you haven't updated your pull request for a while, you should consider + rebasing on master and resolving any conflicts. + + **IMPORTANT**: _Never ever_ merge upstream `master` into your branches. You + should always `git rebase` on `master` to bring your changes up to date when + necessary. + + ```bash + git checkout master + git pull upstream master + git checkout + git rebase master + ``` diff --git a/Directory.Build.props b/Directory.Build.props index 958d8d417..46170f563 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,5 +2,6 @@ true true + false diff --git a/Directory.Build.targets b/Directory.Build.targets index dce4b4510..63dd75283 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -3,9 +3,7 @@ AfterTargets="BeforeBuild" Condition="$(MSBuildProjectName) != 'FSharpLint.FunctionalTest.TestedProject.NetCore' And $(MSBuildProjectName) != 'FSharpLint.FunctionalTest.TestedProject.MultiTarget' - And $(MSBuildProjectName) != 'FSharpLint.FunctionalTest.TestedProject.OldProject' - And $(MSBuildProjectName) != 'FSharpLint.Console' - And $(MSBuildProjectName) != 'FSharpLint.Console.Tests'"> + And $(MSBuildProjectName) != 'FSharpLint.FunctionalTest.TestedProject.OldProject'"> [@jrr] - -##### 0.12.4 - October 5 2019 - -* Update FCS to 32.0 [@Krzysztof-Cieslak] - -##### 0.12.3 - August 15 2019 - -* Update FCS to 31.0 [@baronfel] - -##### 0.12.2 - July 3 2019 - -* Add API to convert XmlConfiguration to new config type [@milbrandt] -* Ignore active patterns in PublicValues naming conventions rule -* Update FCS to 30.0 [@baronfel] -* Use Newtonsoft.Json for config parsing - -##### 0.12.1 - May 31 2019 - -* Implement linting of all projects in solution using `-sol` flag, or programmatically using `lintSolution` function -* Return non-zero exit code if lint warnings exist -* Fix bug in converting XML config with no hints defined -* Add `XmlConfiguration.tryLoadConfigurationForProject` to support backwards compatability in external applications - -##### 0.12.0 - May 29 2019 - -* Update `FSharp.Compiler.Service` - -##### 0.11.1 - May 14 2019 - -* Fix issue in loading default configuration - -##### 0.11.0 - May 14 2019 - -* Add ability to disable previously defined hints -* Ignore members implementing interface when checking member naming -* Change config from XML to JSON -* Refactor and redesign linter internals - -##### 0.10.8 - April 1 2019 - -* Fixed bug: by jgardella -* Update `FSharp.Compiler.Service`, by enricosada - -##### 0.10.7 - February 26 2019 - -* Fixed bug: - -##### 0.10.6 - February 26 2019 - -* Update `FSharp.Compiler.Service` - -##### 0.10.5 - February 13 2019 - -* Update `FSharp.Compiler.Service`, by baronfel - -##### 0.10.4 - February 11 2019 - -* Improve tuple item spacing check, by jgardella -* Ignore pattern matching in function parameters, by jgardella -* Fix using FSharpLint.Core targeting `net`, by enricosada -* Fix match indentation calculation, by jgardella -* Produce tuple type string correctly, by jgardella -* Fix false positive for tuple instantiation with cons operator, by jgardella -* Take comments into account when checking spacing, by jgardella - -##### 0.10.3 - January 29 2019 - -* Update configuration defaults to exclude formatting rules for now. - -##### 0.10.2 - December 20 2018 - -* API C# interop, thanks to [@jgardella](https://github.com/jgardella) -* Fix guard indentation in FormattingMatchExpressionIndentation rule, thanks to [@jgardella](https://github.com/jgardella) -* Command line interface improvements. - -##### 0.10.1 - November 18 2018 - -* Pack console application as tool. - -##### 0.10.0 - October 07 2018 - -* Move solution to dotnet core. - -##### 0.9.1-beta - February 22 2018 - -* Fixed by [@SteveGilham](https://github.com/SteveGilham) -* Fixed by [@SteveGilham](https://github.com/SteveGilham) - -##### 0.9.0 - January 28 2018 - -* .net standard 2.0 support, thanks to [@enricosada](https://github.com/enricosada) - -##### 0.9.0-beta - October 19 2017 - -* .net standard 2.0 support, thanks to [@enricosada](https://github.com/enricosada) - -##### 0.8.1 - October 10 2017 - -* Fixed - -##### 0.8.0 - September 05 2017 - -* Updated `FSharp.Compiler.Service` - -##### 0.7.7 - August 20 2017 - -* Fixed - -##### 0.7.6 - July 02 2017 - -* Fixed -* Fixed -* Updated `FSharp.Compiler.Service` - -##### 0.7.5-beta - March 31 2017 - -* Updated `FSharp.Compiler.Service` - -##### 0.7.4-beta - March 03 2017 - -* Updated `FSharp.Compiler.Service` - -##### 0.7.3-beta - February 23 2017 - -* Updated `FSharp.Compiler.Service` - -##### 0.7.2-beta - February 23 2017 - -* Updated `FSharp.Compiler.Service` - -##### 0.7.1-beta - February 20 2017 - -* Added suggestion for redundant usages of the `new` keyword. - -##### 0.7.0-beta - February 12 2017 - -* Type checks performed at end of lint in parallel -* Linter now cancellable. - -##### 0.6.5-beta - February 11 2017 - -* Updated `FSharp.Compiler.Service` -* New hints by [@ErikSchierboom](https://github.com/ErikSchierboom) - -##### 0.6.4-beta - January 30 2017 - -* Updated `FSharp.Compiler.Service` - -##### 0.6.3-beta - January 22 2017 - -* Improved performance of naming analyser. - -##### 0.6.2-beta - January 21 2017 - -* Added suggested fixes for naming rules. -* New hint by [@smoothdeveloper](https://github.com/smoothdeveloper): - -##### 0.6.1-beta - January 17 2017 - -* Naming rules now customisable thanks to [@Krzysztof-Cieslak](https://github.com/Krzysztof-Cieslak). - -##### 0.5.1-beta - December 31 2016 - -* Introduced automated fix information to API. - -##### 0.4.12 - November 16 2016 - -* Fixed bug: - -##### 0.4.11 - November 10 2016 - -* Bug fixed by [@rexcfnghk](https://github.com/rexcfnghk): - -##### 0.4.10 - October 24 2016 - -* Updated FSharp.Compiler.Service - -##### 0.4.9 - October 8 2016 - -* Fixed bug: - -##### 0.4.8 - September 13 2016 - -* Updated wording of warnings. -* Disabled `RecordFieldNamesMustBePascalCase` naming rule by default. - -##### 0.4.7-beta - September 9 2016 - -* Included FSharp.Core.sigdata and FSharp.Core.optdata in the FSharpLint.MSBuild package. - -##### 0.4.6 - August 21 2016 - -* Bug fixed by [@Krzysztof-Cieslak](https://github.com/Krzysztof-Cieslak): - -##### 0.4.5 - August 5 2016 - -* Added missing app.config file to FSharpLint.MSBuild package - -##### 0.4.5-beta - August 4 2016 - -* Run linter in separate AppDomain in MSBuild package so that we can add binding redirects to get the correct version of FSharp.Core - -##### 0.4.4 - July 23 2016 - -* Fixed structure of FSharpLint.MSBuild package - -##### 0.4.3 - July 23 2016 - -* Updated FSharp.Compiler.Service - -##### 0.4.2 - July 16 2016 - -* Fixed name convention bug which warned for DU names inside patterns. - -##### 0.4.2-beta - July 14 2016 - -* Added required project cracker files to FSharpLint.Fake package. - -##### 0.4.1-beta - July 09 2016 - -* Updated FSharp.Compiler.Service -* Brought back configuration manager api. -* Targets FSharp.Core 4.4.0.0 - -##### 0.4.0-beta - June 26 2016 - -* Added initial dotnet core support. - -##### 0.3.0-beta - June 19 2016 - -* Improved overall performance of linter. -* Updated default configuration to have opinionated rules off by default. - -##### 0.2.7 - September 27 2015 - -* Fixed bug: -* Fixed bug: -* Added feature - now able to write a message as a suggestion in hints: -* Added feature - nulls can now be matched against in hints: -* Fixed bug - lambda length warnings would be repeated for each argument: -* Enhancement - display operators as symbols in eta reduction suggestions: -* Enhancement - updated warning messages: -* Partially fixed bug (fixed when type checking enabled): -* Partially fixed bug (fixed when type checking enabled): -* Configuration can now be written back to XML. -* Configuration API updated to provide management of configuration files. - -##### 0.2.6 - July 18 2015 - -* Fixed bug: -* `Default` property now static: - -##### 0.2.5 - July 7 2015 - -* FSharp.Core.dll is now included again - -##### 0.2.4 - July 6 2015 - -* Fixed bug: -* Fixed bug: -* Fixed bug: -* Fixed bug: - -##### 0.2.3 - July 2 2015 - -* Fixed bug: - -##### 0.2.2 - June 9 2015 - -* Fixed bug: -* XmlDoc rules now configurable to apply to code with certain access levels e.g. private or public. Thanks goes to Jon Hamm for implementing this feature - -##### 0.2.1 - May 31 2015 - -* Included FSharp.Core -* Fixed bug where hints would accidentally match named parameters and property initialisers - -##### 0.2.0 - May 31 2015 - -* Configuration has been updated to be simpler and verifiable via an XSD. -* Type checking is now optional and off by default to speed up the linting. -* More XML documentation rules have been added thanks to [jhamm](https://github.com/jhamm) -* Files can now be ignored by specifying git ignore like globs in the configuration file. -* Fixed bug: -* Fixed bug: - -##### 0.1.16 - March 11 2015 - -* Handling of project files is now performed by FSharp.Compiler.Service - -##### 0.1.15 - February 08 2015 - -* Added `Enabled` config option to all analysers. - -##### 0.1.14 - January 18 2015 - -* Added a new rule `CanBeReplacedWithComposition` to the `FSharpLint.FunctionReimplementation` analyser: -* Fixed bug: - -##### 0.1.13 - January 11 2015 - -* Fixed bug: -* Fixed bug: -* Files can now be ignored via the .fsproj file: -* FAKE task now reports on how many files were linted and how many warnings were found. -* FAKE task now includes more detailed information on failure. -* FAKE task now includes an option to fail the build if any warnings are found. - -##### 0.1.12 - December 16 2014 - -* Fixed bug: - -##### 0.1.11 - November 23 2014 - -* FSharp.Compiler.Service now included as a strongly named assembly. -* TargetFrameworkVersion now taken from the project file: - -##### 0.1.10 - November 19 2014 - -* Dropped MSBuild tools back down from 12 to 4 to support VS2010 - -##### 0.1.9 - November 17 2014 - -* Updated `FSharp.Compiler.Service` for compatibility with VisualFSharpPowerTools: - -##### 0.1.8 - November 15 2014 - -* FSharp.Core lookup now supports F# 4, the package is now a single click install in VS 2015 preview - -##### 0.1.7 - November 14 2014 - -* Added support for SuppressMessageAttribute for the Typography analyser -* Fixed bug: -* Fixed bug: -* Attempted to fix assembly resolution issues by including FParsec built against FSharp.Core 4.3.0.0 -* Added FAKE task to the nuget package - -##### 0.1.6 - October 25 2014 - -* Added `FSharpLint.Binding.TupleOfWildcards` rule -* Fixed bug: - -##### 0.1.5 - October 24 2014 - -* Added support for `SuppressMessageAttribute` for all analysers except `FSharpLint.Typography` -* Added FAKE task, thanks to [@archaeron](https://github.com/archaeron) for this contribution - -##### 0.1.4 - October 21 2014 - -* Fixed bug: - -##### 0.1.3 - October 16 2014 - -* Implemented new analyser: `FSharpLint.RaiseWithTooManyArguments` -* Implemented new rule: `FSharpLint.Binding.WildcardNamedWithAsPattern` - -##### 0.1.2 - October 14 2014 - -* More hints and support added for matching if statements, tuples, lists, array, and patterns with hints - -##### 0.1.1 - September 28 2014 - -* Fixed bug: literals in pattern matches were generating lint warnings saying that they should be camel case, whereas they must be pascal case. - -##### 0.1.0 - September 25 2014 - -* First release diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index a6bb8feb7..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,30 +0,0 @@ -image: Visual Studio 2019 - -init: - - git config --global core.autocrlf input - -branches: - only: - - master - -build_script: - - ps: dotnet --info - - cmd: .\build.cmd - -test: off - -artifacts: - - path: bin - name: Console Application - - - path: packaging\*.nupkg - name: nuget - -deploy: - - provider: NuGet - api_key: - secure: B5w2/65WZ+KmwYdfBa+p6L5Bs9T+BxlL/5qz9UP/9G9D1hUFo10Md02XhArMRO9T - skip_symbols: true - artifact: nuget - on: - branch: master \ No newline at end of file diff --git a/build.cmd b/build.cmd deleted file mode 100644 index 8506bab3e..000000000 --- a/build.cmd +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -cls - -rem Restore the tool NuGet packages -dotnet tool restore - -dotnet restore build.proj --verbosity n - -dotnet fake run build.fsx \ No newline at end of file diff --git a/build.fsx b/build.fsx index cfdfa4c5c..9a8352009 100644 --- a/build.fsx +++ b/build.fsx @@ -1,97 +1,194 @@ -#r "paket: -nuget Fake.DotNet.Cli -nuget Fake.DotNet.FSFormatting -nuget Fake.DotNet.Paket -nuget Fake.DotNet.MSBuild -nuget Fake.IO.FileSystem -nuget Fake.Tools.Git -nuget Fake.Core.ReleaseNotes -nuget Fake.Core.Target //" +// -------------------------------------------------------------------------------------- +// FAKE build script +// -------------------------------------------------------------------------------------- +#r "paket: groupref build //" +#load ".fake/build.fsx/intellisense.fsx" open Fake.Core open Fake.DotNet +open Fake.Tools open Fake.IO +open Fake.IO.FileSystemOperators open Fake.IO.Globbing.Operators -open Fake.Tools +open Fake.Core.TargetOperators +open Fake.Api + +// -------------------------------------------------------------------------------------- +// Information about the project to be used at NuGet and in AssemblyInfo files +// -------------------------------------------------------------------------------------- let project = "FSharpLint" -let release = ReleaseNotes.load "RELEASE_NOTES.md" -Environment.setEnvironVar "Version" release.NugetVersion +let authors = "Matthew Mcveigh" + +let gitOwner = "fsprojects" +let gitName = "FSharpLint" +let gitHome = "https://github.com/" + gitOwner +let gitUrl = gitHome + "/" + gitName + +// -------------------------------------------------------------------------------------- +// Build variables +// -------------------------------------------------------------------------------------- + +let buildDir = "./build/" +let nugetDir = "./out/" + + +System.Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ +let changelogFilename = "CHANGELOG.md" +let changelog = Changelog.load changelogFilename +let latestEntry = changelog.LatestEntry + +let nugetVersion = latestEntry.NuGetVersion +let packageReleaseNotes = sprintf "%s/blob/v%s/CHANGELOG.md" gitUrl latestEntry.NuGetVersion +let releaseNotes = + latestEntry.Changes + |> List.map (fun c -> " * " + c.ToString()) + |> String.concat "\n" + +// -------------------------------------------------------------------------------------- +// Helpers +// -------------------------------------------------------------------------------------- +let isNullOrWhiteSpace = System.String.IsNullOrWhiteSpace + +let exec cmd args dir = + let proc = + CreateProcess.fromRawCommandLine cmd args + |> CreateProcess.ensureExitCodeWithMessage (sprintf "Error while running '%s' with args: %s" cmd args) + (if isNullOrWhiteSpace dir then proc + else proc |> CreateProcess.withWorkingDirectory dir) + |> Proc.run + |> ignore + +let getBuildParam = Environment.environVar +let DoNothing = ignore +// -------------------------------------------------------------------------------------- +// Build Targets +// -------------------------------------------------------------------------------------- Target.create "Clean" (fun _ -> - !! "src/*/bin" - ++ "src/*/obj" - ++ "tests/*/bin" - ++ "tests/*/obj" - |> Shell.cleanDirs) + Shell.cleanDirs [buildDir; nugetDir] +) -Target.create "Restore" (fun _ -> DotNet.exec id "paket" "restore" |> ignore) - -Target.create "Build" (fun _ -> DotNet.build id "FSharpLint.sln") +Target.create "Build" (fun _ -> + DotNet.build id "FSharpLint.sln" +) let filterPerformanceTests (p:DotNet.TestOptions) = { p with Filter = Some "\"TestCategory!=Performance\""; Configuration = DotNet.Release } -Target.create "RunTests" (fun _ -> +Target.create "Test" (fun _ -> DotNet.test filterPerformanceTests "tests/FSharpLint.Core.Tests" - DotNet.test filterPerformanceTests "tests/FSharpLint.Console.Tests") -Target.create "RunFunctionalTests" (fun _ -> + DotNet.test filterPerformanceTests "tests/FSharpLint.Console.Tests" DotNet.restore id "tests/FSharpLint.FunctionalTest.TestedProject/FSharpLint.FunctionalTest.TestedProject.sln" - DotNet.test filterPerformanceTests "tests/FSharpLint.FunctionalTest") - -Target.create "Package" (fun _ -> - // TODO: fix pack warning on deprecated licenseUrl param - let cliArgs = { MSBuild.CliArguments.Create() with NoWarn = Some ["NU5125"] } - let configure (c:DotNet.PackOptions) = - { c with - Configuration = DotNet.Release - OutputPath = Some "packaging" - MSBuildParams = cliArgs } - DotNet.pack configure "src/FSharpLint.Core/FSharpLint.Core.fsproj" - DotNet.pack configure "src/FSharpLint.Console/FSharpLint.Console.fsproj") - -Target.create "PublishPackages" (fun _ -> Paket.push(fun p -> { p with WorkingDir = "packaging" })) - -Target.create "Release" (fun _ -> - Git.Staging.stageAll "" - Git.Commit.exec "" (sprintf "Bump version to %s" release.NugetVersion) - Git.Branches.push "" - - Git.Branches.tag "" release.NugetVersion - Git.Branches.pushTag "" "origin" release.NugetVersion) + DotNet.test filterPerformanceTests "tests/FSharpLint.FunctionalTest" +) + +Target.create "Docs" (fun _ -> + exec "dotnet" @"fornax build" "docs" +) + +// -------------------------------------------------------------------------------------- +// Release Targets +// -------------------------------------------------------------------------------------- +Target.create "BuildRelease" (fun _ -> + DotNet.build (fun p -> + { p with + Configuration = DotNet.BuildConfiguration.Release + OutputPath = Some buildDir + MSBuildParams = { p.MSBuildParams with Properties = [("Version", nugetVersion); ("PackageReleaseNotes", packageReleaseNotes)]} + } + ) "FSharpLint.sln" +) + + +Target.create "Pack" (fun _ -> + let properties = [ + ("Version", nugetVersion); + ("Authors", authors) + ("PackageProjectUrl", gitUrl) + ("RepositoryType", "git") + ("RepositoryUrl", gitUrl) + ("PackageLicenseUrl", gitUrl + "/LICENSE") + ("PackageReleaseNotes", packageReleaseNotes) + ] + + + DotNet.pack (fun p -> + { p with + Configuration = DotNet.BuildConfiguration.Release + OutputPath = Some nugetDir + MSBuildParams = { p.MSBuildParams with Properties = properties } + } + ) "FSharpLint.sln" +) + +Target.create "ReleaseGitHub" (fun _ -> + let remote = + Git.CommandHelper.getGitResult "" "remote -v" + |> Seq.filter (fun (s: string) -> s.EndsWith("(push)")) + |> Seq.tryFind (fun (s: string) -> s.Contains(gitOwner + "/" + gitName)) + |> function None -> gitHome + "/" + gitName | Some (s: string) -> s.Split().[0] -Target.create "GenerateDocs" (fun _ -> - Shell.cleanDir "docs" - - let projInfo = - [ "project-name", "FSharpLint" - "project-author", "Matthew Mcveigh" - "project-summary", "A lint tool for F#." - "project-github", "http://fsprojects.github.io/FSharpLint/" - "project-nuget", "http://nuget.org/packages/FSharpLint.Core" ] - - Shell.copyDir "docs/content" "docs-gen/files" FileFilter.allFiles - FSFormatting.createDocs (fun s -> - { s with - Source = "docs-gen/markdown" - OutputDirectory = "docs" - Template = "docs-gen/templates/template.html" - ProjectParameters = projInfo - LayoutRoots = [] })) - -Target.create "Default" ignore + Git.Staging.stageAll "" + Git.Commit.exec "" (sprintf "Bump version to %s" nugetVersion) + Git.Branches.pushBranch "" remote (Git.Information.getBranchName "") + + + Git.Branches.tag "" nugetVersion + Git.Branches.pushTag "" remote nugetVersion + + let client = + let user = + match getBuildParam "github-user" with + | s when not (isNullOrWhiteSpace s) -> s + | _ -> UserInput.getUserInput "Username: " + let pw = + match getBuildParam "github-pw" with + | s when not (isNullOrWhiteSpace s) -> s + | _ -> UserInput.getUserPassword "Password: " + + // Git.createClient user pw + GitHub.createClient user pw + let files = !! (nugetDir "*.nupkg") + + + + // release on github + let cl = + client + |> GitHub.draftNewRelease gitOwner gitName nugetVersion (latestEntry.SemVer.PreRelease <> None) [releaseNotes] + (cl,files) + ||> Seq.fold (fun acc e -> acc |> GitHub.uploadFile e) + |> GitHub.publishDraft//releaseDraft + |> Async.RunSynchronously +) + +Target.create "Push" (fun _ -> + let key = + match getBuildParam "nuget-key" with + | s when not (isNullOrWhiteSpace s) -> s + | _ -> UserInput.getUserPassword "NuGet Key: " + Paket.push (fun p -> { p with WorkingDir = nugetDir; ApiKey = key; ToolType = ToolType.CreateLocalTool() })) + +// -------------------------------------------------------------------------------------- +// Build order +// -------------------------------------------------------------------------------------- +Target.create "Default" DoNothing +Target.create "Release" DoNothing -open Fake.Core.TargetOperators +"Clean" + ==> "Build" + ==> "Test" + ==> "Default" "Clean" - ==> "Restore" - ==> "Build" - ==> "RunTests" - ==> "RunFunctionalTests" - ==> "Package" - ==> "GenerateDocs" - ==> "Default" - ==> "PublishPackages" - ==> "Release" + ==> "BuildRelease" + ==> "Docs" + +"Default" + ==> "Pack" + ==> "ReleaseGitHub" + ==> "Push" + ==> "Release" Target.runOrDefault "Default" diff --git a/build.fsx.lock b/build.fsx.lock deleted file mode 100644 index b6e6ce00f..000000000 --- a/build.fsx.lock +++ /dev/null @@ -1,588 +0,0 @@ -STORAGE: NONE -RESTRICTION: == netstandard2.0 -NUGET - remote: https://api.nuget.org/v3/index.json - BlackFox.VsWhere (0.3.1) - FSharp.Core (>= 4.2.3) - Fake.Core.CommandLineParsing (5.7.2) - FParsec (>= 1.0.3) - FSharp.Core (>= 4.3.4) - Fake.Core.Context (5.7.2) - FSharp.Core (>= 4.3.4) - Fake.Core.Environment (5.7.2) - FSharp.Core (>= 4.3.4) - Fake.Core.FakeVar (5.7.2) - Fake.Core.Context (>= 5.7.2) - FSharp.Core (>= 4.3.4) - Fake.Core.Process (5.7.2) - Fake.Core.Environment (>= 5.7.2) - Fake.Core.FakeVar (>= 5.7.2) - Fake.Core.String (>= 5.7.2) - Fake.Core.Trace (>= 5.7.2) - Fake.IO.FileSystem (>= 5.7.2) - FSharp.Core (>= 4.3.4) - System.Diagnostics.Process (>= 4.3) - Fake.Core.ReleaseNotes (5.7.2) - Fake.Core.SemVer (>= 5.7.2) - Fake.Core.String (>= 5.7.2) - FSharp.Core (>= 4.3.4) - Fake.Core.SemVer (5.7.2) - FSharp.Core (>= 4.3.4) - System.Runtime.Numerics (>= 4.3) - Fake.Core.String (5.7.2) - FSharp.Core (>= 4.3.4) - Fake.Core.Target (5.7.2) - Fake.Core.CommandLineParsing (>= 5.7.2) - Fake.Core.Context (>= 5.7.2) - Fake.Core.Environment (>= 5.7.2) - Fake.Core.FakeVar (>= 5.7.2) - Fake.Core.Process (>= 5.7.2) - Fake.Core.String (>= 5.7.2) - Fake.Core.Trace (>= 5.7.2) - FSharp.Control.Reactive (>= 4.1) - FSharp.Core (>= 4.3.4) - System.Reactive.Compatibility (>= 4.1) - Fake.Core.Trace (5.7.2) - Fake.Core.Environment (>= 5.7.2) - Fake.Core.FakeVar (>= 5.7.2) - FSharp.Core (>= 4.3.4) - Fake.DotNet.Cli (5.7.2) - Fake.Core.Environment (>= 5.7.2) - Fake.Core.Process (>= 5.7.2) - Fake.Core.String (>= 5.7.2) - Fake.Core.Trace (>= 5.7.2) - Fake.DotNet.MSBuild (>= 5.7.2) - Fake.IO.FileSystem (>= 5.7.2) - FSharp.Core (>= 4.3.4) - Newtonsoft.Json (>= 11.0.2) - Fake.DotNet.FSFormatting (5.7.2) - Fake.Core.Process (>= 5.7.2) - Fake.IO.FileSystem (>= 5.7.2) - FSharp.Core (>= 4.3.4) - Fake.DotNet.MSBuild (5.7.2) - BlackFox.VsWhere (>= 0.3.1) - Fake.Core.Environment (>= 5.7.2) - Fake.Core.Process (>= 5.7.2) - Fake.Core.String (>= 5.7.2) - Fake.Core.Trace (>= 5.7.2) - Fake.IO.FileSystem (>= 5.7.2) - FSharp.Core (>= 4.3.4) - MSBuild.StructuredLogger (>= 2.0.4) - Fake.DotNet.Paket (5.7.2) - Fake.Core.Process (>= 5.7.2) - Fake.Core.String (>= 5.7.2) - Fake.Core.Trace (>= 5.7.2) - Fake.IO.FileSystem (>= 5.7.2) - FSharp.Core (>= 4.3.4) - Fake.IO.FileSystem (5.7.2) - Fake.Core.String (>= 5.7.2) - FSharp.Core (>= 4.3.4) - System.Diagnostics.FileVersionInfo (>= 4.3) - System.IO.FileSystem.Watcher (>= 4.3) - Fake.Tools.Git (5.7.2) - Fake.Core.Environment (>= 5.7.2) - Fake.Core.Process (>= 5.7.2) - Fake.Core.SemVer (>= 5.7.2) - Fake.Core.String (>= 5.7.2) - Fake.Core.Trace (>= 5.7.2) - Fake.IO.FileSystem (>= 5.7.2) - FSharp.Core (>= 4.3.4) - FParsec (1.0.3) - FSharp.Core (>= 4.2.3) - NETStandard.Library (>= 1.6.1) - FSharp.Control.Reactive (4.1) - FSharp.Core (>= 4.2.3) - System.Reactive (>= 4.0) - FSharp.Core (4.5.2) - Microsoft.Build (15.8.166) - Microsoft.Build.Framework (>= 15.8.166) - Microsoft.Win32.Registry (>= 4.3) - System.Collections.Immutable (>= 1.5) - System.Diagnostics.TraceSource (>= 4.0) - System.IO.Compression (>= 4.3) - System.Reflection.Metadata (>= 1.6) - System.Reflection.TypeExtensions (>= 4.1) - System.Runtime.InteropServices.RuntimeInformation (>= 4.3) - System.Runtime.Loader (>= 4.0) - System.Text.Encoding.CodePages (>= 4.0.1) - System.Threading.Tasks.Dataflow (>= 4.6) - Microsoft.Build.Framework (15.8.166) - System.Runtime.Serialization.Primitives (>= 4.1.1) - System.Threading.Thread (>= 4.0) - Microsoft.Build.Tasks.Core (15.8.166) - Microsoft.Build.Framework (>= 15.8.166) - Microsoft.Build.Utilities.Core (>= 15.8.166) - Microsoft.Win32.Registry (>= 4.3) - System.CodeDom (>= 4.4) - System.Collections.Immutable (>= 1.5) - System.Linq.Parallel (>= 4.0.1) - System.Net.Http (>= 4.3) - System.Reflection.Metadata (>= 1.6) - System.Reflection.TypeExtensions (>= 4.1) - System.Resources.Writer (>= 4.0) - System.Threading.Tasks.Dataflow (>= 4.6) - Microsoft.Build.Utilities.Core (15.8.166) - Microsoft.Build.Framework (>= 15.8.166) - Microsoft.Win32.Registry (>= 4.3) - System.Collections.Immutable (>= 1.5) - System.Runtime.InteropServices.RuntimeInformation (>= 4.3) - System.Text.Encoding.CodePages (>= 4.4) - Microsoft.NETCore.Platforms (2.1.1) - Microsoft.NETCore.Targets (2.1) - Microsoft.Win32.Primitives (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - Microsoft.Win32.Registry (4.5) - System.Buffers (>= 4.4) - System.Memory (>= 4.5) - System.Security.AccessControl (>= 4.5) - System.Security.Principal.Windows (>= 4.5) - MSBuild.StructuredLogger (2.0.11) - Microsoft.Build (>= 15.8.166) - Microsoft.Build.Framework (>= 15.8.166) - Microsoft.Build.Tasks.Core (>= 15.8.166) - Microsoft.Build.Utilities.Core (>= 15.8.166) - NETStandard.Library (2.0.3) - Microsoft.NETCore.Platforms (>= 1.1) - Newtonsoft.Json (11.0.2) - runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.native.System (4.3.1) - Microsoft.NETCore.Platforms (>= 1.1.1) - Microsoft.NETCore.Targets (>= 1.1.3) - runtime.native.System.IO.Compression (4.3.2) - Microsoft.NETCore.Platforms (>= 1.1.1) - Microsoft.NETCore.Targets (>= 1.1.3) - runtime.native.System.Net.Http (4.3.1) - Microsoft.NETCore.Platforms (>= 1.1.1) - Microsoft.NETCore.Targets (>= 1.1.3) - runtime.native.System.Security.Cryptography.Apple (4.3.1) - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (>= 4.3.1) - runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) - runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (4.3.1) - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - System.Buffers (4.5) - System.CodeDom (4.5) - System.Collections (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Collections.Concurrent (4.3) - System.Collections (>= 4.3) - System.Diagnostics.Debug (>= 4.3) - System.Diagnostics.Tracing (>= 4.3) - System.Globalization (>= 4.3) - System.Reflection (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Threading (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.Collections.Immutable (1.5) - System.Diagnostics.Debug (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Diagnostics.DiagnosticSource (4.5.1) - System.Diagnostics.FileVersionInfo (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - System.Globalization (>= 4.3) - System.IO (>= 4.3) - System.IO.FileSystem (>= 4.3) - System.IO.FileSystem.Primitives (>= 4.3) - System.Reflection.Metadata (>= 1.4.1) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Diagnostics.Process (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.Win32.Primitives (>= 4.3) - Microsoft.Win32.Registry (>= 4.3) - runtime.native.System (>= 4.3) - System.Collections (>= 4.3) - System.Diagnostics.Debug (>= 4.3) - System.Globalization (>= 4.3) - System.IO (>= 4.3) - System.IO.FileSystem (>= 4.3) - System.IO.FileSystem.Primitives (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Text.Encoding.Extensions (>= 4.3) - System.Threading (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.Threading.Thread (>= 4.3) - System.Threading.ThreadPool (>= 4.3) - System.Diagnostics.TraceSource (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - runtime.native.System (>= 4.3) - System.Collections (>= 4.3) - System.Diagnostics.Debug (>= 4.3) - System.Globalization (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Threading (>= 4.3) - System.Diagnostics.Tracing (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Globalization (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Globalization.Calendars (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Globalization (>= 4.3) - System.Runtime (>= 4.3) - System.Globalization.Extensions (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - System.Globalization (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.IO (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.IO.Compression (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - runtime.native.System (>= 4.3) - runtime.native.System.IO.Compression (>= 4.3) - System.Buffers (>= 4.3) - System.Collections (>= 4.3) - System.Diagnostics.Debug (>= 4.3) - System.IO (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.IO.FileSystem (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.IO (>= 4.3) - System.IO.FileSystem.Primitives (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.IO.FileSystem.Primitives (4.3) - System.Runtime (>= 4.3) - System.IO.FileSystem.Watcher (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.Win32.Primitives (>= 4.3) - runtime.native.System (>= 4.3) - System.Collections (>= 4.3) - System.IO.FileSystem (>= 4.3) - System.IO.FileSystem.Primitives (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading (>= 4.3) - System.Threading.Overlapped (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.Threading.Thread (>= 4.3) - System.Linq (4.3) - System.Collections (>= 4.3) - System.Diagnostics.Debug (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Linq.Parallel (4.3) - System.Collections (>= 4.3) - System.Collections.Concurrent (>= 4.3) - System.Diagnostics.Debug (>= 4.3) - System.Diagnostics.Tracing (>= 4.3) - System.Linq (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Threading (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.Memory (4.5.1) - System.Buffers (>= 4.4) - System.Numerics.Vectors (>= 4.4) - System.Runtime.CompilerServices.Unsafe (>= 4.5) - System.Net.Http (4.3.3) - Microsoft.NETCore.Platforms (>= 1.1) - runtime.native.System (>= 4.3) - runtime.native.System.Net.Http (>= 4.3) - runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) - System.Collections (>= 4.3) - System.Diagnostics.Debug (>= 4.3) - System.Diagnostics.DiagnosticSource (>= 4.3) - System.Diagnostics.Tracing (>= 4.3) - System.Globalization (>= 4.3) - System.Globalization.Extensions (>= 4.3) - System.IO (>= 4.3) - System.IO.FileSystem (>= 4.3) - System.Net.Primitives (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Security.Cryptography.Algorithms (>= 4.3) - System.Security.Cryptography.Encoding (>= 4.3) - System.Security.Cryptography.OpenSsl (>= 4.3) - System.Security.Cryptography.Primitives (>= 4.3) - System.Security.Cryptography.X509Certificates (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.Net.Primitives (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Numerics.Vectors (4.5) - System.Reactive (4.1.1) - System.Runtime.InteropServices.WindowsRuntime (>= 4.3) - System.Threading.Tasks.Extensions (>= 4.5.1) - System.Reactive.Compatibility (4.1.1) - System.Reactive.Core (>= 4.1.1) - System.Reactive.Interfaces (>= 4.1.1) - System.Reactive.Linq (>= 4.1.1) - System.Reactive.PlatformServices (>= 4.1.1) - System.Reactive.Providers (>= 4.1.1) - System.Reactive.Core (4.1.1) - System.Reactive (>= 4.1.1) - System.Threading.Tasks.Extensions (>= 4.5.1) - System.Reactive.Interfaces (4.1.1) - System.Reactive (>= 4.1.1) - System.Threading.Tasks.Extensions (>= 4.5.1) - System.Reactive.Linq (4.1.1) - System.Reactive (>= 4.1.1) - System.Threading.Tasks.Extensions (>= 4.5.1) - System.Reactive.PlatformServices (4.1.1) - System.Reactive (>= 4.1.1) - System.Threading.Tasks.Extensions (>= 4.5.1) - System.Reactive.Providers (4.1.1) - System.Reactive (>= 4.1.1) - System.Threading.Tasks.Extensions (>= 4.5.1) - System.Reflection (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.IO (>= 4.3) - System.Reflection.Primitives (>= 4.3) - System.Runtime (>= 4.3) - System.Reflection.Extensions (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Reflection (>= 4.3) - System.Runtime (>= 4.3) - System.Reflection.Metadata (1.6) - System.Collections.Immutable (>= 1.5) - System.Reflection.Primitives (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Reflection.TypeExtensions (4.5.1) - System.Resources.ResourceManager (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Globalization (>= 4.3) - System.Reflection (>= 4.3) - System.Runtime (>= 4.3) - System.Resources.Writer (4.3) - System.Collections (>= 4.3) - System.IO (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Runtime (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime.CompilerServices.Unsafe (4.5.2) - System.Runtime.Extensions (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Runtime.Handles (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Runtime.InteropServices (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Reflection (>= 4.3) - System.Reflection.Primitives (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices.RuntimeInformation (4.3) - runtime.native.System (>= 4.3) - System.Reflection (>= 4.3) - System.Reflection.Extensions (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Threading (>= 4.3) - System.Runtime.InteropServices.WindowsRuntime (4.3) - System.Runtime (>= 4.3) - System.Runtime.Loader (4.3) - System.IO (>= 4.3) - System.Reflection (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Numerics (4.3) - System.Globalization (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Serialization.Primitives (4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Security.AccessControl (4.5) - System.Security.Principal.Windows (>= 4.5) - System.Security.Cryptography.Algorithms (4.3.1) - Microsoft.NETCore.Platforms (>= 1.1) - runtime.native.System.Security.Cryptography.Apple (>= 4.3.1) - runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) - System.Collections (>= 4.3) - System.IO (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Runtime.Numerics (>= 4.3) - System.Security.Cryptography.Encoding (>= 4.3) - System.Security.Cryptography.Primitives (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Security.Cryptography.Cng (4.5) - System.Security.Cryptography.Csp (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - System.IO (>= 4.3) - System.Reflection (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Security.Cryptography.Algorithms (>= 4.3) - System.Security.Cryptography.Encoding (>= 4.3) - System.Security.Cryptography.Primitives (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading (>= 4.3) - System.Security.Cryptography.Encoding (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) - System.Collections (>= 4.3) - System.Collections.Concurrent (>= 4.3) - System.Linq (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Security.Cryptography.Primitives (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Security.Cryptography.OpenSsl (4.5) - System.Security.Cryptography.Primitives (4.3) - System.Diagnostics.Debug (>= 4.3) - System.Globalization (>= 4.3) - System.IO (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Threading (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.Security.Cryptography.X509Certificates (4.3.2) - Microsoft.NETCore.Platforms (>= 1.1) - runtime.native.System (>= 4.3) - runtime.native.System.Net.Http (>= 4.3) - runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) - System.Collections (>= 4.3) - System.Diagnostics.Debug (>= 4.3) - System.Globalization (>= 4.3) - System.Globalization.Calendars (>= 4.3) - System.IO (>= 4.3) - System.IO.FileSystem (>= 4.3) - System.IO.FileSystem.Primitives (>= 4.3) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Extensions (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Runtime.InteropServices (>= 4.3) - System.Runtime.Numerics (>= 4.3) - System.Security.Cryptography.Algorithms (>= 4.3) - System.Security.Cryptography.Cng (>= 4.3) - System.Security.Cryptography.Csp (>= 4.3) - System.Security.Cryptography.Encoding (>= 4.3) - System.Security.Cryptography.OpenSsl (>= 4.3) - System.Security.Cryptography.Primitives (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading (>= 4.3) - System.Security.Principal.Windows (4.5.1) - System.Text.Encoding (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Text.Encoding.CodePages (4.5) - System.Runtime.CompilerServices.Unsafe (>= 4.5) - System.Text.Encoding.Extensions (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading (4.3) - System.Runtime (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.Threading.Overlapped (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - System.Resources.ResourceManager (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Threading.Tasks (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Threading.Tasks.Dataflow (4.9) - System.Threading.Tasks.Extensions (4.5.1) - System.Runtime.CompilerServices.Unsafe (>= 4.5) - System.Threading.Thread (4.3) - System.Runtime (>= 4.3) - System.Threading.ThreadPool (4.3) - System.Runtime (>= 4.3) - System.Runtime.Handles (>= 4.3) diff --git a/build.proj b/build.proj deleted file mode 100644 index 650d4cf4f..000000000 --- a/build.proj +++ /dev/null @@ -1,30 +0,0 @@ - - - - - netstandard2.0 - netcoreapp3.1 - - - - - - $([System.IO.Path]::GetFullPath("$(MSBuildThisFileDirectory)")) - - - --parallel 3 - target $(FakeTarget) - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build.sh b/build.sh deleted file mode 100755 index 4c7f9ef7d..000000000 --- a/build.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -eu -set -o pipefail - -# Restore the tool NuGet packages -dotnet tool restore - -dotnet restore build.proj --verbosity n - -dotnet fake run build.fsx \ No newline at end of file diff --git a/docs-gen/files/style.css b/docs-gen/files/style.css deleted file mode 100644 index fa43d8de6..000000000 --- a/docs-gen/files/style.css +++ /dev/null @@ -1,206 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans+Mono|Open+Sans:400,600,700); - -/*-------------------------------------------------------------------------- - Formatting for F# code snippets -/*--------------------------------------------------------------------------*/ - -/* identifier */ -span.i { color:#d1d1d1; } -/* string */ -span.s { color:#d4b43c; } -/* keywords */ -span.k { color:#4e98dc; } -/* comment */ -span.c { color:#96C71D; } -/* operators */ -span.o { color:#af75c1; } -/* numbers */ -span.n { color:#96C71D; } -/* line number */ -span.l { color:#80b0b0; } - -/* inactive code */ -span.inactive { color:#808080; } -/* preprocessor */ -span.prep { color:#af75c1; } -/* fsi output */ -span.fsi { color:#808080; } - -/* omitted */ -span.omitted { - background:#3c4e52; - border-radius:5px; - color:#808080; - padding:0px 0px 1px 0px; -} -/* tool tip */ -div.tip { - background:#475b5f; - border-radius:4px; - font:11pt 'Droid Sans', arial, sans-serif; - padding:6px 8px 6px 8px; - display:none; - color:#d1d1d1; -} -table.pre pre { - padding:0px; - margin:0px; - border:none; -} -table.pre, pre.fssnip, pre { - line-height:13pt; - border:1px solid #d8d8d8; - border-collapse:separate; - white-space:pre; - font: 9pt 'Droid Sans Mono',consolas,monospace; - width:90%; - margin:10px 20px 20px 20px; - background-color:#212d30; - padding:10px; - border-radius:5px; - color:#d1d1d1; -} -table.pre pre { - padding:0px; - margin:0px; - border-radius:0px; - width: 100%; -} -table.pre td { - padding:0px; - white-space:normal; - margin:0px; -} -table.pre td.lines { - width:30px; -} - -/*-------------------------------------------------------------------------- - Formatting for page & standard document content -/*--------------------------------------------------------------------------*/ - -body { - font-family: 'Open Sans', serif; - padding-top: 0px; - padding-bottom: 40px; -} - -pre { - word-wrap: inherit; -} - -/* Format the heading - nicer spacing etc. */ -.masthead { - overflow: hidden; -} -.masthead .muted a { - text-decoration:none; - color:#999999; -} -.masthead ul, .masthead li { - margin-bottom:0px; -} -.masthead .nav li { - margin-top: 15px; - font-size:110%; -} -.masthead h3 { - margin-bottom:5px; - font-size:170%; -} -hr { - margin:0px 0px 20px 0px; -} - -/* Make table headings and td.title bold */ -td.title, thead { - font-weight:bold; -} - -/* Format the right-side menu */ -#menu { - margin-top:50px; - font-size:11pt; - padding-left:20px; -} - -#menu .nav-header { - font-size:12pt; - color:#606060; - margin-top:20px; -} - -#menu li { - line-height:25px; -} - -/* Change font sizes for headings etc. */ -#main h1 { font-size: 26pt; margin:10px 0px 15px 0px; font-weight:400; } -#main h2 { font-size: 20pt; margin:20px 0px 0px 0px; font-weight:400; } -#main h3 { font-size: 14pt; margin:15px 0px 0px 0px; font-weight:600; } -#main p { font-size: 11pt; margin:5px 0px 15px 0px; } -#main ul { font-size: 11pt; margin-top:10px; } -#main li { font-size: 11pt; margin: 5px 0px 5px 0px; } -#main strong { font-weight:700; } - -/*-------------------------------------------------------------------------- - Formatting for API reference -/*--------------------------------------------------------------------------*/ - -.type-list .type-name, .module-list .module-name { - width:25%; - font-weight:bold; -} -.member-list .member-name { - width:35%; -} -#main .xmldoc h2 { - font-size:14pt; - margin:10px 0px 0px 0px; -} -#main .xmldoc h3 { - font-size:12pt; - margin:10px 0px 0px 0px; -} -.github-link { - float:right; - text-decoration:none; -} -.github-link img { - border-style:none; - margin-left:10px; -} -.github-link .hover { display:none; } -.github-link:hover .hover { display:block; } -.github-link .normal { display: block; } -.github-link:hover .normal { display: none; } - -/*-------------------------------------------------------------------------- - Additional formatting for the homepage -/*--------------------------------------------------------------------------*/ - -#nuget { - margin-top:20px; - font-size: 11pt; - padding:20px; -} - -#nuget pre { - font-size:11pt; - -moz-border-radius: 0px; - -webkit-border-radius: 0px; - border-radius: 0px; - background: #404040; - border-style:none; - color: #e0e0e0; - margin-top:15px; -} - -.code-wrapper { - overflow-x: auto; -} - -a.anchor { - color: inherit; - text-decoration: inherit; -} diff --git a/docs-gen/files/tips.js b/docs-gen/files/tips.js deleted file mode 100644 index 2b125bada..000000000 --- a/docs-gen/files/tips.js +++ /dev/null @@ -1,46 +0,0 @@ -var currentTip = null; -var currentTipElement = null; - -function hideTip(evt, name, unique) { - var el = document.getElementById(name); - el.style.display = "none"; - currentTip = null; -} - -function findPos(obj) { - // no idea why, but it behaves differently in webbrowser component - if (window.location.search == "?inapp") - return [obj.offsetLeft + 10, obj.offsetTop + 30]; - - var curleft = 0; - var curtop = obj.offsetHeight; - while (obj) { - curleft += obj.offsetLeft; - curtop += obj.offsetTop; - obj = obj.offsetParent; - }; - return [curleft, curtop]; -} - -function hideUsingEsc(e) { - if (!e) { e = event; } - hideTip(e, currentTipElement, currentTip); -} - -function showTip(evt, name, unique, owner) { - document.onkeydown = hideUsingEsc; - if (currentTip == unique) return; - currentTip = unique; - currentTipElement = name; - - var pos = findPos(owner ? owner : (evt.srcElement ? evt.srcElement : evt.target)); - var posx = pos[0]; - var posy = pos[1]; - - var el = document.getElementById(name); - var parent = (document.documentElement == null) ? document.body : document.documentElement; - el.style.position = "absolute"; - el.style.left = posx + "px"; - el.style.top = posy + "px"; - el.style.display = "block"; -} \ No newline at end of file diff --git a/docs-gen/templates/template.html b/docs-gen/templates/template.html deleted file mode 100644 index 97d8a5e17..000000000 --- a/docs-gen/templates/template.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - {page-title} - - - - - - - - - - - - - -
- -
-
-
- {document} - {tooltips} -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..3ff806ac3 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +_public diff --git a/docs/DotnetTool.html b/docs/DotnetTool.html deleted file mode 100644 index 10f7085fc..000000000 --- a/docs/DotnetTool.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - Installing as dotnet tool - - - - - - - - - - - - - - -
- -
-
-
-

Installing as dotnet tool

-

The linter can be installed as a dotnet tool.

-

Install as a global tool: dotnet tool install -g dotnet-fsharplint.

-

Install as tool to specific directory: dotnet tool install --tool-path <my_directory> dotnet-fsharplint

-

Running the Console Application

-

The console application is a wrapper around the linter. For basic usage, just run dotnet fsharplint lint <input>, where input can be an fsproj, sln, fs, fsx file, or a string of source code.

-

Run dotnet fsharplint --help for full usage information.

- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/MSBuildTask.html b/docs/MSBuildTask.html deleted file mode 100644 index 749004904..000000000 --- a/docs/MSBuildTask.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - Running as MSBuildTask - - - - - - - - - - - - - - -
- -
-
-
-

Running as MSBuildTask

-

FSharpLint can be run as an MSBuild task; this will result in lint warnings showing up in your IDE (Visual Studio/Rider).

-

To set this up, first install the FSharpLint dotnet tool.

-

Then, you can add the following to any of your projects to run linting after build completion for that project:

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-
<Target Name="FSharpLint" AfterTargets="BeforeBuild">
- <Exec
-   Command="dotnet fsharplint -f msbuild lint --lint-config $(MSBuildThisFileDirectory)/fsharplint.json $(MSBuildProjectFullPath)"
-   ConsoleToMsBuild="true"
-   IgnoreExitCode="false"
- />
-</Target>
-
-

If you would like to enable linting for all projects, you can add the above target to either a Directory.Build.props or Directory.Build.targets file in the root of your repository. This will add the target to all files. See here for more info

- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/Rules.html b/docs/Rules.html deleted file mode 100644 index 8156d2847..000000000 --- a/docs/Rules.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - Rules - - - - - - - - - - - - - - -
- -
-
-
-

Rules

-

Global Configuration

-

In addition to the configuration available for each rule, there are some settings which are defined globally to maintain consistency across -multiple rules. These are defind in the globals object in the base of the configuration file. The rule pages below point out any global -setting that each rule depends on. The config is as follows, but can be completely omitted to use defaults:

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-  "globals": {
-    "numIndentationSpaces": 4 // number of spaces used for indentation
-  }
-}
-
-

Rule Lists

-

The following rules can be specified for linting.

- - - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/Suppression.html b/docs/Suppression.html deleted file mode 100644 index 73fb3253a..000000000 --- a/docs/Suppression.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - Rule Suppression - - - - - - - - - - - - - - -
- -
-
-
-

Rule Suppression

-

The linter's rules can be suppressed using structured comments.

-

The following comments are available for use:

-
    -
  • // fsharplint:disable disables rules for all lines following the comment.
  • -
  • // fsharplint:enable re-enables all disabled rules.
  • -
  • // fsharplint:disable-next-line disables rules for the next line.
  • -
  • // fsharplint:disable-line disables rules for the current line.
  • -
-

Only one structured comment can be specified per line; any additional ones will be ignored.

-

Disabling Specific Rules

-

The disable comments allow for specific rules to be disabled by specifying the rules whitespace separated at the end of the comment, for example:

-
    -
  • // fsharplint:disable TypePrefixing Hints disables the rules TypePrefixing and Hints.
  • -
  • // fsharplint:disable-next-line TypePrefixing disables the rule TypePrefixing.
  • -
-

If no rules a specified then all rules are disabled, for example:

-
    -
  • // fsharplint:disable disables all rules.
  • -
-

Examples

-

Disable Entire File

- - - -
1: 
-
// fsharplint:disable
-
-

Precede the file with the comment above.

-

Disable Section of the File

- - - -
1: 
-2: 
-3: 
-4: 
-5: 
-
// fsharplint:disable RecordFieldNames
-type MyType =
-    { xyz: string
-      foo: string }
-// fsharplint:enable
-
-

Disables the RecordFieldNames rule between the disable and enable comments.

- - - -
1: 
-2: 
-3: 
-4: 
-5: 
-
// fsharplint:disable
-type sometype =
-    { xyz: string
-      foo: string }
-// fsharplint:enable
-
-

Disables all rules between the disable and enable comments.

-

Disable Next Line

- - - -
1: 
-2: 
-
// fsharplint:disable-next-line Hints
-let x = not true
-
-

Disables the Hints rule for the next line.

- - - -
1: 
-2: 
-
// fsharplint:disable-next-line
-let x = not true
-
-

Disables all rules for the next line.

-

Disable Current Line

- - - -
1: 
-
let x = not true // fsharplint:disable-line Hints
-
-

Disables the Hints rule for the current line.

- - - -
1: 
-
let x = not true // fsharplint:disable-line
-
-

Disables all rules for the current line.

- -
type MyType =
  {xyz: string;
   foo: string;}
-
MyType.xyz: string
-
Multiple items
val string : value:'T -> string

--------------------
type string = System.String
-
MyType.foo: string
-
type sometype =
  {xyz: string;
   foo: string;}
-
sometype.xyz: string
-
sometype.foo: string
-
val x : bool
-
val not : value:bool -> bool
- -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/_lib/Fornax.Core.dll b/docs/_lib/Fornax.Core.dll new file mode 100644 index 000000000..b8754840a Binary files /dev/null and b/docs/_lib/Fornax.Core.dll differ diff --git a/docs/config.fsx b/docs/config.fsx new file mode 100644 index 000000000..2e724c98f --- /dev/null +++ b/docs/config.fsx @@ -0,0 +1,16 @@ +#r "_lib/Fornax.Core.dll" + +open Config + +let customRename (page: string) = + System.IO.Path.ChangeExtension(page.Replace ("content/", ""), ".html") + + +let config = { + Generators = [ + {Script = "page.fsx"; Trigger = OnFileExt ".md"; OutputFile = Custom customRename } + {Script = "apiref.fsx"; Trigger = Once; OutputFile = MultipleFiles (sprintf "reference/%s.html") } + + {Script = "lunr.fsx"; Trigger = Once; OutputFile = NewFileName "index.json" } + ] +} diff --git a/docs/config.fsx.lock b/docs/config.fsx.lock new file mode 100644 index 000000000..db3f86c72 --- /dev/null +++ b/docs/config.fsx.lock @@ -0,0 +1,5 @@ +STORAGE: NONE +RESTRICTION: == netstandard2.0 +NUGET + remote: https://api.nuget.org/v3/index.json + FSharp.Core (4.7.2) diff --git a/docs-gen/markdown/index.md b/docs/content/explanations/overview.md similarity index 52% rename from docs-gen/markdown/index.md rename to docs/content/explanations/overview.md index 1b9bc7ef8..7bc0dfcb7 100644 --- a/docs-gen/markdown/index.md +++ b/docs/content/explanations/overview.md @@ -1,12 +1,31 @@ -# FSharpLint +--- +title: Overview +category: explanation +menu_order: 1 +--- -FSharpLint is a lint tool for F#. It can be run as a dotnet tool, and also integrates with Ionide for VS Code. +# Overview -> The term [lint] is now applied generically to tools that flag suspicious usage in software written in any computer language - [_Wikipedia_](http://en.wikipedia.org/wiki/Lint_(software)) +FSharpLint is a style checking tool for F#. It points out locations where a set of rules on how F# is to be styled have been broken. +The tool is configurable via JSON and can be run from a console app, or as an MSBuild task. It also provides an interface to easily integrate the tool into other software. -Using a `.fsproj` (F# project) or `.sln` (F# solution) file the tool will analyse all of the F# implementation files in the project/solution looking for code that breaks a set of rules governing the style of the code. Examples of rules: lambda functions must be less than 6 lines long, class member identifiers must be PascalCase. +The project aims to let the user know of problems through [matching user defined hints](http://fsprojects.github.io/FSharpLint/rules/FL0065.html) +a la [HLint](http://community.haskell.org/~ndm/hlint/), and also by using custom rules written in F# similar to the rules +in [Mascot](http://mascot.x9c.fr/manual.html) and [StyleCop](http://stylecop.codeplex.com/). -#### Example Usage of the Tool +Using a `.fsproj` (F# project) or `.sln` (F# solution) file the tool will analyse all of the F# implementation files in the project/solution looking for +code that breaks a set of rules governing the style of the code. Examples of rules: lambda functions must be less than 6 lines long, class member identifiers must be PascalCase. + +## Usage + +FSharpLint can be used in several ways: + +* [Running as dotnet tool from command line](/how-tos/install-dotnet-tool.html). +* [In VS Code using the Ionide-FSharp plugin](https://marketplace.visualstudio.com/items?itemName=Ionide.Ionide-fsharp). +* [In other IDEs (Visual Studio, Rider) as an MSBuild Task](/how-tos/msbuild-task.html). +* [In other editors through FsAutoComplete Language Server](https://github.com/fsharp/FsAutoComplete) + +### Example Usage The following program: @@ -21,9 +40,6 @@ The following program: Run against the lint tool generates the following errors: - [lang=error] - - FL0036: Consider changing `ExampleInterface` to be prefixed with `I`. Consider changing `ExampleInterface` to be prefixed with `I`. Error in file Program.fs on line 1 starting at column 5 @@ -53,7 +69,6 @@ Refactored using lint's warnings: If we run lint again it will find a new error, it's worth running the tool until it no longer finds any errors: - [lang=error] FL0065: `List.fold ( + ) 0 x` might be able to be refactored into `List.sum x`. Error in file Program.fs on line 6 starting at column 12 let x = List.fold (+) 0 [1;2;3] @@ -70,44 +85,22 @@ After refactoring again we have with no lint errors: printfn "%d" x 0 -#### Building The Tool - -On windows run `build.cmd` and on unix based systems run `build.sh`. - -#### Running The Tool - -FSharpLint can be used in several ways: - -* [Running as dotnet tool from command line](DotnetTool.html). -* [In VS Code using the Ionide-FSharp plugin](https://marketplace.visualstudio.com/items?itemName=Ionide.Ionide-fsharp). -* [In other IDEs (Visual Studio, Rider) as an MSBuild Task](MSBuildTask.html). -* [In other editors through FsAutoComplete Language Server](https://github.com/fsharp/FsAutoComplete) - -#### Rules - -See a full list of the available rules [here](Rules.html). Each rule has its own page with more information. - -#### Suppressing rules in code - -Rules can be disabled within the code using structured comments. See the [Suppressing Warnings](Suppression.html) page for more information. - -#### Configuration Files - -Configuration of the tool is done using JSON. Configuration files must be named: `fsharplint.json`. A single JSON file containing the default configuration for all rules is [included inside of the software](https://github.com/fsprojects/FSharpLint/blob/master/src/FSharpLint.Core/DefaultConfiguration.json). +## Configuration Files -By default, FSharpLint will try to load the configuration from the file `./fsharplint.json`. You can override this to point to a different file, for example by using the `--lint-config` flag in the dotnet tool. +Configuration of the tool is done using JSON. +A single JSON file containing the default configuration for all rules +is [included inside of the software](https://github.com/fsprojects/FSharpLint/blob/master/src/FSharpLint.Core/DefaultConfiguration.json). -#### Ignoring Files +By default, FSharpLint will use the default configuration. You can override this to point +to a different file, for example by using the `--lint-config` flag in the dotnet tool. -In the configuration file paths can be used to specify files that should be included, globs are used to match wildcard directories and files. For example the following will match all files with the file name assemblyinfo (the matching is case insensitive) with any extension: +See the [Rule Configuration page](/how-tos/rule-configuration.html) for more info. - { "ignoreFiles": ["assemblyinfo.*"] } +## Suppressing rules in code -* Directories in the path must be separated using `/` -* If the path ends with a `/` then everything inside of a matching directory shall be excluded. -* If the path does not end with a `/` then all matching files are excluded. +Rules can be disabled within the code using structured comments. See the [Suppressing Warnings](/how-tos/rule-suppression.html) page for more information. -#### Running Lint From An Application +## Running Lint From An Application Install the [`FSharp.Core` nuget package](https://www.nuget.org/packages/FSharpLint.Core/). diff --git a/docs-gen/markdown/DotnetTool.md b/docs/content/how-tos/install-dotnet-tool.md similarity index 90% rename from docs-gen/markdown/DotnetTool.md rename to docs/content/how-tos/install-dotnet-tool.md index 3160dedb2..69d996ffa 100644 --- a/docs-gen/markdown/DotnetTool.md +++ b/docs/content/how-tos/install-dotnet-tool.md @@ -1,3 +1,9 @@ +--- +title: Install Dotnet Tool +category: how-to +menu_order: 1 +--- + # Installing as dotnet tool The linter can be [installed as a dotnet tool](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-tool-install). diff --git a/docs-gen/markdown/MSBuildTask.md b/docs/content/how-tos/msbuild-task.md similarity index 91% rename from docs-gen/markdown/MSBuildTask.md rename to docs/content/how-tos/msbuild-task.md index 26b68a311..4e82aca01 100644 --- a/docs-gen/markdown/MSBuildTask.md +++ b/docs/content/how-tos/msbuild-task.md @@ -1,4 +1,10 @@ -# Running as MSBuildTask +--- +title: Setup MSBuild Task +category: how-to +menu_order: 2 +--- + +# Setup MSBuild Task FSharpLint can be run as an MSBuild task; this will result in lint warnings showing up in your IDE (Visual Studio/Rider). @@ -6,7 +12,6 @@ To set this up, first [install the FSharpLint dotnet tool](DotnetTool). Then, you can add the following to any of your projects to run linting after build completion for that project: - [lang=xml] ignore` ## Rule Settings - [lang=javascript] { - "favourIgnoreOverLetWild": { + "favourIgnoreOverLetWild": { "enabled": true } - } \ No newline at end of file + } diff --git a/docs-gen/markdown/rules/FL0056.md b/docs/content/how-tos/rules/FL0056.md similarity index 90% rename from docs-gen/markdown/rules/FL0056.md rename to docs/content/how-tos/rules/FL0056.md index 6b0097fae..0c524d508 100644 --- a/docs-gen/markdown/rules/FL0056.md +++ b/docs/content/how-tos/rules/FL0056.md @@ -1,3 +1,9 @@ +--- +title: FL0056 +category: how-to +hide_menu: true +--- + # WildcardNamedWithAsPattern (FL0056) ## Cause @@ -14,7 +20,6 @@ Replace the wildcard with the identifier the wildcard is currently being bound t ## Rule Settings - [lang=javascript] { "wildcardNamedWithAsPattern": { "enabled": true diff --git a/docs-gen/markdown/rules/FL0057.md b/docs/content/how-tos/rules/FL0057.md similarity index 64% rename from docs-gen/markdown/rules/FL0057.md rename to docs/content/how-tos/rules/FL0057.md index cd131e7bb..479de3e60 100644 --- a/docs-gen/markdown/rules/FL0057.md +++ b/docs/content/how-tos/rules/FL0057.md @@ -1,3 +1,9 @@ +--- +title: FL0057 +category: how-to +hide_menu: true +--- + # UselessBinding (FL0057) ## Cause @@ -14,9 +20,8 @@ Remove the binding. ## Rule Settings - [lang=javascript] { - "uselessBinding": { - "enabled": true + "uselessBinding": { + "enabled": true } - } \ No newline at end of file + } diff --git a/docs-gen/markdown/rules/FL0058.md b/docs/content/how-tos/rules/FL0058.md similarity index 88% rename from docs-gen/markdown/rules/FL0058.md rename to docs/content/how-tos/rules/FL0058.md index be26c840d..a4cea18f7 100644 --- a/docs-gen/markdown/rules/FL0058.md +++ b/docs/content/how-tos/rules/FL0058.md @@ -1,3 +1,9 @@ +--- +title: FL0058 +category: how-to +hide_menu: true +--- + # TupleOfWildcards (FL0058) ## Cause @@ -14,7 +20,6 @@ Replace the tuple with a single wildcard e.g. the example in the cause could be ## Rule Settings - [lang=javascript] { "tupleOfWildcards": { "enabled": true diff --git a/docs-gen/markdown/rules/FL0059.md b/docs/content/how-tos/rules/FL0059.md similarity index 85% rename from docs-gen/markdown/rules/FL0059.md rename to docs/content/how-tos/rules/FL0059.md index 481694743..6288b8b9b 100644 --- a/docs-gen/markdown/rules/FL0059.md +++ b/docs/content/how-tos/rules/FL0059.md @@ -1,3 +1,9 @@ +--- +title: FL0059 +category: how-to +hide_menu: true +--- + # Indentation (FL0059) ## Cause @@ -16,7 +22,6 @@ Update file to use consistent amount of spaces for indentation. Uses the `numIndentationSpaces` global setting. - [lang=javascript] { "indentation": { "enabled": false diff --git a/docs-gen/markdown/rules/FL0060.md b/docs/content/how-tos/rules/FL0060.md similarity index 88% rename from docs-gen/markdown/rules/FL0060.md rename to docs/content/how-tos/rules/FL0060.md index 0856cd081..ef95e4bc1 100644 --- a/docs-gen/markdown/rules/FL0060.md +++ b/docs/content/how-tos/rules/FL0060.md @@ -1,3 +1,9 @@ +--- +title: FL0060 +category: how-to +hide_menu: true +--- + # MaxCharactersOnLine (FL0060) ## Cause @@ -14,7 +20,6 @@ Break the line up into multiple lines. ## Rule Settings - [lang=javascript] { "maxCharactersOnLine": { "enabled": false, @@ -22,4 +27,4 @@ Break the line up into multiple lines. "maxCharactersOnLine": 120 } } - } \ No newline at end of file + } diff --git a/docs-gen/markdown/rules/FL0061.md b/docs/content/how-tos/rules/FL0061.md similarity index 94% rename from docs-gen/markdown/rules/FL0061.md rename to docs/content/how-tos/rules/FL0061.md index de3cd604d..d3113b3c5 100644 --- a/docs-gen/markdown/rules/FL0061.md +++ b/docs/content/how-tos/rules/FL0061.md @@ -1,3 +1,9 @@ +--- +title: FL0061 +category: how-to +hide_menu: true +--- + # TrailingWhitespaceOnLine (FL0061) ## Cause @@ -14,7 +20,6 @@ Remove any whitespace from the end of the line. ## Rule Settings - [lang=javascript] { "trailingWhitespaceOnLine": { "enabled": false, diff --git a/docs-gen/markdown/rules/FL0062.md b/docs/content/how-tos/rules/FL0062.md similarity index 86% rename from docs-gen/markdown/rules/FL0062.md rename to docs/content/how-tos/rules/FL0062.md index c4baa3907..dcd0622e7 100644 --- a/docs-gen/markdown/rules/FL0062.md +++ b/docs/content/how-tos/rules/FL0062.md @@ -1,3 +1,9 @@ +--- +title: FL0062 +category: how-to +hide_menu: true +--- + # MaxLinesInFile (FL0062) ## Cause @@ -14,7 +20,6 @@ Refactor to extract code out into another file. ## Rule Settings - [lang=javascript] { "maxLinesInFile": { "enabled": false, @@ -22,4 +27,4 @@ Refactor to extract code out into another file. "maxLinesInFile": 1000 } } - } \ No newline at end of file + } diff --git a/docs-gen/markdown/rules/FL0063.md b/docs/content/how-tos/rules/FL0063.md similarity index 71% rename from docs-gen/markdown/rules/FL0063.md rename to docs/content/how-tos/rules/FL0063.md index a985de069..9965095d9 100644 --- a/docs-gen/markdown/rules/FL0063.md +++ b/docs/content/how-tos/rules/FL0063.md @@ -1,3 +1,9 @@ +--- +title: FL0063 +category: how-to +hide_menu: true +--- + # TrailingNewLineInFile (FL0063) ## Cause @@ -14,9 +20,8 @@ Remove any new lines at the end of a file. ## Rule Settings - [lang=javascript] { - "trailingNewLineInFile": { + "trailingNewLineInFile": { "enabled": true } - } \ No newline at end of file + } diff --git a/docs-gen/markdown/rules/FL0064.md b/docs/content/how-tos/rules/FL0064.md similarity index 78% rename from docs-gen/markdown/rules/FL0064.md rename to docs/content/how-tos/rules/FL0064.md index 2f11366e7..cf771b1ab 100644 --- a/docs-gen/markdown/rules/FL0064.md +++ b/docs/content/how-tos/rules/FL0064.md @@ -1,3 +1,9 @@ +--- +title: FL0064 +category: how-to +hide_menu: true +--- + # NoTabCharacters (FL0064) ## Cause @@ -14,9 +20,8 @@ Replace the tab with spaces. ## Rule Settings - [lang=javascript] { - "noTabCharacters": { + "noTabCharacters": { "enabled": true } - } \ No newline at end of file + } diff --git a/docs-gen/markdown/rules/FL0065.md b/docs/content/how-tos/rules/FL0065.md similarity index 99% rename from docs-gen/markdown/rules/FL0065.md rename to docs/content/how-tos/rules/FL0065.md index 38d0cff25..5399cd6fc 100644 --- a/docs-gen/markdown/rules/FL0065.md +++ b/docs/content/how-tos/rules/FL0065.md @@ -1,3 +1,9 @@ +--- +title: FL0065 +category: how-to +hide_menu: true +--- + # Hints (FL0065) ## Introduction @@ -27,7 +33,6 @@ and suggest the following (which is equivalent): We can use variables here, the expression `(4 + 4)` can be matched by a variable and `(x + 77 * (9 * y))` by another, this is shown below using the variables `a` and `b`. - [lang=hint] not (a >= b) ===> a < b ### Match An Identifier diff --git a/docs/content/img/github-blue.png b/docs/content/img/github-blue.png deleted file mode 100644 index 57432a035..000000000 Binary files a/docs/content/img/github-blue.png and /dev/null differ diff --git a/docs/content/img/github.png b/docs/content/img/github.png deleted file mode 100644 index 5d48d83fa..000000000 Binary files a/docs/content/img/github.png and /dev/null differ diff --git a/docs/content/img/logo.pdn b/docs/content/img/logo.pdn deleted file mode 100644 index fa3869421..000000000 Binary files a/docs/content/img/logo.pdn and /dev/null differ diff --git a/docs/content/img/logo.png b/docs/content/img/logo.png deleted file mode 100644 index ce25a2e63..000000000 Binary files a/docs/content/img/logo.png and /dev/null differ diff --git a/docs/content/style.css b/docs/content/style.css deleted file mode 100644 index fa43d8de6..000000000 --- a/docs/content/style.css +++ /dev/null @@ -1,206 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans+Mono|Open+Sans:400,600,700); - -/*-------------------------------------------------------------------------- - Formatting for F# code snippets -/*--------------------------------------------------------------------------*/ - -/* identifier */ -span.i { color:#d1d1d1; } -/* string */ -span.s { color:#d4b43c; } -/* keywords */ -span.k { color:#4e98dc; } -/* comment */ -span.c { color:#96C71D; } -/* operators */ -span.o { color:#af75c1; } -/* numbers */ -span.n { color:#96C71D; } -/* line number */ -span.l { color:#80b0b0; } - -/* inactive code */ -span.inactive { color:#808080; } -/* preprocessor */ -span.prep { color:#af75c1; } -/* fsi output */ -span.fsi { color:#808080; } - -/* omitted */ -span.omitted { - background:#3c4e52; - border-radius:5px; - color:#808080; - padding:0px 0px 1px 0px; -} -/* tool tip */ -div.tip { - background:#475b5f; - border-radius:4px; - font:11pt 'Droid Sans', arial, sans-serif; - padding:6px 8px 6px 8px; - display:none; - color:#d1d1d1; -} -table.pre pre { - padding:0px; - margin:0px; - border:none; -} -table.pre, pre.fssnip, pre { - line-height:13pt; - border:1px solid #d8d8d8; - border-collapse:separate; - white-space:pre; - font: 9pt 'Droid Sans Mono',consolas,monospace; - width:90%; - margin:10px 20px 20px 20px; - background-color:#212d30; - padding:10px; - border-radius:5px; - color:#d1d1d1; -} -table.pre pre { - padding:0px; - margin:0px; - border-radius:0px; - width: 100%; -} -table.pre td { - padding:0px; - white-space:normal; - margin:0px; -} -table.pre td.lines { - width:30px; -} - -/*-------------------------------------------------------------------------- - Formatting for page & standard document content -/*--------------------------------------------------------------------------*/ - -body { - font-family: 'Open Sans', serif; - padding-top: 0px; - padding-bottom: 40px; -} - -pre { - word-wrap: inherit; -} - -/* Format the heading - nicer spacing etc. */ -.masthead { - overflow: hidden; -} -.masthead .muted a { - text-decoration:none; - color:#999999; -} -.masthead ul, .masthead li { - margin-bottom:0px; -} -.masthead .nav li { - margin-top: 15px; - font-size:110%; -} -.masthead h3 { - margin-bottom:5px; - font-size:170%; -} -hr { - margin:0px 0px 20px 0px; -} - -/* Make table headings and td.title bold */ -td.title, thead { - font-weight:bold; -} - -/* Format the right-side menu */ -#menu { - margin-top:50px; - font-size:11pt; - padding-left:20px; -} - -#menu .nav-header { - font-size:12pt; - color:#606060; - margin-top:20px; -} - -#menu li { - line-height:25px; -} - -/* Change font sizes for headings etc. */ -#main h1 { font-size: 26pt; margin:10px 0px 15px 0px; font-weight:400; } -#main h2 { font-size: 20pt; margin:20px 0px 0px 0px; font-weight:400; } -#main h3 { font-size: 14pt; margin:15px 0px 0px 0px; font-weight:600; } -#main p { font-size: 11pt; margin:5px 0px 15px 0px; } -#main ul { font-size: 11pt; margin-top:10px; } -#main li { font-size: 11pt; margin: 5px 0px 5px 0px; } -#main strong { font-weight:700; } - -/*-------------------------------------------------------------------------- - Formatting for API reference -/*--------------------------------------------------------------------------*/ - -.type-list .type-name, .module-list .module-name { - width:25%; - font-weight:bold; -} -.member-list .member-name { - width:35%; -} -#main .xmldoc h2 { - font-size:14pt; - margin:10px 0px 0px 0px; -} -#main .xmldoc h3 { - font-size:12pt; - margin:10px 0px 0px 0px; -} -.github-link { - float:right; - text-decoration:none; -} -.github-link img { - border-style:none; - margin-left:10px; -} -.github-link .hover { display:none; } -.github-link:hover .hover { display:block; } -.github-link .normal { display: block; } -.github-link:hover .normal { display: none; } - -/*-------------------------------------------------------------------------- - Additional formatting for the homepage -/*--------------------------------------------------------------------------*/ - -#nuget { - margin-top:20px; - font-size: 11pt; - padding:20px; -} - -#nuget pre { - font-size:11pt; - -moz-border-radius: 0px; - -webkit-border-radius: 0px; - border-radius: 0px; - background: #404040; - border-style:none; - color: #e0e0e0; - margin-top:15px; -} - -.code-wrapper { - overflow-x: auto; -} - -a.anchor { - color: inherit; - text-decoration: inherit; -} diff --git a/docs/content/tips.js b/docs/content/tips.js deleted file mode 100644 index 2b125bada..000000000 --- a/docs/content/tips.js +++ /dev/null @@ -1,46 +0,0 @@ -var currentTip = null; -var currentTipElement = null; - -function hideTip(evt, name, unique) { - var el = document.getElementById(name); - el.style.display = "none"; - currentTip = null; -} - -function findPos(obj) { - // no idea why, but it behaves differently in webbrowser component - if (window.location.search == "?inapp") - return [obj.offsetLeft + 10, obj.offsetTop + 30]; - - var curleft = 0; - var curtop = obj.offsetHeight; - while (obj) { - curleft += obj.offsetLeft; - curtop += obj.offsetTop; - obj = obj.offsetParent; - }; - return [curleft, curtop]; -} - -function hideUsingEsc(e) { - if (!e) { e = event; } - hideTip(e, currentTipElement, currentTip); -} - -function showTip(evt, name, unique, owner) { - document.onkeydown = hideUsingEsc; - if (currentTip == unique) return; - currentTip = unique; - currentTipElement = name; - - var pos = findPos(owner ? owner : (evt.srcElement ? evt.srcElement : evt.target)); - var posx = pos[0]; - var posy = pos[1]; - - var el = document.getElementById(name); - var parent = (document.documentElement == null) ? document.body : document.documentElement; - el.style.position = "absolute"; - el.style.left = posx + "px"; - el.style.top = posy + "px"; - el.style.display = "block"; -} \ No newline at end of file diff --git a/docs/generators/apiref.fsx b/docs/generators/apiref.fsx new file mode 100644 index 000000000..ca8262234 --- /dev/null +++ b/docs/generators/apiref.fsx @@ -0,0 +1,276 @@ +#r "../_lib/Fornax.Core.dll" +#r "../../packages/docs/Markdig/lib/netstandard2.0/Markdig.dll" +#r "../../packages/docs/Newtonsoft.Json/lib/netstandard2.0/Newtonsoft.Json.dll" +#r "../../packages/docs/FSharp.Formatting/lib/netstandard2.0/FSharp.MetadataFormat.dll" + +#if !FORNAX +#load "../loaders/apirefloader.fsx" +#endif + +#load "partials/layout.fsx" + +open System +open FSharp.MetadataFormat +open Html +open Apirefloader +open Markdig + +let markdownPipeline = + MarkdownPipelineBuilder() + .UsePipeTables() + .UseGridTables() + .Build() + +let getComment (c: Comment) = + let t = + c.RawData + |> List.map (fun n -> n.Value) + |> String.concat "\n\n" + Markdown.ToHtml(t, markdownPipeline) + + +let formatMember (m: Member) = + let attributes = + m.Attributes + |> List.filter (fun a -> a.FullName <> "Microsoft.FSharp.Core.CustomOperationAttribute") + + let hasCustomOp = + m.Attributes + |> List.exists (fun a -> a.FullName = "Microsoft.FSharp.Core.CustomOperationAttribute") + + let customOp = + if hasCustomOp then + m.Attributes + |> List.tryFind (fun a -> a.FullName = "Microsoft.FSharp.Core.CustomOperationAttribute") + |> Option.bind (fun a -> + a.ConstructorArguments + |> Seq.tryFind (fun x -> x :? string) + |> Option.map (fun x -> x.ToString()) + ) + |> Option.defaultValue "" + else + "" + + tr [] [ + td [] [ + code [] [!! m.Name] + br [] + + if hasCustomOp then + b [] [!! "CE Custom Operation: "] + code [] [!!customOp] + br [] + br [] + b [] [!! "Signature: "] + !!m.Details.Signature + br [] + if not (attributes.IsEmpty) then + b [] [!! "Attributes:"] + for a in attributes do + code [] [!! (a.Name)] + ] + td [] [!! (getComment m.Comment)] + ] + +let generateType ctx (page: ApiPageInfo) = + let t = page.Info + let body = + div [Class "api-page"] [ + h2 [] [!! t.Name] + b [] [!! "Namespace: "] + a [Href (sprintf "%s.html" page.NamespaceUrlName) ] [!! page.NamespaceName] + br [] + b [] [!! "Parent: "] + a [Href (sprintf "%s.html" page.ParentUrlName)] [!! page.ParentName] + span [] [!! (getComment t.Comment)] + br [] + if not (String.IsNullOrWhiteSpace t.Category) then + b [] [!! "Category:"] + !!t.Category + br [] + if not (t.Attributes.IsEmpty) then + b [] [!! "Attributes:"] + for a in t.Attributes do + br [] + code [] [!! (a.Name)] + br [] + + table [] [ + tr [] [ + th [ Width "35%" ] [!!"Name"] + th [ Width "65%"] [!!"Description"] + ] + if not t.Constructors.IsEmpty then tr [] [ td [ColSpan 3. ] [ b [] [!! "Constructors"]]] + yield! t.Constructors |> List.map formatMember + + if not t.InstanceMembers.IsEmpty then tr [] [ td [ColSpan 3. ] [ b [] [!! "Instance Members"]]] + yield! t.InstanceMembers |> List.map formatMember + + if not t.RecordFields.IsEmpty then tr [] [ td [ColSpan 3. ] [ b [] [!! "Record Fields"]]] + yield! t.RecordFields |> List.map formatMember + + if not t.StaticMembers.IsEmpty then tr [] [ td [ColSpan 3. ] [ b [] [!! "Static Members"]]] + yield! t.StaticMembers |> List.map formatMember + + if not t.StaticParameters.IsEmpty then tr [] [ td [ColSpan 3. ] [ b [] [!! "Static Parameters"]]] + yield! t.StaticParameters |> List.map formatMember + + if not t.UnionCases.IsEmpty then tr [] [ td [ColSpan 3. ] [ b [] [!! "Union Cases"]]] + yield! t.UnionCases |> List.map formatMember + ] + ] + t.UrlName, Layout.layout ctx [body] t.Name + +let generateModule ctx (page: ApiPageInfo) = + let m = page.Info + let body = + div [Class "api-page"] [ + h2 [] [!!m.Name] + b [] [!! "Namespace: "] + a [Href (sprintf "%s.html" page.NamespaceUrlName) ] [!! page.NamespaceName] + br [] + b [] [!! "Parent: "] + a [Href (sprintf "%s.html" page.ParentUrlName)] [!! page.ParentName] + span [] [!! (getComment m.Comment)] + br [] + if not (String.IsNullOrWhiteSpace m.Category) then + b [] [!! "Category:"] + !!m.Category + br [] + + if not m.NestedTypes.IsEmpty then + b [] [!! "Declared Types"] + table [] [ + tr [] [ + th [ Width "35%" ] [!!"Type"] + th [ Width "65%"] [!!"Description"] + ] + for t in m.NestedTypes do + tr [] [ + td [] [a [Href (sprintf "%s.html" t.UrlName )] [!! t.Name ]] + td [] [!! (getComment t.Comment)] + ] + ] + br [] + + if not m.NestedModules.IsEmpty then + b [] [!! "Declared Modules"] + table [] [ + tr [] [ + th [ Width "35%" ] [!!"Module"] + th [ Width "65%"] [!!"Description"] + ] + for t in m.NestedModules do + tr [] [ + td [] [a [Href (sprintf "%s.html" t.UrlName )] [!! t.Name ]] + td [] [!! (getComment t.Comment)] + ] + ] + br [] + + if not m.ValuesAndFuncs.IsEmpty then + b [] [!! "Values and Functions"] + table [] [ + tr [] [ + th [ Width "35%" ] [!!"Name"] + th [ Width "65%"] [!!"Description"] + ] + yield! m.ValuesAndFuncs |> List.map formatMember + ] + br [] + + if not m.TypeExtensions.IsEmpty then + b [] [!! "Type Extensions"] + table [] [ + tr [] [ + th [ Width "35%" ] [!!"Name"] + th [ Width "65%"] [!!"Description"] + ] + yield! m.TypeExtensions |> List.map formatMember + ] + ] + m.UrlName, Layout.layout ctx [body] m.Name + +let generateNamespace ctx (n: Namespace) = + let body = + div [Class "api-page"] [ + h2 [] [!!n.Name] + + if not n.Types.IsEmpty then + + b [] [!! "Declared Types"] + table [] [ + tr [] [ + th [ Width "35%" ] [!!"Type"] + th [ Width "65%"] [!!"Description"] + ] + for t in n.Types do + tr [] [ + td [] [a [Href (sprintf "%s.html" t.UrlName )] [!! t.Name ]] + td [] [!!(getComment t.Comment)] + ] + ] + br [] + + if not n.Modules.IsEmpty then + + b [] [!! "Declared Modules"] + table [] [ + tr [] [ + th [ Width "35%" ] [!!"Module"] + th [ Width "65%"] [!!"Description"] + ] + for t in n.Modules do + tr [] [ + td [] [a [Href (sprintf "%s.html" t.UrlName )] [!! t.Name ]] + td [] [!! (getComment t.Comment)] + ] + ] + ] + n.Name, Layout.layout ctx [body] (n.Name) + + +let generate' (ctx : SiteContents) = + let all = ctx.TryGetValues() + match all with + | None -> [] + | Some all -> + all + |> Seq.toList + |> List.collect (fun n -> + let name = n.GeneratorOutput.AssemblyGroup.Name + let namespaces = + n.GeneratorOutput.AssemblyGroup.Namespaces + |> List.map (generateNamespace ctx) + + let modules = + n.Modules + |> Seq.map (generateModule ctx) + + let types = + n.Types + |> Seq.map (generateType ctx) + + let ref = + Layout.layout ctx [ + h1 [] [!! name ] + b [] [!! "Declared namespaces"] + br [] + for (n, _) in namespaces do + a [Href (sprintf "%s.html" n)] [!!n] + br [] + ] n.Label + + [("index" , ref); yield! namespaces; yield! modules; yield! types] + |> List.map (fun (x, y) -> (sprintf "%s/%s" n.Label x), y) + ) + + +let generate (ctx : SiteContents) (projectRoot: string) (page: string) = + try + generate' ctx + |> List.map (fun (n,b) -> n, (Layout.render ctx b)) + with + | ex -> + printfn "ERROR IN API REF GENERATION:\n%A" ex + [] diff --git a/docs/generators/lunr.fsx b/docs/generators/lunr.fsx new file mode 100644 index 000000000..eaceafd3f --- /dev/null +++ b/docs/generators/lunr.fsx @@ -0,0 +1,83 @@ +#r "../_lib/Fornax.Core.dll" +#r "../../packages/docs/Newtonsoft.Json/lib/netstandard2.0/Newtonsoft.Json.dll" +#r "../../packages/docs/FSharp.Formatting/lib/netstandard2.0/FSharp.MetadataFormat.dll" +#if !FORNAX +#load "../loaders/contentloader.fsx" +#load "../loaders/apirefloader.fsx" +#load "../loaders/globalloader.fsx" + +#endif + +open Apirefloader +open FSharp.MetadataFormat + + +type Entry = { + uri: string + title: string + content: string +} +let generate (ctx : SiteContents) (projectRoot: string) (page: string) = + let siteInfo = ctx.TryGetValue().Value + let rootUrl = siteInfo.root_url + + let pages = ctx.TryGetValues () |> Option.defaultValue Seq.empty + let entries = + pages + |> Seq.map (fun n -> + {uri = rootUrl + "/" + n.link.Replace("content/", ""); title = n.title; content = n.text} + ) + + let all = ctx.TryGetValues() + let refs = + match all with + | None -> [] + | Some all -> + all + |> Seq.toList + |> List.collect (fun n -> + let generatorOutput = n.GeneratorOutput + let allModules = n.Modules + let allTypes = n.Types + + let gen = + let ctn = + sprintf "%s \n %s" generatorOutput.AssemblyGroup.Name (generatorOutput.AssemblyGroup.Namespaces |> Seq.map (fun n -> n.Name) |> String.concat " ") + {uri = (rootUrl + sprintf "/reference/%s/index.html" n.Label ); title = sprintf "%s - API Reference" n.Label; content = ctn } + + let mdlsGen = + allModules + |> Seq.map (fun m -> + let m = m.Info + let cnt = + sprintf "%s \n %s \n %s \n %s \n %s \n %s" + m.Name + m.Comment.FullText + (m.NestedModules |> List.map (fun m -> m.Name + " " + m.Comment.FullText ) |> String.concat " ") + (m.NestedTypes |> List.map (fun m -> m.Name + " " + m.Comment.FullText ) |> String.concat " ") + (m.ValuesAndFuncs |> List.map (fun m -> m.Name + " " + m.Comment.FullText ) |> String.concat " ") + (m.TypeExtensions |> List.map (fun m -> m.Name + " " + m.Comment.FullText ) |> String.concat " ") + + + {uri = rootUrl + sprintf "/reference/%s/%s.html" n.Label m.UrlName ; title = m.Name; content = cnt } + ) + + let tsGen = + allTypes + |> Seq.map (fun m -> + let m = m.Info + let cnt = + sprintf "%s \n %s \n %s" + m.Name + m.Comment.FullText + (m.AllMembers |> List.map (fun m -> m.Name + " " + m.Comment.FullText ) |> String.concat " ") + + + {uri = rootUrl + sprintf "/reference/%s/%s.html" n.Label m.UrlName ; title = m.Name; content = cnt } + ) + [yield! entries; gen; yield! mdlsGen; yield! tsGen] + ) + + [|yield! entries; yield! refs|] + |> Newtonsoft.Json.JsonConvert.SerializeObject + diff --git a/docs/generators/page.fsx b/docs/generators/page.fsx new file mode 100644 index 000000000..8768ee412 --- /dev/null +++ b/docs/generators/page.fsx @@ -0,0 +1,21 @@ +#r "../_lib/Fornax.Core.dll" +#load "partials/layout.fsx" + +open Html + + +let generate' (ctx : SiteContents) (page: string) = + let posts = + ctx.TryGetValues () + |> Option.defaultValue Seq.empty + let post = posts |> Seq.find (fun n -> "content/" + n.file = page) + Layout.layout ctx [ !! post.content ] post.title + +let generate (ctx : SiteContents) (projectRoot: string) (page: string) = + try + generate' ctx page + |> Layout.render ctx + with + | ex -> + printfn "ERROR IN PAGE GENERATION:\n%A" ex + "" diff --git a/docs/generators/partials/footer.fsx b/docs/generators/partials/footer.fsx new file mode 100644 index 000000000..74f47a586 --- /dev/null +++ b/docs/generators/partials/footer.fsx @@ -0,0 +1,37 @@ +#r "../../_lib/Fornax.Core.dll" +#if !FORNAX +#load "../../loaders/contentloader.fsx" +#load "../../loaders/pageloader.fsx" +#load "../../loaders/globalloader.fsx" +#endif + +open Html + + + +let footer (ctx : SiteContents) = + let siteInfo = ctx.TryGetValue().Value + let rootUrl = siteInfo.root_url + + [ + div [Custom("style", "left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;")] [ + div [Custom("style", "border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;")] [] + ] + script [Src (rootUrl + "/static/js/clipboard.min.js")] [] + script [Src (rootUrl + "/static/js/perfect-scrollbar.min.js")] [] + script [Src (rootUrl + "/static/js/perfect-scrollbar.jquery.min.js")] [] + script [Src (rootUrl + "/static/js/jquery.sticky.js")] [] + script [Src (rootUrl + "/static/js/featherlight.min.js")] [] + + script [Src (rootUrl + "/static/js/modernizr.custom-3.6.0.js")] [] + script [Src (rootUrl + "/static/js/learn.js")] [] + script [Src (rootUrl + "/static/js/hugo-learn.js")] [] + link [Rel "stylesheet"; Href (rootUrl + "/static/mermaid/mermaid.css")] + script [Src (rootUrl + "/static/mermaid/mermaid.js")] [] + script [] [!! "mermaid.initialize({ startOnLoad: true });"] + script [Src "//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/highlight.min.js"] [] + script [Src "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/fsharp.min.js"] [] + script [] [ + !! "hljs.initHighlightingOnLoad()" + ] + ] diff --git a/docs/generators/partials/header.fsx b/docs/generators/partials/header.fsx new file mode 100644 index 000000000..b9125837d --- /dev/null +++ b/docs/generators/partials/header.fsx @@ -0,0 +1,31 @@ +#r "../../_lib/Fornax.Core.dll" +#if !FORNAX +#load "../../loaders/contentloader.fsx" +#load "../../loaders/pageloader.fsx" +#load "../../loaders/globalloader.fsx" +#endif + +open Html + +let header (ctx : SiteContents) page = + let siteInfo = ctx.TryGetValue().Value + let rootUrl = siteInfo.root_url + + head [] [ + meta [CharSet "utf-8"] + meta [Name "viewport"; Content "width=device-width, initial-scale=1"] + title [] [!! (siteInfo.title + " | " + page)] + link [Rel "icon"; Type "image/png"; Sizes "32x32"; Href (rootUrl + "/static/images/favicon.png")] + link [Rel "stylesheet"; Href (rootUrl + "/static/css/nucleus.css")] + link [Rel "stylesheet"; Href (rootUrl + "/static/css/fontawesome-all.min.css")] + link [Rel "stylesheet"; Href (rootUrl + "/static/css/hybrid.css")] + link [Rel "stylesheet"; Href (rootUrl + "/static/css/featherlight.min.css")] + link [Rel "stylesheet"; Href (rootUrl + "/static/css/perfect-scrollbar.min.css")] + link [Rel "stylesheet"; Href (rootUrl + "/static/css/auto-complete.css")] + link [Rel "stylesheet"; Href (rootUrl + "/static/css/atom-one-dark-reasonable.css")] + link [Rel "stylesheet"; Href (rootUrl + "/static/css/theme.css")] + link [Rel "stylesheet"; Href "//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/atom-one-dark.min.css"] + if siteInfo.theme_variant.IsSome then + link [Rel "stylesheet"; Href (rootUrl + (sprintf "/static/css/theme-%s.css" siteInfo.theme_variant.Value))] + script [Src (rootUrl + "/static/js/jquery-3.3.1.min.js")] [] + ] diff --git a/docs/generators/partials/layout.fsx b/docs/generators/partials/layout.fsx new file mode 100644 index 000000000..62262c067 --- /dev/null +++ b/docs/generators/partials/layout.fsx @@ -0,0 +1,65 @@ +#r "../../_lib/Fornax.Core.dll" +#if !FORNAX +#load "../../loaders/contentloader.fsx" +#load "../../loaders/pageloader.fsx" +#load "../../loaders/globalloader.fsx" +#endif +#load "menu.fsx" +#load "header.fsx" +#load "footer.fsx" + +open Html + +let injectWebsocketCode (webpage:string) = + let websocketScript = + """ + + """ + let head = "" + let index = webpage.IndexOf head + webpage.Insert ( (index + head.Length + 1),websocketScript) + + +let layout (ctx : SiteContents) bodyCnt (page: string) = + + html [Class "js csstransforms3d"] [ + Header.header ctx page + body [] [ + Menu.menu ctx page + section [Id "body"] [ + div [Id "overlay"] [] + div [ Class "padding highlightable"] [ + div [Id "body-inner"] [ + span [Id "sidebar-toggle-span"] [ + a [Href "#"; Id "sidebar-toggle"; Custom("data-sidebar-toggle", "") ] [ + i [Class "fas fa-bars"] [] + !! " navigation" + ] + ] + yield! bodyCnt + ] + ] + ] + yield! Footer.footer ctx + ] + ] + +let render (ctx : SiteContents) cnt = + let disableLiveRefresh = ctx.TryGetValue () |> Option.map (fun n -> n.disableLiveRefresh) |> Option.defaultValue false + cnt + |> HtmlElement.ToString + |> fun n -> if disableLiveRefresh then n else injectWebsocketCode n diff --git a/docs/generators/partials/menu.fsx b/docs/generators/partials/menu.fsx new file mode 100644 index 000000000..c90efb6b8 --- /dev/null +++ b/docs/generators/partials/menu.fsx @@ -0,0 +1,146 @@ +#r "../../_lib/Fornax.Core.dll" +#if !FORNAX +#load "../../loaders/apirefloader.fsx" +#load "../../loaders/contentloader.fsx" +#load "../../loaders/pageloader.fsx" +#load "../../loaders/globalloader.fsx" +#endif + +open Html + + +let menu (ctx : SiteContents) (page: string) = + let shortcuts = ctx.GetValues () + let all = ctx.GetValues() + + let content = ctx.GetValues () + let siteInfo = ctx.TryGetValue().Value + let rootUrl = siteInfo.root_url + + let group = content |> Seq.tryFind (fun n -> n.title = page) |> Option.map (fun n -> n.category) + + let explenations = + content + |> Seq.filter (fun n -> n.category = Contentloader.Explanation && not n.hide_menu ) + |> Seq.sortBy (fun n -> n.menu_order) + + let tutorials = + content + |> Seq.filter (fun n -> n.category = Contentloader.Tutorial && not n.hide_menu ) + |> Seq.sortBy (fun n -> n.menu_order) + + let howtos = + content + |> Seq.filter (fun n -> n.category = Contentloader.HowTo && not n.hide_menu ) + |> Seq.sortBy (fun n -> n.menu_order) + + let hasTutorials = not (Seq.isEmpty tutorials) + let hasExplenations = not (Seq.isEmpty explenations) + let hasHowTos = not (Seq.isEmpty howtos) + + let menuHeader = + [ + if hasExplenations then + li [Id "menu-explanations"; if group = Some Contentloader.Explanation then Class "dd-item menu-group-link menu-group-link-active" else Class "dd-item menu-group-link"; ] [ + a [] [!! "Explanation"] + ] + if hasTutorials then + li [Id "menu-tutorials"; if group = Some Contentloader.Tutorial then Class "dd-item menu-group-link menu-group-link-active" else Class "dd-item menu-group-link"; ] [ + a [] [!! "Tutorials"] + ] + if hasHowTos then + li [Id "menu-howtos"; if group = Some Contentloader.HowTo then Class "dd-item menu-group-link menu-group-link-active" else Class "dd-item menu-group-link"; ] [ + a [] [!! "How-To Guides"] + ] + li [ Id "menu-refs"; if group = None then Class "dd-item menu-group-link menu-group-link-active" else Class "dd-item menu-group-link";] [ + a [] [!! "API References"] + ] + ] + + let renderExpls = + ul [Id "submenu-explanations"; if group = Some Contentloader.Explanation then Class "submenu submenu-active" else Class "submenu"; ] [ + for r in explenations -> + li [] [ + a [Href (rootUrl + "/" + r.link); if r.title = page then Class "active-link padding" else Class "padding"] [ + !! r.title + ] + ] + ] + + let renderTuts = + ul [Id "submenu-tutorials"; if group = Some Contentloader.Tutorial then Class "submenu submenu-active" else Class "submenu"; ] [ + for r in tutorials -> + li [] [ + a [ Href (rootUrl + "/" + r.link); if r.title = page then Class "active-link padding" else Class "padding" ] [ + !! r.title + ] + ] + ] + + let renderHowTos = + ul [Id "submenu-howtos"; if group = Some Contentloader.HowTo then Class "submenu submenu-active" else Class "submenu"; ] [ + for r in howtos -> + li [] [ + a [Href (rootUrl + "/" + r.link); if r.title = page then Class "active-link padding" else Class "padding" ] [ + !! r.title + ] + ] + ] + + let renderRefs = + ul [Id "submenu-refs"; if group = None then Class "submenu submenu-active" else Class "submenu"; ] [ + for r in all -> + li [] [ + a [Href (rootUrl + "/reference/" + r.Label + "/index.html"); if r.Label = page then Class "active-link padding" else Class "padding" ] [ + !! r.Label + ] + ] + ] + + let renderShortucuts = + section [Id "shortcuts"] [ + h3 [] [!! "Shortucts"] + ul [] [ + for s in shortcuts do + yield + li [] [ + a [Class "padding"; Href s.link ] [ + i [Class s.icon] [] + !! s.title + ] + ] + ] + ] + + let renderFooter = + section [Id "footer"] [ + !! """

Built with Fornax""" + ] + + + nav [Id "sidebar"] [ + div [Id "header-wrapper"] [ + div [Id "header"] [ + h2 [Id "logo"] [!! siteInfo.title] + ] + div [Class "searchbox"] [ + label [Custom("for", "search-by")] [i [Class "fas fa-search"] []] + input [Custom ("data-search-input", ""); Id "search-by"; Type "search"; Placeholder "Search..."] + span [Custom ("data-search-clear", "")] [i [Class "fas fa-times"] []] + ] + script [Type "text/javascript"; Src (rootUrl + "/static/js/lunr.min.js")] [] + script [Type "text/javascript"; Src (rootUrl + "/static/js/auto-complete.js")] [] + script [Type "text/javascript";] [!! (sprintf "var baseurl ='%s'" rootUrl)] + script [Type "text/javascript"; Src (rootUrl + "/static/js/search.js")] [] + ] + div [Class "highlightable"] [ + ul [Class "topics"] menuHeader + if hasExplenations then renderExpls + if hasTutorials then renderTuts + if hasHowTos then renderHowTos + renderRefs + renderShortucuts + renderFooter + ] + ] + diff --git a/docs/index.html b/docs/index.html index e4ee32d9b..9545bc044 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,226 +1,10 @@ - + - - - FSharpLint - - - - - - - - - - - - - - -

- -
-
-
-

FSharpLint

-

FSharpLint is a lint tool for F#. It can be run as a dotnet tool, and also integrates with Ionide for VS Code.

-
-

The term [lint] is now applied generically to tools that flag suspicious usage in software written in any computer language - Wikipedia

-
-

Using a .fsproj (F# project) or .sln (F# solution) file the tool will analyse all of the F# implementation files in the project/solution looking for code that breaks a set of rules governing the style of the code. Examples of rules: lambda functions must be less than 6 lines long, class member identifiers must be PascalCase.

-

Example Usage of the Tool

-

The following program:

- - - -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
type ExampleInterface =
-   abstract member print : unit -> unit
-
-[<EntryPoint>]
-let main argv =
-    let x = List.fold (fun x y -> x + y) 0 [1;2;3]
-    printfn "%d" x
-    0
-
-

Run against the lint tool generates the following errors:

- -
 1: 
- 2: 
- 3: 
- 4: 
- 5: 
- 6: 
- 7: 
- 8: 
- 9: 
-10: 
-11: 
-12: 
-13: 
-14: 
-15: 
-

-
-FL0036: Consider changing `ExampleInterface` to be prefixed with `I`.
-Consider changing `ExampleInterface` to be prefixed with `I`.
-Error in file Program.fs on line 1 starting at column 5
-type ExampleInterface =
-     ^
-
-FL0045: Consider changing `print` to PascalCase.
-Error in file Program.fs on line 2 starting at column 19
-   abstract member print : unit -> unit
-                   ^
-
-FL0034: If `( + )` has no mutable arguments partially applied then the lambda can be removed.
-Error in file Program.fs on line 6 starting at column 23
-    let x = List.fold (fun x y -> x + y) 0 [1;2;3]
-                       ^
-
-

Refactored using lint's warnings:

- - - -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
type IExampleInterface =
-   abstract member Print : unit -> unit
-
-[<EntryPoint>]
-let main argv =
-    let x = List.fold (+) 0 [1;2;3]
-    printfn "%d" x
-    0
-
-

If we run lint again it will find a new error, it's worth running the tool until it no longer finds any errors:

- -
1: 
-2: 
-3: 
-4: 
-
FL0065: `List.fold ( + ) 0 x` might be able to be refactored into `List.sum x`.
-Error in file Program.fs on line 6 starting at column 12
-let x = List.fold (+) 0 [1;2;3]
-        ^
-
-

After refactoring again we have with no lint errors:

- - - -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
type IExampleInterface =
-   abstract member Print : unit -> unit
-
-[<EntryPoint>]
-let main argv =
-    let x = List.sum [1;2;3]
-    printfn "%d" x
-    0
-
-

Building The Tool

-

On windows run build.cmd and on unix based systems run build.sh.

-

Running The Tool

-

FSharpLint can be used in several ways:

- -

Rules

-

See a full list of the available rules here. Each rule has its own page with more information.

-

Suppressing rules in code

-

Rules can be disabled within the code using structured comments. See the Suppressing Warnings page for more information.

-

Configuration Files

-

Configuration of the tool is done using JSON. Configuration files must be named: fsharplint.json. A single JSON file containing the default configuration for all rules is included inside of the software.

-

By default, FSharpLint will try to load the configuration from the file ./fsharplint.json. You can override this to point to a different file, for example by using the --lint-config flag in the dotnet tool.

-

Ignoring Files

-

In the configuration file paths can be used to specify files that should be included, globs are used to match wildcard directories and files. For example the following will match all files with the file name assemblyinfo (the matching is case insensitive) with any extension:

-

{ "ignoreFiles": ["assemblyinfo.*"] }

-
    -
  • Directories in the path must be separated using /
  • -
  • If the path ends with a / then everything inside of a matching directory shall be excluded.
  • -
  • If the path does not end with a / then all matching files are excluded.
  • -
-

Running Lint From An Application

-

Install the FSharp.Core nuget package.

-

The namespace FSharpLint.Application contains a module named Lint which provides several functions -to lint a project/source file/source string.

- -
type ExampleInterface =
  interface
    abstract member print : unit -> unit
  end
-
type unit = Unit
-
Multiple items
type EntryPointAttribute =
  inherit Attribute
  new : unit -> EntryPointAttribute

--------------------
new : unit -> EntryPointAttribute
-
val main : argv:string [] -> int
-
val argv : string []
-
val x : int
-
Multiple items
module List

from Microsoft.FSharp.Collections

--------------------
type List<'T> =
  | ( [] )
  | ( :: ) of Head: 'T * Tail: 'T list
    interface IReadOnlyList<'T>
    interface IReadOnlyCollection<'T>
    interface IEnumerable
    interface IEnumerable<'T>
    member GetSlice : startIndex:int option * endIndex:int option -> 'T list
    member Head : 'T
    member IsEmpty : bool
    member Item : index:int -> 'T with get
    member Length : int
    member Tail : 'T list
    ...
-
val fold : folder:('State -> 'T -> 'State) -> state:'State -> list:'T list -> 'State
-
val y : int
-
val printfn : format:Printf.TextWriterFormat<'T> -> 'T
-
type IExampleInterface =
  interface
    abstract member Print : unit -> unit
  end
-
val sum : list:'T list -> 'T (requires member ( + ) and member get_Zero)
- -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - + + + + + + + + diff --git a/docs/loaders/apirefloader.fsx b/docs/loaders/apirefloader.fsx new file mode 100644 index 000000000..0e75204ed --- /dev/null +++ b/docs/loaders/apirefloader.fsx @@ -0,0 +1,72 @@ +#r "../_lib/Fornax.Core.dll" +#r "../../packages/docs/FSharp.Formatting/lib/netstandard2.0/FSharp.MetadataFormat.dll" + +open System +open System.IO +open FSharp.MetadataFormat + +type ApiPageInfo<'a> = { + ParentName: string + ParentUrlName: string + NamespaceName: string + NamespaceUrlName: string + Info: 'a +} + +type AssemblyEntities = { + Label: string + Modules: ApiPageInfo list + Types: ApiPageInfo list + GeneratorOutput: GeneratorOutput +} + +let rec collectModules pn pu nn nu (m: Module) = + [ + yield { ParentName = pn; ParentUrlName = pu; NamespaceName = nn; NamespaceUrlName = nu; Info = m} + yield! m.NestedModules |> List.collect (collectModules m.Name m.UrlName nn nu ) + ] + + +let loader (projectRoot: string) (siteContet: SiteContents) = + try + let dlls = + [ + "FSharpLint.Core", Path.Combine(projectRoot, "..", "build", "FSharpLint.Core.dll") + ] + let libs = + [ + Path.Combine (projectRoot, "..", "build") + ] + for (label, dll) in dlls do + let output = MetadataFormat.Generate(dll, markDownComments = true, publicOnly = true, libDirs = libs) + + let allModules = + output.AssemblyGroup.Namespaces + |> List.collect (fun n -> + List.collect (collectModules n.Name n.Name n.Name n.Name) n.Modules + ) + + let allTypes = + [ + yield! + output.AssemblyGroup.Namespaces + |> List.collect (fun n -> + n.Types |> List.map (fun t -> {ParentName = n.Name; ParentUrlName = n.Name; NamespaceName = n.Name; NamespaceUrlName = n.Name; Info = t} ) + ) + yield! + allModules + |> List.collect (fun n -> + n.Info.NestedTypes |> List.map (fun t -> {ParentName = n.Info.Name; ParentUrlName = n.Info.UrlName; NamespaceName = n.NamespaceName; NamespaceUrlName = n.NamespaceUrlName; Info = t}) ) + ] + let entities = { + Label = label + Modules = allModules + Types = allTypes + GeneratorOutput = output + } + siteContet.Add entities + with + | ex -> + printfn "%A" ex + + siteContet diff --git a/docs/loaders/contentloader.fsx b/docs/loaders/contentloader.fsx new file mode 100644 index 000000000..c101a5ca3 --- /dev/null +++ b/docs/loaders/contentloader.fsx @@ -0,0 +1,136 @@ +open System +#r "../_lib/Fornax.Core.dll" +#r "../../packages/docs/Markdig/lib/netstandard2.0/Markdig.dll" + +open Markdig +open System.IO + +type PostConfig = { + disableLiveRefresh: bool +} + +///This is following documentation structure described here https://documentation.divio.com/ +type PostCategory = + | Tutorial + | Explanation + | HowTo + | TopLevel + | ApiRef + +with + static member Parse x = + match x with + | "tutorial" -> Tutorial + | "explanation" -> Explanation + | "how-to" -> HowTo + | "top-level" -> TopLevel + | _ -> failwith "Unsupported category" + +type Post = { + file: string + link : string + title: string + content: string + text: string + menu_order: int + hide_menu: bool + category: PostCategory +} + + +let markdownPipeline = + MarkdownPipelineBuilder() + .UsePipeTables() + .UseGridTables() + .Build() + +let isSeparator (input : string) = + input.StartsWith "---" + +///`fileContent` - content of page to parse. Usually whole content of `.md` file +///returns content of config that should be used for the page +let getConfig (fileContent : string) = + let fileContent = fileContent.Split '\n' + let fileContent = fileContent |> Array.skip 1 //First line must be --- + let indexOfSeperator = fileContent |> Array.findIndex isSeparator + fileContent + |> Array.splitAt indexOfSeperator + |> fst + |> String.concat "\n" + +///`fileContent` - content of page to parse. Usually whole content of `.md` file +///returns HTML version of content of the page +let getContent (fileContent : string) = + let fileContent = fileContent.Split '\n' + let fileContent = fileContent |> Array.skip 1 //First line must be --- + let indexOfSeperator = fileContent |> Array.findIndex isSeparator + let _, content = fileContent |> Array.splitAt indexOfSeperator + + let content = content |> Array.skip 1 |> String.concat "\n" + content, Markdown.ToHtml(content, markdownPipeline) + +let trimString (str : string) = + str.Trim().TrimEnd('"').TrimStart('"') + +let relative toPath fromPath = + let toUri = Uri(toPath) + let fromUri = Uri(fromPath) + toUri.MakeRelativeUri(fromUri).OriginalString + +let loadFile projectRoot n = + let text = System.IO.File.ReadAllText n + + let config = (getConfig text).Split( '\n') |> List.ofArray + + let (text, content) = getContent text + + let file = relative (Path.Combine(projectRoot, "content") + string Path.DirectorySeparatorChar) n + let link = Path.ChangeExtension(file, ".html") + + let title = config |> List.find (fun n -> n.ToLower().StartsWith "title" ) |> fun n -> n.Split(':').[1] |> trimString + + let menu_order = + try + let n = config |> List.find (fun n -> n.ToLower().StartsWith "menu_order" ) + n.Split(':').[1] |> trimString |> System.Int32.Parse + with + | _ -> 10 + + let hide = + try + let n = config |> List.find (fun n -> n.ToLower().StartsWith "hide_menu" ) + n.Split(':').[1] |> trimString |> System.Boolean.Parse + with + | _ -> false + + let category = + let n = config |> List.find (fun n -> n.ToLower().StartsWith "category" ) + n.Split(':').[1] |> trimString |> PostCategory.Parse + + + { file = file + link = link + title = title + content = content + menu_order = menu_order + hide_menu = hide + text = text + category = category } + +let loader (projectRoot: string) (siteContet: SiteContents) = + try + let postsPath = System.IO.Path.Combine(projectRoot, "content") + let posts = + Directory.GetFiles(postsPath, "*", SearchOption.AllDirectories ) + |> Array.filter (fun n -> n.EndsWith ".md") + |> Array.map (loadFile projectRoot) + + posts + |> Array.iter (fun p -> siteContet.Add p) + + siteContet.Add({disableLiveRefresh = true}) + with + | ex -> printfn "EX: %A" ex + + siteContet + diff --git a/docs/loaders/copyloader.fsx b/docs/loaders/copyloader.fsx new file mode 100644 index 000000000..01d3fdc58 --- /dev/null +++ b/docs/loaders/copyloader.fsx @@ -0,0 +1,22 @@ +#r "../_lib/Fornax.Core.dll" + +open System.IO + + +let loader (projectRoot: string) (siteContet: SiteContents) = + let intputPath = Path.Combine(projectRoot, "static") + let outputPath = Path.Combine(projectRoot, "_public", "static") + if Directory.Exists outputPath then Directory.Delete(outputPath, true) + Directory.CreateDirectory outputPath |> ignore + + for dirPath in Directory.GetDirectories(intputPath, "*", SearchOption.AllDirectories) do + Directory.CreateDirectory(dirPath.Replace(intputPath, outputPath)) |> ignore + + for filePath in Directory.GetFiles(intputPath, "*.*", SearchOption.AllDirectories) do + File.Copy(filePath, filePath.Replace(intputPath, outputPath), true) + + let intputPath = Path.Combine(projectRoot, "index.html") + let outputPath = Path.Combine(projectRoot, "_public", "index.html") + File.Copy(intputPath, outputPath, true) + + siteContet \ No newline at end of file diff --git a/docs/loaders/globalloader.fsx b/docs/loaders/globalloader.fsx new file mode 100644 index 000000000..23c30f674 --- /dev/null +++ b/docs/loaders/globalloader.fsx @@ -0,0 +1,25 @@ +#r "../_lib/Fornax.Core.dll" + +type SiteInfo = { + title: string + description: string + theme_variant: string option + root_url: string +} + +let config = { + title = "FSharpLint" + description = "Lint tool for F#" + theme_variant = Some "blue" + root_url = + #if WATCH + "http://localhost:8080/" + #else + "http://fsprojects.github.io/FSharpLint/" + #endif +} + +let loader (projectRoot: string) (siteContet: SiteContents) = + siteContet.Add(config) + + siteContet diff --git a/docs/loaders/pageloader.fsx b/docs/loaders/pageloader.fsx new file mode 100644 index 000000000..8a0a4dda0 --- /dev/null +++ b/docs/loaders/pageloader.fsx @@ -0,0 +1,13 @@ +#r "../_lib/Fornax.Core.dll" + + +type Shortcut = { + title: string + link: string + icon: string +} + +let loader (projectRoot: string) (siteContet: SiteContents) = + siteContet.Add({title = "Home"; link = "/"; icon = "fas fa-home"}) + siteContet.Add({title = "GitHub repo"; link = "http://github.com/fsprojects/FSharpLint"; icon = "fab fa-github"}) + siteContet diff --git a/docs/rules/FL0001.html b/docs/rules/FL0001.html deleted file mode 100644 index cb95104de..000000000 --- a/docs/rules/FL0001.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - TupleCommaSpacing (FL0001) - - - - - - - - - - - - - - -
- -
-
-
-

TupleCommaSpacing (FL0001)

-

Cause

-

Space missing after tuple comma.

-

Rationale

-

For readability, it helps to include a space after tuple commas.

-

How To Fix

-

Add a space after tuple commas.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "tupleCommaSpacing": {
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0002.html b/docs/rules/FL0002.html deleted file mode 100644 index 0124ea8c9..000000000 --- a/docs/rules/FL0002.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - TupleIndentation (FL0002) - - - - - - - - - - - - - - -
- -
-
-
-

TupleIndentation (FL0002)

-

Cause

-

Tuples which span several lines should have consistent indentation.

-

Rationale

-

Consistent indentation provides better readability.

-

How To Fix

-

Fix tuple indentation.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "tupleIndentation": { 
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0003.html b/docs/rules/FL0003.html deleted file mode 100644 index 1331fdd06..000000000 --- a/docs/rules/FL0003.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - TupleParentheses (FL0003) - - - - - - - - - - - - - - -
- -
-
-
-

TupleParentheses (FL0003)

-

Cause

-

Missing parentheses around tuple instantiation.

-

Rationale

-

Recommended by Microsoft F# code formatting guide.

-

How To Fix

-

Add parentheses around tuple instantiation.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "tupleParentheses": { 
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0004.html b/docs/rules/FL0004.html deleted file mode 100644 index 0f0722c41..000000000 --- a/docs/rules/FL0004.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - PatternMatchClausesOnNewLine (FL0004) - - - - - - - - - - - - - - -
- -
-
-
-

PatternMatchClausesOnNewLine (FL0004)

-

Cause

-

All pattern match clauses should be on their own line.

-

Rationale

-

Readability.

-

How To Fix

-

Place each pattern match clause on its own line.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "patternMatchClausesOnNewLine": { 
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0005.html b/docs/rules/FL0005.html deleted file mode 100644 index 6d3bf6f8b..000000000 --- a/docs/rules/FL0005.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - PatternMatchOrClausesOnNewLine (FL0005) - - - - - - - - - - - - - - -
- -
-
-
-

PatternMatchOrClausesOnNewLine (FL0005)

-

Cause

-

All pattern match "or" clauses should be on their own line.

-

Rationale

-

Readability.

-

How To Fix

-

Place each pattern match "or" clause on its own line.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "patternMatchOrClausesOnNewLine": { 
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0006.html b/docs/rules/FL0006.html deleted file mode 100644 index 140c08790..000000000 --- a/docs/rules/FL0006.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - PatternMatchClauseIndentation (FL0006) - - - - - - - - - - - - - - -
- -
-
-
-

PatternMatchClauseIndentation (FL0006)

-

Cause

-

All pattern match clauses should be at the same indentation level.

-

Rationale

-

Readability.

-

How To Fix

-

Update pattern match clauses to have consistent indentation.

-

Rule Settings

-

Uses the numIndentationSpaces global setting.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "patternMatchClauseIndentation": {
-        "enabled": false,
-        "config": {
-          "allowSingleLineLambda": false
-        }
-    }
-}
-
-
    -
  • allowSingleLineLambda - whether or not to allow single-line lambda pattern matches
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0007.html b/docs/rules/FL0007.html deleted file mode 100644 index 95bc45d1b..000000000 --- a/docs/rules/FL0007.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - PatternMatchExpressionIndentation (FL0007) - - - - - - - - - - - - - - -
- -
-
-
-

PatternMatchExpressionIndentation (FL0007)

-

Cause

-

All pattern match expressions (to the right of -> after clause) should be at the same indentation level.

-

Rationale

-

Readability.

-

How To Fix

-

Update pattern match expressions to have consistent indentation.

-

Rule Settings

-

Uses the numIndentationSpaces global setting.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "patternMatchExpressionIndentation": {
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0008.html b/docs/rules/FL0008.html deleted file mode 100644 index d842c1d84..000000000 --- a/docs/rules/FL0008.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - ModuleDeclSpacing (FL0008) - - - - - - - - - - - - - - -
- -
-
-
-

ModuleDeclSpacing (FL0008)

-

Cause

-

Unexpected number of spaces between declarations within module (1 space is expected).

-

Rationale

-

Recommended by Microsoft F# code formatting guide.

-

How To Fix

-

Use 1 space between module declarations.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "moduleDeclSpacing": { 
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0009.html b/docs/rules/FL0009.html deleted file mode 100644 index e69b7856e..000000000 --- a/docs/rules/FL0009.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - ClassMemberSpacing (FL0009) - - - - - - - - - - - - - - -
- -
-
-
-

ClassMemberSpacing (FL0009)

-

Cause

-

Unexpected number of spaces between declarations within module (2 spaces are expected).

-

Rationale

-

Recommended by Microsoft F# code formatting guide.

-

How To Fix

-

Use 2 space between class members.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "classMemberSpacing": { 
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0010.html b/docs/rules/FL0010.html deleted file mode 100644 index ccd541014..000000000 --- a/docs/rules/FL0010.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - TypedItemSpacing (FL0010) - - - - - - - - - - - - - - -
- -
-
-
-

TypedItemSpacing (FL0010)

-

Cause

-

Checks spacing around a typed item, e.g. (number:int).

-

Rationale

-

Consistency and readability.

-

How To Fix

-

Update typed item to use configured spacing.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "typedItemSpacing": { 
-        "enabled": false,
-        "config": {
-            "typedItemStyle": "NoSpaces"
-        }
-    }
-}
-
-
    -
  • typedItemSpacing - style of spacing: "NoSpaces", "SpaceAfter", "SpacesAround"
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0011.html b/docs/rules/FL0011.html deleted file mode 100644 index c6a263d1b..000000000 --- a/docs/rules/FL0011.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - TypePrefixing (FL0011) - - - - - - - - - - - - - - -
- -
-
-
-

TypePrefixing (FL0011)

-

Cause

-

Incorrect formatting for higher order type.

-

Rationale

-

Recommended by Microsoft F# code formatting guide.

-

How To Fix

-

Update higher order type to have correct formatting as per guide linked above.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "typePrefixing": { 
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0012.html b/docs/rules/FL0012.html deleted file mode 100644 index 316f3062a..000000000 --- a/docs/rules/FL0012.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - UnionDefinitionIndentation (FL0012) - - - - - - - - - - - - - - -
- -
-
-
-

UnionDefinitionIndentation (FL0012)

-

Cause

-

Incorrect indentation for union definition.

-

Rationale

-

Recommended by Microsoft F# code formatting guide.

-

How To Fix

-

Update union definition to have correct formatting as specified in linked guide (indent | by 4 spaces).

-

Rule Settings

-

Uses the numIndentationSpaces global setting.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "unionDefinitionIndentation": {
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0013.html b/docs/rules/FL0013.html deleted file mode 100644 index e23492003..000000000 --- a/docs/rules/FL0013.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - RecursiveAsyncFunction (FL0013) - - - - - - - - - - - - - - -
- -
-
-
-

RecursiveAsyncFunction (FL0013)

-

Cause

-

Recursive async function ending in do! instead of return! is unsafe.

-

Rationale

-

If you end your recursive function with do! instead of return!, the compiler -cannot perform tail-call optimization.

-

How To Fix

-

Use return! instead of do!

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "recursiveAsyncFunction": { 
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0014.html b/docs/rules/FL0014.html deleted file mode 100644 index d3630c31d..000000000 --- a/docs/rules/FL0014.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - RedundantNewKeyword (FL0014) - - - - - - - - - - - - - - -
- -
-
-
-

RedundantNewKeyword (FL0014)

-

Cause

-

Using new to instantiate a type which does not implement IDisposable.

-

Rationale

-

new is redundant for instantiating types which do not implement IDisposable.

-

How To Fix

-

Remove new keyword.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "redundantNewKeyword": {
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0015.html b/docs/rules/FL0015.html deleted file mode 100644 index 8adf70c67..000000000 --- a/docs/rules/FL0015.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - NestedStatements (FL0015) - - - - - - - - - - - - - - -
- -
-
-
-

NestedStatements (FL0015)

-

Single rule that checks code is not more deeply nested than a configurable depth.

-

Cause

-

A statement is nested deeper than a configurable depth, for example if depth was set to 8 (the default) then the following code would cause an error:

- - - -
 1: 
- 2: 
- 3: 
- 4: 
- 5: 
- 6: 
- 7: 
- 8: 
- 9: 
-10: 
-
let dog =
-	if true then 									// Depth 1
-		if true then								// Depth 2
-			if true then							// Depth 3
-				if true then						// Depth 4
-					if true then					// Depth 5
-						if true then				// Depth 6
-							if true then			// Depth 7
-								if true then		// Depth 8
-									()		// Depth 9!!
-
-

Rationale

-

When code becomes too deeply nested it becomes more difficult to read and understand, try to refactor nested code out into functions.

-

How To Fix

-

Reduce the depth of the deepest statement, e.g. to fix the example in the "Cause" section you'd take out on level of depth:

- - - -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
let dog =
-	if true then 									// Depth 1
-		if true then								// Depth 2
-			if true then							// Depth 3
-				if true then						// Depth 4
-					if true then					// Depth 5
-						if true then				// Depth 6
-							if true then			// Depth 7
-								()			// Depth 8
-
-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "nestedStatements": { 
-        "enabled": false,
-        "config": {
-            "depth": 8
-        }
-    }
-}
-
- -
val dog : unit
- -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0016.html b/docs/rules/FL0016.html deleted file mode 100644 index b1a3cc9da..000000000 --- a/docs/rules/FL0016.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - FailwithWithSingleArgument (FL0016) - - - - - - - - - - - - - - -
- -
-
-
-

FailwithWithSingleArgument (FL0016)

-

Cause

-

failwith is passed more than one argument e.g. failwith "Divisor cannot be zero." 5

-

Rationale

-

failwith being passed more than one argument (the error message) is probably a mistake.

-

How To Fix

-

Remove the extra arguments.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "failwithWithSingleArgument": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0017.html b/docs/rules/FL0017.html deleted file mode 100644 index 42cce1f22..000000000 --- a/docs/rules/FL0017.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - RaiseWithSingleArgument (FL0017) - - - - - - - - - - - - - - -
- -
-
-
-

RaiseWithSingleArgument (FL0017)

-

Cause

-

raise is passed more than one argument e.g. raise (System.ArgumentException("Divisor cannot be zero.")) 5

-

Rationale

-

raise being passed more than one argument (the exception to be thrown) is probably a mistake.

-

How To Fix

-

Remove the extra arguments.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "raiseWithSingleArgument": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0018.html b/docs/rules/FL0018.html deleted file mode 100644 index 745df5086..000000000 --- a/docs/rules/FL0018.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - NullArgWithSingleArgument (FL0018) - - - - - - - - - - - - - - -
- -
-
-
-

NullArgWithSingleArgument (FL0018)

-

Cause

-

nullArg is passed more than one argument e.g. nullArg "Divisor cannot be zero." 5

-

Rationale

-

nullArg being passed more than one argument (the error message) is probably a mistake.

-

How To Fix

-

Remove the extra arguments.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "nullArgWithSingleArgument": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0019.html b/docs/rules/FL0019.html deleted file mode 100644 index f49c263e3..000000000 --- a/docs/rules/FL0019.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - InvalidOpWithSingleArgument (FL0019) - - - - - - - - - - - - - - -
- -
-
-
-

InvalidOpWithSingleArgument (FL0019)

-

Cause

-

invalidOp is passed more than one argument e.g. invalidOp "Divisor cannot be zero." 5

-

Rationale

-

invalidOp being passed more than one argument (the error message) is probably a mistake.

-

How To Fix

-

Remove the extra arguments.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "invalidOpWithSingleArgument": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0020.html b/docs/rules/FL0020.html deleted file mode 100644 index 5835259f8..000000000 --- a/docs/rules/FL0020.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - InvalidArgWithTwoArguments (FL0020) - - - - - - - - - - - - - - -
- -
-
-
-

InvalidArgWithTwoArguments (FL0020)

-

Cause

-

invalidArg is passed more than two arguments e.g. invalidArg "month" "Expected value between 1 and 12"

-

Rationale

-

invalidArg being passed more than two arguments is probably a mistake.

-

How To Fix

-

Remove the extra arguments.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "invalidArgWithTwoArguments": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0021.html b/docs/rules/FL0021.html deleted file mode 100644 index a4bcff332..000000000 --- a/docs/rules/FL0021.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - FailwithfWithArgumentsMatchingFormatString (FL0021) - - - - - - - - - - - - - - -
- -
-
-
-

FailwithfWithArgumentsMatchingFormatString (FL0021)

-

Cause

-

failwithf is passed more arguments than the format string (first argument) species e.g. failwithf "%d" 5 5

-

Rationale

-

failwithf being passed more arguments than the format string (first argument) specifies is probably a mistake.

-

How To Fix

-

Remove the extra arguments.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "failwithfWithArgumentsMatchingFormatString": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0022.html b/docs/rules/FL0022.html deleted file mode 100644 index c00fbafea..000000000 --- a/docs/rules/FL0022.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInLambdaFunction (FL0022) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInLambdaFunction (FL0022)

-

Cause

-

A lambda function is made up of more than a configurable number of lines.

-

Rationale

-

Lambda functions are usually used for single lines of code that aren't worth naming to make code more concise. A large lambda function indicates it should probably be a named function.

-

How To Fix

-

Consider using a named function rather than a lambda function.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInLambdaFunction": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 7
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0023.html b/docs/rules/FL0023.html deleted file mode 100644 index 4dc07c57c..000000000 --- a/docs/rules/FL0023.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInMatchLambdaFunction (FL0023) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInMatchLambdaFunction (FL0023)

-

Cause

-

A match function is made up of more than a configurable number of lines.

-

Rationale

-

The larger a function becomes the more complex it becomes, it also indicates that it may have too many different responsibilities.

-

How To Fix

-

Use active patterns to help reduce the number of matches/extract code out into composable functions.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInMatchLambdaFunction": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 100
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0024.html b/docs/rules/FL0024.html deleted file mode 100644 index 3a29cb073..000000000 --- a/docs/rules/FL0024.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - MaxLinesInValue (FL0024) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInValue (FL0024)

-

Cause

-

A statement binded to a value is made up of more than a configurable number of lines. -For example the following would break the rule when the maximum number of lines is set to 4:

- - - -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-
let value = 
-	let x = 7
-	let y = 6
-	let e = 5
-	let r = 4
-	r * y * e * x
-
-

Rationale

-

The larger a value becomes the more complex it becomes.

-

How To Fix

-

Refactor to extract out code into smaller composable functions.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInValue": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 100
-        }
-    }
-}
-
- -
val value : int
-
val x : int
-
val y : int
-
val e : int
-
val r : int
- -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0025.html b/docs/rules/FL0025.html deleted file mode 100644 index f70605bb6..000000000 --- a/docs/rules/FL0025.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInFunction (FL0025) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInFunction (FL0025)

-

Cause

-

A function is made up of more than a configurable number of lines.

-

Rationale

-

The larger a function becomes the more complex it becomes, it also indicates that it may have too many different responsibilities.

-

How To Fix

-

Refactor to extract out code into smaller composable functions.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInFunction": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 100
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0026.html b/docs/rules/FL0026.html deleted file mode 100644 index 98c4fcaf5..000000000 --- a/docs/rules/FL0026.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInMember (FL0026) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInMember (FL0026)

-

Cause

-

A member is made up of more than a configurable number of lines.

-

Rationale

-

The larger a member becomes the more complex it becomes, it also indicates that it may have too many different responsibilities.

-

How To Fix

-

Extract code out into private methods or functions.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInMember": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 100
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0027.html b/docs/rules/FL0027.html deleted file mode 100644 index ba087b23f..000000000 --- a/docs/rules/FL0027.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInConstructor (FL0027) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInConstructor (FL0027)

-

Cause

-

A class constructor is made up of more than a configurable number of lines.

-

Rationale

-

The larger a constructor becomes the more complex it becomes, it also indicates that it may have too many different responsibilities.

-

How To Fix

-

Extract code out into private methods or functions.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInConstructor": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 100
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0028.html b/docs/rules/FL0028.html deleted file mode 100644 index 84cb6ae78..000000000 --- a/docs/rules/FL0028.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInProperty (FL0028) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInProperty (FL0028)

-

Cause

-

A property is made up of more than a configurable number of lines.

-

Rationale

-

The larger a property becomes the more complex it becomes, it also indicates that it may have too many different responsibilities.

-

How To Fix

-

Extract code out into private methods or functions.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "MaxLinesInProperty": {
-        "enabled": false,
-        "config": {
-            "maxLines": 70
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0029.html b/docs/rules/FL0029.html deleted file mode 100644 index a83443dd1..000000000 --- a/docs/rules/FL0029.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInModule (FL0029) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInModule (FL0029)

-

Cause

-

A module is made up of more than a configurable number of lines.

-

Rationale

-

The larger a module becomes the more complex it becomes, it also indicates that it may have too many different responsibilities.

-

How To Fix

-

Extract code out into smaller modules.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInModule": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 1000
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0030.html b/docs/rules/FL0030.html deleted file mode 100644 index a2721023c..000000000 --- a/docs/rules/FL0030.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInRecord (FL0030) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInRecord (FL0030)

-

Cause

-

A record is made up of more than a configurable number of lines.

-

Rationale

-

The larger a record becomes the more complex it becomes, it also indicates that all the items may not be related.

-

How To Fix

-

Extract code out into smaller composed records.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInRecord": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 500
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0031.html b/docs/rules/FL0031.html deleted file mode 100644 index 7ea82fb44..000000000 --- a/docs/rules/FL0031.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInEnum (FL0031) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInEnum (FL0031)

-

Cause

-

An enum is made up of more than a configurable number of lines.

-

Rationale

-

The larger a enum becomes the more complex it becomes, it also indicates that all the items may not be related.

-

How To Fix

-

Extract code out into smaller enums.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInEnum": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 500
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0032.html b/docs/rules/FL0032.html deleted file mode 100644 index 1059d4e54..000000000 --- a/docs/rules/FL0032.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInUnion (FL0032) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInUnion (FL0032)

-

Cause

-

A discriminated union is made up of more than a configurable number of lines.

-

Rationale

-

The larger a discriminated union becomes the more complex it becomes, it also indicates that all the items may not be related.

-

How To Fix

-

Extract code out into smaller composed discriminated unions.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInUnion": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 500
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0033.html b/docs/rules/FL0033.html deleted file mode 100644 index f0b2369ed..000000000 --- a/docs/rules/FL0033.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInClass (FL0033) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInClass (FL0033)

-

Cause

-

A class is made up of more than a configurable number of lines.

-

Rationale

-

The larger a class becomes the more complex it becomes, it also indicates that it may have too many different responsibilities.

-

How To Fix

-

Extract code out into smaller composable classes.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInClass": { 
-        "enabled": false,
-        "config": {
-            "maxLines": 500
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0034.html b/docs/rules/FL0034.html deleted file mode 100644 index f7f6a1a7b..000000000 --- a/docs/rules/FL0034.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - ReimplementsFunction (FL0034) - - - - - - - - - - - - - - -
- -
-
-
-

ReimplementsFunction (FL0034)

-

Cause

-

A lambda function does nothing other than call an existing function, two examples below:

-

fun x y -> x + y -fun x y -> foo x y

-

Rationale

-

The lambda functions are redundant.

-

How To Fix

-

Replace the lambda with the function that is being called.

-

fun x y -> x + y is the same as (+) -fun x y -> foo x y is the same as foo

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "reimplementsFunction": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0035.html b/docs/rules/FL0035.html deleted file mode 100644 index a86935c4d..000000000 --- a/docs/rules/FL0035.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - CanBeReplacedWithComposition (FL0035) - - - - - - - - - - - - - - -
- -
-
-
-

CanBeReplacedWithComposition (FL0035)

-

Cause

-

A lambda function applies a single argument to a chain of function calls, two examples below:

-

fun x -> not(isValid(x)) -fun x -> x |> isValid |> not

-

Rationale

-

The lambda functions are redundant.

-

How To Fix

-

Replace the lambda with function composition:

-

fun x -> not(isValid(x)) and fun x -> x |> isValid |> not are the same as isValid >> not

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "canBeReplacedWithComposition": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0036.html b/docs/rules/FL0036.html deleted file mode 100644 index 792bacc1d..000000000 --- a/docs/rules/FL0036.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - InterfaceNames (FL0036) - - - - - - - - - - - - - - -
- -
-
-
-

InterfaceNames (FL0036)

-

Cause

-

Interface naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the interface's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
 1: 
- 2: 
- 3: 
- 4: 
- 5: 
- 6: 
- 7: 
- 8: 
- 9: 
-10: 
-
{
-    "interfaceNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None",
-            "prefix": "I"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0037.html b/docs/rules/FL0037.html deleted file mode 100644 index 5892e11d1..000000000 --- a/docs/rules/FL0037.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - ExceptionNames (FL0037) - - - - - - - - - - - - - - -
- -
-
-
-

ExceptionNames (FL0037)

-

Cause

-

Exception naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the exception's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
 1: 
- 2: 
- 3: 
- 4: 
- 5: 
- 6: 
- 7: 
- 8: 
- 9: 
-10: 
-
{
-    "exceptionNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None",
-            "suffix": "Exception"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0038.html b/docs/rules/FL0038.html deleted file mode 100644 index 075709dad..000000000 --- a/docs/rules/FL0038.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - TypeNames (FL0038) - - - - - - - - - - - - - - -
- -
-
-
-

TypeNames (FL0038)

-

Cause

-

Type naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the type's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "typeNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0039.html b/docs/rules/FL0039.html deleted file mode 100644 index 11eb046f8..000000000 --- a/docs/rules/FL0039.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - RecordFieldNames (FL0039) - - - - - - - - - - - - - - -
- -
-
-
-

RecordFieldNames (FL0039)

-

Cause

-

Record field naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the record field's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "recordFieldNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0040.html b/docs/rules/FL0040.html deleted file mode 100644 index 5aa5b0974..000000000 --- a/docs/rules/FL0040.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - EnumCasesNames (FL0040) - - - - - - - - - - - - - - -
- -
-
-
-

EnumCasesNames (FL0040)

-

Cause

-

Enum case naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the enum case's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "enumCasesNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0041.html b/docs/rules/FL0041.html deleted file mode 100644 index 3942101a7..000000000 --- a/docs/rules/FL0041.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - UnionCasesNames (FL0041) - - - - - - - - - - - - - - -
- -
-
-
-

UnionCasesNames (FL0041)

-

Cause

-

Union case naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the union case's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "unionCasesNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0042.html b/docs/rules/FL0042.html deleted file mode 100644 index 05e026979..000000000 --- a/docs/rules/FL0042.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - ModuleNames (FL0036) - - - - - - - - - - - - - - -
- -
-
-
-

ModuleNames (FL0036)

-

Set of rules that analyse the naming of user defined elements within a program.

-

Cause

-

Module naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the module's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "moduleNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0043.html b/docs/rules/FL0043.html deleted file mode 100644 index 04cb5d288..000000000 --- a/docs/rules/FL0043.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - LiteralNames (FL0043) - - - - - - - - - - - - - - -
- -
-
-
-

LiteralNames (FL0043)

-

Cause

-

Literal naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the literal's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "literalNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0044.html b/docs/rules/FL0044.html deleted file mode 100644 index ad1c164ef..000000000 --- a/docs/rules/FL0044.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - NamespaceNames (FL0044) - - - - - - - - - - - - - - -
- -
-
-
-

NamespaceNames (FL0044)

-

Cause

-

Namespace naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the namespace's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "namespaceNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0045.html b/docs/rules/FL0045.html deleted file mode 100644 index f10b6eece..000000000 --- a/docs/rules/FL0045.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - MemberNames (FL0045) - - - - - - - - - - - - - - -
- -
-
-
-

MemberNames (FL0045)

-

Cause

-

Member naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the member's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "memberNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "AllowPrefix"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0046.html b/docs/rules/FL0046.html deleted file mode 100644 index e77f3084f..000000000 --- a/docs/rules/FL0046.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - ParameterNames (FL0046) - - - - - - - - - - - - - - -
- -
-
-
-

ParameterNames (FL0046)

-

Cause

-

Parameter naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the parameter's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "parameterNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "CamelCase",
-            "underscores": "AllowPrefix"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0047.html b/docs/rules/FL0047.html deleted file mode 100644 index 2a8f0afd8..000000000 --- a/docs/rules/FL0047.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - MeasureTypeNames (FL0047) - - - - - - - - - - - - - - -
- -
-
-
-

MeasureTypeNames (FL0047)

-

Cause

-

Measure type naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the measure type's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "measureTypeNames": { 
-        "enabled": true,
-        "config": {
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0048.html b/docs/rules/FL0048.html deleted file mode 100644 index 454259b26..000000000 --- a/docs/rules/FL0048.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - ActivePatternNames (FL0048) - - - - - - - - - - - - - - -
- -
-
-
-

ActivePatternNames (FL0048)

-

Cause

-

Active pattern naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the active pattern's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "activePatternNames": { 
-        "enabled": true,
-        "config": {
-            "naming": "PascalCase",
-            "underscores": "None"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0049.html b/docs/rules/FL0049.html deleted file mode 100644 index 212799f31..000000000 --- a/docs/rules/FL0049.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - PublicValuesNames (FL0049) - - - - - - - - - - - - - - -
- -
-
-
-

PublicValuesNames (FL0049)

-

Cause

-

Public value naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the public value's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "publicValuesNames": { 
-        "enabled": true,
-        "config": {
-            "underscores": "AllowPrefix"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0050.html b/docs/rules/FL0050.html deleted file mode 100644 index 5b72e75ab..000000000 --- a/docs/rules/FL0050.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - NonPublicValuesNames (FL0050) - - - - - - - - - - - - - - -
- -
-
-
-

NonPublicValuesNames (FL0050)

-

Cause

-

Non-public value naming does not match the specified config.

-

Rationale

-

Consistency aides readability.

-

How To Fix

-

Update the non-public value's naming to be consistent with the rules you have specified

-

Rule Settings

-

Note, any of the settings below can be omitted and will not be checked.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-    "nonPublicValuesNames": { 
-       "enabled": true,
-        "config": {
-            "naming": "CamelCase", 
-            "underscores": "AllowPrefix"
-        }
-    }
-}
-
-
    -
  • naming - expected casing of the identifiers ("PascalCase" or "CamelCase")
  • -
  • underscores - if underscores are allowed in the identifiers ("AllowPrefix", "AllowAny", or "None")
  • -
  • prefix - prefix string expected on the front of the identifiers.
  • -
  • suffix - suffix string expected on the end of the identifiers.
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0051.html b/docs/rules/FL0051.html deleted file mode 100644 index 3abe1a52d..000000000 --- a/docs/rules/FL0051.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - MaxNumberOfItemsInTuple (FL0051) - - - - - - - - - - - - - - -
- -
-
-
-

MaxNumberOfItemsInTuple (FL0051)

-

Cause

-

A tuple contains more than a configurable number of items, for example if maxItems was set to 4 (the default value) -then the following statement would cause the error: let tup = (1, 2, 3, 5, 6)

-

Rationale

-

Tuple's items are not named, the more items there are the harder it is to work out what each is for.

-

How To Fix

-

Reduce the number of items in the tuple, ideally replace the tuple with a record.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxNumberOfItemsInTuple": { 
-        "enabled": false,
-        "config": {
-            "maxItems": 4
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0052.html b/docs/rules/FL0052.html deleted file mode 100644 index dae8cbdfb..000000000 --- a/docs/rules/FL0052.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - MaxNumberOfFunctionParameters (FL0052) - - - - - - - - - - - - - - -
- -
-
-
-

MaxNumberOfFunctionParameters (FL0052)

-

Cause

-

A function contains more than a configurable number of parameters, for example if maxItems was set to 5 (the default value) -then the following condition would cause the error: let findCat one two three four five six = 0

-

Rationale

-

Too many parameters make the function difficult to use.

-

How To Fix

-

Reduce the number of function parameters, e.g. to fix the example in the "Cause": let findCat one two three four five = 0. A good way to reduce the number of parameters is to group them using records.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxNumberOfFunctionParameters": { 
-        "enabled": false,
-        "config": {
-            "maxItems": 5
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0053.html b/docs/rules/FL0053.html deleted file mode 100644 index 3e93a1f54..000000000 --- a/docs/rules/FL0053.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxNumberOfMembers (FL0053) - - - - - - - - - - - - - - -
- -
-
-
-

MaxNumberOfMembers (FL0053)

-

Cause

-

A class contains more than a configurable number of members (maxItems).

-

Rationale

-

The class is likely to be doing too much and violating the single responsibility principle.

-

How To Fix

-

Reduce the number of members in the class, e.g. extract them out to another class.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxNumberOfMembers": { 
-        "enabled": false,
-        "config": {
-            "maxItems": 32
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0054.html b/docs/rules/FL0054.html deleted file mode 100644 index 2c51a1f5e..000000000 --- a/docs/rules/FL0054.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - MaxNumberOfBooleanOperatorsInCondition (FL0054) - - - - - - - - - - - - - - -
- -
-
-
-

MaxNumberOfBooleanOperatorsInCondition (FL0054)

-

Cause

-

A while/if/assert/match when condition contains more than a configurable number of boolean operators, for example if maxItems was set to 4 (the default value) -then the following condition would cause the error: if x && y || q || r && t && w then

-

Rationale

-

Can make the control flow become diffcult to understand.

-

How To Fix

-

Reduce the number of boolean operators in the while/if/assert/match when condition, e.g. a simple way to fix the example in the "Cause" section you could name the expression:

- - - -
1: 
-2: 
-
let catIsInBin = x && y || q || r && t && w
-if catIsInBin then
-
-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxNumberOfBooleanOperatorsInCondition": { 
-        "enabled": false,
-        "config": {
-            "maxItems": 4
-        }
-    }
-}
-
- -
val catIsInBin : bool
- -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0055.html b/docs/rules/FL0055.html deleted file mode 100644 index 475affe3d..000000000 --- a/docs/rules/FL0055.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - FavourIgnoreOverLetWild (FL0055) - - - - - - - - - - - - - - -
- -
-
-
-

FavourIgnoreOverLetWild (FL0055)

-

Cause

-

A value is binded to a wildcard e.g. let _ = Console.ReadLine()

-

Rationale

-

Using the ignore function makes it clear what is intended to happen, rather than something that may be a mistake.

-

How To Fix

-

Pipe the value into the ignore function e.g. Console.ReadLine() |> ignore

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "favourIgnoreOverLetWild": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0056.html b/docs/rules/FL0056.html deleted file mode 100644 index 3e320d89e..000000000 --- a/docs/rules/FL0056.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - WildcardNamedWithAsPattern (FL0056) - - - - - - - - - - - - - - -
- -
-
-
-

WildcardNamedWithAsPattern (FL0056)

-

Cause

-

A wildcard is given a name using the as pattern e.g. match something with | _ as x -> x + y

-

Rationale

-

The wildcard and as pattern can be replaced with the identifier the value is to be bound to.

-

How To Fix

-

Replace the wildcard with the identifier the wildcard is currently being bound to, e.g. change match something with | _ as x -> x + y to match something with | x -> x + y

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "wildcardNamedWithAsPattern": {
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0057.html b/docs/rules/FL0057.html deleted file mode 100644 index 815dd58fe..000000000 --- a/docs/rules/FL0057.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - UselessBinding (FL0057) - - - - - - - - - - - - - - -
- -
-
-
-

UselessBinding (FL0057)

-

Cause

-

An identifier is binded to itself e.g. let x = x

-

Rationale

-

Pointless statement likely to be an error.

-

How To Fix

-

Remove the binding.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "uselessBinding": { 
-        "enabled": true 
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0058.html b/docs/rules/FL0058.html deleted file mode 100644 index 5b19b9c3b..000000000 --- a/docs/rules/FL0058.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - TupleOfWildcards (FL0058) - - - - - - - - - - - - - - -
- -
-
-
-

TupleOfWildcards (FL0058)

-

Cause

-

A constructor in a pattern has arguments that consist entirely of wildcards e.g. SynPat.Paren(_, _)

-

Rationale

-

The tuple of wildcards can be replaced with a single wildcard.

-

How To Fix

-

Replace the tuple with a single wildcard e.g. the example in the cause could be turned into SynPat.Paren(_)

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "tupleOfWildcards": {
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0059.html b/docs/rules/FL0059.html deleted file mode 100644 index e2b884151..000000000 --- a/docs/rules/FL0059.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - Indentation (FL0059) - - - - - - - - - - - - - - -
- -
-
-
-

Indentation (FL0059)

-

Cause

-

Inconsistent indentation in file.

-

Rationale

-

Readability.

-

How To Fix

-

Update file to use consistent amount of spaces for indentation.

-

Rule Settings

-

Uses the numIndentationSpaces global setting.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "indentation": {
-        "enabled": false
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0060.html b/docs/rules/FL0060.html deleted file mode 100644 index e0e288e73..000000000 --- a/docs/rules/FL0060.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxCharactersOnLine (FL0060) - - - - - - - - - - - - - - -
- -
-
-
-

MaxCharactersOnLine (FL0060)

-

Cause

-

More than a configurable number of characters were on a single line.

-

Rationale

-

Too many characters on a single line make code harder to read by forcing the reader to scroll horizontally.

-

How To Fix

-

Break the line up into multiple lines.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxCharactersOnLine": {
-        "enabled": false,
-        "config": {
-            "maxCharactersOnLine": 120
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0061.html b/docs/rules/FL0061.html deleted file mode 100644 index 3872c8726..000000000 --- a/docs/rules/FL0061.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - TrailingWhitespaceOnLine (FL0061) - - - - - - - - - - - - - - -
- -
-
-
-

TrailingWhitespaceOnLine (FL0061)

-

Cause

-

Whitespace was found at the end of a line.

-

Rationale

-

Pointless whitespace.

-

How To Fix

-

Remove any whitespace from the end of the line.

-

Rule Settings

- -
 1: 
- 2: 
- 3: 
- 4: 
- 5: 
- 6: 
- 7: 
- 8: 
- 9: 
-10: 
-
{
-    "trailingWhitespaceOnLine": {
-        "enabled": false,
-        "config": {
-            "numberOfSpacesAllowed": 1,
-            "oneSpaceAllowedAfterOperator": true,
-            "ignoreBlankLines": true
-        }
-    }
-}
-
-
    -
  • numberOfSpacesAllowed - An integer property that specifies how many space characters are allowed on the end of a line. (Default 1)
  • -
  • oneSpaceAllowedAfterOperator - A boolean property that will allow a single space on the end of the line if it's preceded by an operator/symbol character. (Default true)
  • -
  • ignoreBlankLines - A boolean property that will ignore any lines that are made up of just whitespace. (Default true)
  • -
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0062.html b/docs/rules/FL0062.html deleted file mode 100644 index b20af0b27..000000000 --- a/docs/rules/FL0062.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - MaxLinesInFile (FL0062) - - - - - - - - - - - - - - -
- -
-
-
-

MaxLinesInFile (FL0062)

-

Cause

-

More than a configurable number of lines were found in a file.

-

Rationale

-

Too many lines in a file indicate it's becoming too complex.

-

How To Fix

-

Refactor to extract code out into another file.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-
{
-    "maxLinesInFile": {
-        "enabled": false,
-        "config": {
-            "maxLinesInFile": 1000
-        }
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0063.html b/docs/rules/FL0063.html deleted file mode 100644 index 3bc4002ce..000000000 --- a/docs/rules/FL0063.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - TrailingNewLineInFile (FL0063) - - - - - - - - - - - - - - -
- -
-
-
-

TrailingNewLineInFile (FL0063)

-

Cause

-

A new line was found at the end of a file.

-

Rationale

-

Pointless whitespace.

-

How To Fix

-

Remove any new lines at the end of a file.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "trailingNewLineInFile": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0064.html b/docs/rules/FL0064.html deleted file mode 100644 index 708bfbe5c..000000000 --- a/docs/rules/FL0064.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - NoTabCharacters (FL0064) - - - - - - - - - - - - - - -
- -
-
-
-

NoTabCharacters (FL0064)

-

Cause

-

A tab character was found in a file.

-

Rationale

-

It's best practice to use spaces to indent code rather than tabs, this is because tabs have different widths on different platforms.

-

How To Fix

-

Replace the tab with spaces.

-

Rule Settings

- -
1: 
-2: 
-3: 
-4: 
-5: 
-
{
-    "noTabCharacters": { 
-        "enabled": true
-    }
-}
-
- - -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/rules/FL0065.html b/docs/rules/FL0065.html deleted file mode 100644 index 244121dc0..000000000 --- a/docs/rules/FL0065.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - Hints (FL0065) - - - - - - - - - - - - - - -
- -
-
-
-

Hints (FL0065)

-

Introduction

-

The Hints analyser is inspired by HLint. The hints let users easily write their own rules which are matched against linted code and when matched produce a suggestion that the user provides as part of the hint.

-

Every hint is formed of two parts: the match and the suggestion. Both the match and the suggestion are parsed the same way into ASTs, but they have two different purposes; the match AST is analysed against the code being linted looking for any expressions in the code that match the AST, and if there is a match then the suggestion AST is used to display a suggestion on how the code can be refactored.

-

Matching

-

Match Any Expression

-

Any F# expression can be matched by a variable or wildcard.

-
    -
  • A variable is represented by a single letter e.g. x
  • -
  • A wildcard is represented by the character _
  • -
-

Variables and wildcards are seemingly the same, and in terms of matching they are. The key difference is that using a variable lets you refer to it in the suggestion, enabling you to show where the matched expression should be moved within the matched code.

-

For example if we wanted to match the following:

- - - -
1: 
-
not ((4 + 4) >= (x + 77 * (9 * y)))
-
-

and suggest the following (which is equivalent):

- - - -
1: 
-
(4 + 4) < (x + 77 * (9 * y))
-
-

We can use variables here, the expression (4 + 4) can be matched by a variable and (x + 77 * (9 * y)) by another, this is shown below using the variables a and b.

- -
1: 
-
not (a >= b) ===> a <  b
-
-

Match An Identifier

-

Identifiers in F# code can be matched by using the same identifier in the hint. It's important to note that since single characters are used to represent variables in hints the identifier must be at least 2 characters long.

-

For example the following rule uses identifiers:

- -
1: 
-
List.fold (+) 0 ===> List.sum
-
-

List.fold in the hint will match the same identifier in the code. So if List.fold is found anywhere in the F# code being analysed with (+) and 0 applied to it then the rule will be matched.

-

Match Literal Constants

-

Literal constants can be used to match literal constants in the code, the constants in hints are the same format as constants in F#, so for example if you wanted to match 0x4b you could use 0x4b in the hint.

-

Example:

- -
1: 
-
not true ===> false
-
-

In the example above the boolean literal true is used to match any F# code where true is applied to the not identifier.

-

Match Function Application and Operators

-

Matching function application, prefix operators, and infix operators in hints are all done in the same way as how you'd write it in F# e.g.

- -
1: 
-2: 
-3: 
-
not true ===> false
-4 + 4 ===> 8
-~x ===> someFunc x
-
-

The first rule above matches true (boolean literal) applied to the function not, the second matches two literal integers (both 4) applied to the + binary operator, and the third matches an expression applied to the ~ prefix operator.

-

Read the below section titled "Order Of Operations" for specifying the order of application in a hint.

-

Match Lambda Functions

-

Lambda functions can be matched using the syntax fun args -> () e.g. fun x y -> x + y.

-

The arguments may be either wildcards (_) or 'variables' (a single character). The 'variable' arguments have a particular use: they match a lambda that has that argument as an identifier, and then if that 'variable' is used in the body of the lambda in the hint then it will match the argument's identifier in the body of the code.

-

For example:

- -
1: 
-
fun x -> x ===> id
-
-

The above hint will match a lambda that has a single argument which is an identifier and returns that identifier. fun val -> val would be matched, whereas fun val -> () would not be matched - to match this you could use the hint: fun _ -> ().

-

Order Of Operations

-

Generic order of operations can be specified using parentheses. They're described as 'generic' because using parentheses in a hint will also take into account the following operators: |>, ||>, |||>, <|, <||, and <||| which are often used to specificy the order of function application.

-

Below uses parentheses to match x applied to not and the result of that application applied to someFunc.

- -
1: 
-
someFunc (not x) ===> someOtherFunc x
-
-

In F# several operators are commonly used to show the order of function application, for example in F# someFunc (not x) could also be written as:

- - - -
1: 
-
not x |> someFunc
-
-

The same code written as a rule not x |> someFunc will match the above, but it is matching against the operator so it will not match someFunc (not x). However the rule someFunc (not x) will match both.

-

EBNF of a Hint

-

This is incomplete - currently missing a few of the more detailed rules e.g. uint32 and infix-operator, for these I'd recommend looking them up in the EBNF for F# as that's what they will be based upon.

- -
 1: 
- 2: 
- 3: 
- 4: 
- 5: 
- 6: 
- 7: 
- 8: 
- 9: 
-10: 
-11: 
-12: 
-13: 
-14: 
-15: 
-16: 
-17: 
-18: 
-19: 
-20: 
-21: 
-22: 
-23: 
-24: 
-25: 
-26: 
-27: 
-28: 
-29: 
-30: 
-31: 
-32: 
-33: 
-34: 
-35: 
-36: 
-37: 
-38: 
-39: 
-40: 
-41: 
-42: 
-43: 
-44: 
-45: 
-46: 
-47: 
-48: 
-49: 
-50: 
-51: 
-52: 
-53: 
-54: 
-55: 
-56: 
-57: 
-58: 
-59: 
-60: 
-61: 
-62: 
-63: 
-64: 
-65: 
-66: 
-67: 
-68: 
-69: 
-70: 
-71: 
-72: 
-73: 
-74: 
-75: 
-76: 
-77: 
-78: 
-79: 
-80: 
-81: 
-82: 
-83: 
-84: 
-85: 
-86: 
-87: 
-
whitespace = " " | "\t" | "\n" | "\r\n" | "\r";
-
-spaces = [{whitespace}];
-
-spaces1 = whitespace, [{whitespace}];
-
-bool = "true" | "false";
-
-unit = "(", [spaces], ")";
-
-constant = bool
-            | unit
-            | character
-            | literal-string
-            | verbatim-string
-            | byte-char
-            | byte-array
-            | verbatim-byte-array
-            | triple-quoted-string
-            | sbyte
-            | byte
-            | int16
-            | uint16
-            | uint32
-            | native-int
-            | unative-int
-            | int64
-            | uint64
-            | single
-            | big-num
-            | decimal
-            | double
-            | int32;
-
-parentheses = "(" expression ")";
-
-wildcard = "_";
-
-variable = letter, -letter;
-
-ident-start-char = "_" | letter;
-
-ident-char = letter | digit | "'" | "_" ;
-
-ident-text = ident-start-char, {ident-char};
-
-ident = ident-text | ("``", {(-("`" | "\n" | "\r" | "\t")) | (("`"), -("`" | "\n" | "\r" | "\t"))}, "``");
-
-ident-or-op = ident | ("(", spaces, operator, spaces, ")");
-
-long-ident = {ident, "."} | ident;
-
-long-ident-or-op = ident, {".", ident}, [".", ident-or-op]
-                    | ident-or-op
-                    | long-ident;
-
-application = constant
-                | variable
-                | wildcard
-                | long-ident-or-op
-                | parentheses;
-
-function-application = long-ident-or-op, identifier, spaces, {application, spaces}, [application, spaces];
-
-prefix-expr = prefix-operator, spaces, expression
-
-infix-expr = expression, spaces, infix-operator, spaces, expression
-
-identifier = long-ident-or-op -letter;
-
-argument-variable = letter;
-
-argument-wildcard = "_";
-
-lambda-arguments = [{(argument-variable | argument-wildcard), spaces1}],
-                        (argument-variable | argument-wildcard), [spaces]
-
-lambda = "fun", spaces1, lambda-arguments, "->", spaces, expression;
-
-expression = spaces, (constant | lambda | variable | wildcard | function-application
-                      | identifier | parentheses | infix-expr | prefix-expr), spaces;
-
-suggestion = expression;
-
-match = expression;
-
-hint = match, spaces, "===>", spaces, suggestion;
-
-

Writing Your Own Hints

-

You can add new hints to your config in the hints object. This config has two fields, add and ignore. add is used to add new hints, while ignore can be used to ignore hints -added in previous configs (e.g. the default config).

-

For example to make the lint tool run with just the two hints: not (a = b) ===> a <> b and not (a <> b) ===> a = b, and also ignore the default hint x = true ===> x, -you could use the following config file.

- -
1: 
-2: 
-3: 
-4: 
-5: 
-6: 
-7: 
-8: 
-9: 
-
{
-  "hints": {
-    "add": [
-      "not (a =  b) ===> a <> b",
-      "not (a <> b) ===> a =  b"
-    ],
-    "ignore": [ "x = true ===> x" ]
-  }
-}
-
-

Flaws

-
    -
  • ===> is used to split the hints into parts, a hint cannot match this valid F# operator.
  • -
  • Single letter identifiers are used as variables inside a hint, so attempting to match an identifier that is a single letter is not going to work.
  • -
  • Operators beginning with . (e.g. .*) will have incorrect precedence and as such should not currently be used in hints.
  • -
-

Future Intentions

-
    -
  • Provide more informative parse errors.
  • -
  • Allow for adding your own hints and removing select hints rather than always having to override the default with a set of hints.
  • -
  • Provide support for matching literal lists, literal arrays, literal sequences, tuples, methods, if statements, and match statements.
  • -
- -
val not : value:bool -> bool
- -
-
- - FSharpLint project logo. - - - -
-
-
- Fork me on GitHub - - diff --git a/docs/static/css/atom-one-dark-reasonable.css b/docs/static/css/atom-one-dark-reasonable.css new file mode 100644 index 000000000..fd41c996a --- /dev/null +++ b/docs/static/css/atom-one-dark-reasonable.css @@ -0,0 +1,77 @@ +/* + +Atom One Dark With support for ReasonML by Gidi Morris, based off work by Daniel Gamage + +Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax + +*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + line-height: 1.3em; + color: #abb2bf; + background: #282c34; + border-radius: 5px; +} +.hljs-keyword, .hljs-operator { + color: #F92672; +} +.hljs-pattern-match { + color: #F92672; +} +.hljs-pattern-match .hljs-constructor { + color: #61aeee; +} +.hljs-function { + color: #61aeee; +} +.hljs-function .hljs-params { + color: #A6E22E; +} +.hljs-function .hljs-params .hljs-typing { + color: #FD971F; +} +.hljs-module-access .hljs-module { + color: #7e57c2; +} +.hljs-constructor { + color: #e2b93d; +} +.hljs-constructor .hljs-string { + color: #9CCC65; +} +.hljs-comment, .hljs-quote { + color: #b18eb1; + font-style: italic; +} +.hljs-doctag, .hljs-formula { + color: #c678dd; +} +.hljs-section, .hljs-name, .hljs-selector-tag, .hljs-deletion, .hljs-subst { + color: #e06c75; +} +.hljs-literal { + color: #56b6c2; +} +.hljs-string, .hljs-regexp, .hljs-addition, .hljs-attribute, .hljs-meta-string { + color: #98c379; +} +.hljs-built_in, .hljs-class .hljs-title { + color: #e6c07b; +} +.hljs-attr, .hljs-variable, .hljs-template-variable, .hljs-type, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-number { + color: #d19a66; +} +.hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-title { + color: #61aeee; +} +.hljs-emphasis { + font-style: italic; +} +.hljs-strong { + font-weight: bold; +} +.hljs-link { + text-decoration: underline; +} diff --git a/docs/static/css/auto-complete.css b/docs/static/css/auto-complete.css new file mode 100644 index 000000000..ac6979ad3 --- /dev/null +++ b/docs/static/css/auto-complete.css @@ -0,0 +1,47 @@ +.autocomplete-suggestions { + text-align: left; + cursor: default; + border: 1px solid #ccc; + border-top: 0; + background: #fff; + box-shadow: -1px 1px 3px rgba(0,0,0,.1); + + /* core styles should not be changed */ + position: absolute; + display: none; + z-index: 9999; + max-height: 254px; + overflow: hidden; + overflow-y: auto; + box-sizing: border-box; + +} +.autocomplete-suggestion { + position: relative; + cursor: pointer; + padding: 7px; + line-height: 23px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #333; +} + +.autocomplete-suggestion b { + font-weight: normal; + color: #1f8dd6; +} + +.autocomplete-suggestion.selected { + background: #333; + color: #fff; +} + +.autocomplete-suggestion:hover { + background: #444; + color: #fff; +} + +.autocomplete-suggestion > .context { + font-size: 12px; +} diff --git a/docs/static/css/custom.css b/docs/static/css/custom.css new file mode 100644 index 000000000..a03e1237c --- /dev/null +++ b/docs/static/css/custom.css @@ -0,0 +1,3 @@ +:root #header + #content > #left > #rlblock_left{ + display:none !important; +} \ No newline at end of file diff --git a/docs/static/css/featherlight.min.css b/docs/static/css/featherlight.min.css new file mode 100644 index 000000000..058487f91 --- /dev/null +++ b/docs/static/css/featherlight.min.css @@ -0,0 +1,8 @@ +/** + * Featherlight - ultra slim jQuery lightbox + * Version 1.7.13 - http://noelboss.github.io/featherlight/ + * + * Copyright 2018, Noël Raoul Bossart (http://www.noelboss.com) + * MIT Licensed. +**/ +html.with-featherlight{overflow:hidden}.featherlight{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483647;text-align:center;white-space:nowrap;cursor:pointer;background:#333;background:rgba(0,0,0,0)}.featherlight:last-of-type{background:rgba(0,0,0,.8)}.featherlight:before{content:'';display:inline-block;height:100%;vertical-align:middle}.featherlight .featherlight-content{position:relative;text-align:left;vertical-align:middle;display:inline-block;overflow:auto;padding:25px 25px 0;border-bottom:25px solid transparent;margin-left:5%;margin-right:5%;max-height:95%;background:#fff;cursor:auto;white-space:normal}.featherlight .featherlight-inner{display:block}.featherlight link.featherlight-inner,.featherlight script.featherlight-inner,.featherlight style.featherlight-inner{display:none}.featherlight .featherlight-close-icon{position:absolute;z-index:9999;top:0;right:0;line-height:25px;width:25px;cursor:pointer;text-align:center;font-family:Arial,sans-serif;background:#fff;background:rgba(255,255,255,.3);color:#000;border:0;padding:0}.featherlight .featherlight-close-icon::-moz-focus-inner{border:0;padding:0}.featherlight .featherlight-image{width:100%}.featherlight-iframe .featherlight-content{border-bottom:0;padding:0;-webkit-overflow-scrolling:touch}.featherlight iframe{border:0}.featherlight *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media only screen and (max-width:1024px){.featherlight .featherlight-content{margin-left:0;margin-right:0;max-height:98%;padding:10px 10px 0;border-bottom:10px solid transparent}}@media print{html.with-featherlight>*>:not(.featherlight){display:none}} \ No newline at end of file diff --git a/docs/static/css/fontawesome-all.min.css b/docs/static/css/fontawesome-all.min.css new file mode 100644 index 000000000..de5647372 --- /dev/null +++ b/docs/static/css/fontawesome-all.min.css @@ -0,0 +1 @@ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/docs/static/css/hugo-theme.css b/docs/static/css/hugo-theme.css new file mode 100644 index 000000000..741cab196 --- /dev/null +++ b/docs/static/css/hugo-theme.css @@ -0,0 +1,254 @@ +/* Insert here special css for hugo theme, on top of any other imported css */ + + +/* Table of contents */ + +.progress ul { + list-style: none; + margin: 0; + padding: 0 5px; +} + +#TableOfContents { + font-size: 13px !important; + max-height: 85vh; + overflow: auto; + padding: 15px !important; +} + + +#TableOfContents > ul > li > ul > li > ul li { + margin-right: 8px; +} + +#TableOfContents > ul > li > a { + font-weight: bold; padding: 0 18px; margin: 0 2px; +} + +#TableOfContents > ul > li > ul > li > a { + font-weight: bold; +} + +#TableOfContents > ul > li > ul > li > ul > li > ul > li > ul > li { + display: none; +} + +body { + font-size: 16px !important; + color: #323232 !important; +} + +#body a.highlight, #body a.highlight:hover, #body a.highlight:focus { + text-decoration: none; + outline: none; + outline: 0; +} +#body a.highlight { + line-height: 1.1; + display: inline-block; +} +#body a.highlight:after { + display: block; + content: ""; + height: 1px; + width: 0%; + background-color: #0082a7; /*#CE3B2F*/ + -webkit-transition: width 0.5s ease; + -moz-transition: width 0.5s ease; + -ms-transition: width 0.5s ease; + transition: width 0.5s ease; +} +#body a.highlight:hover:after, #body a.highlight:focus:after { + width: 100%; +} +.progress { + position:absolute; + background-color: rgba(246, 246, 246, 0.97); + width: auto; + border: thin solid #ECECEC; + display:none; + z-index:200; +} + +#toc-menu { + border-right: thin solid #DAD8D8 !important; + padding-right: 1rem !important; + margin-right: 0.5rem !important; +} + +#sidebar-toggle-span { + border-right: thin solid #DAD8D8 !important; + padding-right: 0.5rem !important; + margin-right: 1rem !important; +} + +.btn { + display: inline-block !important; + padding: 6px 12px !important; + margin-bottom: 0 !important; + font-size: 14px !important; + font-weight: normal !important; + line-height: 1.42857143 !important; + text-align: center !important; + white-space: nowrap !important; + vertical-align: middle !important; + -ms-touch-action: manipulation !important; + touch-action: manipulation !important; + cursor: pointer !important; + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; + background-image: none !important; + border: 1px solid transparent !important; + border-radius: 4px !important; + -webkit-transition: all 0.15s !important; + -moz-transition: all 0.15s !important; + transition: all 0.15s !important; +} +.btn:focus { + /*outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px;*/ + outline: none !important; +} +.btn:hover, +.btn:focus { + color: #2b2b2b !important; + text-decoration: none !important; +} + +.btn-default { + color: #333 !important; + background-color: #fff !important; + border-color: #ccc !important; +} +.btn-default:hover, +.btn-default:focus, +.btn-default:active { + color: #fff !important; + background-color: #9e9e9e !important; + border-color: #9e9e9e !important; +} +.btn-default:active { + background-image: none !important; +} + +/* anchors */ +.anchor { + color: #00bdf3; + font-size: 0.5em; + cursor:pointer; + visibility:hidden; + margin-left: 0.5em; + position: absolute; + margin-top:0.1em; +} + +h2:hover .anchor, h3:hover .anchor, h4:hover .anchor, h5:hover .anchor, h6:hover .anchor { + visibility:visible; +} + +/* Redfines headers style */ + +h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.1; +} + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + font-weight: inherit; +} + +h2 { + font-size: 2.5rem; + line-height: 110% !important; + margin: 2.5rem 0 1.5rem 0; +} + +h3 { + font-size: 2rem; + line-height: 110% !important; + margin: 2rem 0 1rem 0; +} + +h4 { + font-size: 1.5rem; + line-height: 110% !important; + margin: 1.5rem 0 0.75rem 0; +} + +h5 { + font-size: 1rem; + line-height: 110% !important; + margin: 1rem 0 0.2rem 0; +} + +h6 { + font-size: 0.5rem; + line-height: 110% !important; + margin: 0.5rem 0 0.2rem 0; +} + +p { + margin: 1rem 0; +} + +figcaption h4 { + font-weight: 300 !important; + opacity: .85; + font-size: 1em; + text-align: center; + margin-top: -1.5em; +} + +.select-style { + border: 0; + width: 150px; + border-radius: 0px; + overflow: hidden; + display: inline-flex; +} + +.select-style svg { + fill: #ccc; + width: 14px; + height: 14px; + pointer-events: none; + margin: auto; +} + +.select-style svg:hover { + fill: #e6e6e6; +} + +.select-style select { + padding: 0; + width: 130%; + border: none; + box-shadow: none; + background: transparent; + background-image: none; + -webkit-appearance: none; + margin: auto; + margin-left: 0px; + margin-right: -20px; +} + +.select-style select:focus { + outline: none; +} + +.select-style :hover { + cursor: pointer; +} + +@media only all and (max-width: 47.938em) { + #breadcrumbs .links, #top-github-link-text { + display: none; + } +} + +.is-sticky #top-bar { + box-shadow: -1px 2px 5px 1px rgba(0, 0, 0, 0.1); +} \ No newline at end of file diff --git a/docs/static/css/hybrid.css b/docs/static/css/hybrid.css new file mode 100644 index 000000000..29735a189 --- /dev/null +++ b/docs/static/css/hybrid.css @@ -0,0 +1,102 @@ +/* + +vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid) + +*/ + +/*background color*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #1d1f21; +} + +/*selection color*/ +.hljs::selection, +.hljs span::selection { + background: #373b41; +} + +.hljs::-moz-selection, +.hljs span::-moz-selection { + background: #373b41; +} + +/*foreground color*/ +.hljs { + color: #c5c8c6; +} + +/*color: fg_yellow*/ +.hljs-title, +.hljs-name { + color: #f0c674; +} + +/*color: fg_comment*/ +.hljs-comment, +.hljs-meta, +.hljs-meta .hljs-keyword { + color: #707880; +} + +/*color: fg_red*/ +.hljs-number, +.hljs-symbol, +.hljs-literal, +.hljs-deletion, +.hljs-link { + color: #cc6666 +} + +/*color: fg_green*/ +.hljs-string, +.hljs-doctag, +.hljs-addition, +.hljs-regexp, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #b5bd68; +} + +/*color: fg_purple*/ +.hljs-attribute, +.hljs-code, +.hljs-selector-id { + color: #b294bb; +} + +/*color: fg_blue*/ +.hljs-keyword, +.hljs-selector-tag, +.hljs-bullet, +.hljs-tag { + color: #81a2be; +} + +/*color: fg_aqua*/ +.hljs-subst, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #8abeb7; +} + +/*color: fg_orange*/ +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-quote, +.hljs-section, +.hljs-selector-class { + color: #de935f; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/docs/static/css/nucleus.css b/docs/static/css/nucleus.css new file mode 100644 index 000000000..1897fc5d6 --- /dev/null +++ b/docs/static/css/nucleus.css @@ -0,0 +1,615 @@ +*, *::before, *::after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +@-webkit-viewport { + width: device-width; } +@-moz-viewport { + width: device-width; } +@-ms-viewport { + width: device-width; } +@-o-viewport { + width: device-width; } +@viewport { + width: device-width; } +html { + font-size: 100%; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; } + +body { + margin: 0; } + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; } + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; } + +audio:not([controls]) { + display: none; + height: 0; } + +[hidden], +template { + display: none; } + +a { + background: transparent; + text-decoration: none; } + +a:active, +a:hover { + outline: 0; } + +abbr[title] { + border-bottom: 1px dotted; } + +b, +strong { + font-weight: bold; } + +dfn { + font-style: italic; } + +mark { + background: #FFFF27; + color: #333; } + +sub, +sup { + font-size: 0.8rem; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +img { + border: 0; + max-width: 100%; } + +svg:not(:root) { + overflow: hidden; } + +figure { + margin: 1em 40px; } + +hr { + height: 0; } + +pre { + overflow: auto; } + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; } + +button { + overflow: visible; } + +button, +select { + text-transform: none; } + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; } + +button[disabled], +html input[disabled] { + cursor: default; } + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; } + +input { + line-height: normal; } + +input[type="checkbox"], +input[type="radio"] { + padding: 0; } + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +input[type="search"] { + -webkit-appearance: textfield; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +legend { + border: 0; + padding: 0; } + +textarea { + overflow: auto; } + +optgroup { + font-weight: bold; } + +table { + border-collapse: collapse; + border-spacing: 0; + table-layout: fixed; + width: 100%; } + +tr, td, th { + vertical-align: middle; } + +th, td { + padding: 0.425rem 0; } + +th { + text-align: left; } + +.container { + width: 75em; + margin: 0 auto; + padding: 0; } + @media only all and (min-width: 60em) and (max-width: 74.938em) { + .container { + width: 60em; } } + @media only all and (min-width: 48em) and (max-width: 59.938em) { + .container { + width: 48em; } } + @media only all and (min-width: 30.063em) and (max-width: 47.938em) { + .container { + width: 30em; } } + @media only all and (max-width: 30em) { + .container { + width: 100%; } } + +.grid { + display: -webkit-box; + display: -moz-box; + display: box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row; + -moz-flex-flow: row; + flex-flow: row; + list-style: none; + margin: 0; + padding: 0; } + @media only all and (max-width: 47.938em) { + .grid { + -webkit-flex-flow: row wrap; + -moz-flex-flow: row wrap; + flex-flow: row wrap; } } + +.block { + -webkit-box-flex: 1; + -moz-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + min-width: 0; + min-height: 0; } + @media only all and (max-width: 47.938em) { + .block { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 100%; + -moz-flex: 0 100%; + -ms-flex: 0 100%; + flex: 0 100%; } } + +.content { + margin: 0.625rem; + padding: 0.938rem; } + +@media only all and (max-width: 47.938em) { + body [class*="size-"] { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 100%; + -moz-flex: 0 100%; + -ms-flex: 0 100%; + flex: 0 100%; } } + +.size-1-2 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 50%; + -moz-flex: 0 50%; + -ms-flex: 0 50%; + flex: 0 50%; } + +.size-1-3 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 33.33333%; + -moz-flex: 0 33.33333%; + -ms-flex: 0 33.33333%; + flex: 0 33.33333%; } + +.size-1-4 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 25%; + -moz-flex: 0 25%; + -ms-flex: 0 25%; + flex: 0 25%; } + +.size-1-5 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 20%; + -moz-flex: 0 20%; + -ms-flex: 0 20%; + flex: 0 20%; } + +.size-1-6 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 16.66667%; + -moz-flex: 0 16.66667%; + -ms-flex: 0 16.66667%; + flex: 0 16.66667%; } + +.size-1-7 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 14.28571%; + -moz-flex: 0 14.28571%; + -ms-flex: 0 14.28571%; + flex: 0 14.28571%; } + +.size-1-8 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 12.5%; + -moz-flex: 0 12.5%; + -ms-flex: 0 12.5%; + flex: 0 12.5%; } + +.size-1-9 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 11.11111%; + -moz-flex: 0 11.11111%; + -ms-flex: 0 11.11111%; + flex: 0 11.11111%; } + +.size-1-10 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 10%; + -moz-flex: 0 10%; + -ms-flex: 0 10%; + flex: 0 10%; } + +.size-1-11 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 9.09091%; + -moz-flex: 0 9.09091%; + -ms-flex: 0 9.09091%; + flex: 0 9.09091%; } + +.size-1-12 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 8.33333%; + -moz-flex: 0 8.33333%; + -ms-flex: 0 8.33333%; + flex: 0 8.33333%; } + +@media only all and (min-width: 48em) and (max-width: 59.938em) { + .size-tablet-1-2 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 50%; + -moz-flex: 0 50%; + -ms-flex: 0 50%; + flex: 0 50%; } + + .size-tablet-1-3 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 33.33333%; + -moz-flex: 0 33.33333%; + -ms-flex: 0 33.33333%; + flex: 0 33.33333%; } + + .size-tablet-1-4 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 25%; + -moz-flex: 0 25%; + -ms-flex: 0 25%; + flex: 0 25%; } + + .size-tablet-1-5 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 20%; + -moz-flex: 0 20%; + -ms-flex: 0 20%; + flex: 0 20%; } + + .size-tablet-1-6 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 16.66667%; + -moz-flex: 0 16.66667%; + -ms-flex: 0 16.66667%; + flex: 0 16.66667%; } + + .size-tablet-1-7 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 14.28571%; + -moz-flex: 0 14.28571%; + -ms-flex: 0 14.28571%; + flex: 0 14.28571%; } + + .size-tablet-1-8 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 12.5%; + -moz-flex: 0 12.5%; + -ms-flex: 0 12.5%; + flex: 0 12.5%; } + + .size-tablet-1-9 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 11.11111%; + -moz-flex: 0 11.11111%; + -ms-flex: 0 11.11111%; + flex: 0 11.11111%; } + + .size-tablet-1-10 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 10%; + -moz-flex: 0 10%; + -ms-flex: 0 10%; + flex: 0 10%; } + + .size-tablet-1-11 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 9.09091%; + -moz-flex: 0 9.09091%; + -ms-flex: 0 9.09091%; + flex: 0 9.09091%; } + + .size-tablet-1-12 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 8.33333%; + -moz-flex: 0 8.33333%; + -ms-flex: 0 8.33333%; + flex: 0 8.33333%; } } +@media only all and (max-width: 47.938em) { + @supports not (flex-wrap: wrap) { + .grid { + display: block; + -webkit-box-lines: inherit; + -moz-box-lines: inherit; + box-lines: inherit; + -webkit-flex-wrap: inherit; + -moz-flex-wrap: inherit; + -ms-flex-wrap: inherit; + flex-wrap: inherit; } + + .block { + display: block; + -webkit-box-flex: inherit; + -moz-box-flex: inherit; + box-flex: inherit; + -webkit-flex: inherit; + -moz-flex: inherit; + -ms-flex: inherit; + flex: inherit; } } } +.first-block { + -webkit-box-ordinal-group: 0; + -webkit-order: -1; + -ms-flex-order: -1; + order: -1; } + +.last-block { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + +.fixed-blocks { + -webkit-flex-flow: row wrap; + -moz-flex-flow: row wrap; + flex-flow: row wrap; } + .fixed-blocks .block { + -webkit-box-flex: inherit; + -moz-box-flex: inherit; + box-flex: inherit; + -webkit-flex: inherit; + -moz-flex: inherit; + -ms-flex: inherit; + flex: inherit; + width: 25%; } + @media only all and (min-width: 60em) and (max-width: 74.938em) { + .fixed-blocks .block { + width: 33.33333%; } } + @media only all and (min-width: 48em) and (max-width: 59.938em) { + .fixed-blocks .block { + width: 50%; } } + @media only all and (max-width: 47.938em) { + .fixed-blocks .block { + width: 100%; } } + +body { + font-size: 1.05rem; + line-height: 1.7; } + +h1, h2, h3, h4, h5, h6 { + margin: 0.85rem 0 1.7rem 0; + text-rendering: optimizeLegibility; } + +h1 { + font-size: 3.25rem; } + +h2 { + font-size: 2.55rem; } + +h3 { + font-size: 2.15rem; } + +h4 { + font-size: 1.8rem; } + +h5 { + font-size: 1.4rem; } + +h6 { + font-size: 0.9rem; } + +p { + margin: 1.7rem 0; } + +ul, ol { + margin-top: 1.7rem; + margin-bottom: 1.7rem; } + ul ul, ul ol, ol ul, ol ol { + margin-top: 0; + margin-bottom: 0; } + +blockquote { + margin: 1.7rem 0; + padding-left: 0.85rem; } + +cite { + display: block; + font-size: 0.925rem; } + cite:before { + content: "\2014 \0020"; } + +pre { + margin: 1.7rem 0; + padding: 0.938rem; } + +code { + vertical-align: bottom; } + +small { + font-size: 0.925rem; } + +hr { + border-left: none; + border-right: none; + border-top: none; + margin: 1.7rem 0; } + +fieldset { + border: 0; + padding: 0.938rem; + margin: 0 0 1.7rem 0; } + +input, +label, +select { + display: block; } + +label { + margin-bottom: 0.425rem; } + label.required:after { + content: "*"; } + label abbr { + display: none; } + +textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] { + -webkit-transition: border-color; + -moz-transition: border-color; + transition: border-color; + border-radius: 0.1875rem; + margin-bottom: 0.85rem; + padding: 0.425rem 0.425rem; + width: 100%; } + textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + outline: none; } + +textarea { + resize: vertical; } + +input[type="checkbox"], input[type="radio"] { + display: inline; + margin-right: 0.425rem; } + +input[type="file"] { + width: 100%; } + +select { + width: auto; + max-width: 100%; + margin-bottom: 1.7rem; } + +button, +input[type="submit"] { + cursor: pointer; + user-select: none; + vertical-align: middle; + white-space: nowrap; + border: inherit; } diff --git a/docs/static/css/perfect-scrollbar.min.css b/docs/static/css/perfect-scrollbar.min.css new file mode 100644 index 000000000..ebd2cb43b --- /dev/null +++ b/docs/static/css/perfect-scrollbar.min.css @@ -0,0 +1,2 @@ +/* perfect-scrollbar v0.6.13 */ +.ps-container{-ms-touch-action:auto;touch-action:auto;overflow:hidden !important;-ms-overflow-style:none}@supports (-ms-overflow-style: none){.ps-container{overflow:auto !important}}@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){.ps-container{overflow:auto !important}}.ps-container.ps-active-x>.ps-scrollbar-x-rail,.ps-container.ps-active-y>.ps-scrollbar-y-rail{display:block;background-color:transparent}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999;height:11px}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999;width:11px}.ps-container>.ps-scrollbar-x-rail{display:none;position:absolute;opacity:0;-webkit-transition:background-color .2s linear, opacity .2s linear;-o-transition:background-color .2s linear, opacity .2s linear;-moz-transition:background-color .2s linear, opacity .2s linear;transition:background-color .2s linear, opacity .2s linear;bottom:0px;height:15px}.ps-container>.ps-scrollbar-x-rail>.ps-scrollbar-x{position:absolute;background-color:#aaa;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;-o-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;-moz-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;bottom:2px;height:6px}.ps-container>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x,.ps-container>.ps-scrollbar-x-rail:active>.ps-scrollbar-x{height:11px}.ps-container>.ps-scrollbar-y-rail{display:none;position:absolute;opacity:0;-webkit-transition:background-color .2s linear, opacity .2s linear;-o-transition:background-color .2s linear, opacity .2s linear;-moz-transition:background-color .2s linear, opacity .2s linear;transition:background-color .2s linear, opacity .2s linear;right:0;width:15px}.ps-container>.ps-scrollbar-y-rail>.ps-scrollbar-y{position:absolute;background-color:#aaa;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;-o-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;-moz-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;right:2px;width:6px}.ps-container>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y,.ps-container>.ps-scrollbar-y-rail:active>.ps-scrollbar-y{width:11px}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999;height:11px}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999;width:11px}.ps-container:hover>.ps-scrollbar-x-rail,.ps-container:hover>.ps-scrollbar-y-rail{opacity:.6}.ps-container:hover>.ps-scrollbar-x-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x{background-color:#999}.ps-container:hover>.ps-scrollbar-y-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y{background-color:#999} diff --git a/docs/static/css/tags.css b/docs/static/css/tags.css new file mode 100644 index 000000000..495d2f9f7 --- /dev/null +++ b/docs/static/css/tags.css @@ -0,0 +1,49 @@ +/* Tags */ + +#head-tags{ + margin-left:1em; + margin-top:1em; +} + +#body .tags a.tag-link { + display: inline-block; + line-height: 2em; + font-size: 0.8em; + position: relative; + margin: 0 16px 8px 0; + padding: 0 10px 0 12px; + background: #8451a1; + + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + color: #fff; +} + +#body .tags a.tag-link:before { + content: ""; + position: absolute; + top:0; + left: -1em; + width: 0; + height: 0; + border-color: transparent #8451a1 transparent transparent; + border-style: solid; + border-width: 1em 1em 1em 0; +} + +#body .tags a.tag-link:after { + content: ""; + position: absolute; + top: 10px; + left: 1px; + width: 5px; + height: 5px; + -webkit-border-radius: 50%; + border-radius: 100%; + background: #fff; +} diff --git a/docs/static/css/theme-blue.css b/docs/static/css/theme-blue.css new file mode 100644 index 000000000..9771ae5e3 --- /dev/null +++ b/docs/static/css/theme-blue.css @@ -0,0 +1,111 @@ + +:root{ + + --MAIN-TEXT-color:#323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ + --MAIN-LINK-color:#1C90F3; /* Color of links */ + --MAIN-LINK-HOVER-color:#167ad0; /* Color of hovered links */ + --MAIN-ANCHOR-color: #1C90F3; /* color of anchors on titles */ + + --MENU-HEADER-BG-color:#1C90F3; /* Background color of menu header */ + --MENU-HEADER-BORDER-color:#33a1ff; /*Color of menu header border */ + + --MENU-SEARCH-BG-color:#167ad0; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BOX-color: #33a1ff; /* Override search field border color */ + --MENU-SEARCH-BOX-ICONS-color: #a1d2fd; /* Override search field icons color */ + + --MENU-SECTIONS-ACTIVE-BG-color:#20272b; /* Background color of the active section and its childs */ + --MENU-SECTIONS-BG-color:#252c31; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #33a1ff; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #20272b; /* Color of
separator in menu */ + +} + +body { + color: var(--MAIN-TEXT-color) !important; +} + +textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + border-color: none; + box-shadow: none; +} + +h2, h3, h4, h5 { + color: var(--MAIN-TITLES-TEXT-color) !important; +} + +a { + color: var(--MAIN-LINK-color); +} + +.anchor { + color: var(--MAIN-ANCHOR-color); +} + +a:hover { + color: var(--MAIN-LINK-HOVER-color); +} + +#sidebar ul li.visited > a .read-icon { + color: var(--MENU-VISITED-color); +} + +#body a.highlight:after { + display: block; + content: ""; + height: 1px; + width: 0%; + -webkit-transition: width 0.5s ease; + -moz-transition: width 0.5s ease; + -ms-transition: width 0.5s ease; + transition: width 0.5s ease; + background-color: var(--MAIN-LINK-HOVER-color); +} +#sidebar { + background-color: var(--MENU-SECTIONS-BG-color); +} +#sidebar #header-wrapper { + background: var(--MENU-HEADER-BG-color); + color: var(--MENU-SEARCH-BOX-color); + border-color: var(--MENU-HEADER-BORDER-color); +} +#sidebar .searchbox { + border-color: var(--MENU-SEARCH-BOX-color); + background: var(--MENU-SEARCH-BG-color); +} +#sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { + background: var(--MENU-SECTIONS-ACTIVE-BG-color); +} +#sidebar .searchbox * { + color: var(--MENU-SEARCH-BOX-ICONS-color); +} + +#sidebar a { + color: var(--MENU-SECTIONS-LINK-color); +} + +#sidebar a:hover { + color: var(--MENU-SECTIONS-LINK-HOVER-color); +} + +#sidebar ul li.active > a { + background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); + color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; +} + +#sidebar hr { + border-color: var(--MENU-SECTION-HR-color); +} + +#body .tags a.tag-link { + background-color: var(--MENU-HEADER-BG-color); +} + +#body .tags a.tag-link:before { + border-right-color: var(--MENU-HEADER-BG-color); +} \ No newline at end of file diff --git a/docs/static/css/theme-green.css b/docs/static/css/theme-green.css new file mode 100644 index 000000000..3b0b1f721 --- /dev/null +++ b/docs/static/css/theme-green.css @@ -0,0 +1,111 @@ + +:root{ + + --MAIN-TEXT-color:#323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ + --MAIN-LINK-color:#599a3e; /* Color of links */ + --MAIN-LINK-HOVER-color:#3f6d2c; /* Color of hovered links */ + --MAIN-ANCHOR-color: #599a3e; /* color of anchors on titles */ + + --MENU-HEADER-BG-color:#74b559; /* Background color of menu header */ + --MENU-HEADER-BORDER-color:#9cd484; /*Color of menu header border */ + + --MENU-SEARCH-BG-color:#599a3e; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BOX-color: #84c767; /* Override search field border color */ + --MENU-SEARCH-BOX-ICONS-color: #c7f7c4; /* Override search field icons color */ + + --MENU-SECTIONS-ACTIVE-BG-color:#1b211c; /* Background color of the active section and its childs */ + --MENU-SECTIONS-BG-color:#222723; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #599a3e; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #18211c; /* Color of
separator in menu */ + +} + +body { + color: var(--MAIN-TEXT-color) !important; +} + +textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + border-color: none; + box-shadow: none; +} + +h2, h3, h4, h5 { + color: var(--MAIN-TITLES-TEXT-color) !important; +} + +a { + color: var(--MAIN-LINK-color); +} + +.anchor { + color: var(--MAIN-ANCHOR-color); +} + +a:hover { + color: var(--MAIN-LINK-HOVER-color); +} + +#sidebar ul li.visited > a .read-icon { + color: var(--MENU-VISITED-color); +} + +#body a.highlight:after { + display: block; + content: ""; + height: 1px; + width: 0%; + -webkit-transition: width 0.5s ease; + -moz-transition: width 0.5s ease; + -ms-transition: width 0.5s ease; + transition: width 0.5s ease; + background-color: var(--MAIN-LINK-HOVER-color); +} +#sidebar { + background-color: var(--MENU-SECTIONS-BG-color); +} +#sidebar #header-wrapper { + background: var(--MENU-HEADER-BG-color); + color: var(--MENU-SEARCH-BOX-color); + border-color: var(--MENU-HEADER-BORDER-color); +} +#sidebar .searchbox { + border-color: var(--MENU-SEARCH-BOX-color); + background: var(--MENU-SEARCH-BG-color); +} +#sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { + background: var(--MENU-SECTIONS-ACTIVE-BG-color); +} +#sidebar .searchbox * { + color: var(--MENU-SEARCH-BOX-ICONS-color); +} + +#sidebar a { + color: var(--MENU-SECTIONS-LINK-color); +} + +#sidebar a:hover { + color: var(--MENU-SECTIONS-LINK-HOVER-color); +} + +#sidebar ul li.active > a { + background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); + color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; +} + +#sidebar hr { + border-color: var(--MENU-SECTION-HR-color); +} + +#body .tags a.tag-link { + background-color: var(--MENU-HEADER-BG-color); +} + +#body .tags a.tag-link:before { + border-right-color: var(--MENU-HEADER-BG-color); +} \ No newline at end of file diff --git a/docs/static/css/theme-red.css b/docs/static/css/theme-red.css new file mode 100644 index 000000000..36c9278e5 --- /dev/null +++ b/docs/static/css/theme-red.css @@ -0,0 +1,111 @@ + +:root{ + + --MAIN-TEXT-color:#323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ + --MAIN-LINK-color:#f31c1c; /* Color of links */ + --MAIN-LINK-HOVER-color:#d01616; /* Color of hovered links */ + --MAIN-ANCHOR-color: #f31c1c; /* color of anchors on titles */ + + --MENU-HEADER-BG-color:#dc1010; /* Background color of menu header */ + --MENU-HEADER-BORDER-color:#e23131; /*Color of menu header border */ + + --MENU-SEARCH-BG-color:#b90000; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BOX-color: #ef2020; /* Override search field border color */ + --MENU-SEARCH-BOX-ICONS-color: #fda1a1; /* Override search field icons color */ + + --MENU-SECTIONS-ACTIVE-BG-color:#2b2020; /* Background color of the active section and its childs */ + --MENU-SECTIONS-BG-color:#312525; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #ff3333; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #2b2020; /* Color of
separator in menu */ + +} + +body { + color: var(--MAIN-TEXT-color) !important; +} + +textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + border-color: none; + box-shadow: none; +} + +h2, h3, h4, h5 { + color: var(--MAIN-TITLES-TEXT-color) !important; +} + +a { + color: var(--MAIN-LINK-color); +} + +.anchor { + color: var(--MAIN-ANCHOR-color); +} + +a:hover { + color: var(--MAIN-LINK-HOVER-color); +} + +#sidebar ul li.visited > a .read-icon { + color: var(--MENU-VISITED-color); +} + +#body a.highlight:after { + display: block; + content: ""; + height: 1px; + width: 0%; + -webkit-transition: width 0.5s ease; + -moz-transition: width 0.5s ease; + -ms-transition: width 0.5s ease; + transition: width 0.5s ease; + background-color: var(--MAIN-LINK-HOVER-color); +} +#sidebar { + background-color: var(--MENU-SECTIONS-BG-color); +} +#sidebar #header-wrapper { + background: var(--MENU-HEADER-BG-color); + color: var(--MENU-SEARCH-BOX-color); + border-color: var(--MENU-HEADER-BORDER-color); +} +#sidebar .searchbox { + border-color: var(--MENU-SEARCH-BOX-color); + background: var(--MENU-SEARCH-BG-color); +} +#sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { + background: var(--MENU-SECTIONS-ACTIVE-BG-color); +} +#sidebar .searchbox * { + color: var(--MENU-SEARCH-BOX-ICONS-color); +} + +#sidebar a { + color: var(--MENU-SECTIONS-LINK-color); +} + +#sidebar a:hover { + color: var(--MENU-SECTIONS-LINK-HOVER-color); +} + +#sidebar ul li.active > a { + background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); + color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; +} + +#sidebar hr { + border-color: var(--MENU-SECTION-HR-color); +} + +#body .tags a.tag-link { + background-color: var(--MENU-HEADER-BG-color); +} + +#body .tags a.tag-link:before { + border-right-color: var(--MENU-HEADER-BG-color); +} \ No newline at end of file diff --git a/docs/static/css/theme.css b/docs/static/css/theme.css new file mode 100644 index 000000000..f435e69a1 --- /dev/null +++ b/docs/static/css/theme.css @@ -0,0 +1,1220 @@ +@charset "UTF-8"; + +/* Tags */ +@import "tags.css"; + +#top-github-link, #body #breadcrumbs { + position: relative; + top: 50%; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -o-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); +} +.button, .button-secondary { + display: inline-block; + padding: 7px 12px; +} +.button:active, .button-secondary:active { + margin: 2px 0 -2px 0; +} +@font-face { + font-family: 'Novacento Sans Wide'; + src: url("../fonts/Novecentosanswide-UltraLight-webfont.eot"); + src: url("../fonts/Novecentosanswide-UltraLight-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/Novecentosanswide-UltraLight-webfont.woff2") format("woff2"), url("../fonts/Novecentosanswide-UltraLight-webfont.woff") format("woff"), url("../fonts/Novecentosanswide-UltraLight-webfont.ttf") format("truetype"), url("../fonts/Novecentosanswide-UltraLight-webfont.svg#novecento_sans_wideultralight") format("svg"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: 'Work Sans'; + font-style: normal; + font-weight: 300; + src: url("../fonts/Work_Sans_300.eot?#iefix") format("embedded-opentype"), url("../fonts/Work_Sans_300.woff") format("woff"), url("../fonts/Work_Sans_300.woff2") format("woff2"), url("../fonts/Work_Sans_300.svg#WorkSans") format("svg"), url("../fonts/Work_Sans_300.ttf") format("truetype"); +} +@font-face { + font-family: 'Work Sans'; + font-style: normal; + font-weight: 500; + src: url("../fonts/Work_Sans_500.eot?#iefix") format("embedded-opentype"), url("../fonts/Work_Sans_500.woff") format("woff"), url("../fonts/Work_Sans_500.woff2") format("woff2"), url("../fonts/Work_Sans_500.svg#WorkSans") format("svg"), url("../fonts/Work_Sans_500.ttf") format("truetype"); +} +body { + background: #fff; + color: #777; +} +body #chapter h1 { + font-size: 3.5rem; +} +@media only all and (min-width: 48em) and (max-width: 59.938em) { + body #chapter h1 { + font-size: 3rem; + } +} +@media only all and (max-width: 47.938em) { + body #chapter h1 { + font-size: 2rem; + } +} +a { + color: #00bdf3; +} +a:hover { + color: #0082a7; +} +pre { + position: relative; + color: #ffffff; +} +.bg { + background: #fff; + border: 1px solid #eaeaea; +} +b, strong, label, th { + font-weight: 600; +} +.default-animation, #header #logo-svg, #header #logo-svg path, #sidebar, #sidebar ul, #body, #body .padding, #body .nav { + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + transition: all 0.5s ease; +} +#grav-logo { + max-width: 60%; +} +#grav-logo path { + fill: #fff !important; +} +#sidebar { + font-weight: 300 !important; +} +fieldset { + border: 1px solid #ddd; +} +textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] { + background-color: white; + border: 1px solid #ddd; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.06); +} +textarea:hover, input[type="email"]:hover, input[type="number"]:hover, input[type="password"]:hover, input[type="search"]:hover, input[type="tel"]:hover, input[type="text"]:hover, input[type="url"]:hover, input[type="color"]:hover, input[type="date"]:hover, input[type="datetime"]:hover, input[type="datetime-local"]:hover, input[type="month"]:hover, input[type="time"]:hover, input[type="week"]:hover, select[multiple=multiple]:hover { + border-color: #c4c4c4; +} +textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + border-color: #00bdf3; + box-shadow: inset 0 1px 3px rgba(0,0,0,.06),0 0 5px rgba(0,169,218,.7) +} +#header-wrapper { + background: #8451a1; + color: #fff; + text-align: center; + border-bottom: 4px solid #9c6fb6; + padding: 1rem; +} +#header a { + display: inline-block; +} +#header #logo-svg { + width: 8rem; + height: 2rem; +} +#header #logo-svg path { + fill: #fff; +} +.searchbox { + margin-top: 1rem; + position: relative; + border: 1px solid #915eae; + background: #764890; + border-radius: 4px; +} +.searchbox label { + color: rgba(255, 255, 255, 0.8); + position: absolute; + left: 10px; + top: 3px; +} +.searchbox span { + color: rgba(255, 255, 255, 0.6); + position: absolute; + right: 10px; + top: 3px; + cursor: pointer; +} +.searchbox span:hover { + color: rgba(255, 255, 255, 0.9); +} +.searchbox input { + display: inline-block; + color: #fff; + width: 100%; + height: 30px; + background: transparent; + border: 0; + padding: 0 25px 0 30px; + margin: 0; + font-weight: 300; +} +.searchbox input::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.6); +} +.searchbox input::-moz-placeholder { + color: rgba(255, 255, 255, 0.6); +} +.searchbox input:-moz-placeholder { + color: rgba(255, 255, 255, 0.6); +} +.searchbox input:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.6); +} +#sidebar-toggle-span { + display: none; +} +@media only all and (max-width: 47.938em) { + #sidebar-toggle-span { + display: inline; + } +} +#sidebar { + background-color: #322A38; + position: fixed; + top: 0; + width: 300px; + bottom: 0; + left: 0; + font-weight: 400; + font-size: 15px; +} +#sidebar a { + color: #ccc; +} +#sidebar a:hover { + color: #e6e6e6; +} +#sidebar a.subtitle { + color: rgba(204, 204, 204, 0.6); +} +#sidebar hr { + border-bottom: 1px solid #2a232f; +} +#sidebar a.padding { + padding: 0 1rem; +} +#sidebar h5 { + margin: 2rem 0 0; + position: relative; + line-height: 2; +} +#sidebar h5 a { + display: block; + margin-left: 0; + margin-right: 0; + padding-left: 1rem; + padding-right: 1rem; +} +#sidebar h5 i { + color: rgba(204, 204, 204, 0.6); + position: absolute; + right: 0.6rem; + top: 0.7rem; + font-size: 80%; +} +#sidebar h5.parent a { + background: #201b24; + color: #d9d9d9 !important; +} +#sidebar h5.active a { + background: #fff; + color: #777 !important; +} +#sidebar h5.active i { + color: #777 !important; +} +#sidebar h5 + ul.topics { + display: none; + margin-top: 0; +} +#sidebar h5.parent + ul.topics, #sidebar h5.active + ul.topics { + display: block; +} +#sidebar ul { + list-style: none; + padding: 0; + margin: 0; +} +#sidebar ul.searched a { + color: #999999; +} +#sidebar ul.searched .search-match a { + color: #e6e6e6; +} +#sidebar ul.searched .search-match a:hover { + color: white; +} +#sidebar ul.topics { + margin: 0 1rem; +} +#sidebar ul.topics.searched ul { + display: block; +} +#sidebar ul.topics ul { + display: none; + padding-bottom: 1rem; +} +#sidebar ul.topics ul ul { + padding-bottom: 0; +} +#sidebar ul.topics li.parent ul, #sidebar ul.topics > li.active ul { + display: block; +} +#sidebar ul.topics > li > a { + line-height: 2rem; + font-size: 1.1rem; +} +#sidebar ul.topics > li > a b { + opacity: 0.5; + font-weight: normal; +} +#sidebar ul.topics > li > a .fa { + margin-top: 9px; +} +#sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { + background: #251f29; + margin-left: -1rem; + margin-right: -1rem; + padding-left: 1rem; + padding-right: 1rem; +} +#sidebar ul li.active > a { + background: #fff; + color: #777 !important; + margin-left: -1rem; + margin-right: -1rem; + padding-left: 1rem; + padding-right: 1rem; +} +#sidebar ul li { + padding: 0; +} +#sidebar ul li.visited + span { + margin-right: 16px; +} +#sidebar ul li a { + display: block; + padding: 2px 0; +} +#sidebar ul li a span { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + display: block; +} +#sidebar ul li > a { + padding: 4px 0; +} +#sidebar ul li.visited > a .read-icon { + color: #9c6fb6; + display: inline; +} +#sidebar ul li li { + padding-left: 1rem; + text-indent: 0.2rem; +} +#main { + background: #f7f7f7; + margin: 0 0 1.563rem 0; +} +#body { + position: relative; + margin-left: 300px; + min-height: 100%; +} +#body img, #body .video-container { + margin: 3rem auto; + display: block; + text-align: center; +} +#body img.border, #body .video-container.border { + border: 2px solid #e6e6e6 !important; + padding: 2px; +} +#body img.shadow, #body .video-container.shadow { + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); +} +#body img.inline { + display: inline !important; + margin: 0 !important; + vertical-align: bottom; +} +#body .bordered { + border: 1px solid #ccc; +} +#body .padding { + padding: 3rem 6rem; +} +@media only all and (max-width: 79.938em) { + #body .padding { + position: static; + padding: 15px 5rem; + } +} + +@media only all and (max-width: 59.938em) { + #body .padding { + position: static; + padding: 15px 3rem; + } +} +@media only all and (max-width: 47.938em) { + #body .padding { + padding: 5px 1rem; + } +} +#body h1 + hr { + margin-top: -1.7rem; + margin-bottom: 3rem; +} +@media only all and (max-width: 59.938em) { + #body #navigation { + position: static; + margin-right: 0 !important; + width: 100%; + display: table; + } +} +#body .nav { + position: fixed; + top: 0; + bottom: 0; + width: 4rem; + font-size: 50px; + height: 100%; + cursor: pointer; + display: table; + text-align: center; +} +#body .nav > i { + display: table-cell; + vertical-align: middle; + text-align: center; +} +@media only all and (max-width: 59.938em) { + #body .nav { + display: table-cell; + position: static; + top: auto; + width: 50%; + text-align: center; + height: 100px; + line-height: 100px; + padding-top: 0; + } + #body .nav > i { + display: inline-block; + } +} +#body .nav:hover { + background: #F6F6F6; +} +#body .nav.nav-pref { + left: 0; +} +#body .nav.nav-next { + right: 0; +} +#body-inner { + margin-bottom: 5rem; +} +#chapter { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + padding: 2rem 0; +} +#chapter #body-inner { + padding-bottom: 3rem; + max-width: 80%; +} +#chapter h3 { + font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + font-weight: 300; + text-align: center; +} +#chapter h1 { + font-size: 5rem; + border-bottom: 4px solid #F0F2F4; +} +#chapter p { + text-align: center; + font-size: 1.2rem; +} +#footer { + padding: 3rem 1rem; + color: #b3b3b3; + font-size: 13px; +} +#footer p { + margin: 0; +} +body { + font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + font-weight: 300; + line-height: 1.6; + font-size: 18px !important; +} +h2, h3, h4, h5, h6 { + font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + text-rendering: optimizeLegibility; + color: #5e5e5e; + font-weight: 400; + letter-spacing: -1px; +} +h1 { + font-family: "Novacento Sans Wide", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + text-align: center; + text-transform: uppercase; + color: #222; + font-weight: 200; +} +blockquote { + border-left: 10px solid #F0F2F4; +} +blockquote p { + font-size: 1.1rem; + color: #999; +} +blockquote cite { + display: block; + text-align: right; + color: #666; + font-size: 1.2rem; +} +div.notices { + margin: 2rem 0; + position: relative; +} +div.notices p { + padding: 15px; + display: block; + font-size: 1rem; + margin-top: 0rem; + margin-bottom: 0rem; + color: #666; +} +div.notices p:first-child:before { + position: absolute; + top: 2px; + color: #fff; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f06a"; + left: 10px; +} +div.notices p:first-child:after { + position: absolute; + top: 2px; + color: #fff; + left: 2rem; +} +div.notices.info p { + border-top: 30px solid #F0B37E; + background: #FFF2DB; +} +div.notices.info p:first-child:after { + content: 'Info'; +} +div.notices.warning p { + border-top: 30px solid rgba(217, 83, 79, 0.8); + background: #FAE2E2; +} +div.notices.warning p:first-child:after { + content: 'Warning'; +} +div.notices.note p { + border-top: 30px solid #6AB0DE; + background: #E7F2FA; +} +div.notices.note p:first-child:after { + content: 'Note'; +} +div.notices.tip p { + border-top: 30px solid rgba(92, 184, 92, 0.8); + background: #E6F9E6; +} +div.notices.tip p:first-child:after { + content: 'Tip'; +} + +/* attachments shortcode */ + +section.attachments { + margin: 2rem 0; + position: relative; +} + +section.attachments label { + font-weight: 400; + padding-left: 0.5em; + padding-top: 0.2em; + padding-bottom: 0.2em; + margin: 0; +} + +section.attachments .attachments-files { + padding: 15px; + display: block; + font-size: 1rem; + margin-top: 0rem; + margin-bottom: 0rem; + color: #666; +} + +section.attachments.orange label { + color: #fff; + background: #F0B37E; +} + +section.attachments.orange .attachments-files { + background: #FFF2DB; +} + +section.attachments.green label { + color: #fff; + background: rgba(92, 184, 92, 0.8); +} + +section.attachments.green .attachments-files { + background: #E6F9E6; +} + +section.attachments.blue label { + color: #fff; + background: #6AB0DE; +} + +section.attachments.blue .attachments-files { + background: #E7F2FA; +} + +section.attachments.grey label { + color: #fff; + background: #505d65; +} + +section.attachments.grey .attachments-files { + background: #f4f4f4; +} + +/* Children shortcode */ + +/* Children shortcode */ +.children p { + font-size: small; + margin-top: 0px; + padding-top: 0px; + margin-bottom: 0px; + padding-bottom: 0px; +} +.children-li p { + font-size: small; + font-style: italic; + +} +.children-h2 p, .children-h3 p { + font-size: small; + margin-top: 0px; + padding-top: 0px; + margin-bottom: 0px; + padding-bottom: 0px; +} +.children h3,.children h2 { + margin-bottom: 0px; + margin-top: 5px; +} + +code, kbd, pre, samp { + font-family: "Consolas", menlo, monospace; + font-size: 92%; +} +code { + border-radius: 2px; + white-space: nowrap; + color: #5e5e5e; + background: #FFF7DD; + border: 1px solid #fbf0cb; + padding: 0px 2px; +} +code + .copy-to-clipboard { + margin-left: -1px; + border-left: 0 !important; + font-size: inherit !important; + vertical-align: middle; + height: 21px; + top: 0; +} +pre { + padding: 1rem; + margin: 2rem 0; + background: #282c34; + border: 0; + border-radius: 2px; + line-height: 1.15; +} +pre code { + color: whitesmoke; + background: inherit; + white-space: inherit; + border: 0; + padding: 0; + margin: 0; + font-size: 15px; +} +hr { + border-bottom: 4px solid #F0F2F4; +} +.page-title { + margin-top: -25px; + padding: 25px; + float: left; + clear: both; + background: #9c6fb6; + color: #fff; +} +#body a.anchor-link { + color: #ccc; +} +#body a.anchor-link:hover { + color: #9c6fb6; +} +#body-inner .tabs-wrapper.ui-theme-badges { + background: #1d1f21; +} +#body-inner .tabs-wrapper.ui-theme-badges .tabs-nav li { + font-size: 0.9rem; + text-transform: uppercase; +} +#body-inner .tabs-wrapper.ui-theme-badges .tabs-nav li a { + background: #35393c; +} +#body-inner .tabs-wrapper.ui-theme-badges .tabs-nav li.current a { + background: #4d5257; +} +#body-inner pre { + white-space: pre-wrap; +} +.tabs-wrapper pre { + margin: 1rem 0; + border: 0; + padding: 0; + background: inherit; +} +table { + border: 1px solid #eaeaea; + table-layout: auto; +} +th { + background: #f7f7f7; + padding: 0.5rem; +} +td { + padding: 0.5rem; + border: 1px solid #eaeaea; +} +.button { + background: #9c6fb6; + color: #fff; + box-shadow: 0 3px 0 #00a5d4; +} +.button:hover { + background: #00a5d4; + box-shadow: 0 3px 0 #008db6; + color: #fff; +} +.button:active { + box-shadow: 0 1px 0 #008db6; +} +.button-secondary { + background: #F8B450; + color: #fff; + box-shadow: 0 3px 0 #f7a733; +} +.button-secondary:hover { + background: #f7a733; + box-shadow: 0 3px 0 #f69b15; + color: #fff; +} +.button-secondary:active { + box-shadow: 0 1px 0 #f69b15; +} +.bullets { + margin: 1.7rem 0; + margin-left: -0.85rem; + margin-right: -0.85rem; + overflow: auto; +} +.bullet { + float: left; + padding: 0 0.85rem; +} +.two-column-bullet { + width: 50%; +} +@media only all and (max-width: 47.938em) { + .two-column-bullet { + width: 100%; + } +} +.three-column-bullet { + width: 33.33333%; +} +@media only all and (max-width: 47.938em) { + .three-column-bullet { + width: 100%; + } +} +.four-column-bullet { + width: 25%; +} +@media only all and (max-width: 47.938em) { + .four-column-bullet { + width: 100%; + } +} +.bullet-icon { + float: left; + background: #9c6fb6; + padding: 0.875rem; + width: 3.5rem; + height: 3.5rem; + border-radius: 50%; + color: #fff; + font-size: 1.75rem; + text-align: center; +} +.bullet-icon-1 { + background: #9c6fb6; +} +.bullet-icon-2 { + background: #00f3d8; +} +.bullet-icon-3 { + background: #e6f300; +} +.bullet-content { + margin-left: 4.55rem; +} +.tooltipped { + position: relative; +} +.tooltipped:after { + position: absolute; + z-index: 1000000; + display: none; + padding: 5px 8px; + font: normal normal 11px/1.5 "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + color: #fff; + text-align: center; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-wrap: break-word; + white-space: pre; + pointer-events: none; + content: attr(aria-label); + background: rgba(0, 0, 0, 0.8); + border-radius: 3px; + -webkit-font-smoothing: subpixel-antialiased; +} +.tooltipped:before { + position: absolute; + z-index: 1000001; + display: none; + width: 0; + height: 0; + color: rgba(0, 0, 0, 0.8); + pointer-events: none; + content: ""; + border: 5px solid transparent; +} +.tooltipped:hover:before, .tooltipped:hover:after, .tooltipped:active:before, .tooltipped:active:after, .tooltipped:focus:before, .tooltipped:focus:after { + display: inline-block; + text-decoration: none; +} +.tooltipped-s:after, .tooltipped-se:after, .tooltipped-sw:after { + top: 100%; + right: 50%; + margin-top: 5px; +} +.tooltipped-s:before, .tooltipped-se:before, .tooltipped-sw:before { + top: auto; + right: 50%; + bottom: -5px; + margin-right: -5px; + border-bottom-color: rgba(0, 0, 0, 0.8); +} +.tooltipped-se:after { + right: auto; + left: 50%; + margin-left: -15px; +} +.tooltipped-sw:after { + margin-right: -15px; +} +.tooltipped-n:after, .tooltipped-ne:after, .tooltipped-nw:after { + right: 50%; + bottom: 100%; + margin-bottom: 5px; +} +.tooltipped-n:before, .tooltipped-ne:before, .tooltipped-nw:before { + top: -5px; + right: 50%; + bottom: auto; + margin-right: -5px; + border-top-color: rgba(0, 0, 0, 0.8); +} +.tooltipped-ne:after { + right: auto; + left: 50%; + margin-left: -15px; +} +.tooltipped-nw:after { + margin-right: -15px; +} +.tooltipped-s:after, .tooltipped-n:after { + transform: translateX(50%); +} +.tooltipped-w:after { + right: 100%; + bottom: 50%; + margin-right: 5px; + transform: translateY(50%); +} +.tooltipped-w:before { + top: 50%; + bottom: 50%; + left: -5px; + margin-top: -5px; + border-left-color: rgba(0, 0, 0, 0.8); +} +.tooltipped-e:after { + bottom: 50%; + left: 100%; + margin-left: 5px; + transform: translateY(50%); +} +.tooltipped-e:before { + top: 50%; + right: -5px; + bottom: 50%; + margin-top: -5px; + border-right-color: rgba(0, 0, 0, 0.8); +} +.highlightable { + padding: 1rem 0 1rem; + overflow: auto; + position: relative; +} +.hljs::selection, .hljs span::selection { + background: #b7b7b7; +} +.lightbox-active #body { + overflow: visible; +} +.lightbox-active #body .padding { + overflow: visible; +} +#github-contrib i { + vertical-align: middle; +} +.featherlight img { + margin: 0 !important; +} +.lifecycle #body-inner ul { + list-style: none; + margin: 0; + padding: 2rem 0 0; + position: relative; +} +.lifecycle #body-inner ol { + margin: 1rem 0 1rem 0; + padding: 2rem; + position: relative; +} +.lifecycle #body-inner ol li { + margin-left: 1rem; +} +.lifecycle #body-inner ol strong, .lifecycle #body-inner ol label, .lifecycle #body-inner ol th { + text-decoration: underline; +} +.lifecycle #body-inner ol ol { + margin-left: -1rem; +} +.lifecycle #body-inner h3[class*='level'] { + font-size: 20px; + position: absolute; + margin: 0; + padding: 4px 10px; + right: 0; + z-index: 1000; + color: #fff; + background: #1ABC9C; +} +.lifecycle #body-inner ol h3 { + margin-top: 1rem !important; + right: 2rem !important; +} +.lifecycle #body-inner .level-1 + ol { + background: #f6fefc; + border: 4px solid #1ABC9C; + color: #16A085; +} +.lifecycle #body-inner .level-1 + ol h3 { + background: #2ECC71; +} +.lifecycle #body-inner .level-2 + ol { + background: #f7fdf9; + border: 4px solid #2ECC71; + color: #27AE60; +} +.lifecycle #body-inner .level-2 + ol h3 { + background: #3498DB; +} +.lifecycle #body-inner .level-3 + ol { + background: #f3f9fd; + border: 4px solid #3498DB; + color: #2980B9; +} +.lifecycle #body-inner .level-3 + ol h3 { + background: #34495E; +} +.lifecycle #body-inner .level-4 + ol { + background: #e4eaf0; + border: 4px solid #34495E; + color: #2C3E50; +} +.lifecycle #body-inner .level-4 + ol h3 { + background: #34495E; +} +#top-bar { + background: #F6F6F6; + border-radius: 2px; + padding: 0 1rem; + height: 0; + min-height: 3rem; +} +#top-github-link { + position: relative; + z-index: 1; + float: right; + display: block; +} +#body #breadcrumbs { + height: auto; + margin-bottom: 0; + padding-left: 0; + line-height: 1.4; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + width: 70%; + display: inline-block; + float: left; +} +#body #breadcrumbs span { + padding: 0 0.1rem; +} +@media only all and (max-width: 59.938em) { + #sidebar { + width: 230px; + } + #body { + margin-left: 230px; + } +} +@media only all and (max-width: 47.938em) { + #sidebar { + width: 230px; + left: -230px; + } + #body { + margin-left: 0; + width: 100%; + } + .sidebar-hidden { + overflow: hidden; + } + .sidebar-hidden #sidebar { + left: 0; + } + .sidebar-hidden #body { + margin-left: 230px; + overflow: hidden; + } + .sidebar-hidden #overlay { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + z-index: 10; + background: rgba(255, 255, 255, 0.5); + cursor: pointer; + } +} +.copy-to-clipboard { + background-image: url(../images/clippy.svg); + background-position: 50% 50%; + background-size: 16px 16px; + background-repeat: no-repeat; + width: 27px; + height: 1.45rem; + top: -1px; + display: inline-block; + vertical-align: middle; + position: relative; + color: #5e5e5e; + background-color: #FFF7DD; + margin-left: -.2rem; + cursor: pointer; + border-radius: 0 2px 2px 0; + margin-bottom: 1px; +} +.copy-to-clipboard:hover { + background-color: #E8E2CD; +} +pre .copy-to-clipboard { + position: absolute; + right: 4px; + top: 4px; + background-color: #949bab; + color: #ccc; + border-radius: 2px; +} +pre .copy-to-clipboard:hover { + background-color: #656c72; + color: #fff; +} +.parent-element { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +#sidebar ul.topics > li > a .read-icon { + margin-top: 9px; +} + +#sidebar ul { + list-style: none; + padding: 0; + margin: 0; +} + +#sidebar #shortcuts li { + padding: 2px 0; + list-style: none; +} + +#sidebar ul li .read-icon { + display: none; + float: right; + font-size: 13px; + min-width: 16px; + margin: 4px 0 0 0; + text-align: right; +} +#sidebar ul li.visited > a .read-icon { + color: #00bdf3; + display: inline; +} + +#sidebar #shortcuts h3 { + font-family: "Novacento Sans Wide", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + color: white ; + margin-top:1rem; + padding-left: 1rem; +} + +#searchResults { + text-align: left; +} + +option { + color: initial; +} + +#logo { + font-family: "Novacento Sans Wide", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif !important; + color: white !important; + margin-bottom: 0; + text-transform: uppercase; +} + +.searchbox i { + margin-top: 5px; +} + +.summary { + margin-top: 0; + margin-bottom: 0; +} + +.api-page table{ + margin-top: 20px; +} + +.highlight { + display: inline-block !important; +} + +.gif { + max-height: 500px; +} + +.sponsor { + height: 70px !important; + margin-top: 25px !important; + display: inline-block !important; + } + +#logo-pic { + height: 60px !important; +} + +.submenu { + margin-top: 30px !important; + padding-left: 13px !important; + display: none; +} + +.submenu-active { + display: block; +} + +.active-link { + text-decoration: underline; +} + +.menu-group-link a{ + padding-left: 10px !important; + border-left: 3px solid transparent; + text-transform: uppercase; + cursor: pointer; +} + +.menu-group-link a:hover{ + border-left: 3px solid #0082a7; +} + +.menu-group-link-active { + border-left: 3px solid #0082a7; +} + + +#body-inner p { + margin: 0.8rem 0; +} + +#body-inner pre { + margin: 1.2rem 0; +} + diff --git a/docs/static/fonts/Inconsolata.eot b/docs/static/fonts/Inconsolata.eot new file mode 100644 index 000000000..0a705d653 Binary files /dev/null and b/docs/static/fonts/Inconsolata.eot differ diff --git a/docs/static/fonts/Inconsolata.svg b/docs/static/fonts/Inconsolata.svg new file mode 100644 index 000000000..36775f074 --- /dev/null +++ b/docs/static/fonts/Inconsolata.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/fonts/Inconsolata.ttf b/docs/static/fonts/Inconsolata.ttf new file mode 100644 index 000000000..4b8a36d24 Binary files /dev/null and b/docs/static/fonts/Inconsolata.ttf differ diff --git a/docs/static/fonts/Inconsolata.woff b/docs/static/fonts/Inconsolata.woff new file mode 100644 index 000000000..6f39625e5 Binary files /dev/null and b/docs/static/fonts/Inconsolata.woff differ diff --git a/docs/static/fonts/Novecentosanswide-Normal-webfont.eot b/docs/static/fonts/Novecentosanswide-Normal-webfont.eot new file mode 100644 index 000000000..9984682fc Binary files /dev/null and b/docs/static/fonts/Novecentosanswide-Normal-webfont.eot differ diff --git a/docs/static/fonts/Novecentosanswide-Normal-webfont.svg b/docs/static/fonts/Novecentosanswide-Normal-webfont.svg new file mode 100644 index 000000000..6fa1a66e3 --- /dev/null +++ b/docs/static/fonts/Novecentosanswide-Normal-webfont.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/fonts/Novecentosanswide-Normal-webfont.ttf b/docs/static/fonts/Novecentosanswide-Normal-webfont.ttf new file mode 100644 index 000000000..8cfb62dd5 Binary files /dev/null and b/docs/static/fonts/Novecentosanswide-Normal-webfont.ttf differ diff --git a/docs/static/fonts/Novecentosanswide-Normal-webfont.woff b/docs/static/fonts/Novecentosanswide-Normal-webfont.woff new file mode 100644 index 000000000..d5c429079 Binary files /dev/null and b/docs/static/fonts/Novecentosanswide-Normal-webfont.woff differ diff --git a/docs/static/fonts/Novecentosanswide-Normal-webfont.woff2 b/docs/static/fonts/Novecentosanswide-Normal-webfont.woff2 new file mode 100644 index 000000000..eefb4a318 Binary files /dev/null and b/docs/static/fonts/Novecentosanswide-Normal-webfont.woff2 differ diff --git a/docs/static/fonts/Novecentosanswide-UltraLight-webfont.eot b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.eot new file mode 100644 index 000000000..2a26561f9 Binary files /dev/null and b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.eot differ diff --git a/docs/static/fonts/Novecentosanswide-UltraLight-webfont.svg b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.svg new file mode 100644 index 000000000..c4e903b61 --- /dev/null +++ b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/fonts/Novecentosanswide-UltraLight-webfont.ttf b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.ttf new file mode 100644 index 000000000..9ce9c7f99 Binary files /dev/null and b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.ttf differ diff --git a/docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff new file mode 100644 index 000000000..381650c98 Binary files /dev/null and b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff differ diff --git a/docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 new file mode 100644 index 000000000..7e659549b Binary files /dev/null and b/docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 differ diff --git a/docs/static/fonts/Work_Sans_200.eot b/docs/static/fonts/Work_Sans_200.eot new file mode 100644 index 000000000..4052e4f94 Binary files /dev/null and b/docs/static/fonts/Work_Sans_200.eot differ diff --git a/docs/static/fonts/Work_Sans_200.svg b/docs/static/fonts/Work_Sans_200.svg new file mode 100644 index 000000000..0ffbd3a84 --- /dev/null +++ b/docs/static/fonts/Work_Sans_200.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/fonts/Work_Sans_200.ttf b/docs/static/fonts/Work_Sans_200.ttf new file mode 100644 index 000000000..68019e1cc Binary files /dev/null and b/docs/static/fonts/Work_Sans_200.ttf differ diff --git a/docs/static/fonts/Work_Sans_200.woff b/docs/static/fonts/Work_Sans_200.woff new file mode 100644 index 000000000..a1bd9e469 Binary files /dev/null and b/docs/static/fonts/Work_Sans_200.woff differ diff --git a/docs/static/fonts/Work_Sans_200.woff2 b/docs/static/fonts/Work_Sans_200.woff2 new file mode 100644 index 000000000..20c68a75c Binary files /dev/null and b/docs/static/fonts/Work_Sans_200.woff2 differ diff --git a/docs/static/fonts/Work_Sans_300.eot b/docs/static/fonts/Work_Sans_300.eot new file mode 100644 index 000000000..ace799382 Binary files /dev/null and b/docs/static/fonts/Work_Sans_300.eot differ diff --git a/docs/static/fonts/Work_Sans_300.svg b/docs/static/fonts/Work_Sans_300.svg new file mode 100644 index 000000000..7d2936783 --- /dev/null +++ b/docs/static/fonts/Work_Sans_300.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/fonts/Work_Sans_300.ttf b/docs/static/fonts/Work_Sans_300.ttf new file mode 100644 index 000000000..35387c235 Binary files /dev/null and b/docs/static/fonts/Work_Sans_300.ttf differ diff --git a/docs/static/fonts/Work_Sans_300.woff b/docs/static/fonts/Work_Sans_300.woff new file mode 100644 index 000000000..8d789eae9 Binary files /dev/null and b/docs/static/fonts/Work_Sans_300.woff differ diff --git a/docs/static/fonts/Work_Sans_300.woff2 b/docs/static/fonts/Work_Sans_300.woff2 new file mode 100644 index 000000000..f6e216d64 Binary files /dev/null and b/docs/static/fonts/Work_Sans_300.woff2 differ diff --git a/docs/static/fonts/Work_Sans_500.eot b/docs/static/fonts/Work_Sans_500.eot new file mode 100644 index 000000000..9df692942 Binary files /dev/null and b/docs/static/fonts/Work_Sans_500.eot differ diff --git a/docs/static/fonts/Work_Sans_500.svg b/docs/static/fonts/Work_Sans_500.svg new file mode 100644 index 000000000..90a91c14c --- /dev/null +++ b/docs/static/fonts/Work_Sans_500.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/fonts/Work_Sans_500.ttf b/docs/static/fonts/Work_Sans_500.ttf new file mode 100644 index 000000000..5b8cc5342 Binary files /dev/null and b/docs/static/fonts/Work_Sans_500.ttf differ diff --git a/docs/static/fonts/Work_Sans_500.woff b/docs/static/fonts/Work_Sans_500.woff new file mode 100644 index 000000000..df058514f Binary files /dev/null and b/docs/static/fonts/Work_Sans_500.woff differ diff --git a/docs/static/fonts/Work_Sans_500.woff2 b/docs/static/fonts/Work_Sans_500.woff2 new file mode 100644 index 000000000..b06c54df0 Binary files /dev/null and b/docs/static/fonts/Work_Sans_500.woff2 differ diff --git a/docs/static/images/clippy.svg b/docs/static/images/clippy.svg new file mode 100644 index 000000000..f4551735e --- /dev/null +++ b/docs/static/images/clippy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/images/favicon.png b/docs/static/images/favicon.png new file mode 100644 index 000000000..df06e35d6 Binary files /dev/null and b/docs/static/images/favicon.png differ diff --git a/docs-gen/files/img/github-blue.png b/docs/static/images/github-blue.png similarity index 100% rename from docs-gen/files/img/github-blue.png rename to docs/static/images/github-blue.png diff --git a/docs-gen/files/img/github.png b/docs/static/images/github.png similarity index 100% rename from docs-gen/files/img/github.png rename to docs/static/images/github.png diff --git a/docs/static/images/gopher-404.jpg b/docs/static/images/gopher-404.jpg new file mode 100644 index 000000000..2a5054389 Binary files /dev/null and b/docs/static/images/gopher-404.jpg differ diff --git a/docs-gen/files/img/logo.pdn b/docs/static/images/logo.pdn similarity index 100% rename from docs-gen/files/img/logo.pdn rename to docs/static/images/logo.pdn diff --git a/docs-gen/files/img/logo.png b/docs/static/images/logo.png similarity index 100% rename from docs-gen/files/img/logo.png rename to docs/static/images/logo.png diff --git a/docs/static/js/auto-complete.js b/docs/static/js/auto-complete.js new file mode 100644 index 000000000..0b4605456 --- /dev/null +++ b/docs/static/js/auto-complete.js @@ -0,0 +1,3 @@ +// JavaScript autoComplete v1.0.4 +// https://github.com/Pixabay/JavaScript-autoComplete +var autoComplete=function(){function e(e){function t(e,t){return e.classList?e.classList.contains(t):new RegExp("\\b"+t+"\\b").test(e.className)}function o(e,t,o){e.attachEvent?e.attachEvent("on"+t,o):e.addEventListener(t,o)}function s(e,t,o){e.detachEvent?e.detachEvent("on"+t,o):e.removeEventListener(t,o)}function n(e,s,n,l){o(l||document,s,function(o){for(var s,l=o.target||o.srcElement;l&&!(s=t(l,e));)l=l.parentElement;s&&n.call(l,o)})}if(document.querySelector){var l={selector:0,source:0,minChars:3,delay:150,offsetLeft:0,offsetTop:1,cache:1,menuClass:"",renderItem:function(e,t){t=t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");var o=new RegExp("("+t.split(" ").join("|")+")","gi");return'
'+e.replace(o,"$1")+"
"},onSelect:function(){}};for(var c in e)e.hasOwnProperty(c)&&(l[c]=e[c]);for(var a="object"==typeof l.selector?[l.selector]:document.querySelectorAll(l.selector),u=0;u0?i.sc.scrollTop=n+i.sc.suggestionHeight+s-i.sc.maxHeight:0>n&&(i.sc.scrollTop=n+s)}else i.sc.scrollTop=0},o(window,"resize",i.updateSC),document.body.appendChild(i.sc),n("autocomplete-suggestion","mouseleave",function(){var e=i.sc.querySelector(".autocomplete-suggestion.selected");e&&setTimeout(function(){e.className=e.className.replace("selected","")},20)},i.sc),n("autocomplete-suggestion","mouseover",function(){var e=i.sc.querySelector(".autocomplete-suggestion.selected");e&&(e.className=e.className.replace("selected","")),this.className+=" selected"},i.sc),n("autocomplete-suggestion","mousedown",function(e){if(t(this,"autocomplete-suggestion")){var o=this.getAttribute("data-val");i.value=o,l.onSelect(e,o,this),i.sc.style.display="none"}},i.sc),i.blurHandler=function(){try{var e=document.querySelector(".autocomplete-suggestions:hover")}catch(t){var e=0}e?i!==document.activeElement&&setTimeout(function(){i.focus()},20):(i.last_val=i.value,i.sc.style.display="none",setTimeout(function(){i.sc.style.display="none"},350))},o(i,"blur",i.blurHandler);var r=function(e){var t=i.value;if(i.cache[t]=e,e.length&&t.length>=l.minChars){for(var o="",s=0;st||t>40)&&13!=t&&27!=t){var o=i.value;if(o.length>=l.minChars){if(o!=i.last_val){if(i.last_val=o,clearTimeout(i.timer),l.cache){if(o in i.cache)return void r(i.cache[o]);for(var s=1;s https://github.com/noelboss/featherlight/issues/317 +!function(u){"use strict";if(void 0!==u)if(u.fn.jquery.match(/-ajax/))"console"in window&&window.console.info("Featherlight needs regular jQuery, not the slim version.");else{var r=[],i=function(t){return r=u.grep(r,function(e){return e!==t&&0','
','",'
'+n.loading+"
","
",""].join("")),o="."+n.namespace+"-close"+(n.otherClose?","+n.otherClose:"");return n.$instance=i.clone().addClass(n.variant),n.$instance.on(n.closeTrigger+"."+n.namespace,function(e){if(!e.isDefaultPrevented()){var t=u(e.target);("background"===n.closeOnClick&&t.is("."+n.namespace)||"anywhere"===n.closeOnClick||t.closest(o).length)&&(n.close(e),e.preventDefault())}}),this},getContent:function(){if(!1!==this.persist&&this.$content)return this.$content;var t=this,e=this.constructor.contentFilters,n=function(e){return t.$currentTarget&&t.$currentTarget.attr(e)},r=n(t.targetAttr),i=t.target||r||"",o=e[t.type];if(!o&&i in e&&(o=e[i],i=t.target&&r),i=i||n("href")||"",!o)for(var a in e)t[a]&&(o=e[a],i=t[a]);if(!o){var s=i;if(i=null,u.each(t.contentFilters,function(){return(o=e[this]).test&&(i=o.test(s)),!i&&o.regex&&s.match&&s.match(o.regex)&&(i=s),!i}),!i)return"console"in window&&window.console.error("Featherlight: no content filter found "+(s?' for "'+s+'"':" (no target specified)")),!1}return o.process.call(t,i)},setContent:function(e){return this.$instance.removeClass(this.namespace+"-loading"),this.$instance.toggleClass(this.namespace+"-iframe",e.is("iframe")),this.$instance.find("."+this.namespace+"-inner").not(e).slice(1).remove().end().replaceWith(u.contains(this.$instance[0],e[0])?"":e),this.$content=e.addClass(this.namespace+"-inner"),this},open:function(t){var n=this;if(n.$instance.hide().appendTo(n.root),!(t&&t.isDefaultPrevented()||!1===n.beforeOpen(t))){t&&t.preventDefault();var e=n.getContent();if(e)return r.push(n),s(!0),n.$instance.fadeIn(n.openSpeed),n.beforeContent(t),u.when(e).always(function(e){n.setContent(e),n.afterContent(t)}).then(n.$instance.promise()).done(function(){n.afterOpen(t)})}return n.$instance.detach(),u.Deferred().reject().promise()},close:function(e){var t=this,n=u.Deferred();return!1===t.beforeClose(e)?n.reject():(0===i(t).length&&s(!1),t.$instance.fadeOut(t.closeSpeed,function(){t.$instance.detach(),t.afterClose(e),n.resolve()})),n.promise()},resize:function(e,t){if(e&&t&&(this.$content.css("width","").css("height",""),this.$content.parent().width()');return n.onload=function(){r.naturalWidth=n.width,r.naturalHeight=n.height,t.resolve(r)},n.onerror=function(){t.reject(r)},n.src=e,t.promise()}},html:{regex:/^\s*<[\w!][^<]*>/,process:function(e){return u(e)}},ajax:{regex:/./,process:function(e){var n=u.Deferred(),r=u("
").load(e,function(e,t){"error"!==t&&n.resolve(r.contents()),n.fail()});return n.promise()}},iframe:{process:function(e){var t=new u.Deferred,n=u("