Use only Python

This commit is contained in:
Lucàs
2023-12-26 22:09:40 +01:00
parent 31f70d319f
commit efbf7fb7cc
33 changed files with 625 additions and 391 deletions
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="jdk" jdkName="Python 3.8" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
+26
View File
@@ -0,0 +1,26 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<Languages>
<language minSize="275" name="Python" />
</Languages>
</inspection_tool>
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="N806" />
<option value="N802" />
<option value="N803" />
</list>
</option>
</inspection_tool>
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="str.save" />
</list>
</option>
</inspection_tool>
</profile>
</component>
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.8" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8" project-jdk-type="Python SDK" />
</project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/LucasVbr.iml" filepath="$PROJECT_DIR$/.idea/LucasVbr.iml" />
</modules>
</component>
</project>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectTasksOptions" suppressed-tasks="Pug/Jade" />
</project>
+79 -39
View File
@@ -5,37 +5,34 @@
</component>
<component name="ChangeListManager">
<list default="true" id="b25cc8d3-396f-4036-b751-5d061242b2fc" name="Changes" comment="Add ts-node and some skills">
<change afterPath="$PROJECT_DIR$/components/ImageComponent.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/components/LinkComponent.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/config.yaml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/main.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/models/BadgeModel.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/models/BannerModel.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/models/ConfigModel.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/models/LinkModel.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Banner.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Context.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Link.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Skill.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/url_builder/BadgeUrlBuilder.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/url_builder/BannerUrlBuilder.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/url_builder/UrlBuilder.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/views/template.njk" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/core/FooterBadge.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/core/Link.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/core/Log.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/core/Skill.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/data/footerBadges.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/data/links.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/data/skills.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/index.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/tsconfig.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/views/README.njk" beforeDir="false" />
<change afterPath="$PROJECT_DIR$/assets/banner.svg" afterDir="false" />
<change afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/requirements" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/config.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/model/skill.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/model/skill_list.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/model/social.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/model/social_list.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/template.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/template.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/components/ImageComponent.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/components/LinkComponent.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/config.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/config.yaml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/models/BadgeModel.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/models/BannerModel.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/models/ConfigModel.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/models/LinkModel.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/Banner.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/Context.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/Link.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/Skill.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/url_builder/BadgeUrlBuilder.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/url_builder/BannerUrlBuilder.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/url_builder/UrlBuilder.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/views/template.njk" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -43,13 +40,14 @@
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="DarkyenusTimeTracker">
<option name="totalTimeSeconds" value="26120" />
<option name="totalTimeSeconds" value="26848" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="JavaScript File" />
<option value="TypeScript File" />
<option value="Python Script" />
</list>
</option>
</component>
@@ -64,6 +62,10 @@
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectColorInfo">{
&quot;customColor&quot;: &quot;&quot;,
&quot;associatedIndex&quot;: 7
}</component>
<component name="ProjectId" id="2D5NGsoG3YaWSwKstpEFyHAQuqo" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
@@ -75,12 +77,13 @@
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"ASKED_MARK_IGNORED_FILES_AS_EXCLUDED": "true",
"Python.main.executor": "Run",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"WebServerToolWindowFactoryState": "false",
"git-widget-placeholder": "dev",
"javascript.nodejs.core.library.configured.version": "19.6.0",
"javascript.nodejs.core.library.typings.version": "18.16.3",
"javascript.nodejs.core.library.configured.version": "20.6.1",
"javascript.nodejs.core.library.typings.version": "20.6.5",
"last_directory_selection": "/Users/lucas/Documents/GitHub/LucasVbr/model",
"last_opened_file_path": "/Users/lucas/Documents/GitHub/LucasVbr/models",
"node.js.detected.package.eslint": "true",
@@ -89,7 +92,7 @@
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "preferences.pluginManager",
"ts.external.directory.path": "/Users/lucas/Library/Application Support/JetBrains/Toolbox/apps/WebStorm/ch-0/231.8770.64/WebStorm.app/Contents/plugins/javascript-impl/jsLanguageServicesImpl/external",
"ts.external.directory.path": "/Users/lucas/Applications/PyCharm Professional Edition.app/Contents/plugins/javascript-impl/jsLanguageServicesImpl/external",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
@@ -100,14 +103,37 @@
<recent name="$PROJECT_DIR$/components" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/url" />
<recent name="$PROJECT_DIR$/src/model" />
<recent name="$PROJECT_DIR$/resources" />
<recent name="$PROJECT_DIR$/src" />
<recent name="$PROJECT_DIR$/src/url" />
<recent name="$PROJECT_DIR$/views" />
<recent name="$PROJECT_DIR$" />
<recent name="$PROJECT_DIR$/src/core" />
</key>
</component>
<component name="RunManager" selected="npm.start">
<component name="RunManager" selected="Python.main">
<configuration name="main" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="LucasVbr" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/main.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="Run Compilation" type="ShConfigurationType">
<option name="SCRIPT_TEXT" value="" />
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
@@ -135,10 +161,18 @@
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.main" />
<item itemvalue="npm.start" />
</list>
</recent_temporary>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-python-sdk-50da183f06c8-2887949eec09-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-233.13135.95" />
</set>
</attachedChunks>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
@@ -167,6 +201,9 @@
<workItem from="1673603557469" duration="10000" />
<workItem from="1682800101629" duration="27322000" />
<workItem from="1683016877648" duration="634000" />
<workItem from="1686672064522" duration="10000" />
<workItem from="1691244360881" duration="1235000" />
<workItem from="1703610497268" duration="12128000" />
</task>
<task id="LOCAL-00001" summary="Add OpenClassRooms link">
<created>1660658552230</created>
@@ -239,4 +276,7 @@
<expand />
<select />
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/LucasVbr$main.coverage" NAME="main Coverage Results" MODIFIED="1703624206428" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component>
</project>
+14 -14
View File
@@ -1,16 +1,18 @@
![Hi I&#39;m Lucàs👋](https://svg-banners.vercel.app/api?type=glitch&amp;text1=Hi+I%27m+Luc%C3%A0s%F0%9F%91%8B&amp;width=1000&amp;height=400)
<header align="center">
![Hi I'm Lucàs👋](assets/banner.svg)
</header>
## 🚀 About Me
I&#39;m a passionate developer from 🇫🇷 **Albi, France**.
I'm a passionate developer from 🇫🇷 **Pau, France**.
## 🔗 Links
[![My Portfolio](https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=My+Portfolio&amp;logo=ko-fi&amp;color=000)](https://lucasvbr.github.io/links/?portfolio)
## 🔗 Social Links
[![Linkedin](https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=Linkedin&amp;color=0e76a8&amp;logo=linkedin)](https://www.linkedin.com/in/lucasvbr)
[![FreeCodeCamp](https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=FreeCodeCamp&amp;color=0a0a23&amp;logo=freecodecamp)](https://www.freecodecamp.org/LucasVbr)
[![OpenClassRooms](https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=OpenClassRooms&amp;color=7451eb&amp;logo=openclassrooms)](https://openclassrooms.com/fr/members/97j9zltv6225)
[![Exercism](https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=Exercism&amp;color=2e57e8&amp;logo=exercism)](https://exercism.org/profiles/LucasVbr)
## 🛠 Skills
![Android](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Android&amp;color=3DDC84&amp;logo=android)
![Angular](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Angular&amp;color=DD0031&amp;logo=angular)
@@ -18,18 +20,18 @@ I&#39;m a passionate developer from 🇫🇷 **Albi, France**.
![Bulma](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Bulma&amp;color=00D1B2&amp;logo=bulma)
![C](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=C&amp;color=A8B9CC&amp;logo=c)
![CSS3](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=CSS3&amp;color=1572B6&amp;logo=css3)
![Deno](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Deno&amp;color=000&amp;logo=deno)
![Deno](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Deno&amp;color=black&amp;logo=deno)
![Docker](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Docker&amp;color=2496ED&amp;logo=docker)
![Express](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Express&amp;color=000&amp;logo=express)
![Express](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Express&amp;color=black&amp;logo=express)
![Figma](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Figma&amp;color=F24E1E&amp;logo=figma)
![Git](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Git&amp;color=F05032&amp;logo=git)
![GNU Bash](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=GNU+Bash&amp;color=4EAA25&amp;logo=gnubash)
![GNU Bash](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=GNU%20Bash&amp;color=4EAA25&amp;logo=gnu-bash)
![HTML5](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=HTML5&amp;color=E34F26&amp;logo=html5)
![JavaScript](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=JavaScript&amp;color=F7DF1E&amp;logo=javascript)
![MariaDB](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=MariaDB&amp;color=003545&amp;logo=mariadb)
![MongoDB](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=MongoDB&amp;color=47A248&amp;logo=mongodb)
![MySQL](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=MySQL&amp;color=4479A1&amp;logo=mysql)
![Node.js](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Node.js&amp;color=339933&amp;logo=nodedotjs)
![Node.js](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Node.js&amp;color=339933&amp;logo=node.js)
![Nunjucks](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Nunjucks&amp;color=1C4913&amp;logo=nunjucks)
![OCaml](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=OCaml&amp;color=EC6813&amp;logo=ocaml)
![PHP](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=PHP&amp;color=777BB4&amp;logo=php)
@@ -38,13 +40,12 @@ I&#39;m a passionate developer from 🇫🇷 **Albi, France**.
![Python](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Python&amp;color=3776AB&amp;logo=python)
![React](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=React&amp;color=61DAFB&amp;logo=react)
![SQLite](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=SQLite&amp;color=003B57&amp;logo=sqlite)
![Symfony](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Symfony&amp;color=000&amp;logo=symfony)
![Symfony](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Symfony&amp;color=black&amp;logo=symfony)
![TypeScript](https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=TypeScript&amp;color=3178C6&amp;logo=typescript)
---
<div align="center">
<footer align="center">
![SVG Stats](https://github-stats-alpha.vercel.app/api?username=LucasVbr&cc=000&tc=fff&ic=fff&bc=000)
@@ -52,5 +53,4 @@ I&#39;m a passionate developer from 🇫🇷 **Albi, France**.
![FreeCodeCamp Points](https://img.shields.io/freecodecamp/points/lucasvbr?label=FreeCodeCamp%20points)
![Made with love](https://img.shields.io/badge/-made%20with%20%E2%9D%A4%EF%B8%8F-red)
</div>
</footer>
+223
View File
@@ -0,0 +1,223 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 800 400" width="800" height="400">
<foreignObject width="100%" height="100%">
<div xmlns="http://www.w3.org/1999/xhtml">
<style>
.container {
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin: 0;
width: 100%;
height: 400px;
background: #333;
background-size: 600% 400%;
border-radius: 10px;
/* color: white; */
text-align: center;
}
h1 {
text-align: center;
color: #fff;
font-size: 5em;
letter-spacing: 8px;
font-family: "Lucida Console", Monaco, monospace;
font-weight: 400;
/*Create overlap*/
margin: 0;
line-height: 0;
/*Animation*/
animation: glitch1 2.5s infinite;
}
h1:nth-child(2) {
color: #67f3da;
animation: glitch2 2.5s infinite;
}
h1:nth-child(3) {
color: #f16f6f;
animation: glitch3 2.5s infinite;
}
/*Keyframes*/
@keyframes glitch1 {
0% {
transform: none;
opacity: 1;
}
7% {
transform: skew(-0.5deg, -0.9deg);
opacity: 0.75;
}
10% {
transform: none;
opacity: 1;
}
27% {
transform: none;
opacity: 1;
}
30% {
transform: skew(0.8deg, -0.1deg);
opacity: 0.75;
}
35% {
transform: none;
opacity: 1;
}
52% {
transform: none;
opacity: 1;
}
55% {
transform: skew(-1deg, 0.2deg);
opacity: 0.75;
}
50% {
transform: none;
opacity: 1;
}
72% {
transform: none;
opacity: 1;
}
75% {
transform: skew(0.4deg, 1deg);
opacity: 0.75;
}
80% {
transform: none;
opacity: 1;
}
100% {
transform: none;
opacity: 1;
}
}
@keyframes glitch2 {
0% {
transform: none;
opacity: 0.25;
}
7% {
transform: translate(-2px, -3px);
opacity: 0.5;
}
10% {
transform: none;
opacity: 0.25;
}
27% {
transform: none;
opacity: 0.25;
}
30% {
transform: translate(-5px, -2px);
opacity: 0.5;
}
35% {
transform: none;
opacity: 0.25;
}
52% {
transform: none;
opacity: 0.25;
}
55% {
transform: translate(-5px, -1px);
opacity: 0.5;
}
50% {
transform: none;
opacity: 0.25;
}
72% {
transform: none;
opacity: 0.25;
}
75% {
transform: translate(-2px, -6px);
opacity: 0.5;
}
80% {
transform: none;
opacity: 0.25;
}
100% {
transform: none;
opacity: 0.25;
}
}
@keyframes glitch3 {
0% {
transform: none;
opacity: 0.25;
}
7% {
transform: translate(2px, 3px);
opacity: 0.5;
}
10% {
transform: none;
opacity: 0.25;
}
27% {
transform: none;
opacity: 0.25;
}
30% {
transform: translate(5px, 2px);
opacity: 0.5;
}
35% {
transform: none;
opacity: 0.25;
}
52% {
transform: none;
opacity: 0.25;
}
55% {
transform: translate(5px, 1px);
opacity: 0.5;
}
50% {
transform: none;
opacity: 0.25;
}
72% {
transform: none;
opacity: 0.25;
}
75% {
transform: translate(2px, 6px);
opacity: 0.5;
}
80% {
transform: none;
opacity: 0.25;
}
100% {
transform: none;
opacity: 0.25;
}
}
</style>
<div class="container">
<h1>Hi I'm Lucàs👋</h1>
<h1>Hi I'm Lucàs👋</h1>
<h1>Hi I'm Lucàs👋</h1>
</div>
</div>
</foreignObject>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

-3
View File
@@ -1,3 +0,0 @@
const ImageComponent = (label: string, url: URL) => `![${label}](${url})`;
export default ImageComponent
-3
View File
@@ -1,3 +0,0 @@
const LinkComponent = (label: string, url: string) => `[${label}](${url})`;
export default LinkComponent;
+70 -91
View File
@@ -1,128 +1,107 @@
file:
template: "template.njk"
output: "README.md"
user: "LucasVbr"
view:
userName: "LucasVbr"
socials:
# - name: "My Portfolio"
# url: "https://lucasvbr.github.io/portfolio"
# img: "https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=My+Portfolio&amp;logo=ko-fi&amp;color=000"
banner:
type: "glitch"
text1: "Hi I'm Lucàs👋"
width: 1000
height: 400
about: "I'm a passionate developer from 🇫🇷 **Albi, France**."
links:
- label:
message: "My Portfolio"
logo: "ko-fi"
url: "https://lucasvbr.github.io/links/?portfolio"
- label:
message: "Linkedin"
color: "0e76a8"
- name: "Linkedin"
url: "https://www.linkedin.com/in/lucasvbr"
img: "https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=Linkedin&amp;color=0e76a8&amp;logo=linkedin"
- label:
message: "FreeCodeCamp"
color: "0a0a23"
- name: "FreeCodeCamp"
url: "https://www.freecodecamp.org/LucasVbr"
img: "https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=FreeCodeCamp&amp;color=0a0a23&amp;logo=freecodecamp"
- label:
message: "OpenClassRooms"
color: "7451eb"
- name: "OpenClassRooms"
url: "https://openclassrooms.com/fr/members/97j9zltv6225"
img: "https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=OpenClassRooms&amp;color=7451eb&amp;logo=openclassrooms"
- label:
message: "Exercism"
color: "2e57e8"
- name: "Exercism"
url: "https://exercism.org/profiles/LucasVbr"
img: "https://img.shields.io/static/v1?style=for-the-badge&amp;label=+&amp;logoColor=white&amp;message=Exercism&amp;color=2e57e8&amp;logo=exercism"
skills:
- message: "Android"
color: "3DDC84"
skills:
- name: "Android"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Android&amp;color=3DDC84&amp;logo=android"
- message: "Angular"
color: "DD0031"
- name: "Angular"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Angular&amp;color=DD0031&amp;logo=angular"
- message: "Bootstrap"
color: "7952B3"
- name: "Bootstrap"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Bootstrap&amp;color=7952B3&amp;logo=bootstrap"
- message: "Bulma"
color: "00D1B2"
- name: "Bulma"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Bulma&amp;color=00D1B2&amp;logo=bulma"
- message: "C"
color: "A8B9CC"
- name: "C"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=C&amp;color=A8B9CC&amp;logo=c"
- message: "CSS3"
color: "1572B6"
- name: "CSS3"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=CSS3&amp;color=1572B6&amp;logo=css3"
- message: "Deno"
- name: "Deno"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Deno&amp;color=black&amp;logo=deno"
- message: "Docker"
color: "2496ED"
- name: "Docker"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Docker&amp;color=2496ED&amp;logo=docker"
- message: "Express"
- name: "Express"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Express&amp;color=black&amp;logo=express"
- message: "Figma"
color: "F24E1E"
- name: "Figma"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Figma&amp;color=F24E1E&amp;logo=figma"
- message: "Git"
color: "F05032"
- name: "Git"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Git&amp;color=F05032&amp;logo=git"
- message: "GNU Bash"
color: "4EAA25"
- name: "GNU Bash"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=GNU%20Bash&amp;color=4EAA25&amp;logo=gnu-bash"
- message: "HTML5"
color: "E34F26"
- name: "HTML5"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=HTML5&amp;color=E34F26&amp;logo=html5"
- message: "JavaScript"
color: "F7DF1E"
- name: "JavaScript"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=JavaScript&amp;color=F7DF1E&amp;logo=javascript"
- message: "MariaDB"
color: "003545"
- name: "MariaDB"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=MariaDB&amp;color=003545&amp;logo=mariadb"
- message: "MongoDB"
color: "47A248"
- name: "MongoDB"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=MongoDB&amp;color=47A248&amp;logo=mongodb"
- message: "MySQL"
color: "4479A1"
- name: "MySQL"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=MySQL&amp;color=4479A1&amp;logo=mysql"
- message: "Node.js"
color: "339933"
logo: "nodedotjs"
- name: "Node.js"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Node.js&amp;color=339933&amp;logo=node.js"
- message: "Nunjucks"
color: "1C4913"
- name: "Nunjucks"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Nunjucks&amp;color=1C4913&amp;logo=nunjucks"
- message: "OCaml"
color: "EC6813"
- name: "OCaml"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=OCaml&amp;color=EC6813&amp;logo=ocaml"
- message: "PHP"
color: "777BB4"
- name: "PHP"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=PHP&amp;color=777BB4&amp;logo=php"
- message: "PostgreSQL"
color: "4169E1"
- name: "PostgreSQL"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=PostgreSQL&amp;color=4169E1&amp;logo=postgresql"
- message: "Pug"
color: "A86454"
- name: "Pug"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Pug&amp;color=A86454&amp;logo=pug"
- message: "Python"
color: "3776AB"
- name: "Python"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Python&amp;color=3776AB&amp;logo=python"
- message: "React"
color: "61DAFB"
- name: "React"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=React&amp;color=61DAFB&amp;logo=react"
- message: "SQLite"
color: "003B57"
- name: "SQLite"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=SQLite&amp;color=003B57&amp;logo=sqlite"
- message: "Symfony"
- name: "Symfony"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=Symfony&amp;color=black&amp;logo=symfony"
- message: "TypeScript"
color: "3178C6"
footer:
- "![Profile Views](https://komarev.com/ghpvc/?username=lucasvbr&amp;amp;label=Profile%20views&amp;amp;color=0e75b6&amp;amp;style=flat)"
- "![FreeCodeCamp Points](https://img.shields.io/freecodecamp/points/lucasvbr?label=FreeCodeCamp%20points)"
- "![Made with love](https://img.shields.io/badge/-made%20with%20%E2%9D%A4%EF%B8%8F-red)"
- name: "TypeScript"
url: "https://img.shields.io/static/v1?style=flat&amp;label=+&amp;logoColor=white&amp;message=TypeScript&amp;color=3178C6&amp;logo=typescript"
+19
View File
@@ -0,0 +1,19 @@
from src.config import load_data
from src.template import load_template
CONFIG_FILE = 'config.yaml'
TEMPLATE_FILE = 'template.md'
OUTPUT_FILE = 'README.md'
if __name__ == '__main__':
data = load_data(CONFIG_FILE)
template = load_template(TEMPLATE_FILE)
# Add data to template
result = template.format(**data)
# Generate README file
with open(OUTPUT_FILE, 'w') as readme_file:
readme_file.write(result)
print(f"{OUTPUT_FILE} generated successfully! 🎉")
-18
View File
@@ -1,18 +0,0 @@
import {parse} from 'https://deno.land/std@0.82.0/encoding/yaml.ts';
import nunjucks from 'https://deno.land/x/nunjucks@3.2.3-2/mod.js';
import makeContext from './src/Context.ts';
import type ConfigModel from './models/ConfigModel.ts';
// Load Config file
const config: ConfigModel = parse(await Deno.readTextFile('config.yaml')) as ConfigModel;
const context = makeContext(config.view)
// Render
nunjucks.configure('views/', {autoescape: true});
nunjucks.render(config.file.template, context, (err, res) => {
if (err) return console.error(err);
Deno.writeTextFile(config.file.output, res ?? '')
.then(() => console.info(`[INFO] ${config.file.output} successfully generated`))
.catch(err => console.error(err));
});
-13
View File
@@ -1,13 +0,0 @@
type BadgeModel = {
label?: string,
message?: string,
color?: string,
logo?: string,
style: "plastic" | "flat" | "flat-square" | "for-the-badge" | "social",
logoColor?: string,
logoWidth?: number,
link?: string,
labelColor?: string,
cacheSeconds?: number,
}
export default BadgeModel;
-9
View File
@@ -1,9 +0,0 @@
type BannerModel = {
text1: string,
text2?: string,
type: "origin" | "textBox" | "glitch" | "luminance" | "typeWriter" | "rainbow",
width: number,
height: number,
}
export default BannerModel;
-20
View File
@@ -1,20 +0,0 @@
import type BannerModel from './BannerModel.ts';
import type LinkModel from './LinkModel.ts';
import type BadgeModel from './BadgeModel.ts';
type ConfigModel = {
file: {
template: string,
output: string
},
view: {
userName: string,
banner: BannerModel,
about: string,
links: LinkModel[],
skills: BadgeModel[],
footer: string[]
}
}
export default ConfigModel;
-8
View File
@@ -1,8 +0,0 @@
import BadgeModel from './BadgeModel.ts';
type LinkModel = {
label: BadgeModel,
url: string
}
export default LinkModel
+3
View File
@@ -0,0 +1,3 @@
pyyaml
json
requests
-18
View File
@@ -1,18 +0,0 @@
import ImageComponent from '../components/ImageComponent.ts';
import type BannerModel from '../models/BannerModel.ts';
import BannerUrlBuilder from './url_builder/BannerUrlBuilder.ts';
export default class Banner {
constructor(private model: BannerModel) {
};
toString(): string {
const url = new BannerUrlBuilder()
.setParameters({...this.model})
.build()
;
return ImageComponent(this.model.text1, url);
}
}
-12
View File
@@ -1,12 +0,0 @@
import Skill from './Skill.ts';
import Banner from './Banner.ts';
import Link from './Link.ts';
export default function makeContext(viewConfig) {
return {
...viewConfig,
banner: new Banner(viewConfig.banner).toString(),
links: viewConfig.links.map(link => (new Link(link)).toString()),
skills: viewConfig.skills.map(skill => (new Skill(skill)).toString()),
}
}
-32
View File
@@ -1,32 +0,0 @@
import BadgeUrlBuilder from './url_builder/BadgeUrlBuilder.ts';
import ImageComponent from '../components/ImageComponent.ts';
import LinkModel from '../models/LinkModel.ts';
import LinkComponent from '../components/LinkComponent.ts';
export default class Link {
constructor(private model: LinkModel) {}
handleLabel() {
const {label: badge} = this.model;
const defaultLogo = badge.message.toLowerCase().replace(/\s+/g, '')
const url = new BadgeUrlBuilder()
.setParameters({
...badge,
style: "for-the-badge",
logo: badge.logo ?? defaultLogo,
color: badge.color ?? '000',
},
)
.build()
;
return ImageComponent(badge.message, url);
}
toString(): string {
const label = this.handleLabel().toString()
return LinkComponent(label, this.model.url).toString()
}
}
-24
View File
@@ -1,24 +0,0 @@
import BadgeUrlBuilder from './url_builder/BadgeUrlBuilder.ts';
import ImageComponent from '../components/ImageComponent.ts';
import type SkillModel from '../models/SkillModel.ts';
export default class Skill {
constructor(private model: SkillModel) {};
toString(): string {
const defaultLogo = this.model.message.toLowerCase().replace(/\s+/g, '');
const url = new BadgeUrlBuilder()
.setParameters({
...this.model,
color: this.model.color ?? '000',
logo: this.model.logo ?? defaultLogo
},
)
.build()
;
return ImageComponent(this.model.message, url);
}
}
+80
View File
@@ -0,0 +1,80 @@
import yaml
from src.model.skill_list import SkillList
import requests
from src.model.social_list import SocialList
def load_data(config_file_path: str) -> dict:
"""Load data from config file and return a dict"""
config_data_builder = ConfigDataBuilder(config_file_path)
return (config_data_builder
.load_config_file()
.load_user_info()
.load_skill_section()
.load_social_section()
.build())
class ConfigDataBuilder:
def __init__(self, config_file_path: str):
"""
Initialize ConfigDataBuilder
:param config_file_path: Path to config file
"""
self.config_file_path = config_file_path
self.config_data = None
def load_config_file(self) -> 'ConfigDataBuilder':
"""
Load config file and return ConfigDataBuilder
:return: ConfigDataBuilder
"""
with open(self.config_file_path, 'r') as config_file:
self.config_data = yaml.safe_load(config_file)
return self
def load_user_info(self) -> 'ConfigDataBuilder':
"""
Load user info from GitHub API and return ConfigDataBuilder
:return: ConfigDataBuilder
"""
user = self.config_data["user"]
response = requests.get(f"https://api.github.com/users/{user}")
if response.status_code != 200:
raise Exception("User not found")
self.config_data["user"] = response.json()
return self
def load_social_section(self) -> 'ConfigDataBuilder':
"""
Load social section and return ConfigDataBuilder
:return: ConfigDataBuilder
"""
self.config_data["socials"] = str(SocialList(self.config_data["socials"]))
return self
def load_skill_section(self) -> 'ConfigDataBuilder':
"""
Load skill section and return ConfigDataBuilder
:return: ConfigDataBuilder
"""
self.config_data["skills"] = str(SkillList(self.config_data["skills"]))
return self
def build(self) -> dict:
"""
Return config data
:return: dict
"""
return self.config_data
+10
View File
@@ -0,0 +1,10 @@
class Skill:
def __init__(self, name: str, url: str):
self.name = name
self.url = url
def __str__(self):
return f"![{self.name}]({self.url})"
def __repr__(self):
return f"![{self.name}]({self.url})"
+13
View File
@@ -0,0 +1,13 @@
from src.model.skill import Skill
class SkillList:
def __init__(self, skills: list):
self.skills = [Skill(skill.get("name"), skill.get("url")) for skill in skills]
def __str__(self) -> str:
return "\n".join([str(skill) for skill in self.skills])
def __repr__(self) -> str:
return "\n".join([repr(skill) for skill in self.skills])
+11
View File
@@ -0,0 +1,11 @@
class Social:
def __init__(self, name: str, url: str, img: str):
self.name = name
self.url = url
self.img = img
def __repr__(self) -> str:
return f"[![{self.name}]({self.img})]({self.url})"
def __str__(self) -> str:
return f"[![{self.name}]({self.img})]({self.url})"
+12
View File
@@ -0,0 +1,12 @@
from src.model.social import Social
class SocialList:
def __init__(self, socials: list):
self.socials = [Social(social.get("name"), social.get("url"), social.get("img")) for social in socials]
def __str__(self) -> str:
return "\n".join([str(social) for social in self.socials])
def __repr__(self) -> str:
return "\n".join([str(social) for social in self.socials])
+4
View File
@@ -0,0 +1,4 @@
def load_template(template_file_path: str):
with open(template_file_path, 'r') as template_file:
template_content = template_file.read()
return template_content
-18
View File
@@ -1,18 +0,0 @@
import type BadgeModel from '../../models/BadgeModel.ts';
import UrlBuilder from './UrlBuilder.ts';
export default class BadgeUrlBuilder extends UrlBuilder {
static BASE_URL = 'https://img.shields.io/static/v1';
static DEFAULT_PARAMETERS: BadgeModel = {style: 'flat', label: " ", logoColor: "white"};
constructor(parameters?: BadgeModel) {
super(BadgeUrlBuilder.BASE_URL,
parameters,
BadgeUrlBuilder.DEFAULT_PARAMETERS,
);
};
public setParameters(parameters: BadgeModel): this {
return super.setParameters(parameters);
}
}
-14
View File
@@ -1,14 +0,0 @@
import UrlBuilder from './UrlBuilder.ts';
import type BannerModel from '../../models/BannerModel.ts';
export default class BannerUrlBuilder extends UrlBuilder {
static BASE_URL = 'https://svg-banners.vercel.app/api';
constructor(parameters: BannerModel) {
super(BannerUrlBuilder.BASE_URL, parameters, {});
}
public setParameters(parameters: BannerModel): this {
return super.setParameters(parameters);
}
}
-25
View File
@@ -1,25 +0,0 @@
export default abstract class UrlBuilder {
private parameters;
protected constructor(
private baseUrl: string,
parameters,
private defaultParameters,
) {
this.parameters = {...defaultParameters, ...parameters};
};
setParameters(parameters) {
this.parameters = {...this.parameters, ...parameters};
return this;
}
build(): URL {
const url = new URL(this.baseUrl);
for (const [key, value] of Object.entries(this.parameters)) {
if (value) url.searchParams.set(key, value);
}
return url;
};
}
+26
View File
@@ -0,0 +1,26 @@
<header align="center">
![Hi I'm Lucàs👋](assets/banner.svg)
</header>
## 🚀 About Me
I'm a passionate developer from 🇫🇷 **{user[location]}**.
## 🔗 Social Links
{socials}
## 🛠 Skills
{skills}
---
<footer align="center">
![SVG Stats](https://github-stats-alpha.vercel.app/api?username=LucasVbr&cc=000&tc=fff&ic=fff&bc=000)
![Profile Views](https://komarev.com/ghpvc/?username=lucasvbr&amp;amp;amp;label=Profile%20views&amp;amp;amp;color=0e75b6&amp;amp;amp;style=flat)
![FreeCodeCamp Points](https://img.shields.io/freecodecamp/points/lucasvbr?label=FreeCodeCamp%20points)
![Made with love](https://img.shields.io/badge/-made%20with%20%E2%9D%A4%EF%B8%8F-red)
</footer>
-26
View File
@@ -1,26 +0,0 @@
{{banner}}
## 🚀 About Me
{{about}}
## 🔗 Links
{% for link in links -%}
{{link}}
{% endfor %}
## 🛠 Skills
{% for skill in skills -%}
{{skill}}
{% endfor %}
---
<div align="center">
![SVG Stats](https://github-stats-alpha.vercel.app/api?username={{userName}}&cc=000&tc=fff&ic=fff&bc=000)
{% for badge in footer -%}
{{badge}}
{% endfor %}
</div>