mirror of
https://github.com/tonytins/tomas.git
synced 2025-05-06 22:54:49 -04:00
Compare commits
9 commits
81bf203b6f
...
5888771e20
Author | SHA1 | Date | |
---|---|---|---|
|
5888771e20 | ||
|
c10e753c39 | ||
|
19f7483fbd | ||
|
6fb029b76e | ||
|
f006ab41bf | ||
|
ac28f2b9a4 | ||
|
2794aa17f4 | ||
|
dc2176b26d | ||
|
7b56b93edd |
56 changed files with 1300 additions and 295 deletions
17
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md
vendored
Normal file
17
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
## Expected Behavior
|
||||||
|
|
||||||
|
|
||||||
|
## Actual Behavior
|
||||||
|
|
||||||
|
|
||||||
|
## Steps to Reproduce the Problem
|
||||||
|
|
||||||
|
1.
|
||||||
|
1.
|
||||||
|
1.
|
||||||
|
|
||||||
|
## Specifications
|
||||||
|
|
||||||
|
- Version:
|
||||||
|
- Platform:
|
||||||
|
- Operating System:
|
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Desktop (please complete the following information):**
|
||||||
|
- OS: [e.g. iOS]
|
||||||
|
- Browser [e.g. chrome, safari]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Smartphone (please complete the following information):**
|
||||||
|
- Device: [e.g. iPhone6]
|
||||||
|
- OS: [e.g. iOS8.1]
|
||||||
|
- Browser [e.g. stock browser, safari]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
7
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
7
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Fixes
|
||||||
|
|
||||||
|
## Proposed Changes
|
||||||
|
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-
|
25
.github/workflows/dotnet.yml
vendored
25
.github/workflows/dotnet.yml
vendored
|
@ -4,9 +4,9 @@ on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "0 0 * * 0"
|
- cron: "0 0 * * 0"
|
||||||
push:
|
push:
|
||||||
branches: [main, develop, "feature/**"]
|
branches: [main, develop, "feature/**", "release/**"]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [main, develop, "feature/**"]
|
branches: [main, develop, "feature/**", "release/**"]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
@ -27,4 +27,23 @@ jobs:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: dotnet restore src/Tomas.Terminal
|
run: dotnet restore src/Tomas.Terminal
|
||||||
- name: Build
|
- name: Build
|
||||||
run: dotnet build src/Tomas.Terminal -c Release --no-restore
|
run: dotnet build src/Tomas.Terminal -c Release --no-restore --nologo
|
||||||
|
|
||||||
|
test:
|
||||||
|
timeout-minutes: 15
|
||||||
|
continue-on-error: true
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
dotnet: ["6.0.x"]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v1
|
||||||
|
with:
|
||||||
|
dotnet-version: ${{ matrix.dotnet }}
|
||||||
|
- name: Install test dependencies
|
||||||
|
run: dotnet restore src/Tomas.Tests
|
||||||
|
- name: Test
|
||||||
|
run: dotnet test src --no-restore --nologo
|
|
@ -2,10 +2,10 @@
|
||||||
|
|
||||||
## v23.0
|
## v23.0
|
||||||
|
|
||||||
- Calendar versioning, `YY.MINOR.MICRO`
|
- Split versioning systems between kernal and terminal
|
||||||
|
- Calendar versioning, `YY.MINOR.MICRO`, for kernal
|
||||||
|
- Semantic versioning for terminal
|
||||||
- If the file system is activate, system activity will be logged
|
- If the file system is activate, system activity will be logged
|
||||||
|
|
||||||
- Build number based on commit hash
|
- Build number based on commit hash
|
||||||
|
|
||||||
Due to the huge time skip and architectural changes, I've (retroactively) switched to calendar versioning with ``v0.1`` now known as ``v20.1`` as well.
|
Due to the huge time skip and architectural changes, I've (retroactively) switched to calendar versioning with ``v0.1`` now known as ``v20.1`` as well.
|
||||||
|
|
22
README.md
22
README.md
|
@ -1,6 +1,20 @@
|
||||||
# TOMAS
|
# TOMAS
|
||||||
|
|
||||||
<img title="" src="screenshot.png" alt="" data-align="center">
|
<p align="center">
|
||||||
|
<img title="" src="assets/logo.svg" width="250" alt=""">
|
||||||
|
<br>
|
||||||
|
<img title="" src="assets/screenshot.png" alt=""">
|
||||||
|
<hr>
|
||||||
|
</p>
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/tonytins/tomas/blob/main/LICENSE"><img src="https://img.shields.io/github/license/tonytins/tomas" alt="GitHub license"></a>
|
||||||
|
<a href="https://github.com/tonytins/tomas/actions?query=workflow%3Adotnet.yml"><img src="https://img.shields.io/github/actions/workflow/status/tonytins/tomas/dotnet.yml" alt="GitHub Workflow Status"></a>
|
||||||
|
<img src="https://img.shields.io/github/commit-activity/w/tonytins/tomas" alt="GitHub commit activity">
|
||||||
|
<br>
|
||||||
|
<a href="code_of_conduct.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Contributor Covenant"></a>
|
||||||
|
<img src="https://img.shields.io/codeclimate/maintainability-percentage/tonytins/tomas" alt="Code Climate maintainability">
|
||||||
|
<img src="https://img.shields.io/codeclimate/tech-debt/tonytins/tomas" alt="Code Climate technical debt">
|
||||||
|
</p>
|
||||||
|
|
||||||
TOMAS (**To**ny's **Ma**naged Operating **S**ystem) is a hobby operating system based on the [COSMOS](https://github.com/CosmosOS/Cosmos) framework that comes with a respective terminal emulator.
|
TOMAS (**To**ny's **Ma**naged Operating **S**ystem) is a hobby operating system based on the [COSMOS](https://github.com/CosmosOS/Cosmos) framework that comes with a respective terminal emulator.
|
||||||
|
|
||||||
|
@ -9,15 +23,11 @@ TOMAS (**To**ny's **Ma**naged Operating **S**ystem) is a hobby operating system
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
- Windows 10 or later
|
- Windows 10 or later
|
||||||
|
|
||||||
- Visual Studio 2022
|
- Visual Studio 2022
|
||||||
|
|
||||||
- .NET 6 or later
|
- .NET 6 or later
|
||||||
|
|
||||||
- COSMOS User Kit v2022 or later
|
- COSMOS User Kit v2022 or later
|
||||||
|
|
||||||
- VMWare Workstation Player
|
- VMWare Workstation Player
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This project is licensed under the BSD 3-Clause license - see the [LICENSE](LICENSE) file for details.
|
In jurisdictions that recognize copyright waivers, I've [waived all copyright](UNLICENSE) and related or neighboring rights for to this project. In areas where these waivers are not recognized, [BSD-3-Clause](LICENSE) is enforced.
|
||||||
|
|
24
UNLICENSE
Normal file
24
UNLICENSE
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <https://unlicense.org>
|
BIN
assets/logo.png
Normal file
BIN
assets/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
246
assets/logo.svg
Normal file
246
assets/logo.svg
Normal file
|
@ -0,0 +1,246 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 350 350.00001"
|
||||||
|
id="svg368"
|
||||||
|
sodipodi:docname="logo.svg"
|
||||||
|
width="350"
|
||||||
|
height="350"
|
||||||
|
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs372">
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
inkscape:label="Drop Shadow"
|
||||||
|
id="filter4772"
|
||||||
|
x="-0.08538938"
|
||||||
|
y="-0.10760133"
|
||||||
|
width="1.2050412"
|
||||||
|
height="1.2583777">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.498039"
|
||||||
|
flood-color="rgb(0,0,0)"
|
||||||
|
result="flood"
|
||||||
|
id="feFlood4762" />
|
||||||
|
<feComposite
|
||||||
|
in="flood"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="in"
|
||||||
|
result="composite1"
|
||||||
|
id="feComposite4764" />
|
||||||
|
<feGaussianBlur
|
||||||
|
in="composite1"
|
||||||
|
stdDeviation="6.23053"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur4766" />
|
||||||
|
<feOffset
|
||||||
|
dx="6"
|
||||||
|
dy="6"
|
||||||
|
result="offset"
|
||||||
|
id="feOffset4768" />
|
||||||
|
<feComposite
|
||||||
|
in="offset"
|
||||||
|
in2="offset"
|
||||||
|
operator="atop"
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
id="feComposite4770" />
|
||||||
|
<feColorMatrix
|
||||||
|
result="fbSourceGraphicAlpha"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||||
|
id="feColorMatrix4774" />
|
||||||
|
<feFlood
|
||||||
|
id="feFlood4776"
|
||||||
|
flood-opacity="0.498039"
|
||||||
|
flood-color="rgb(0,0,0)"
|
||||||
|
result="flood"
|
||||||
|
in="fbSourceGraphic" />
|
||||||
|
<feComposite
|
||||||
|
in2="fbSourceGraphic"
|
||||||
|
id="feComposite4778"
|
||||||
|
in="flood"
|
||||||
|
operator="in"
|
||||||
|
result="composite1" />
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur4780"
|
||||||
|
in="composite1"
|
||||||
|
stdDeviation="6.23053"
|
||||||
|
result="blur" />
|
||||||
|
<feOffset
|
||||||
|
id="feOffset4782"
|
||||||
|
dx="6"
|
||||||
|
dy="6"
|
||||||
|
result="offset" />
|
||||||
|
<feComposite
|
||||||
|
in2="offset"
|
||||||
|
id="feComposite4784"
|
||||||
|
in="offset"
|
||||||
|
operator="atop"
|
||||||
|
result="composite2" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview370"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.0097656"
|
||||||
|
inkscape:cx="61.895551"
|
||||||
|
inkscape:cy="184.20116"
|
||||||
|
inkscape:window-width="1366"
|
||||||
|
inkscape:window-height="697"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg368" />
|
||||||
|
<g
|
||||||
|
id="g2820-5"
|
||||||
|
transform="matrix(0.82401468,0,0,0.82444568,24.616324,35.386706)"
|
||||||
|
style="filter:url(#filter4772)">
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 335.72772,32.435374 q 2.12,0.71 4.94,0.37 0.5,-0.06 0.92,0.21 5.86,3.58 7.45,11.86 2.3,12.6 0.19,25.81 -3.78,23.68 -14.04,45.999996 -1.48,2.94 -2.52,5.19 -4.62999,9.54 -11.99999,18.50002 -8.12,9.85 -19.85,18.7 -0.4,0.3 -0.83,0.56 -14.68,9.35 -31.51,14.55 -13.25,4.09 -26.25,5.75 -9.05,1.32 -18.54,1.5 -3.64,0.32 -7.21,0.5 -3.66,0.18 -6.19,1.81 -4.45,3.32 -8.1,8.69 -2.27,1.71 -3.46,5.75 -2.78,9.41 -3.25,20.5 -0.07,1.67 1.6,1.74 13.44,0.27 24.9,-2.49 13.07,-2.67 28.75,-0.25 5.84,0.9 11.11,2.73 0.45,0.21 0.94,0.34 14.09,4.22 28.01,15.37 1.12,0.89 1.69,1.52 -7.9,0.03 -16.25,0.04 -10.8,-0.21 -19.75,3 -15.51,5.1 -26.69,14.81 -9.18,7.99 -14.75,18.5 -5.53,9.56 -10.5,21.25 -3.79,8.88 -12.12,11.63 -12.46,4.52 -25.75,2.37 -4.22,-0.68 -8.75,-2.5 -6.25,-2.01 -11.02,-6.77 -0.36,-0.35 -0.62,-0.78 -2.2,-3.63 -4.05,-8.26 -5.82,-14.54 -14.69,-26.06 -7.04,-9.16 -16.87,-15.38 -19.119998,-12.04 -42.689998,-12.06 -0.5,0 -0.99,-0.08 -3.75,-0.59 -9.51,-0.46 1.62,-2.37 4.73,-3.81 0.46,-0.21 0.87,-0.5 14.69,-10.43 33.4,-14.65 4.729998,-1.07 10.249998,-1 11.9,-0.42 21.25,1 0.68,0.1 1.25,0.5 11.01,1.35 25.26,1.25 1.24,-0.01 0.94,-1.21 -0.78,-3.86 -1.64,-8.1 -1.84,-8.73 -6.31,-15.94 -0.56,-0.91 -1.25,-1.29 -3.15,-6.24 -9.94,-10.27 -4.68,-2.78 -11.27,-1.94 -0.15,-0.25 -0.79,-0.25 -28.829998,0.04 -53.479998,-10.61 -0.46,-0.2 -0.93,-0.36 -13.76,-4.57 -24.78,-13.84 -2.28,-1.92 -4.62,-3.88 -5.92,-4.34 -8.98,-9.08 -0.27,-0.42 -0.61,-0.79 -6.47,-7.48 -11.29,-16.50002 -1.92,-3.59 -4.27,-7.19 -0.99,-2.62 -2,-4.5 -7.4,-16.569996 -11.04,-34.749996 -2.94000004,-14.7 -2.00000004,-29 0.25,-6.28 2.31000004,-11.44 2.45,-5.5 9.19,-6.06 6.67,-0.77 13.44,0.06 3.84,0.47 7.81,1.19 4.22,0.67 7.48,2.11 0.46,0.2 0.95,0.27 4.24,0.55 8.06,2.34 0.45,0.22 0.84,-0.1 0.19,-0.15 0.92,0.42 -0.14,0.78 1.25,1.46 6.01,2.69 11.44,5.81 1.89,1.09 3.52,1.85 0.48,0.15 0.88,0.44 8.77,6.03 17.85,12.46 12.36,8.82 24.119998,23.38 8.9,11.01 17.32,21.729996 0.31,0.39 0.59,0.8 18.5,26.91002 38.25,55.24002 1.02,1.46 2.78,1.65 2.77,0.29 10.15,0.08 1.81,-0.06 2.88,-1.51 12.98,-17.37 25.72,-36.43002 14.56,-21.79 30.61,-40.679996 0.33,-0.38 0.68,-0.74 8.07,-8.37 18.4,-18.89 2.18,-2.22 4.37,-3.63 4.96,-2.72 10,-6.5 16.1,-12.05 34.69,-18.52 2.51,-0.76 5,-1.33 1.81,0.09 2.75,-0.92 6.86,-2.2 15.49999,-2.29 0.5,0 0.98,-0.13 2.38,-0.67 4.77,0.13 z M 252.91773,141.24539 q 2.35,2.03 5.31,2.94 4.52,1.66 10.5,0.5 15.33,-3.04 26.44,-12.06002 13.64,-11.08 22.62,-25.63 6.66,-10.699996 10.63,-20.619996 6.55999,-16.41 5.56999,-35.43 -0.03,-0.6 -0.58,-0.37 -12.01999,4.83 -23.11999,9.92 -20.41,9.38 -37.75,25.75 -5.21,4.78 -9.62,10.38 -6.98,8.849996 -11.88,19.619996 -3.07,6.62 -3.37,14.13 -0.03,2.99002 2,6.87002 1.25,2.44 3.25,4 z M 49.417732,127.99537 q 11.13,10.11002 25.25,15.00002 5.71,1.9 11.81,1.94 5.16,0.33 9.44,-2.56 6.129998,-4.14 6.059998,-12.69002 -0.12,-6.12 -2.689998,-12.56 -4.66,-11.7 -13,-20.999996 -5.47,-5.89 -10.48,-11.57 -0.33,-0.37 -0.71,-0.69 -13.41,-11.14 -28,-19.62 -0.43,-0.25 -0.88,-0.47 -13.38,-6.57 -29.24,-11.59 -1.81,-0.57 -1.75,1.25 0.59,26.98 14.44,50.559996 8.16,13.91 19.75,24 z M 161.80773,303.07539 q 2.65,1.57 6.17,1.61 6,0.06 12,0 3.25,0.04 6.03,-0.59 1.69,-0.42 2.21,-2.08 1.8,-6.41 -0.18,-12.39 -1.08,-4.05 -5.06,-4.94 -6.85,-1.53 -15.5,-0.77 -0.5,0.02 -0.98,0.14 -3.98,1.01 -5.71,4.69 -1.18,2.51 -2.1,4.49 -0.21,0.45 -0.07,0.93 0.62,2.08 0.92,5.46 0.21,2.33 2.27,3.45 z"
|
||||||
|
id="path280-3"
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#7c91ad"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 314.47773,34.725374 q -0.94,1.01 -2.75,0.92 0.89,-1.01 2.75,-0.92 z"
|
||||||
|
id="path282-5"
|
||||||
|
style="stroke:none" />
|
||||||
|
<path
|
||||||
|
fill="#017aff"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 306.72773,36.975374 q -18.59,6.47 -34.69,18.52 -5.04,3.78 -10,6.5 -2.19,1.41 -4.37,3.63 -10.33,10.52 -18.4,18.89 -0.35,0.36 -0.68,0.74 -16.05,18.889996 -30.61,40.679996 -12.74,19.06002 -25.72,36.43002 -1.07,1.45 -2.88,1.51 -7.38,0.21 -10.15,-0.08 -1.76,-0.19 -2.78,-1.65 -19.75,-28.33 -38.25,-55.24002 -0.28,-0.41 -0.59,-0.8 -8.42,-10.719996 -17.32,-21.729996 -11.759998,-14.56 -24.119998,-23.38 -9.08,-6.43 -17.85,-12.46 -0.4,-0.29 -0.88,-0.44 -1.63,-0.76 -3.52,-1.85 -5.43,-3.12 -11.44,-5.81 -1.39,-0.68 -1.25,-1.46 7.37,1.63 13.44,4.52 4.92,2.35 9.34,4.28 0.47,0.16 0.91,0.4 8.89,4.86 17.75,10.82 9.959998,6.7 18.649998,15.64 0.35,0.36 0.73,0.68 7.58,6.24 16.62,11.93 1.77,1.12 3.79,0.56 12.35,-3.86 25.02,-5.87 7.86,-1.25 16.25,-1 21.47,-0.57 40,7.25 3.56,1.5 5.69,-0.06 4.62,-3.99 9.62,-6.88 5.18,-2.88 9.5,-7.5 3.61,-3.85 6.63,-6.37 22.23,-17.67 46.28,-25.84 0.47,-0.16 0.9,-0.41 6.64,-3.76 14.38,-4.15 z"
|
||||||
|
id="path284-5"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#ffbb00"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 333.98772,50.945374 q 0.99,19.02 -5.56999,35.43 -3.97,9.92 -10.63,20.619996 -8.98,14.55 -22.62,25.63 -11.11,9.02002 -26.44,12.06002 -5.98,1.16 -10.5,-0.5 -2.96,-0.91 -5.31,-2.94 -2,-1.56 -3.25,-4 -2.03,-3.88 -2,-6.87002 0.3,-7.51 3.37,-14.13 4.9,-10.77 11.88,-19.619996 4.41,-5.6 9.62,-10.38 17.34,-16.37 37.75,-25.75 11.1,-5.09 23.11999,-9.92 0.55,-0.23 0.58,0.37 z"
|
||||||
|
id="path286-3"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#ffbb00"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 16.977732,52.185374 q 15.86,5.02 29.24,11.59 0.45,0.22 0.88,0.47 14.59,8.48 28,19.62 0.38,0.32 0.71,0.69 5.01,5.68 10.48,11.57 8.34,9.299996 13,20.999996 2.569998,6.44 2.689998,12.56 0.07,8.55002 -6.059998,12.69002 -4.28,2.89 -9.44,2.56 -6.1,-0.04 -11.81,-1.94 -14.12,-4.89 -25.25,-15.00002 -11.59,-10.09 -19.75,-24 -13.85,-23.579996 -14.44,-50.559996 -0.06,-1.82 1.75,-1.25 z"
|
||||||
|
id="path288-7"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#374a6c"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 13.267732,113.93537 q 1.01,1.88 2,4.5 -0.04,0.25 -0.08,0.5 -2.73,-2.53 -1.92,-5 z"
|
||||||
|
id="path294-3"
|
||||||
|
style="stroke:none" />
|
||||||
|
<path
|
||||||
|
fill="#017aff"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 335.18772,116.68537 q -0.33,2.6 -1.71,5.25 -5.49999,10.59 -10.70999,20.87002 -0.23,0.44 -0.41,0.91 -4.39,11 -8.88,22.47 -2.29,5.85 -3.94,12.31 -4.37,16.87 -6.56,33.44 -1.73,13.1 -2.89,25.82 -0.05,0.49 -0.55,0.47 -2.65,-0.13 -7.06,-0.58 -0.57,-0.63 -1.69,-1.52 -13.92,-11.15 -28.01,-15.37 -0.49,-0.13 -0.94,-0.34 -5.27,-1.83 -11.11,-2.73 -15.68,-2.42 -28.75,0.25 -11.46,2.76 -24.9,2.49 -1.67,-0.07 -1.6,-1.74 0.47,-11.09 3.25,-20.5 1.19,-4.04 3.46,-5.75 -0.45,1.79 -1.03,3.28 -0.18,0.47 -0.05,0.95 1.48,5.55 5.93,11.21 6.14,8.03 16.19,6.31 5.87,-1 9.31,-7.19 3.56,-5.97 2.44,-12.81 -0.95,-5.81 -6.56,-9.44 -2.39,-1.54 -4.88,-2.37 -0.14,-0.08 0.15,-0.94 9.49,-0.18 18.54,-1.5 13,-1.66 26.25,-5.75 16.83,-5.2 31.51,-14.55 0.43,-0.26 0.83,-0.56 11.73,-8.85 19.85,-18.7 7.37,-8.96002 11.99999,-18.50002 1.04,-2.25 2.52,-5.19 z"
|
||||||
|
id="path296-6"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#017aff"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 15.267732,118.43537 q 2.35,3.6 4.27,7.19 4.82,9.02002 11.29,16.50002 0.34,0.37 0.61,0.79 3.06,4.74 8.98,9.08 2.34,1.96 4.62,3.88 11.02,9.27 24.78,13.84 0.47,0.16 0.93,0.36 24.65,10.65 53.479998,10.61 0.64,0 0.79,0.25 0.09,0.71 -0.85,1.19 -5.65,2.45 -8.88,6.87 -4.25,5.83 -1.7,13.56 0.67,2.25 2.14,4.08 4.68,5.81 12.02,7.91 0.48,0.14 0.98,0.19 5.39,0.55 9.94,-1.86 5.58,-2.95 7.31,-8.94 1.43,-4.95 0.25,-9 -0.35,-1.22 0,-1.79 0.69,0.38 1.25,1.29 4.47,7.21 6.31,15.94 0.86,4.24 1.64,8.1 0.3,1.2 -0.94,1.21 -14.25,0.1 -25.26,-1.25 -0.57,-0.4 -1.25,-0.5 -9.35,-1.42 -21.25,-1 -5.52,-0.07 -10.249998,1 -18.71,4.22 -33.4,14.65 -0.41,0.29 -0.87,0.5 -3.11,1.44 -4.73,3.81 -4.1,0.12 -7.69,0 -0.5,-0.02 -0.53,-0.52 -0.91,-8.25 -1.28,-16.94 -0.3,-9.81 -2.25,-18 -2.6,-10.92 -4.47,-20.45 -0.09,-0.49 -0.24,-0.97 -5.63,-17.93 -12.92,-36.3 -0.18,-0.47 -0.45,-0.89 -7.87,-12.27002 -12.46,-23.89002 0.04,-0.25 0.08,-0.5 z"
|
||||||
|
id="path298-4"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#0e141d"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 125.01773,180.93539 q 6.59,-0.84 11.27,1.94 6.79,4.03 9.94,10.27 -0.35,0.57 0,1.79 1.18,4.05 -0.25,9 -1.73,5.99 -7.31,8.94 -4.55,2.41 -9.94,1.86 -0.5,-0.05 -0.98,-0.19 -7.34,-2.1 -12.02,-7.91 -1.47,-1.83 -2.14,-4.08 -2.55,-7.73 1.7,-13.56 3.23,-4.42 8.88,-6.87 0.94,-0.48 0.85,-1.19 z"
|
||||||
|
id="path300-0"
|
||||||
|
style="stroke:none" />
|
||||||
|
<path
|
||||||
|
fill="#0d1120"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 223.68773,181.43539 q -0.29,0.86 -0.15,0.94 2.49,0.83 4.88,2.37 5.61,3.63 6.56,9.44 1.12,6.84 -2.44,12.81 -3.44,6.19 -9.31,7.19 -10.05,1.72 -16.19,-6.31 -4.45,-5.66 -5.93,-11.21 -0.13,-0.48 0.05,-0.95 0.58,-1.49 1.03,-3.28 3.65,-5.37 8.1,-8.69 2.53,-1.63 6.19,-1.81 3.57,-0.18 7.21,-0.5 z"
|
||||||
|
id="path302-2"
|
||||||
|
style="stroke:none" />
|
||||||
|
<path
|
||||||
|
fill="#161a47"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 167.47773,283.91539 q 8.65,-0.76 15.5,0.77 3.98,0.89 5.06,4.94 1.98,5.98 0.18,12.39 -0.52,1.66 -2.21,2.08 -2.78,0.63 -6.03,0.59 -6,0.06 -12,0 -3.52,-0.04 -6.17,-1.61 -2.06,-1.12 -2.27,-3.45 -0.3,-3.38 -0.92,-5.46 -0.14,-0.48 0.07,-0.93 0.92,-1.98 2.1,-4.49 1.73,-3.68 5.71,-4.69 0.48,-0.12 0.98,-0.14 z"
|
||||||
|
id="path304-8"
|
||||||
|
style="stroke:none" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g2820"
|
||||||
|
transform="matrix(0.82401468,0,0,0.82444568,34.26914,37.541234)">
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 335.72772,32.435374 q 2.12,0.71 4.94,0.37 0.5,-0.06 0.92,0.21 5.86,3.58 7.45,11.86 2.3,12.6 0.19,25.81 -3.78,23.68 -14.04,45.999996 -1.48,2.94 -2.52,5.19 -4.62999,9.54 -11.99999,18.50002 -8.12,9.85 -19.85,18.7 -0.4,0.3 -0.83,0.56 -14.68,9.35 -31.51,14.55 -13.25,4.09 -26.25,5.75 -9.05,1.32 -18.54,1.5 -3.64,0.32 -7.21,0.5 -3.66,0.18 -6.19,1.81 -4.45,3.32 -8.1,8.69 -2.27,1.71 -3.46,5.75 -2.78,9.41 -3.25,20.5 -0.07,1.67 1.6,1.74 13.44,0.27 24.9,-2.49 13.07,-2.67 28.75,-0.25 5.84,0.9 11.11,2.73 0.45,0.21 0.94,0.34 14.09,4.22 28.01,15.37 1.12,0.89 1.69,1.52 -7.9,0.03 -16.25,0.04 -10.8,-0.21 -19.75,3 -15.51,5.1 -26.69,14.81 -9.18,7.99 -14.75,18.5 -5.53,9.56 -10.5,21.25 -3.79,8.88 -12.12,11.63 -12.46,4.52 -25.75,2.37 -4.22,-0.68 -8.75,-2.5 -6.25,-2.01 -11.02,-6.77 -0.36,-0.35 -0.62,-0.78 -2.2,-3.63 -4.05,-8.26 -5.82,-14.54 -14.69,-26.06 -7.04,-9.16 -16.87,-15.38 -19.119998,-12.04 -42.689998,-12.06 -0.5,0 -0.99,-0.08 -3.75,-0.59 -9.51,-0.46 1.62,-2.37 4.73,-3.81 0.46,-0.21 0.87,-0.5 14.69,-10.43 33.4,-14.65 4.729998,-1.07 10.249998,-1 11.9,-0.42 21.25,1 0.68,0.1 1.25,0.5 11.01,1.35 25.26,1.25 1.24,-0.01 0.94,-1.21 -0.78,-3.86 -1.64,-8.1 -1.84,-8.73 -6.31,-15.94 -0.56,-0.91 -1.25,-1.29 -3.15,-6.24 -9.94,-10.27 -4.68,-2.78 -11.27,-1.94 -0.15,-0.25 -0.79,-0.25 -28.829998,0.04 -53.479998,-10.61 -0.46,-0.2 -0.93,-0.36 -13.76,-4.57 -24.78,-13.84 -2.28,-1.92 -4.62,-3.88 -5.92,-4.34 -8.98,-9.08 -0.27,-0.42 -0.61,-0.79 -6.47,-7.48 -11.29,-16.50002 -1.92,-3.59 -4.27,-7.19 -0.99,-2.62 -2,-4.5 -7.4,-16.569996 -11.04,-34.749996 -2.94000004,-14.7 -2.00000004,-29 0.25,-6.28 2.31000004,-11.44 2.45,-5.5 9.19,-6.06 6.67,-0.77 13.44,0.06 3.84,0.47 7.81,1.19 4.22,0.67 7.48,2.11 0.46,0.2 0.95,0.27 4.24,0.55 8.06,2.34 0.45,0.22 0.84,-0.1 0.19,-0.15 0.92,0.42 -0.14,0.78 1.25,1.46 6.01,2.69 11.44,5.81 1.89,1.09 3.52,1.85 0.48,0.15 0.88,0.44 8.77,6.03 17.85,12.46 12.36,8.82 24.119998,23.38 8.9,11.01 17.32,21.729996 0.31,0.39 0.59,0.8 18.5,26.91002 38.25,55.24002 1.02,1.46 2.78,1.65 2.77,0.29 10.15,0.08 1.81,-0.06 2.88,-1.51 12.98,-17.37 25.72,-36.43002 14.56,-21.79 30.61,-40.679996 0.33,-0.38 0.68,-0.74 8.07,-8.37 18.4,-18.89 2.18,-2.22 4.37,-3.63 4.96,-2.72 10,-6.5 16.1,-12.05 34.69,-18.52 2.51,-0.76 5,-1.33 1.81,0.09 2.75,-0.92 6.86,-2.2 15.49999,-2.29 0.5,0 0.98,-0.13 2.38,-0.67 4.77,0.13 z M 252.91773,141.24539 q 2.35,2.03 5.31,2.94 4.52,1.66 10.5,0.5 15.33,-3.04 26.44,-12.06002 13.64,-11.08 22.62,-25.63 6.66,-10.699996 10.63,-20.619996 6.55999,-16.41 5.56999,-35.43 -0.03,-0.6 -0.58,-0.37 -12.01999,4.83 -23.11999,9.92 -20.41,9.38 -37.75,25.75 -5.21,4.78 -9.62,10.38 -6.98,8.849996 -11.88,19.619996 -3.07,6.62 -3.37,14.13 -0.03,2.99002 2,6.87002 1.25,2.44 3.25,4 z M 49.417732,127.99537 q 11.13,10.11002 25.25,15.00002 5.71,1.9 11.81,1.94 5.16,0.33 9.44,-2.56 6.129998,-4.14 6.059998,-12.69002 -0.12,-6.12 -2.689998,-12.56 -4.66,-11.7 -13,-20.999996 -5.47,-5.89 -10.48,-11.57 -0.33,-0.37 -0.71,-0.69 -13.41,-11.14 -28,-19.62 -0.43,-0.25 -0.88,-0.47 -13.38,-6.57 -29.24,-11.59 -1.81,-0.57 -1.75,1.25 0.59,26.98 14.44,50.559996 8.16,13.91 19.75,24 z M 161.80773,303.07539 q 2.65,1.57 6.17,1.61 6,0.06 12,0 3.25,0.04 6.03,-0.59 1.69,-0.42 2.21,-2.08 1.8,-6.41 -0.18,-12.39 -1.08,-4.05 -5.06,-4.94 -6.85,-1.53 -15.5,-0.77 -0.5,0.02 -0.98,0.14 -3.98,1.01 -5.71,4.69 -1.18,2.51 -2.1,4.49 -0.21,0.45 -0.07,0.93 0.62,2.08 0.92,5.46 0.21,2.33 2.27,3.45 z"
|
||||||
|
id="path280"
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#7c91ad"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 314.47773,34.725374 q -0.94,1.01 -2.75,0.92 0.89,-1.01 2.75,-0.92 z"
|
||||||
|
id="path282"
|
||||||
|
style="stroke:none" />
|
||||||
|
<path
|
||||||
|
fill="#017aff"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 306.72773,36.975374 q -18.59,6.47 -34.69,18.52 -5.04,3.78 -10,6.5 -2.19,1.41 -4.37,3.63 -10.33,10.52 -18.4,18.89 -0.35,0.36 -0.68,0.74 -16.05,18.889996 -30.61,40.679996 -12.74,19.06002 -25.72,36.43002 -1.07,1.45 -2.88,1.51 -7.38,0.21 -10.15,-0.08 -1.76,-0.19 -2.78,-1.65 -19.75,-28.33 -38.25,-55.24002 -0.28,-0.41 -0.59,-0.8 -8.42,-10.719996 -17.32,-21.729996 -11.759998,-14.56 -24.119998,-23.38 -9.08,-6.43 -17.85,-12.46 -0.4,-0.29 -0.88,-0.44 -1.63,-0.76 -3.52,-1.85 -5.43,-3.12 -11.44,-5.81 -1.39,-0.68 -1.25,-1.46 7.37,1.63 13.44,4.52 4.92,2.35 9.34,4.28 0.47,0.16 0.91,0.4 8.89,4.86 17.75,10.82 9.959998,6.7 18.649998,15.64 0.35,0.36 0.73,0.68 7.58,6.24 16.62,11.93 1.77,1.12 3.79,0.56 12.35,-3.86 25.02,-5.87 7.86,-1.25 16.25,-1 21.47,-0.57 40,7.25 3.56,1.5 5.69,-0.06 4.62,-3.99 9.62,-6.88 5.18,-2.88 9.5,-7.5 3.61,-3.85 6.63,-6.37 22.23,-17.67 46.28,-25.84 0.47,-0.16 0.9,-0.41 6.64,-3.76 14.38,-4.15 z"
|
||||||
|
id="path284"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#ffbb00"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 333.98772,50.945374 q 0.99,19.02 -5.56999,35.43 -3.97,9.92 -10.63,20.619996 -8.98,14.55 -22.62,25.63 -11.11,9.02002 -26.44,12.06002 -5.98,1.16 -10.5,-0.5 -2.96,-0.91 -5.31,-2.94 -2,-1.56 -3.25,-4 -2.03,-3.88 -2,-6.87002 0.3,-7.51 3.37,-14.13 4.9,-10.77 11.88,-19.619996 4.41,-5.6 9.62,-10.38 17.34,-16.37 37.75,-25.75 11.1,-5.09 23.11999,-9.92 0.55,-0.23 0.58,0.37 z"
|
||||||
|
id="path286"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#ffbb00"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 16.977732,52.185374 q 15.86,5.02 29.24,11.59 0.45,0.22 0.88,0.47 14.59,8.48 28,19.62 0.38,0.32 0.71,0.69 5.01,5.68 10.48,11.57 8.34,9.299996 13,20.999996 2.569998,6.44 2.689998,12.56 0.07,8.55002 -6.059998,12.69002 -4.28,2.89 -9.44,2.56 -6.1,-0.04 -11.81,-1.94 -14.12,-4.89 -25.25,-15.00002 -11.59,-10.09 -19.75,-24 -13.85,-23.579996 -14.44,-50.559996 -0.06,-1.82 1.75,-1.25 z"
|
||||||
|
id="path288"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#374a6c"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 13.267732,113.93537 q 1.01,1.88 2,4.5 -0.04,0.25 -0.08,0.5 -2.73,-2.53 -1.92,-5 z"
|
||||||
|
id="path294"
|
||||||
|
style="stroke:none" />
|
||||||
|
<path
|
||||||
|
fill="#017aff"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 335.18772,116.68537 q -0.33,2.6 -1.71,5.25 -5.49999,10.59 -10.70999,20.87002 -0.23,0.44 -0.41,0.91 -4.39,11 -8.88,22.47 -2.29,5.85 -3.94,12.31 -4.37,16.87 -6.56,33.44 -1.73,13.1 -2.89,25.82 -0.05,0.49 -0.55,0.47 -2.65,-0.13 -7.06,-0.58 -0.57,-0.63 -1.69,-1.52 -13.92,-11.15 -28.01,-15.37 -0.49,-0.13 -0.94,-0.34 -5.27,-1.83 -11.11,-2.73 -15.68,-2.42 -28.75,0.25 -11.46,2.76 -24.9,2.49 -1.67,-0.07 -1.6,-1.74 0.47,-11.09 3.25,-20.5 1.19,-4.04 3.46,-5.75 -0.45,1.79 -1.03,3.28 -0.18,0.47 -0.05,0.95 1.48,5.55 5.93,11.21 6.14,8.03 16.19,6.31 5.87,-1 9.31,-7.19 3.56,-5.97 2.44,-12.81 -0.95,-5.81 -6.56,-9.44 -2.39,-1.54 -4.88,-2.37 -0.14,-0.08 0.15,-0.94 9.49,-0.18 18.54,-1.5 13,-1.66 26.25,-5.75 16.83,-5.2 31.51,-14.55 0.43,-0.26 0.83,-0.56 11.73,-8.85 19.85,-18.7 7.37,-8.96002 11.99999,-18.50002 1.04,-2.25 2.52,-5.19 z"
|
||||||
|
id="path296"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#017aff"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 15.267732,118.43537 q 2.35,3.6 4.27,7.19 4.82,9.02002 11.29,16.50002 0.34,0.37 0.61,0.79 3.06,4.74 8.98,9.08 2.34,1.96 4.62,3.88 11.02,9.27 24.78,13.84 0.47,0.16 0.93,0.36 24.65,10.65 53.479998,10.61 0.64,0 0.79,0.25 0.09,0.71 -0.85,1.19 -5.65,2.45 -8.88,6.87 -4.25,5.83 -1.7,13.56 0.67,2.25 2.14,4.08 4.68,5.81 12.02,7.91 0.48,0.14 0.98,0.19 5.39,0.55 9.94,-1.86 5.58,-2.95 7.31,-8.94 1.43,-4.95 0.25,-9 -0.35,-1.22 0,-1.79 0.69,0.38 1.25,1.29 4.47,7.21 6.31,15.94 0.86,4.24 1.64,8.1 0.3,1.2 -0.94,1.21 -14.25,0.1 -25.26,-1.25 -0.57,-0.4 -1.25,-0.5 -9.35,-1.42 -21.25,-1 -5.52,-0.07 -10.249998,1 -18.71,4.22 -33.4,14.65 -0.41,0.29 -0.87,0.5 -3.11,1.44 -4.73,3.81 -4.1,0.12 -7.69,0 -0.5,-0.02 -0.53,-0.52 -0.91,-8.25 -1.28,-16.94 -0.3,-9.81 -2.25,-18 -2.6,-10.92 -4.47,-20.45 -0.09,-0.49 -0.24,-0.97 -5.63,-17.93 -12.92,-36.3 -0.18,-0.47 -0.45,-0.89 -7.87,-12.27002 -12.46,-23.89002 0.04,-0.25 0.08,-0.5 z"
|
||||||
|
id="path298"
|
||||||
|
style="stroke:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
fill="#0e141d"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 125.01773,180.93539 q 6.59,-0.84 11.27,1.94 6.79,4.03 9.94,10.27 -0.35,0.57 0,1.79 1.18,4.05 -0.25,9 -1.73,5.99 -7.31,8.94 -4.55,2.41 -9.94,1.86 -0.5,-0.05 -0.98,-0.19 -7.34,-2.1 -12.02,-7.91 -1.47,-1.83 -2.14,-4.08 -2.55,-7.73 1.7,-13.56 3.23,-4.42 8.88,-6.87 0.94,-0.48 0.85,-1.19 z"
|
||||||
|
id="path300"
|
||||||
|
style="stroke:none" />
|
||||||
|
<path
|
||||||
|
fill="#0d1120"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 223.68773,181.43539 q -0.29,0.86 -0.15,0.94 2.49,0.83 4.88,2.37 5.61,3.63 6.56,9.44 1.12,6.84 -2.44,12.81 -3.44,6.19 -9.31,7.19 -10.05,1.72 -16.19,-6.31 -4.45,-5.66 -5.93,-11.21 -0.13,-0.48 0.05,-0.95 0.58,-1.49 1.03,-3.28 3.65,-5.37 8.1,-8.69 2.53,-1.63 6.19,-1.81 3.57,-0.18 7.21,-0.5 z"
|
||||||
|
id="path302"
|
||||||
|
style="stroke:none" />
|
||||||
|
<path
|
||||||
|
fill="#161a47"
|
||||||
|
fill-opacity="1"
|
||||||
|
d="m 167.47773,283.91539 q 8.65,-0.76 15.5,0.77 3.98,0.89 5.06,4.94 1.98,5.98 0.18,12.39 -0.52,1.66 -2.21,2.08 -2.78,0.63 -6.03,0.59 -6,0.06 -12,0 -3.52,-0.04 -6.17,-1.61 -2.06,-1.12 -2.27,-3.45 -0.3,-3.38 -0.92,-5.46 -0.14,-0.48 0.07,-0.93 0.92,-1.98 2.1,-4.49 1.73,-3.68 5.71,-4.69 0.48,-0.12 0.98,-0.14 z"
|
||||||
|
id="path304"
|
||||||
|
style="stroke:none" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
BIN
assets/social-preview.png
Normal file
BIN
assets/social-preview.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 45 KiB |
BIN
assets/social-preview.xcf
Normal file
BIN
assets/social-preview.xcf
Normal file
Binary file not shown.
132
code_of_conduct.md
Normal file
132
code_of_conduct.md
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
[INSERT CONTACT METHOD].
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by
|
||||||
|
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
|
||||||
|
at [https://www.contributor-covenant.org/translations][translations].
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
|
||||||
|
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||||
|
[FAQ]: https://www.contributor-covenant.org/faq
|
||||||
|
[translations]: https://www.contributor-covenant.org/translations
|
|
@ -13,6 +13,8 @@ indent_style = space
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
insert_final_newline = false
|
insert_final_newline = false
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||||
|
tab_width = 4
|
||||||
|
|
||||||
# C# files
|
# C# files
|
||||||
[*.cs]
|
[*.cs]
|
||||||
|
@ -50,7 +52,7 @@ dotnet_style_predefined_type_for_member_access = true:suggestion
|
||||||
# Use camel_case for private or internal constant fields
|
# Use camel_case for private or internal constant fields
|
||||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
|
||||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
|
||||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
|
||||||
|
|
||||||
dotnet_naming_symbols.constant_fields.applicable_kinds = field
|
dotnet_naming_symbols.constant_fields.applicable_kinds = field
|
||||||
dotnet_naming_symbols.constant_fields.required_modifiers = const
|
dotnet_naming_symbols.constant_fields.required_modifiers = const
|
||||||
|
@ -62,7 +64,7 @@ dotnet_naming_style.pascal_case_style.capitalization = pascal_case
|
||||||
# internal and private fields should be _camel_case
|
# internal and private fields should be _camel_case
|
||||||
dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
|
dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
|
||||||
dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields
|
dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields
|
||||||
dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style
|
dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style
|
||||||
|
|
||||||
dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
|
dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
|
||||||
dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
|
dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
|
||||||
|
@ -122,3 +124,9 @@ csharp_space_between_method_declaration_name_and_open_parenthesis = false
|
||||||
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||||
csharp_space_between_parentheses = false
|
csharp_space_between_parentheses = false
|
||||||
csharp_space_between_square_brackets = false
|
csharp_space_between_square_brackets = false
|
||||||
|
csharp_using_directive_placement = outside_namespace:silent
|
||||||
|
csharp_prefer_simple_using_statement = true:suggestion
|
||||||
|
csharp_prefer_braces = when_multiline:silent
|
||||||
|
csharp_style_namespace_declarations = file_scoped:silent
|
||||||
|
csharp_style_prefer_method_group_conversion = true:silent
|
||||||
|
csharp_style_prefer_top_level_statements = true:silent
|
||||||
|
|
|
@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.4.33205.214
|
VisualStudioVersion = 17.4.33205.214
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Common", "Tomas.Common\Tomas.Common.csproj", "{C50F3A6F-CFF4-4725-A1A5-21C5A2BC3321}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Core", "Tomas.Core\Tomas.Core.csproj", "{C50F3A6F-CFF4-4725-A1A5-21C5A2BC3321}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{59C9B3FC-B1EE-4C23-9BD9-D33074BF1334}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{59C9B3FC-B1EE-4C23-9BD9-D33074BF1334}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
@ -13,13 +13,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
||||||
..\LICENSE = ..\LICENSE
|
..\LICENSE = ..\LICENSE
|
||||||
..\README.md = ..\README.md
|
..\README.md = ..\README.md
|
||||||
TOMAS.sln.licenseheader = TOMAS.sln.licenseheader
|
TOMAS.sln.licenseheader = TOMAS.sln.licenseheader
|
||||||
|
..\UNLICENSE = ..\UNLICENSE
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Interface", "Tomas.Interface\Tomas.Interface.csproj", "{DAA9EDF4-83C7-4271-9805-FD6CE29E1796}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Interface", "Tomas.Interface\Tomas.Interface.csproj", "{DAA9EDF4-83C7-4271-9805-FD6CE29E1796}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Terminal", "Tomas.Terminal\Tomas.Terminal.csproj", "{49E67E55-F9D2-419A-8097-38F39E98A95E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Terminal", "Tomas.Terminal\Tomas.Terminal.csproj", "{49E67E55-F9D2-419A-8097-38F39E98A95E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Kernel", "Tomas.Kernal\Tomas.Kernel.csproj", "{20750C95-A3C7-4958-BA9F-56E4C3BD0293}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Kernel", "Tomas.Kernel\Tomas.Kernel.csproj", "{B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tomas.Tests", "Tomas.Tests\Tomas.Tests.csproj", "{76AD2140-2975-43DA-89A9-0BEC70B2ECDD}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
@ -39,10 +42,14 @@ Global
|
||||||
{49E67E55-F9D2-419A-8097-38F39E98A95E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{49E67E55-F9D2-419A-8097-38F39E98A95E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{49E67E55-F9D2-419A-8097-38F39E98A95E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{49E67E55-F9D2-419A-8097-38F39E98A95E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{49E67E55-F9D2-419A-8097-38F39E98A95E}.Release|Any CPU.Build.0 = Release|Any CPU
|
{49E67E55-F9D2-419A-8097-38F39E98A95E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{20750C95-A3C7-4958-BA9F-56E4C3BD0293}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{20750C95-A3C7-4958-BA9F-56E4C3BD0293}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{20750C95-A3C7-4958-BA9F-56E4C3BD0293}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{20750C95-A3C7-4958-BA9F-56E4C3BD0293}.Release|Any CPU.Build.0 = Release|Any CPU
|
{B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{76AD2140-2975-43DA-89A9-0BEC70B2ECDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{76AD2140-2975-43DA-89A9-0BEC70B2ECDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{76AD2140-2975-43DA-89A9-0BEC70B2ECDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{76AD2140-2975-43DA-89A9-0BEC70B2ECDD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
extensions: designer.cs generated.cs
|
extensions: designer.cs generated.cs
|
||||||
extensions: .cs .cpp .h .fs
|
extensions: .cs .cpp .h .fs
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
|
@ -1,2 +0,0 @@
|
||||||
global using System.Diagnostics.CodeAnalysis;
|
|
||||||
global using Tomas.Interface;
|
|
|
@ -1,13 +0,0 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
|
||||||
// See the LICENSE file in the project root for more information.
|
|
||||||
|
|
||||||
namespace Tomas.Common.Programs;
|
|
||||||
|
|
||||||
public class Clear : IProgram
|
|
||||||
{
|
|
||||||
public bool Run(IShell shell)
|
|
||||||
{
|
|
||||||
Console.Clear();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
|
||||||
// See the LICENSE file in the project root for more information.
|
|
||||||
|
|
||||||
namespace Tomas.Common.Programs;
|
|
||||||
|
|
||||||
public class Commands : IProgram
|
|
||||||
{
|
|
||||||
public bool Run(IShell shell)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Commands:");
|
|
||||||
var progs = shell.Programs;
|
|
||||||
foreach (var commands in progs.Keys)
|
|
||||||
Console.WriteLine(commands);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
|
||||||
// See the LICENSE file in the project root for more information.
|
|
||||||
|
|
||||||
namespace Tomas.Common.Programs;
|
|
||||||
|
|
||||||
public class FenSay : IProgram
|
|
||||||
{
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Fennec art by Todd Vargo
|
|
||||||
/// </summary>
|
|
||||||
const string _fennec = @" \/
|
|
||||||
/\ /\
|
|
||||||
//\\_//\\ ____
|
|
||||||
\_ _/ / /
|
|
||||||
/ * * \ /^^^]
|
|
||||||
\_\O/_/ [ ]
|
|
||||||
/ \_ [ /
|
|
||||||
\ \_ / /
|
|
||||||
[ [ / \/ _/
|
|
||||||
_[ [ \ /_/";
|
|
||||||
|
|
||||||
readonly string[] _phrases =
|
|
||||||
{
|
|
||||||
"[SCREAMS IN FENNEC]",
|
|
||||||
"Some people call me a coffee fox.",
|
|
||||||
"Drink Soda. It makes you see faster.",
|
|
||||||
"10/10, Wouldn't Recommend."
|
|
||||||
};
|
|
||||||
|
|
||||||
public bool Run(IShell shell)
|
|
||||||
{
|
|
||||||
var rng = new Random();
|
|
||||||
var phrases = _phrases[rng.Next(_phrases.Length)];
|
|
||||||
Console.WriteLine($"{phrases}{Environment.NewLine}{_fennec}");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
16
src/Tomas.Core/Programs/Clear.cs
Normal file
16
src/Tomas.Core/Programs/Clear.cs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Core.Programs;
|
||||||
|
|
||||||
|
public class Clear : IProgram
|
||||||
|
{
|
||||||
|
public bool Run(IShell shell)
|
||||||
|
{
|
||||||
|
Console.Clear();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
19
src/Tomas.Core/Programs/Commands.cs
Normal file
19
src/Tomas.Core/Programs/Commands.cs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Core.Programs;
|
||||||
|
|
||||||
|
public class Commands : IProgram
|
||||||
|
{
|
||||||
|
public bool Run(IShell shell)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Commands:");
|
||||||
|
var progs = shell.Programs;
|
||||||
|
foreach (var commands in progs.Keys)
|
||||||
|
Console.WriteLine(commands);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
41
src/Tomas.Core/Programs/FenSay.cs
Normal file
41
src/Tomas.Core/Programs/FenSay.cs
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Core.Programs;
|
||||||
|
|
||||||
|
public class FenSay : IProgram
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fennec art by Todd Vargo
|
||||||
|
/// </summary>
|
||||||
|
const string _fennec = @" \/
|
||||||
|
/\ /\
|
||||||
|
//\\_//\\ ____
|
||||||
|
\_ _/ / /
|
||||||
|
/ * * \ /^^^]
|
||||||
|
\_\O/_/ [ ]
|
||||||
|
/ \_ [ /
|
||||||
|
\ \_ / /
|
||||||
|
[ [ / \/ _/
|
||||||
|
_[ [ \ /_/";
|
||||||
|
|
||||||
|
readonly string[] _phrases =
|
||||||
|
{
|
||||||
|
"[SCREAMS IN FENNEC]",
|
||||||
|
"Some people call me a coffee fox.",
|
||||||
|
"Drink Soda. It makes you see faster.",
|
||||||
|
"10/10, Wouldn't Recommend."
|
||||||
|
};
|
||||||
|
|
||||||
|
public bool Run(IShell shell)
|
||||||
|
{
|
||||||
|
var rng = new Random();
|
||||||
|
var phrases = _phrases[rng.Next(_phrases.Length)];
|
||||||
|
Console.WriteLine($"{phrases}{Environment.NewLine}{_fennec}");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,11 +9,4 @@
|
||||||
<ProjectReference Include="..\Tomas.Interface\Tomas.Interface.csproj" />
|
<ProjectReference Include="..\Tomas.Interface\Tomas.Interface.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="GitInfo" Version="2.1.2">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
9
src/Tomas.Core/Usings.cs
Normal file
9
src/Tomas.Core/Usings.cs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
global using System.Diagnostics.CodeAnalysis;
|
||||||
|
global using System.Diagnostics;
|
||||||
|
global using Tomas.Interface;
|
|
@ -1,14 +1,18 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
namespace Tomas.Interface;
|
namespace Tomas.Interface;
|
||||||
|
|
||||||
public interface IProgram
|
public interface IProgram
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The program's main entry point. Boolean behaves as an exit point.
|
/// The program's main entry point. Boolean behaves as an exit point.
|
||||||
/// True and False are the equivalent to C's 0 and 1, i.e. "Success" and "Failure," respectfully.
|
/// True and False are the equivalent to C's 0 and 1, i.e. "Success" and "Failure," respectfully.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="shell">Allows the program to interact with the shell.</param>
|
/// <param name="shell">Allows the program to interact with the shell.</param>
|
||||||
/// <returns>Exit back to shell.</returns>
|
/// <returns>Exit back to shell.</returns>
|
||||||
bool Run(IShell shell);
|
bool Run(IShell shell);
|
||||||
}
|
}
|
|
@ -1,11 +1,14 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
namespace Tomas.Interface;
|
namespace Tomas.Interface;
|
||||||
|
|
||||||
public interface IShell
|
public interface IShell
|
||||||
{
|
{
|
||||||
string ReadLine { get; }
|
string ReadLine { get; }
|
||||||
|
|
||||||
Dictionary<string, IProgram> Programs { get; }
|
Dictionary<string, IProgram> Programs { get; }
|
||||||
}
|
}
|
0
src/Tomas.Interface/Usings.cs
Normal file
0
src/Tomas.Interface/Usings.cs
Normal file
|
@ -1,7 +0,0 @@
|
||||||
global using Tomas.Common.Programs;
|
|
||||||
global using Tomas.Interface;
|
|
||||||
global using Tomas.Kernel.Programs;
|
|
||||||
global using Cosmos.System.FileSystem;
|
|
||||||
global using Cosmos.System.FileSystem.VFS;
|
|
||||||
global using Tomas.Common;
|
|
||||||
global using Os = Cosmos.System;
|
|
|
@ -1,51 +0,0 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
|
||||||
// See the LICENSE file in the project root for more information.
|
|
||||||
|
|
||||||
namespace Tomas.Kernel;
|
|
||||||
|
|
||||||
public class Kernel : Os.Kernel
|
|
||||||
{
|
|
||||||
|
|
||||||
protected override void BeforeRun()
|
|
||||||
{
|
|
||||||
SysFS.Initialize();
|
|
||||||
|
|
||||||
if (!SysMeta.IsFSActive)
|
|
||||||
Console.WriteLine($"{SysMeta.NAME} booted with errors.");
|
|
||||||
else
|
|
||||||
Console.WriteLine($"{SysMeta.NAME} booted successfully.");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Run()
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
var shell = new Shell();
|
|
||||||
var command = shell.ReadLine;
|
|
||||||
var programs = shell.Programs;
|
|
||||||
|
|
||||||
if (!programs.TryGetValue(command, out var program))
|
|
||||||
{
|
|
||||||
Console.WriteLine("Command Not Found.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var start = program.Run(shell);
|
|
||||||
switch (start)
|
|
||||||
{
|
|
||||||
case true:
|
|
||||||
continue;
|
|
||||||
case false:
|
|
||||||
Console.WriteLine("Program closed unexpectedly.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception err)
|
|
||||||
{
|
|
||||||
Console.WriteLine(err.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
|
||||||
// See the LICENSE file in the project root for more information.
|
|
||||||
|
|
||||||
namespace Tomas.Kernel.Programs;
|
|
||||||
|
|
||||||
public class About : IProgram
|
|
||||||
{
|
|
||||||
public bool Run(IShell shell)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"TOMAS v{SysMeta.VERSION} ({SysMeta.BuildNumber}) is a hobby operating system written in C# using the COSMOS framework.{Environment.NewLine}Commands:");
|
|
||||||
var progs = shell.Programs;
|
|
||||||
foreach (var commands in progs.Keys)
|
|
||||||
Console.WriteLine(commands);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
101
src/Tomas.Kernel/Globalization/CST.cs
Normal file
101
src/Tomas.Kernel/Globalization/CST.cs
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Kernel.Globalization;
|
||||||
|
|
||||||
|
public class CST
|
||||||
|
{
|
||||||
|
const char CARET = '^';
|
||||||
|
const string LF = "\u000A";
|
||||||
|
const string CR = "\u000D";
|
||||||
|
const string CRLF = "\u000D\u000A";
|
||||||
|
const string LS = "\u2028";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the value from the digit-based key.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Returns the entry</returns>
|
||||||
|
public static string Parse(string content, int key) => Parse(content, key.ToString());
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the value from the string-based key.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Returns the entry</returns>
|
||||||
|
public static string Parse(string content, string key)
|
||||||
|
{
|
||||||
|
var entries = NormalizeEntries(content);
|
||||||
|
return GetEntry(entries, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Replaces the document's line endings with the native system line endings.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>This stage ensures there are no crashes during parsing.</remarks>
|
||||||
|
/// <param name="content">The content of the document.</param>
|
||||||
|
/// <returns>The document's content with native system line endings.</returns>
|
||||||
|
static IEnumerable<string> NormalizeEntries(string content)
|
||||||
|
{
|
||||||
|
// Check if the document already uses native system line endings.
|
||||||
|
if (!content.Contains(Environment.NewLine))
|
||||||
|
{
|
||||||
|
// If not, check for and replace other line ending types.
|
||||||
|
if (content.Contains(LF))
|
||||||
|
content = content.Replace(LF, Environment.NewLine);
|
||||||
|
|
||||||
|
if (content.Contains(CR))
|
||||||
|
content = content.Replace(CR, Environment.NewLine);
|
||||||
|
|
||||||
|
if (content.Contains(CRLF))
|
||||||
|
content = content.Replace(CRLF, Environment.NewLine);
|
||||||
|
|
||||||
|
if (content.Contains(LS))
|
||||||
|
content = content.Replace(LS, Environment.NewLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Split the content by the caret and newline characters.
|
||||||
|
var lines = content.Split(new[] { $"{CARET}{Environment.NewLine}" },
|
||||||
|
StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
|
// Filter out any lines that start with "//", "#", "/*", or end with "*/".
|
||||||
|
return lines.Where(line =>
|
||||||
|
!line.StartsWith("//") &&
|
||||||
|
!line.StartsWith("#") &&
|
||||||
|
!line.StartsWith("/*") &&
|
||||||
|
!line.EndsWith("*/"))
|
||||||
|
.AsEnumerable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves the value for the specified key from the given entries.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entries">The entries to search through.</param>
|
||||||
|
/// <param name="key">The key to search for.</param>
|
||||||
|
/// <returns>The value for the specified key, or a default string if not found.</returns>
|
||||||
|
static string GetEntry(IEnumerable<string> entries, string key)
|
||||||
|
{
|
||||||
|
// Iterate through the entries.
|
||||||
|
foreach (var entry in entries)
|
||||||
|
{
|
||||||
|
// If the line doesn't start with the key, keep searching.
|
||||||
|
if (!entry.StartsWith(key))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Locate the index of the caret character.
|
||||||
|
var startIndex = entry.IndexOf(CARET);
|
||||||
|
// Get the line from the caret character to the end of the string.
|
||||||
|
var line = entry[startIndex..];
|
||||||
|
|
||||||
|
// Return the line with the caret characters trimmed.
|
||||||
|
return line.TrimStart(CARET).TrimEnd(CARET);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no entry is found, return a default string.
|
||||||
|
return "***MISSING***";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
23
src/Tomas.Kernel/Globalization/IUIText.cs
Normal file
23
src/Tomas.Kernel/Globalization/IUIText.cs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Kernel.Globalization;
|
||||||
|
|
||||||
|
public interface IUIText
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The base directory for the language files.
|
||||||
|
/// </summary>
|
||||||
|
string[] BasePath { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the text for the given id and key.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The id of the text.</param>
|
||||||
|
/// <param name="key">The key of the text.</param>
|
||||||
|
/// <returns>The text for the given id and key.</returns>
|
||||||
|
string GetText(int id, int key);
|
||||||
|
}
|
104
src/Tomas.Kernel/Globalization/UIText.cs
Normal file
104
src/Tomas.Kernel/Globalization/UIText.cs
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Kernel.Globalization;
|
||||||
|
|
||||||
|
public class UIText : IUIText
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The language of the text.
|
||||||
|
/// </summary>
|
||||||
|
string Language { get; set; } = "english";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The base directory for the language files.
|
||||||
|
/// </summary>
|
||||||
|
public string[] BasePath { get; set; } = { AppContext.BaseDirectory, "uitext" };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for the UIText class.
|
||||||
|
/// </summary>
|
||||||
|
public UIText() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for the UIText class.
|
||||||
|
/// Loads the language file for the specified language.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="language">Language to load</param>
|
||||||
|
public UIText(string language)
|
||||||
|
{
|
||||||
|
Language = language;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for the UIText class.
|
||||||
|
/// Loads the language file for the specified language and base directory.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="language">Language to load</param>
|
||||||
|
/// <param name="basePath">Base directory for the language files.</param>
|
||||||
|
public UIText(string language, params string[] baseBath)
|
||||||
|
{
|
||||||
|
Language = language;
|
||||||
|
BasePath = baseBath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the text for the given id and key.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The id of the text.</param>
|
||||||
|
/// <param name="key">The key of the text.</param>
|
||||||
|
/// <returns>The text for the given id and key.</returns>
|
||||||
|
public string GetText(int id, int key) => GetText(id, key.ToString());
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the text for the given id and key.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The id of the text.</param>
|
||||||
|
/// <param name="key">The key of the text.</param>
|
||||||
|
/// <returns>The text for the given id and key.</returns>
|
||||||
|
public string GetText(int id, string key)
|
||||||
|
{
|
||||||
|
// Combine the base path and language path to get the full path of the language file.
|
||||||
|
var basePath = Path.Combine(BasePath);
|
||||||
|
var langPath = Path.Combine(basePath, $"{Language}.dir");
|
||||||
|
|
||||||
|
// Get all the files in the language directory.
|
||||||
|
var files = Directory.GetFiles(langPath);
|
||||||
|
|
||||||
|
// Iterate through the files in the language directory.
|
||||||
|
foreach (var file in files)
|
||||||
|
{
|
||||||
|
// Skip files that do not have the ".cst" extension.
|
||||||
|
if (!file.Contains(".cst"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Get the id of the current file.
|
||||||
|
var ids = Path.GetFileName(file);
|
||||||
|
var second = ids.IndexOf("_", 1, StringComparison.InvariantCultureIgnoreCase);
|
||||||
|
|
||||||
|
if (second == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ids = ids.Substring(1, second - 1);
|
||||||
|
|
||||||
|
// If the id of the current file does not match the id passed to the function,
|
||||||
|
// skip to the next file.
|
||||||
|
if (ids != id.ToString())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Read the content of the current file.
|
||||||
|
var content = File.ReadAllText(file);
|
||||||
|
|
||||||
|
// Return the text for the specified key.
|
||||||
|
return CST.Parse(content, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no text is found, return a default string.
|
||||||
|
return "***MISSING***";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
73
src/Tomas.Kernel/Kernel.cs
Normal file
73
src/Tomas.Kernel/Kernel.cs
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Kernel;
|
||||||
|
|
||||||
|
public class Kernel : Os.Kernel
|
||||||
|
{
|
||||||
|
// This method is called before the Run method
|
||||||
|
protected override void BeforeRun()
|
||||||
|
{
|
||||||
|
// Initialize the file system
|
||||||
|
SysFS.Initialize();
|
||||||
|
|
||||||
|
// If the file system is not enabled, print an error message indicating that the system booted with errors
|
||||||
|
if (!SysMeta.IsFSEnabled)
|
||||||
|
Console.WriteLine($"{SysMeta.NAME} booted with errors.");
|
||||||
|
// If the file system is enabled, print a message indicating that the system booted successfully
|
||||||
|
else
|
||||||
|
Console.WriteLine($"{SysMeta.NAME} booted successfully.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method is the main loop of the kernel, which handles input and runs programs
|
||||||
|
protected override void Run()
|
||||||
|
{
|
||||||
|
// Run the loop indefinitely
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
// Create a new instance of the Shell class
|
||||||
|
var shell = new Shell();
|
||||||
|
|
||||||
|
// Read a line of input from the user
|
||||||
|
var command = shell.ReadLine;
|
||||||
|
|
||||||
|
// Get the dictionary of programs from the shell
|
||||||
|
var programs = shell.Programs;
|
||||||
|
|
||||||
|
// If the command is not a key in the dictionary of programs, print an error message
|
||||||
|
// and continue to the next iteration of the loop
|
||||||
|
if (!programs.TryGetValue(command, out var program))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Command Not Found.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to run the program and handle any exceptions that may be thrown
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Run the program and store the returned value in the 'start' variable
|
||||||
|
var start = program.Run(shell);
|
||||||
|
|
||||||
|
// Check the value of 'start' and take the appropriate action
|
||||||
|
switch (start)
|
||||||
|
{
|
||||||
|
case true:
|
||||||
|
// If 'start' is true, continue to the next iteration of the loop
|
||||||
|
continue;
|
||||||
|
case false:
|
||||||
|
// If 'start' is false, print an error message and continue to the next iteration of the loop
|
||||||
|
Console.WriteLine("Program closed unexpectedly.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception err)
|
||||||
|
{
|
||||||
|
// If an exception is caught, print the error message and continue to the next iteration of the loop
|
||||||
|
Console.WriteLine(err.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
src/Tomas.Kernel/Programs/About.cs
Normal file
20
src/Tomas.Kernel/Programs/About.cs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Kernel.Programs;
|
||||||
|
|
||||||
|
public class About : IProgram
|
||||||
|
{
|
||||||
|
public bool Run(IShell shell)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"TOMAS v{SysMeta.VERSION} ({SysMeta.BuildNumber}) is a hobby operating system written in C# using the COSMOS framework.{Environment.NewLine}Commands:");
|
||||||
|
var progs = shell.Programs;
|
||||||
|
foreach (var commands in progs.Keys)
|
||||||
|
Console.WriteLine(commands);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,9 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
namespace Tomas.Kernel;
|
namespace Tomas.Kernel;
|
||||||
|
|
||||||
public class Shell : IShell
|
public class Shell : IShell
|
|
@ -1,19 +1,26 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
namespace Tomas.Kernel;
|
namespace Tomas.Kernel;
|
||||||
|
|
||||||
static class SysFS
|
static class SysFS
|
||||||
{
|
{
|
||||||
// The root directory of the file system
|
// The root directory of the file system
|
||||||
const string ROOT_DIR = "0:\\";
|
public const string ROOT_DIR = "0:\\";
|
||||||
// The system directory, located in the root directory
|
// The system directory, located in the root directory
|
||||||
static string SYSTEM_DIR = $"{ROOT_DIR}\\SYSTEM\\";
|
static string SYSTEM_DIR = $"{ROOT_DIR}\\SYSTEM\\";
|
||||||
|
|
||||||
static string LOG_FILE = $"{SYSTEM_DIR}system.log";
|
static string LOG_FILE = $"{SYSTEM_DIR}system.log";
|
||||||
|
|
||||||
// An instance of the CosmosVFS class, used for accessing the virtual file system
|
public const string FS_ERROR = "File system disabled.";
|
||||||
static readonly CosmosVFS _fs = new();
|
|
||||||
|
/// <summary>
|
||||||
|
/// An instance of the CosmosVFS class, used for accessing the virtual file system
|
||||||
|
/// </summary>
|
||||||
|
static CosmosVFS fileSystem = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes the file system by creating the system directory and sysinfo.txt file
|
/// Initializes the file system by creating the system directory and sysinfo.txt file
|
||||||
|
@ -23,49 +30,40 @@ static class SysFS
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var createSysFiles = "Creating system files.";
|
// File to store system information
|
||||||
var setSysPref = "Writing system info.";
|
const string sysInfoFile = "sysinfo.txt";
|
||||||
var fsSuccess = "File system succesfully initialized.";
|
|
||||||
|
|
||||||
// Register the CosmosVFS instance as the virtual file system
|
// Create system directory if it doesn't exist
|
||||||
VFSManager.RegisterVFS(_fs);
|
if (!Directory.Exists(SYSTEM_DIR))
|
||||||
|
fileSystem.CreateDirectory(SYSTEM_DIR);
|
||||||
|
|
||||||
// Create the system directory
|
// Create system log file if it doesn't exist
|
||||||
_fs.CreateDirectory(SYSTEM_DIR);
|
if (!File.Exists($"{SYSTEM_DIR}{LOG_FILE}"))
|
||||||
|
fileSystem.CreateFile($"{SYSTEM_DIR}{LOG_FILE}");
|
||||||
|
|
||||||
_fs.CreateFile($"{SYSTEM_DIR}{LOG_FILE}");
|
// Create sysinfo.txt file if it doesn't exist
|
||||||
|
if (!File.Exists($"{SYSTEM_DIR}{sysInfoFile}"))
|
||||||
|
fileSystem.CreateFile($"{SYSTEM_DIR}{sysInfoFile}");
|
||||||
|
|
||||||
Console.WriteLine(createSysFiles);
|
// Write system name, version, and build number to sysinfo.txt file
|
||||||
File.AppendAllText(LOG_FILE, createSysFiles);
|
|
||||||
|
|
||||||
// Create the sysinfo.txt file in the system directory
|
|
||||||
_fs.CreateFile($"{SYSTEM_DIR}sysinfo.txt");
|
|
||||||
|
|
||||||
Console.WriteLine(setSysPref);
|
|
||||||
|
|
||||||
File.AppendAllText(LOG_FILE, setSysPref);
|
|
||||||
|
|
||||||
// Write the system name, version, and build number to the sysinfo.txt file
|
|
||||||
File.WriteAllText($"{SYSTEM_DIR}sysinfo.txt", $"{SysMeta.NAME} v{SysMeta.VERSION} ({SysMeta.BuildNumber})");
|
File.WriteAllText($"{SYSTEM_DIR}sysinfo.txt", $"{SysMeta.NAME} v{SysMeta.VERSION} ({SysMeta.BuildNumber})");
|
||||||
|
|
||||||
Console.WriteLine(fsSuccess);
|
// Set IsFSEnabled property of SysMeta class to true
|
||||||
File.AppendAllText(LOG_FILE, fsSuccess);
|
SysMeta.IsFSEnabled = true;
|
||||||
|
|
||||||
// Set the IsFSActive property of the SysMeta class to true
|
// Read contents of sysinfo.txt file and print to console
|
||||||
SysMeta.IsFSActive = true;
|
|
||||||
|
|
||||||
// Read the contents of the sysinfo.txt file and print it to the console
|
|
||||||
var systemInfo = File.ReadAllText($"{SYSTEM_DIR}sysinfo.txt");
|
var systemInfo = File.ReadAllText($"{SYSTEM_DIR}sysinfo.txt");
|
||||||
|
|
||||||
Console.WriteLine(systemInfo);
|
Console.WriteLine(systemInfo);
|
||||||
}
|
}
|
||||||
catch (Exception err)
|
catch (Exception err)
|
||||||
{
|
{
|
||||||
// If an exception is caught, print an error message indicating that the file system failed to load
|
// Print error message if an exception is caught
|
||||||
Console.WriteLine($"{err.Message}{Environment.NewLine}Warning: Error messages will not logged.");
|
Console.WriteLine($"{err.Message}{Environment.NewLine}Warning: Error messages will not logged.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new directory at the specified path
|
/// Creates a new directory at the specified path
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -74,8 +72,13 @@ static class SysFS
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// If file system isn't enabeld, throw exception
|
||||||
|
if (!SysMeta.IsFSEnabled)
|
||||||
|
throw new IOException(FS_ERROR);
|
||||||
|
|
||||||
// Create the directory using the CosmosVFS instance
|
// Create the directory using the CosmosVFS instance
|
||||||
_fs.CreateDirectory($"{ROOT_DIR}\\{directory}");
|
if (!Directory.Exists($"{ROOT_DIR}\\{directory}"))
|
||||||
|
fileSystem.CreateDirectory($"{ROOT_DIR}\\{directory}");
|
||||||
}
|
}
|
||||||
catch (IOException err)
|
catch (IOException err)
|
||||||
{
|
{
|
||||||
|
@ -94,8 +97,13 @@ static class SysFS
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// If file system isn't enabeld, throw exception
|
||||||
|
if (!SysMeta.IsFSEnabled)
|
||||||
|
throw new IOException(FS_ERROR);
|
||||||
|
|
||||||
// Create the file using the CosmosVFS instance
|
// Create the file using the CosmosVFS instance
|
||||||
_fs.CreateFile($"{ROOT_DIR}\\{path}\\{file}");
|
if (!File.Exists($"{ROOT_DIR}\\{path}\\{file}"))
|
||||||
|
fileSystem.CreateFile($"{ROOT_DIR}\\{path}\\{file}");
|
||||||
}
|
}
|
||||||
catch (IOException err)
|
catch (IOException err)
|
||||||
{
|
{
|
||||||
|
@ -114,6 +122,10 @@ static class SysFS
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// If file system isn't enabeld, throw exception
|
||||||
|
if (!SysMeta.IsFSEnabled)
|
||||||
|
throw new IOException(FS_ERROR);
|
||||||
|
|
||||||
// Get the directories in the specified path using the Directory.GetDirectories method
|
// Get the directories in the specified path using the Directory.GetDirectories method
|
||||||
var dirs = Directory.GetDirectories(path);
|
var dirs = Directory.GetDirectories(path);
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace Tomas.Common;
|
namespace Tomas.Kernel;
|
||||||
|
|
||||||
/// <summary>
|
internal struct SysMeta
|
||||||
/// System metdata, such as name, version and build number.
|
|
||||||
/// </summary>
|
|
||||||
public struct SysMeta
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The name of the operating system.
|
/// The name of the operating system.
|
||||||
|
@ -26,13 +27,12 @@ public struct SysMeta
|
||||||
/// The build number is a 6-digit number, with the first 3 digits being the first 3 digits of the commit hash
|
/// The build number is a 6-digit number, with the first 3 digits being the first 3 digits of the commit hash
|
||||||
/// converted to a uint, and the last 3 digits being the last 3 digits of the commit hash converted to a uint.
|
/// converted to a uint, and the last 3 digits being the last 3 digits of the commit hash converted to a uint.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SuppressMessage("Usage", "CA2211:Non-constant fields should not be visible")]
|
|
||||||
public static string BuildNumber = $"Build {BuildNumFromCommit}";
|
public static string BuildNumber = $"Build {BuildNumFromCommit}";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Let's the system know that the file system is activated.
|
/// Let's the kernel know that the file system is activated.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static bool IsFSActive { get; set; } = false;
|
public static bool IsFSEnabled { get; set; } = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Generates the build number from the commit hash.
|
/// Generates the build number from the commit hash.
|
|
@ -5,6 +5,7 @@
|
||||||
<!--<RuntimeIdentifier>cosmos</RuntimeIdentifier>-->
|
<!--<RuntimeIdentifier>cosmos</RuntimeIdentifier>-->
|
||||||
<Platform>cosmos</Platform>
|
<Platform>cosmos</Platform>
|
||||||
<SupportsX86Intrinsics>false</SupportsX86Intrinsics>
|
<SupportsX86Intrinsics>false</SupportsX86Intrinsics>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
<SelfContained>True</SelfContained>
|
<SelfContained>True</SelfContained>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
@ -24,10 +25,14 @@
|
||||||
<PackageReference Include="Cosmos.Build" Version="0-*" NoWarn="NU1604" />
|
<PackageReference Include="Cosmos.Build" Version="0-*" NoWarn="NU1604" />
|
||||||
<PackageReference Include="Cosmos.Debug.Kernel" Version="0-*" NoWarn="NU1604" />
|
<PackageReference Include="Cosmos.Debug.Kernel" Version="0-*" NoWarn="NU1604" />
|
||||||
<PackageReference Include="Cosmos.System2" Version="0-*" NoWarn="NU1604" />
|
<PackageReference Include="Cosmos.System2" Version="0-*" NoWarn="NU1604" />
|
||||||
|
<PackageReference Include="GitInfo" Version="2.3.0">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Tomas.Common\Tomas.Common.csproj" />
|
<ProjectReference Include="..\Tomas.Core\Tomas.Core.csproj" />
|
||||||
<ProjectReference Include="..\Tomas.Interface\Tomas.Interface.csproj" />
|
<ProjectReference Include="..\Tomas.Interface\Tomas.Interface.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
15
src/Tomas.Kernel/Usings.cs
Normal file
15
src/Tomas.Kernel/Usings.cs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
global using System.Diagnostics.CodeAnalysis;
|
||||||
|
global using System.Diagnostics;
|
||||||
|
global using Tomas.Core.Programs;
|
||||||
|
global using Tomas.Interface;
|
||||||
|
global using Tomas.Kernel.Programs;
|
||||||
|
global using Cosmos.System.FileSystem;
|
||||||
|
global using Cosmos.System.FileSystem.VFS;
|
||||||
|
global using Tomas.Core;
|
||||||
|
global using Os = Cosmos.System;
|
1
src/Tomas.Terminal/GitInfo.txt
Normal file
1
src/Tomas.Terminal/GitInfo.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
0.1
|
|
@ -1,2 +0,0 @@
|
||||||
global using Tomas.Common.Programs;
|
|
||||||
global using Tomas.Interface;
|
|
|
@ -1,40 +1,43 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
namespace Tomas.Terminal;
|
namespace Tomas.Terminal;
|
||||||
|
|
||||||
class Program
|
class Program
|
||||||
{
|
{
|
||||||
static void Main()
|
static void Main()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var shell = new Shell();
|
||||||
|
var command = shell.ReadLine;
|
||||||
|
var programs = shell.Programs;
|
||||||
|
|
||||||
|
if (!programs.TryGetValue(command, out var program))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Command Not Found.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var start = program.Run(shell);
|
||||||
|
switch (start)
|
||||||
{
|
{
|
||||||
while (true)
|
case true:
|
||||||
{
|
continue;
|
||||||
var shell = new Shell();
|
case false:
|
||||||
var command = shell.ReadLine;
|
Console.WriteLine("Program closed unexpectedly.");
|
||||||
var programs = shell.Programs;
|
continue;
|
||||||
|
|
||||||
if (!programs.TryGetValue(command, out var program))
|
|
||||||
{
|
|
||||||
Console.WriteLine("Command Not Found.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var start = program.Run(shell);
|
|
||||||
switch (start)
|
|
||||||
{
|
|
||||||
case true:
|
|
||||||
continue;
|
|
||||||
case false:
|
|
||||||
Console.WriteLine("Program closed unexpectedly.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception err)
|
|
||||||
{
|
|
||||||
Console.WriteLine(err.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch (Exception err)
|
||||||
|
{
|
||||||
|
Console.WriteLine(err.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,15 +1,16 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
using Tomas.Common;
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
namespace Tomas.Terminal.Programs;
|
namespace Tomas.Terminal.Programs;
|
||||||
|
|
||||||
public class About : IProgram
|
public class About : IProgram
|
||||||
{
|
{
|
||||||
public bool Run(IShell shell)
|
public bool Run(IShell shell)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"{SysMeta.NAME} Terminal Emulator v{SysMeta.BuildNumber}{Environment.NewLine}"
|
Console.WriteLine($"{TermMeta.NAME} Terminal Emulator v{TermMeta.VERSION}");
|
||||||
+ "TOMAS (Tony's Managed Operating System) is a operating system written in C# using the COSMOS framework.");
|
return true;
|
||||||
return true;
|
}
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,14 +1,18 @@
|
||||||
// I license this project under the BSD 3-Clause license.
|
/*
|
||||||
// See the LICENSE file in the project root for more information.
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
using Tomas.Terminal.Programs;
|
using Tomas.Terminal.Programs;
|
||||||
|
|
||||||
namespace Tomas.Terminal;
|
namespace Tomas.Terminal;
|
||||||
|
|
||||||
public class Shell : IShell
|
public class Shell : IShell
|
||||||
{
|
{
|
||||||
const char SYMBOL = '$';
|
const char SYMBOL = '$';
|
||||||
|
|
||||||
public Dictionary<string, IProgram> Programs => new()
|
public Dictionary<string, IProgram> Programs => new()
|
||||||
{
|
{
|
||||||
{"about", new About()},
|
{"about", new About()},
|
||||||
{"fensay", new FenSay()},
|
{"fensay", new FenSay()},
|
||||||
|
@ -16,13 +20,13 @@ public class Shell : IShell
|
||||||
{"commands", new Commands()}
|
{"commands", new Commands()}
|
||||||
};
|
};
|
||||||
|
|
||||||
public string ReadLine
|
public string ReadLine
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Console.Write(SYMBOL);
|
Console.Write(SYMBOL);
|
||||||
var readl = Console.ReadLine();
|
var readl = Console.ReadLine();
|
||||||
return readl;
|
return readl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
52
src/Tomas.Terminal/TermMeta.cs
Normal file
52
src/Tomas.Terminal/TermMeta.cs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Tomas.Terminal;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// System metdata, such as name, version and build number.
|
||||||
|
/// </summary>
|
||||||
|
public struct TermMeta
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the operating system.
|
||||||
|
/// </summary>
|
||||||
|
public const string NAME = "TOMAS Emulator";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The version of the operating system, in the Calendar Versioning format: "yy.minor.patch".
|
||||||
|
/// The year, minor, and patch version numbers are automatically extracted from the Git repository
|
||||||
|
/// using the ThisAssembly.Git.SemVer object.
|
||||||
|
/// </summary>
|
||||||
|
public const string VERSION = $"{ThisAssembly.Git.SemVer.Major}.{ThisAssembly.Git.SemVer.Minor}.{ThisAssembly.Git.SemVer.Patch}";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The build number of the operating system, generated from the commit hash.
|
||||||
|
/// The build number is a 6-digit number, with the first 3 digits being the first 3 digits of the commit hash
|
||||||
|
/// converted to a uint, and the last 3 digits being the last 3 digits of the commit hash converted to a uint.
|
||||||
|
/// </summary>
|
||||||
|
public static string BuildNumber = $"Build {BuildNumFromCommit}";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generates the build number from the commit hash.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The build number as a uint.</returns>
|
||||||
|
static uint BuildNumFromCommit
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
// Get the bytes of the commit hash as a UTF-8 encoded string
|
||||||
|
var commit = Encoding.UTF8.GetBytes(ThisAssembly.Git.Commit);
|
||||||
|
|
||||||
|
// Convert the first 4 bytes of the commit hash to a uint and return it modulo 1000000
|
||||||
|
// (this will give us a 6-digit number with the first 3 digits being the first 3 digits of the commit hash
|
||||||
|
// and the last 3 digits being the last 3 digits of the commit hash)
|
||||||
|
return BitConverter.ToUInt32(commit, 0) % 1000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,15 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Tomas.Common\Tomas.Common.csproj" />
|
<PackageReference Include="GitInfo" Version="2.3.0">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="NLua" Version="1.6.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Tomas.Core\Tomas.Core.csproj" />
|
||||||
<ProjectReference Include="..\Tomas.Interface\Tomas.Interface.csproj" />
|
<ProjectReference Include="..\Tomas.Interface\Tomas.Interface.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
10
src/Tomas.Terminal/Usings.cs
Normal file
10
src/Tomas.Terminal/Usings.cs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
global using System.Diagnostics.CodeAnalysis;
|
||||||
|
global using System.Diagnostics;
|
||||||
|
global using Tomas.Core.Programs;
|
||||||
|
global using Tomas.Interface;
|
16
src/Tomas.Tests/Shell/MockProgram.cs
Normal file
16
src/Tomas.Tests/Shell/MockProgram.cs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Tests.Shell;
|
||||||
|
|
||||||
|
internal class MockProgram : IProgram
|
||||||
|
{
|
||||||
|
public bool Run(IShell shell)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("Test Program.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
17
src/Tomas.Tests/Shell/MockShell.cs
Normal file
17
src/Tomas.Tests/Shell/MockShell.cs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
namespace Tomas.Tests.Shell;
|
||||||
|
|
||||||
|
internal class MockShell : IShell
|
||||||
|
{
|
||||||
|
public string? ReadLine { get; }
|
||||||
|
|
||||||
|
public Dictionary<string, IProgram> Programs => new()
|
||||||
|
{
|
||||||
|
{ "test", new MockProgram() },
|
||||||
|
};
|
||||||
|
}
|
26
src/Tomas.Tests/ShellTests.cs
Normal file
26
src/Tomas.Tests/ShellTests.cs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
using Tomas.Tests.Shell;
|
||||||
|
|
||||||
|
namespace Tomas.Tests;
|
||||||
|
|
||||||
|
public class ShellTests
|
||||||
|
{
|
||||||
|
// Create a new instance of the mock shell
|
||||||
|
readonly MockShell _mockShell = new();
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ProgramTest()
|
||||||
|
{
|
||||||
|
// Create a mock program instance
|
||||||
|
var program = new MockProgram();
|
||||||
|
|
||||||
|
// Assert that the Run method of the program and returns true when passed the shell object.
|
||||||
|
Assert.True(program.Run(_mockShell));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
29
src/Tomas.Tests/Tomas.Tests.csproj
Normal file
29
src/Tomas.Tests/Tomas.Tests.csproj
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<IsPackable>false</IsPackable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
|
||||||
|
<PackageReference Include="xunit" Version="2.4.2" />
|
||||||
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Tomas.Core\Tomas.Core.csproj" />
|
||||||
|
<ProjectReference Include="..\Tomas.Interface\Tomas.Interface.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
11
src/Tomas.Tests/Usings.cs
Normal file
11
src/Tomas.Tests/Usings.cs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
/*
|
||||||
|
In jurisdictions that recognize copyright waivers, I've waived all copyright
|
||||||
|
and related or neighboring rights for to this project. In areas where these
|
||||||
|
waivers are not recognized, BSD-3-Clause is enforced.
|
||||||
|
See the (UN)LICENSE file in the project root for more information.
|
||||||
|
*/
|
||||||
|
global using Xunit;
|
||||||
|
global using System.Diagnostics.CodeAnalysis;
|
||||||
|
global using System.Diagnostics;
|
||||||
|
global using Tomas.Core;
|
||||||
|
global using Tomas.Interface;
|
Loading…
Add table
Reference in a new issue