diff --git a/.gitignore b/.gitignore index 0a44e6d..d0782d5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,11 +5,6 @@ converted **/logs tests/ **/__pycache__ -**/*.ui -**/*.ts -**/*.pyproject -**/*.pyproject.user -**/*.qrc **/*.db .idea .vscode \ No newline at end of file diff --git a/src/PYMD/interface/_interface.py b/src/PYMD/interface/_interface.py index 0a2be42..1084e0f 100644 --- a/src/PYMD/interface/_interface.py +++ b/src/PYMD/interface/_interface.py @@ -127,26 +127,33 @@ def __language(self): """Change UI language""" __result: int = 0 if self.ui.text_preview_mode.isVisible(): - __result = self.__box_dialog(self.tr('Warning'),self.tr('Extracted content will be deleted once you change the language (unless you have already saved it)'),{'ok': self.tr('Accept')}).exec() + # Show a warning dialog before change language + __result = self.__box_dialog(self.tr('Warning'), self.tr('Extracted content will be deleted once you change the language (unless you have already saved it)'),{'ok': self.tr('Accept')}).exec() if not self.ui.text_preview_mode.isVisible() or __result == 1024: #Feature: Save content in a temporal file (The content is removed when language change) lang_manager.show_dialog() #Update UI language self.ui.retranslateUi(self) self.current_lang = lang_manager.lang_code + # When initial info screen is visible if self.__init_help.info.isVisible(): self.__init_help.load_info(self.current_lang) def __box_dialog(self, title:str = '', text:str = '', buttons_cancel_ok:dict | None = None, icon:QIcon | None = None) -> QMessageBox: + """Create a box dialog""" __icon: QIcon = icon if icon is not None else self.__icon_window __dialog: QMessageBox = QMessageBox() + # Standard dialog buttons __dialog.setStandardButtons(__dialog.StandardButton.Ok | __dialog.StandardButton.Cancel) - __buttons_txt:list[str] = ['Ok', 'Cancel'] + # If not give buttons labels + __buttons_txt:list[str] = [self.tr('Ok'), self.tr('Cancel')] __dialog.setWindowIcon(__icon) __dialog.setWindowTitle(title) __dialog.setText(text) + # Has been received a dict with buttons if buttons_cancel_ok is not None and type(buttons_cancel_ok) is dict: if 'ok' in buttons_cancel_ok: __buttons_txt[0] = buttons_cancel_ok['ok'] if 'cancel' in buttons_cancel_ok: __buttons_txt[1] = buttons_cancel_ok['cancel'] + # Set visible text for each button __dialog.button(__dialog.StandardButton.Ok).setText(__buttons_txt[0]) __dialog.button(__dialog.StandardButton.Cancel).setText(__buttons_txt[1]) return __dialog @@ -158,6 +165,7 @@ def __theme(self): pass def __osl(self): + """Load Open Source Licenses (Information - OSL)""" OSL(self, lang_manager) def run(): diff --git a/src/PYMD/interface/dialog_about.ui b/src/PYMD/interface/dialog_about.ui new file mode 100644 index 0000000..9eec789 --- /dev/null +++ b/src/PYMD/interface/dialog_about.ui @@ -0,0 +1,187 @@ + + + Tutos Rive + about_dialog + + + + 0 + 0 + 578 + 640 + + + + + Gabriola + 20 + + + + About + + + + + + true + + + + + + + Gabriola + 12 + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Close + + + true + + + + + + + 0 + + + + + + 0 + 20 + + + + + 150 + 40 + + + + + Gabriola + 10 + false + true + false + false + true + + + + background-color: rgb(59, 59, 59); +color: #84CD4F; +border-radius: 5px; + + + + + + <code>pip install pymd</code> + + + Qt::TextFormat::RichText + + + false + + + Qt::AlignmentFlag::AlignCenter + + + Qt::TextInteractionFlag::TextSelectableByKeyboard|Qt::TextInteractionFlag::TextSelectableByMouse + + + + + + + + + true + + + + + 0 + 0 + 558 + 562 + + + + + + + + 540 + 16777215 + + + + + + + Qt::TextFormat::MarkdownText + + + true + + + true + + + Qt::TextInteractionFlag::LinksAccessibleByMouse|Qt::TextInteractionFlag::TextSelectableByKeyboard|Qt::TextInteractionFlag::TextSelectableByMouse + + + + + + + + + + + + + close_button + accepted() + about_dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + close_button + rejected() + about_dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/PYMD/interface/dialog_language.ui b/src/PYMD/interface/dialog_language.ui new file mode 100644 index 0000000..17d4403 --- /dev/null +++ b/src/PYMD/interface/dialog_language.ui @@ -0,0 +1,213 @@ + + + Lang_Dialog + + + + 0 + 0 + 330 + 320 + + + + + 100 + 100 + + + + + 330 + 320 + + + + + Gabriola + 12 + + + + Select Language + + + + :/img/logo-pymd-2:/img/logo-pymd-2 + + + Qt::LayoutDirection::LeftToRight + + + false + + + + + + + + + + QLayout::SizeConstraint::SetDefaultConstraint + + + + + + 0 + 0 + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Save + + + true + + + + + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 272 + + + + false + + + QDialog > QListWidget{ +background-image: url(:/img/logo-pymd-2.2); +background-position: center; +background-repeat: no-repeat; +background-attachment: fixed;} + + + QAbstractItemView::EditTrigger::DoubleClicked|QAbstractItemView::EditTrigger::EditKeyPressed + + + true + + + Qt::DropAction::CopyAction + + + Qt::TextElideMode::ElideLeft + + + QListView::Movement::Static + + + QListView::Flow::TopToBottom + + + QListView::ViewMode::ListMode + + + false + + + 0 + + + true + + + + English - GB + + + en_GB + + + + Gabriola + 12 + + + + + :/flags/en_GB.svg:/flags/en_GB.svg + + + + + Spanish - CO + + + es_CO + + + + Gabriola + 12 + + + + + :/flags/es_CO.svg:/flags/es_CO.svg + + + + + + + + + + + + dialog_btn + accepted() + Lang_Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + dialog_btn + rejected() + Lang_Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/PYMD/interface/main_window.ui b/src/PYMD/interface/main_window.ui new file mode 100644 index 0000000..53bb82f --- /dev/null +++ b/src/PYMD/interface/main_window.ui @@ -0,0 +1,1580 @@ + + + MainWindow + + + Qt::WindowModality::NonModal + + + true + + + + 0 + 0 + 931 + 634 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 63 + 63 + 63 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + 134 + 134 + 134 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + + + Gabriola + 12 + + + + PYMD - SRM & TRG + + + + :/img/logo-pymd-2:/img/logo-pymd-2 + + + + + + Qt::LayoutDirection::LeftToRight + + + false + + + + + + true + + + QMainWindow::DockOption::AllowTabbedDocks|QMainWindow::DockOption::AnimatedDocks + + + + Qt::LayoutDirection::LeftToRight + + + + + + + 0 + 0 + + + + + 40 + 0 + + + + + 16777215 + 200 + + + + Qt::LayoutDirection::LeftToRight + + + QFrame::Shape::NoFrame + + + QFrame::Shadow::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 20 + 70 + + + + + Gabriola + 12 + + + + Change language + + + + + + + + + Ctrl+A + + + false + + + + + + + + 20 + 70 + + + + + Gabriola + 12 + + + + Open File + + + + + + + + + + + + false + + + + + + + + + + true + + + + 0 + 0 + + + + + + + Qt::LayoutDirection::LeftToRight + + + false + + + QFrame::Shape::NoFrame + + + QFrame::Shadow::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + Gabriola + 14 + false + true + + + + + + + Markdown + + + Qt::TextFormat::PlainText + + + Qt::AlignmentFlag::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + Qt::FocusPolicy::StrongFocus + + + true + + + + + + false + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } +</style></head><body style=" font-family:'Times New Roman'; font-size:12pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Gabriola';"><br /></p></body></html> + + + + + + + + + + + Gabriola + 14 + + + + Preview + + + Qt::TextFormat::PlainText + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + Times New Roman + 12 + + + + Qt::FocusPolicy::NoFocus + + + QTextEdit::AutoFormattingFlag::AutoAll + + + true + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } +</style></head><body style=" font-family:'Times New Roman'; font-size:12pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Gabriola';"><br /></p></body></html> + + + Qt::TextInteractionFlag::LinksAccessibleByMouse|Qt::TextInteractionFlag::TextSelectableByMouse + + + + + + + + + + 0 + 40 + + + + PointingHandCursor + + + Save file to Markdown (.md) + + + false + + + Convert + + + + + + Ctrl+Enter + + + + + + + + + + + + + + + + 16777215 + 20 + + + + Qt::LayoutDirection::LeftToRight + + + QFrame::Shape::NoFrame + + + QFrame::Shadow::Raised + + + 0 + + + + QLayout::SizeConstraint::SetDefaultConstraint + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 20 + + + + + 855 + 60 + + + + + + + <html><head/><body><p>© 2025 Tutos Rive. Licensed under the <a href="https://github.com/tutosrive/pymd/blob/main/LICENSE"><span style=" text-decoration: underline; color:#27bf73;">MIT License</span></a></p><p><br/></p></body></html> + + + Qt::TextFormat::RichText + + + true + + + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignHCenter + + + true + + + + + + + + + + + true + + + + 0 + 0 + 931 + 27 + + + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 43 + 43 + 43 + + + + + + + 36 + 36 + 36 + + + + + + + 14 + 14 + 14 + + + + + + + 19 + 19 + 19 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 0 + 0 + 0 + + + + + + + 14 + 14 + 14 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 43 + 43 + 43 + + + + + + + 36 + 36 + 36 + + + + + + + 14 + 14 + 14 + + + + + + + 19 + 19 + 19 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 0 + 0 + 0 + + + + + + + 14 + 14 + 14 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + + + 14 + 14 + 14 + + + + + + + 33 + 33 + 33 + + + + + + + 43 + 43 + 43 + + + + + + + 36 + 36 + 36 + + + + + + + 14 + 14 + 14 + + + + + + + 19 + 19 + 19 + + + + + + + 14 + 14 + 14 + + + + + + + 255 + 255 + 255 + + + + + + + 14 + 14 + 14 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 0 + 0 + 0 + + + + + + + 29 + 29 + 29 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 14 + 14 + 14 + + + + + + + 20 + 20 + 20 + + + + + + + + + Segoe Print + 9 + + + + Qt::LayoutDirection::LeftToRight + + + false + + + QMenu:hover{color: red} + + + + + Gabriola + 12 + + + + PointingHandCursor + + + true + + + false + + + Menu + + + false + + + + + + + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 34 + 34 + 103 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 33 + 33 + 33 + + + + + + + 33 + 33 + 33 + + + + + + + 255 + 255 + 255 + + + + + + + + Preferences + + + + + + + + Gabriola + 12 + + + + Qt::FocusPolicy::ClickFocus + + + false + + + Help + + + false + + + false + + + + + + + + + + + false + + + Open File + + + + Gabriola + 12 + + + + Ctrl+O + + + QAction::MenuRole::TextHeuristicRole + + + + + Exit + + + + Gabriola + 12 + + + + Ctrl+W + + + QAction::MenuRole::TextHeuristicRole + + + + + + + + About + + + + Gabriola + 12 + + + + Ctrl+M + + + + + Language + + + Ctrl+L + + + + + Theme + + + + Amiri Quran + + + + Ctrl+T + + + + + + assets/img/opl.webpassets/img/opl.webp + + + Open Source Licences + + + + Gabriola + 12 + + + + + + + + + + + 10 + + + 10 + + + true + + + true + + + true + + + diff --git a/src/PYMD/interface/osl.ui b/src/PYMD/interface/osl.ui new file mode 100644 index 0000000..7cef6dd --- /dev/null +++ b/src/PYMD/interface/osl.ui @@ -0,0 +1,255 @@ + + + dialog_osl + + + Qt::WindowModality::WindowModal + + + + 0 + 0 + 480 + 640 + + + + + 480 + 661 + + + + + Gabriola + 12 + + + + false + + + Open Source Licenses - Notice + + + + :/img/logo-pymd-2:/img/logo-pymd-2 + + + + + + false + + + true + + + + + + + 150 + 0 + + + + + Gabriola + 14 + + + + + + + Select a library + + + + Select a library + + + + + Markitdown + + + + + PySide6 + + + + + + + + QFrame::Shape::NoFrame + + + QFrame::Shadow::Raised + + + + + + true + + + + + 0 + 0 + 442 + 515 + + + + + + + + 424 + 16777215 + + + + + Times New Roman + 12 + + + + + + + Qt::TextFormat::MarkdownText + + + true + + + true + + + Qt::TextInteractionFlag::LinksAccessibleByMouse|Qt::TextInteractionFlag::TextSelectableByMouse + + + + + + + + + + + + 0 + 20 + + + + + 444 + 20 + + + + + + + Qt::TextFormat::MarkdownText + + + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft + + + true + + + + + + + + + + + 300 + 16777215 + + + + + Gabriola + 14 + + + + CREDITS + + + Qt::TextFormat::PlainText + + + false + + + Qt::AlignmentFlag::AlignCenter + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Close + + + true + + + + + + + + + + + close_dialog_osl + accepted() + dialog_osl + accept() + + + 248 + 254 + + + 157 + 274 + + + + + close_dialog_osl + rejected() + dialog_osl + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/PYMD/interface/pymd.pyproject b/src/PYMD/interface/pymd.pyproject new file mode 100644 index 0000000..9aab255 --- /dev/null +++ b/src/PYMD/interface/pymd.pyproject @@ -0,0 +1,16 @@ +{ + "files": [ + "_interface.py", + "dialog_language.ui", + "_initialHelp.py", + "main_window.ui", + "pymd.pyproject.user", + "requirements.txt", + "resources.qrc", + "osl.ui", + "_osl.py", + "translations/others/ABOUT_es_CO.trg", + "dialog_about.ui", + "_about.py" + ] +} diff --git a/src/PYMD/interface/pymd.pyproject.user b/src/PYMD/interface/pymd.pyproject.user new file mode 100644 index 0000000..d65349b --- /dev/null +++ b/src/PYMD/interface/pymd.pyproject.user @@ -0,0 +1,255 @@ + + + + + + EnvironmentId + {cfbed4cb-0e85-4f18-a17a-07293519a89d} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + true + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 1 + 80 + true + true + 1 + 0 + false + true + false + 2 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + false + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 2 + true + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Python 3.12.8 + Python 3.12.8 + {3fd8f48e-f33a-4bf4-b30b-cb2d8ff6335a} + 0 + 0 + 0 + + D:\CODE\Qt\projects\pymd\.qtcreator\Python_3_12_8venv + + + true + Python.PysideBuildStep + D:\CODE\Qt\projects\pymd\.qtcreator\Python_3_12_8venv\Scripts\pyside6-project.exe + D:\CODE\Qt\projects\pymd\.qtcreator\Python_3_12_8venv\Scripts\pyside6-uic.exe + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + 0 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Python 3.12.8 Virtual Environment + Python.PySideBuildConfiguration + D:/CODE/Qt/projects/pymd/.qtcreator/Python_3_12_8venv/Scripts/python.exe + D:/CODE/Qt/projects/pymd/.qtcreator/Python_3_12_8venv + + 1 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + _interface.py + PythonEditor.RunConfiguration. + D:/CODE/Qt/projects/pymd/_interface.py + true + D:\CODE\Qt\projects\pymd\_interface.py + 0 + false + true + false + D:/CODE/Qt/projects/pymd + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + _initialHelp.py + PythonEditor.RunConfiguration. + D:/CODE/Qt/projects/pymd/_initialHelp.py + true + D:\CODE\Qt\projects\pymd\_initialHelp.py + true + true + D:/CODE/Qt/projects/pymd + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + OSL.py + PythonEditor.RunConfiguration. + D:/CODE/Qt/projects/pymd/OSL.py + true + true + true + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + _osl.py + PythonEditor.RunConfiguration. + D:/CODE/Qt/projects/pymd/_osl.py + true + D:\CODE\Qt\projects\pymd\_osl.py + true + true + D:/CODE/Qt/projects/pymd + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + _about.py + PythonEditor.RunConfiguration. + D:/CODE/Qt/projects/pymd/_about.py + true + D:\CODE\Qt\projects\pymd\_about.py + true + true + D:/CODE/Qt/projects/pymd + + 5 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/src/PYMD/interface/resources.qrc b/src/PYMD/interface/resources.qrc new file mode 100644 index 0000000..9847a44 --- /dev/null +++ b/src/PYMD/interface/resources.qrc @@ -0,0 +1,20 @@ + + + ./assets/img/me.webp + ./assets/img/logo-pymd/logo-pymd-1.png + ./assets/img/logo-pymd/logo-pymd-2.png + ./assets/img/logo-pymd/logo-pymd-3.png + ./assets/img/logo-pymd/logo-pymd-4.png + ./assets/img/logo-pymd/logo-pymd-5.png + ./assets/img/logo-pymd/logo-pymd-2.1.png + ./assets/img/logo-pymd/logo-pymd-2.2.png + + + ./assets/img/language/en_GB.svg + ./assets/img/language/es_CO.svg + + + ./assets/img/osl_icon.webp + ./assets/img/gh-logo.png + +