From ae339a49d4ae562a8cd9160b1ecde0cc3dae2722 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 3 Apr 2022 08:52:09 +0200 Subject: [PATCH 001/131] Making __ completion smarter. --- app/src/qt/note_smart_editor.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/qt/note_smart_editor.cpp b/app/src/qt/note_smart_editor.cpp index f429e50b..e646a2cd 100644 --- a/app/src/qt/note_smart_editor.cpp +++ b/app/src/qt/note_smart_editor.cpp @@ -401,10 +401,18 @@ bool NoteSmartEditor::completePairChars(QKeyEvent* event) { textEdit.moveCursor(QTextCursor::PreviousCharacter); return true; */ - case Qt::Key_Underscore: - textEdit.textCursor().insertText("__"); - textEdit.moveCursor(QTextCursor::PreviousCharacter); - return true; + case Qt::Key_Underscore: { + // complete __ only if cursor is preceded by SPACE + QString lastChar = getLastChar(); + if(isAtTheBeginningOfLine() + || (lastChar.size() && lastChar[0] == ' ') + ) { + textEdit.textCursor().insertText("__"); + textEdit.moveCursor(QTextCursor::PreviousCharacter); + return true; + } + return false; + } case Qt::Key_AsciiTilde: textEdit.textCursor().insertText("~~"); textEdit.moveCursor(QTextCursor::PreviousCharacter); From f4ae4e23d5c8e965d9001d7d5c3a8b96dbd2209f Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Thu, 14 Apr 2022 19:33:23 +0200 Subject: [PATCH 002/131] Just code cleanup and polishing. --- app/app.pro | 2 -- app/src/qt/mindforger.cpp | 3 ++- app/src/qt/note_edit_model.cpp | 27 -------------------- app/src/qt/note_edit_model.h | 37 ---------------------------- app/src/qt/orloj_presenter.cpp | 13 +++++----- app/test/qt/mindforger-gui-tests.pro | 2 -- 6 files changed, 9 insertions(+), 75 deletions(-) delete mode 100644 app/src/qt/note_edit_model.cpp delete mode 100644 app/src/qt/note_edit_model.h diff --git a/app/app.pro b/app/app.pro index 7a7c979e..705b3ba4 100644 --- a/app/app.pro +++ b/app/app.pro @@ -231,7 +231,6 @@ HEADERS += \ ./src/qt/note_view_model.h \ ./src/qt/note_view_presenter.h \ ./src/qt/note_view.h \ - ./src/qt/note_edit_model.h \ ./src/qt/note_edit_presenter.h \ ./src/qt/look_n_feel.h \ ./src/qt/html_delegate.h \ @@ -356,7 +355,6 @@ SOURCES += \ ./src/qt/note_view_model.cpp \ ./src/qt/note_view_presenter.cpp \ ./src/qt/note_view.cpp \ - ./src/qt/note_edit_model.cpp \ ./src/qt/note_edit_presenter.cpp \ ./src/qt/look_n_feel.cpp \ ./src/qt/html_delegate.cpp \ diff --git a/app/src/qt/mindforger.cpp b/app/src/qt/mindforger.cpp index 799f4a2a..e42ad6fb 100644 --- a/app/src/qt/mindforger.cpp +++ b/app/src/qt/mindforger.cpp @@ -78,7 +78,8 @@ using namespace m8r::filesystem; * -h * ``` * - * Terminal CLI commands proposal: + * Terminal CLI commands proposal + * (Docker inspiration > switch entity and action): * * ``` * $ mindforger --command LIST outlines diff --git a/app/src/qt/note_edit_model.cpp b/app/src/qt/note_edit_model.cpp deleted file mode 100644 index 5a11e626..00000000 --- a/app/src/qt/note_edit_model.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - note_edit_model.cpp MindForger thinking notebook - - Copyright (C) 2016-2022 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "note_edit_model.h" - -namespace m8r { - -NoteEditModel::NoteEditModel() -{ -} - -} diff --git a/app/src/qt/note_edit_model.h b/app/src/qt/note_edit_model.h deleted file mode 100644 index f4ddc18e..00000000 --- a/app/src/qt/note_edit_model.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - note_edit_model.h MindForger thinking notebook - - Copyright (C) 2016-2022 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8RUI_NOTE_EDIT_MODEL_H -#define M8RUI_NOTE_EDIT_MODEL_H - -#include - -#include "model_meta_definitions.h" - -namespace m8r { - -class NoteEditModel : public QObject -{ - Q_OBJECT - -public: - NoteEditModel(); -}; - -} -#endif // M8RUI_NOTE_EDIT_MODEL_H diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp index 90a64974..82924549 100644 --- a/app/src/qt/orloj_presenter.cpp +++ b/app/src/qt/orloj_presenter.cpp @@ -24,12 +24,13 @@ using namespace std; namespace m8r { -OrlojPresenter::OrlojPresenter(MainWindowPresenter* mainPresenter, - OrlojView* view, - Mind* mind) - : activeFacet{OrlojPresenterFacets::FACET_NONE}, - config{Configuration::getInstance()}, - skipEditNoteCheck{false} +OrlojPresenter::OrlojPresenter( + MainWindowPresenter* mainPresenter, + OrlojView* view, + Mind* mind +) : activeFacet{OrlojPresenterFacets::FACET_NONE}, + config{Configuration::getInstance()}, + skipEditNoteCheck{false} { this->mainPresenter = mainPresenter; this->view = view; diff --git a/app/test/qt/mindforger-gui-tests.pro b/app/test/qt/mindforger-gui-tests.pro index 92bcd2db..6fbca13b 100644 --- a/app/test/qt/mindforger-gui-tests.pro +++ b/app/test/qt/mindforger-gui-tests.pro @@ -91,7 +91,6 @@ HEADERS += \ ../../src/qt/note_view_model.h \ ../../src/qt/note_view_presenter.h \ ../../src/qt/note_view.h \ - ../../src/qt/note_edit_model.h \ ../../src/qt/note_edit_presenter.h \ ../../src/qt/look_n_feel.h \ ../../src/qt/html_delegate.h \ @@ -189,7 +188,6 @@ SOURCES += \ ../../src/qt/note_view_model.cpp \ ../../src/qt/note_view_presenter.cpp \ ../../src/qt/note_view.cpp \ - ../../src/qt/note_edit_model.cpp \ ../../src/qt/note_edit_presenter.cpp \ ../../src/qt/look_n_feel.cpp \ ../../src/qt/html_delegate.cpp \ From 1bda5a7b6d90ae58798e372fd62bcc993cf37072 Mon Sep 17 00:00:00 2001 From: COMPUTER102 <55975631+COMPUTER102@users.noreply.github.com> Date: Sat, 6 Aug 2022 11:41:46 +0800 Subject: [PATCH 003/131] Unfinished Chinese Simplified translation. --- .../qt/translations/mindforger_zh_cn.ts | 4488 +++++++++++++++++ 1 file changed, 4488 insertions(+) create mode 100644 app/resources/qt/translations/mindforger_zh_cn.ts diff --git a/app/resources/qt/translations/mindforger_zh_cn.ts b/app/resources/qt/translations/mindforger_zh_cn.ts new file mode 100644 index 00000000..b64e22fb --- /dev/null +++ b/app/resources/qt/translations/mindforger_zh_cn.ts @@ -0,0 +1,4488 @@ + + + + + QObject + + + 保存笔记 + + + + + 是否要保存更改? + + + + + 放弃更改 + + + + + &放弃更改 + + + + + + 自动保存 + + + + + 不再询问 & 自动保存 + + + + + 继续编辑 + + + + + 继续 &编辑 + + + + + 保存 + + + + + &保存 + + + + + SpellChecker + + + 检查拼写 + + + + + &添加 + + + + + &忽略 + + + + + &全部忽略 + + + + + &更正 + + + + + &全部更正 + + + + + 不在词典中: + + + + + 更改为: + + + + + 正在检查拼写... + + + + + 取消 + + + + + 请稍等 + + + + + 是否继续在文件开头检查? + + + + + 拼写检查完成。 + + + + + m8r + + + 笔记本标签: + + + + + 笔记本: + + + + + &打开笔记本 + + + + + &查找笔记 + + + + + + + + &取消 + + + + + 按标签查找笔记本 + + + + + + 一般 + + + + + + 高级 + + + + + 编辑笔记 + + + + + 名称 + + + + + 组织者 + + + + + 查看为 + + + + + 艾森豪威尔矩阵 + + + + + 看板 + + + + + 笔记本范围 + + + + + 笔记本 + + + + + 清除 + + + + + &新建 + + + + + 笔记本排序依据 + + + + + 重要性 + + + + + 紧迫性 + + + + + 筛选依据 + + + + + 笔记本 + + + + + 笔记 + + + + + 笔记本和笔记 + + + + + 查找笔记本范围 + + + + + 新组织者 + + + + + 首部 + + + + + 编辑笔记本 + + + + + 指定要生成的行数和列数 + + + + + 行数 + + + + + 列数 + + + + + &生成 + + + + + 格式生成器 + + + + + 显示最近修改或查看的笔记本和笔记 + + + + + 年 + + + + + 月 + + + + + 日 + + + + + 小时 + + + + + 分钟 + + + + + 显示具有以下标记的笔记本 + + + + + &设置 + + + + + 范围思维 + + + + + 新笔记本 + + + + + 以Markdowns或MindForger存储库打开目录 + + + + + 打开Markdown文件 + + + + + 显示仪表板 + + + + + 显示艾森豪威尔矩阵 + + + + + 显示更多艾森豪威尔矩阵 + + + + + 显示笔记本列表 + + + + + 查看知识图谱导航器 + + + + + 显示标签列表 + + + + + 显示最近笔记 + + + + + 向词典添加单词 + + + + + 正在检查拼写... + + + + + + 按 ⌘↩ 添加标签 + + + + + + 按 Ctrl+Enter 添加标签 + + + + + 添加筛选器标签 + + + + + 新建标签 + + + + + 删除标签 + + + + + m8r::AddLibraryDialog + + + Choose and find library source: + + + + + Directory + + + + + Library name: + + + + + Library source path: + + + + + index PDF + + + + + &Create Library and Index Documents + + + + + &Cancel + + + + + Add Document Library + + + + + Choose Directory + + + + + m8r::AssocLeaderboardModel + + + + Associations + + + + + + % + + + + + for ' + + + + + ' + + + + + m8r::AssocLeaderboardPresenter + + + Associations + + + + + m8r::CliAndBreadcrumbsPresenter + + + Notebook + + + + + Notebook not found: + + + + + No command! + + + + + m8r::ConfigurationDialog + + + Application + + + + + Viewer + + + + + Editor + + + + + Markdown + + + + + Navigator + + + + + Mind + + + + + Adapt + Preferences + Preferences + + + + m8r::ConfigurationDialog::AppTab + + + UI theme (<font color='#ff0000'>requires restart</font>) + + + + + Show the following view on application start + + + + + show toolbar + + + + + I don't need buttons - I know all keyboard shortcuts! + + + + + nerd menu (requires restart) + + + + + Startup + + + + + Appearance + + + + + m8r::ConfigurationDialog::EditorTab + + + Editor key binding + + + + + Editor font + + + + + live spell check + + + + + Spell check dictionaries <a href='https://github.com/dvorka/mindforger-repository/blob/master/memory/mindforger/installation.md#spell-check-'>configuration documentation</a> + + + + + TABs as SPACEs + + + + + autosave Note on editor close + + + + + TAB width + + + + + External editor command + + + + + Editor + + + + + m8r::ConfigurationDialog::MarkdownTab + + + syntax highlighting + + + + + autocomplete text + + + + + autocomplete lists, blocks and {([`_ characters + + + + + SPACE-based # in section escaping (HTML otherwise) + + + + + Rendering + + + + + Autocompletion + + + + + Escaping + + + + + m8r::ConfigurationDialog::MindTab + + + save reads metadata + + + + + Async refresh interval (1 - 10.000ms) + + + + + Persistence + + + + + Notifications + + + + + m8r::ConfigurationDialog::NavigatorTab + + + Max graph nodes (150 by default) + + + + + Knowledge Graph Navigator + + + + + m8r::ConfigurationDialog::ViewerTab + + + HTML Viewer + + + + + Viewer theme CSS + + + + + HTML zoom (100 is 100%, Ctrl + mouse wheel) + + + + + source code syntax highlighting support + + + + + math support + + + + + whole notebook preview + + + + + double click HTML preview to edit + + + + + Diagram support + + + + + Find Custom CSS File + + + + + HTML Viewer CSS + + + + + Choose CSS File + + + + + m8r::DashboardPresenter + + + Do first + + + + + m8r::EditButtonsPanel + + + Preview + + + + + Properties + + + + + Remember + Save + + + + Remember and Leave + Save && Leave + + + + Cancel + + + + + m8r::EditNameAndButtonsPanel + + Remember + Save + + + + m8r::EditNamePanel + + + Name: + + + + + m8r::EditTagsPanel + + + Tags + + + + + + + Add Filter Tag + + + + + + Create New Tag + + + + + Add Existing Tag + + + + + Unknown Tag + + + + + m8r::ExportCsvFileDialog + + + Create New Markdown File + + + + + File name: + + + + + Target directory: + + + + + File to be created: + + + + + Find Directory + + + + + export OHE (one hot encoded) tags + + + + + Minimum tag cardinality to be OHE exported: + + + + + Export + + + + + &Cancel + + + + + + name + + + + + Choose Directory + + + + + m8r::FindNoteByNameDialog + + + Note &name: + + + + + &Open Note + + + + + Find Note by Name + + + + + m8r::FindNoteByTagDialog + + + Notes: + + + + + Note tags: + + + + + Find Notebook + + + + + &Open Note + + + + + Find Note by Tags + + + + + m8r::FindOutlineByNameDialog + + + &Notebook name: + + + + + &ignore case + + + + + &keywords match + + + + + &current Notebook's Notes only + + + + + &Open Notebook + + + + + &Cancel + + + + + Find Notebook by Name + + + + + m8r::FtsDialog + + + Text to &find: + + + + + + Match: + + + + + &Exact + + + + + + &Ignore case + + + + + &Whole words + + + + + &Reverse + + + + + &Regular expression + + + + + &Open + + + + + &Search + + + + + &Cancel + + + + + Full-text Search + + + + + m8r::FtsDialogPresenter + + + Full-text Search Result + + + + + No matching Notebook or Note found. + + + + + No Notebook selected! + + + + + m8r::InsertImageDialog + + + Alternate text: + + + + + Image file path or web address (URL): + + + + + File + + + + + copy image to repository + + + + + &Insert + + + + + &Cancel + + + + + Insert Image + + + + + Image + + + + + Choose File with Image + + + + + m8r::InsertLinkDialog + + + Link text: + + + + + Notebook, Note, file path or web address: + + + + + Notebook + + + + + Note + + + + + File + + + + + Directory + + + + + copy link target to repository + + + + + &Insert + + + + + &Cancel + + + + + Find Notebook as Link Target + + + + + Find Note as Link Target + + + + + Insert Link + + + + + link + + + + + Choose File + + + + + Choose Directory + + + + + m8r::KanbanColumnPresenter + + + Selected Notebook/Note not found! + + + + + No Notebook selected! + + + + + m8r::MainMenuView + + + &Mind + Fi&le + + + + Mind Hack + + + + + Mind hacking and debugging hook + + + + + MindForger &Repository + + + + + Create a brand new MindForger repository... + + + + + + Markdown &File + + + + + Create a brand new Markdown file... + + + + + &Directory with Markdowns or MindForger Repository + + + + + Learn knowledge by loading a MindForger repository or a directory with Markdown files... + Open MindForger repository or a directory with Markdown files... + + + + Learn knowledge by loading a Markdown or MindForger file... + Open a Markdown or MindForger file... + + + + &Remind + &Recent + + + + Re-learn recently opened MindForger repositories, Markdown repositories or files + Reopen recently opened MindForger repositories, Markdown repositories or files + + + + Re&member + &Save + + + + Persist all Things in Memory + + + + + &Think + + + + + S&cope + + + + + Don't show Notebooks and Notes older than... + + + + + + &Forget + &Deprecate + + + + Limbo vs erase memory... + + + + + Retain + Reta&in + + + + Create backup archive of the current repository and store it in home directory + + + + &Adapt + &Preferences + + + + Adapt Mind by setting your preferences... + + + + + E&xit + + + + + Leave application + + + + + &Full-text Search + + + + + Note full-text search + + + + + Recall Note&book by Name + Find Note&book by Name + + + + Find Notebook by name + + + + + Recall &Note by Name + Find &Note by Name + + + + Find Note by name + + + + Recall Notebook by T&ags + Find Notebook by T&ags + + + + Find Notebook by tags + + + + + Recall Note by &Tags + Find Note by &Tags + + + + Find Note by tags + + + + + Recall Library &Doc by Name + + + + + Find Document by name + + + + + Recall &Persons + Find &Persons + + + + Find persons using Named-entity recognition (NER) + + + + + Recall &Locations + Find &Locations + + + + Find locations using Named-entity recognition (NER) + + + + + Recall Organizations + Find Organizations + + + + Find organizations using Named-entity recognition (NER) + + + + + Recall Other Entities + Find Other Entities + + + + Find miscellaneous entities using Named-entity recognition (NER) + + + + + &Recall + F&ind + + + + Dashboard + + + + + Open Home Notebook... + + + + + N&otebooks + + + + + Show list of Notebooks... + + + + + &Tags + + + + + Open Tag cloud... + + + + + Knowledge Graph &Navigator + + + + + Open knowledge graph Navigator... + + + + + &Memory Dwell + + + + + Open memory dwell... + + + + + &CLI + + + + + Ter&minal + + + + + &Recent Notes + + + + + View recently modified Notes... + + + + + &Stencils + + + + + List Notebook and Note stencils... + + + + + List forgotten Notebooks and Notes... + + + + + Ho&isting + + + + + D&istraction Free + + + + + Toggle distraction free mode + + + + + &Fullscreen + + + + + Toggle fullscreen + + + + + &View + + + + + Str&etch edges e | mouse wheel + + + + + Stretch knowledge graph edges + + + + + &Sh&rink edge E | mouse wheel + + + + + Shring knowledge graph edges + + + + + Zoom &in z + + + + + Zoom in knowledge graph + + + + + Zoom &out Z + + + + + Zoom out knowledge graph + + + + + &Shuffle Space + + + + + Shuffle knowledge graph + + + + + &Edit ⌘↩ + + + + + &Edit Alt-Enter + + + + + Move Notebook/Note to Previous Column/Quadrant ⌘[ + + + + + Move Notebook/Note to Next Column/Quadrant ⌘] + + + + + Focus to Previous Column/Quadrant ⇧⇥ + + + + + Focus to Next Column/Quadrant ⇥ + + + + + &HTML + + + + + Export Notebook to a file in HTML format + + + + + &TWiki + + + + + Import Notebook from an external TWiki file and restart MindForger + + + + + Refactor Ctrl+R + + + + + Search Note text + + + + + Find Next Ctrl+F + + + + + Search Note text again + + + + + &Undo Ctrl+Z + + + + + Undo + + + + + &Redo Ctrl+Shift+Z + + + + + Redo + + + + + Cu&t Ctrl+X + + + + + Cut + + + + + &Copy Ctrl+C + + + + + Copy + + + + + &Paste Ctrl+V + + + + + Paste + + + + + + + + &Edit + + + + + Run simple command line from current MindForger repository... + + + + + Flashcard &Decks + + + + + Show list of flashcard decks... + + + + + Organiz&ers + + + + + Open Eisenhower matrix and Kanban organizers... + + + + + &Library Documents + + + + + List Library documents... + + + + + Li&mbo + + + + + &Know + + + + + &Wikipedia + + + + + Find marked text on Wikipedia or open Wikipedia search + + + + + &arXiv + + + + + Find marked text on arXiv or get article by ID + + + + + Str&etch edges + + + + + &Sh&rink edge + + + + + Na&vigate + + + + + Libr&ary + + + + + &Add library + + + + + Add directory with documents, URL or other resource to library... + + + + + &Deprecate library + + + + + Move a library resource with documents to limbo... + + + + + Flash&cards + + + + + &Organizer + + + + + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style + + + + + Edit current Organizer - you can also double click view to open the editor + + + + + Make copy of the current Organizer + + + + + &Delete + + + + + Delete Organizer without undo + + + + + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left + + + + + Move Notebook/Note to previous column or quadrant... + + + + + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right + + + + + Move Notebook/Note to next column or quadrant... + + + + + Move focus to previous column or quandrant... + + + + + Move focus to next column or quandrant... + + + + + Note&book + + + + + E&xamine + + + + + Turn Notebook to deck of flashcard and start active recall testing... + + + + + E&xternal Editor Edit Ctrl+X + + + + + Edit current Note in an external editor - use Preferences to configure the editor + + + + + &Forget Ctrl+D + + + + + Save and Leave Ctrl+L + + + + + &Find Ctrl+Shift+F + + + + + &Live Preview + + + + + Toggle live HTML preview + + + + + &Word Wrap + + + + + &Swap Name/Description Focus + + + + + Swap focus of N title and description editors + + + + + Sp&ell Check + + + + + Spell check Notebook or Note description + + + + + &Bold + + + + + Format text as bold + + + + + &Italic + + + + + Format text as italic + + + + + &Code + + + + + Format text as inlined source code + + + + + &Math + + + + + Format text as math (MathJax) + + + + + Comment + + + + + Add comment to hide text in rendered HTML + + + + + Lis&ts + + + + + &Bulleted List + + + + + &Numbered List + + + + + &Task List + + + + + Task List &Item + + + + + Bl&ocks + + + + + &Code Block + + + + + &Math Block + + + + + &Diagram Block + + + + + Format code block as diagram (Mermaid) + + + + + Diagrams + + + + + &Flowchart + + + + + Insert flowchart Mermaid diagram skeleton + + + + + &Sequence Diagram + + + + + Insert sequence Mermaid diagram skeleton + + + + + &Class Diagram + + + + + Insert class Mermaid diagram skeleton + + + + + St&ate Diagram + + + + + Insert state Mermaid diagram skeleton + + + + + &Gantt Diagram + + + + + Insert Gantt Mermaid diagram skeleton + + + + + &Pie Diagram + + + + + Insert pie Mermaid chart skeleton + + + + + &Strikethrough + + + + + Format text as strikethrough + + + + + &Keyboard + + + + + Format text as keyboard input + + + + + Math cheatsheet + + + + + Open MathJax quick reference + + + + + Math live preview + + + + + Open MathJax live demo + + + + + Mermaid dia&grams documentation + + + + + Open Mermaid diagrams documentation + + + + + Format block as bulleted list + + + + + Format block as numbered list + + + + + + Format block as task list + + + + + T&able of Contents + + + + + Insert Notebook's table of contents + + + + + Insert current date and time + + + + + Format text block as source code + + + + + Format text block as math (MathJax) + + + + + Block &Quote + + + + + Format text block as blockquote + + + + + &Link + + + + + Insert link to a document, image or file + + + + + Insert image + + + + + Tabl&es + + + + + &Horizontal ruler + + + + + Horizontal ruler + + + + + &Format + + + + + + + + &New + + + + + Create new Notebook to form new ideas, principles, combinations or applications + + + + + Edit current Notebook - you can also double click view to open the editor + + + + + Make &Home + + + + + Import + + + + + + Make &Stencil + + + + + + Copy the current Notebook as to Stencil + + + + + + C&lone + + + + + Make copy of the current Notebook + + + + + Forget Notebook and move it to Limbo + Delete Notebook and move it Limbo + + + + E&xport + + + + + &Forget Del + Delete Del + + + + Forget Note + Delete Note + + + + &Learn + &Open + + + + Toggle tag indicating whether to use the current Notebook as home + + + + + &Import + + + + + Think to suggest matching, similar and associated Notes while searching, reading and writing + + + + + &Autolink + + + + + Automatically inject links to relevant Notebooks and Notes when browsing HTML preview + + + + + A&dapt + &Preferences + + + + &CSV + + + + + Export all Notebooks/Markdown files as a single CSV file + + + + + Recall Notebook by Ta&gs + Find Notebook by Ta&gs + + + + Open Dashboard... + + + + + &Home Notebook + + + + + Activate command line interface... + + + + + Create new Note to form new ideas, principles, combinations and applications + + + + + Hoist/de-hoist Note to focus on Note being viewed or edited + + + + + &Edit Ctrl+E + + + + + Edit current Note - you can also double click view to open the editor + + + + + Remember Ctrl+S + Save Ctrl+S + + + + Save Note being edited + + + + + Leave Alt+Left + + + + + Save leave editor of Note being changed + + + + + &Promote Ctrl+Left + + + + + Promote Note + + + + + &Demote Ctrl+Right + + + + + Demote Note + + + + + F&irst Ctrl+Shift+Up + + + + + Move Note to be the first child of its parent + + + + + &Up Ctrl+Up + + + + + Move Note up + + + + + Do&wn Ctrl+Down + + + + + Move Note down + + + + + &Last Ctrl+Shift+Down + + + + + Move Note to be the last child of its parent + + + + + &Refactor + + + + + Refactor Note to another Notebook... + + + + + E&xtract + + + + + Create new Note from the text selected in the current Note... + + + + + &Clone + + + + + Make a copy of the Note to this or other Notebook... + + + + + Export Note to an external file in a supported format + + + + + Import Note from an external file in a supported format + + + + + &Note + + + + + Toggle word wrap mode + + + + + Complete Link Ctrl+/ + + + + + Complete word being written by finding link to Notebook or Note + + + + + MathJa&x + + + + + &text + + + + + &fraction + + + + + &sum + + + + + s&quare root + + + + + &integral + + + + + integrals + + + + + &alpha + + + + + &beta + + + + + &Gama + + + + + &Delta + + + + + &bar + + + + + &hat + + + + + &dot + + + + + &overrightarrow + + + + + &cup + + + + + &cap + + + + + &empty set + + + + + &in + + + + + &not in + + + + + Timestam&p + + + + + Ima&ge + + + + + Insert table... + + + + + &Documentation + + + + + F1 + + + + + Open MindForger documentation + + + + + &Web + + + + + Open MindForger web + + + + + &Markdown tutorial + + + + + Open Markdown tutorial + + + + + Report &Bug or Request Feature + + + + + Report bug or suggest an enhancement + + + + + &Check for Updates + + + + + Check for MindForger updates + + + + + &About Qt + + + + + About Qt... + + + + + &About MindForger + + + + + About MindForger... + + + + + &Help + + + + + m8r::MainToolbarView + + + Main Toolbar + + + + + m8r::MainWindowPresenter + + + + Cannot think - either Mind already dreaming or repository too big + + + + + Hyperlink %1 clicked... + + + + + Link target not found for relative link %1 + + + + + + New Repository Error + + + + + Specified repository path already exists! + + + + + Failed to create empty repository! + + + + + ERROR: repository created, but attempt to copy documentation and/or stencils failed + + + + + New Markdown File Error + + + + + + + Specified file path already exists! + + + + + Cannot start sleeping - please wait until dreaming finishes and then try again + + + + + Learn Directory or MindForger Repository + Open Directory or MindForger Repository + + + + Learn Markdown File + Open Markdown File + + + + Learn + Open + + + + This is neither valid MindForger/Markdown repository nor file. + + + + + Export Notebook to HTML + + + + + + Export + + + + + Autolinked Notebooks and Notes + + + + + Notebook Full-text Search + + + + + Note Full-text Search + + + + + Full-text Search + + + + + + + + Notebook + + + + + + Notebook not found + + + + + Find Note by Tags in Notebook + + + + + + Find Note by Tags + + + + + + + Note + + + + + Export Memory to CSV + + + + + Thing not found + + + + + + Note not found + + + + + Refactored Note to Notebook ' + + + + + Target Notebook not found + + + + + Refactor Note + + + + + Note to be refactored not specified! + + + + + Find Note by Name in Notebook + + + + + Find Note by Name + + + + + + + + Initializing NER and predicting... + + + + + + + + NER + + + + + + + + Memory NER not implemented yet. + + + + + Recognizing named entities... + + + + + Initializing NER and recognizing named entities... + + + + + Initializing (the first run only) NER and predicting... + + + + + + Named-entity Recognition + + + + + NER predicition finished + + + + + No named entities recognized. + + + + + Home Notebook is not defined! + + + + + image + + + + + File copied to repository path '%1' + + + + + Given path '%1' doesn't exist - target will not be copied, but link will be created + + + + + Saving pasted image data to file: '%1' + + + + + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu + + + + + Edit Notebook + + + + + Please open an Notebook to edit. + + + + + + New Note + + + + + Failed to create new Note! + + + + + + Clone Notebook + + + + + Failed to clone Notebook! + + + + + Please open and Notebook to be cloned. + + + + + Home tag toggled/removed - Notebook '%1' is no longer home + + + + + Notebook '%1' successfully marked as home + + + + + Make Notebook home + + + + + Notebook can be marked as home only when viewed. + + + + + + Forget Notebook + Deprecate Notebook + + + + Do you really want to forget ' + + + + + ' Notebook? + + + + + 🔒 Notebook Write Error + + + + + Notebook file is read-only and cannot be written: +'%1' + + + + + Do you really want to deprecate ' + + + + + Notebook can be forgotten only when viewed. + + + + + + + Export Error + + + + + Unable to find Notebook to export! + + + + + Import TWiki File + + + + + Open and view a Notebook to create new Note. + + + + + Edit Note + + + + + + Please select a Note to edit in the Notebook. + + + + + + Edit Note with External Editor Error + + + + + External editor command is not configured in preferences (Editor tab). + + + + + + Edit Note with External Editor + + + + + Running command: '%1' + + + + + Running command: '%1'. Close external editor to return control back to MindForger. + + + + + Delete Note + + + + + Do you really want to delete note ' + + + + + ' along with its child notes? + + + + + Forget Note + Delete Note + + + + Please select a Note to forget. + Please select a Note to delete. + + + + + + Extract Note + + + + + Please select a text to extract. + + + + + Failed to extract new Note! + + + + + Please select a Note, edit it and select a text to extract. + + + + + + + Clone Note + + + + + Do you want to clone Note ' + + + + + ' including its child notes?'? + + + + + Failed to clone Note! + + + + + Please select a Note to be cloned. + + + + + Moved Note '%1' to be the first child + + + + + + + + Move Note + + + + + + + + Please select a Note to be moved. + + + + + Moved up Note '%1' + + + + + Moved down Note '%1' + + + + + Moved Note '%1' to be the last child + + + + + Promoted Note '%1' + + + + + Promote Note + + + + + Please select a Note to be promoted. + + + + + Demoted Note '%1' + + + + + Demote Note + + + + + Please select a Note to be demoted. + + + + + + + Add Library Error + + + + + Library directory doesn't exist! + + + + + Library already indexed - use update action to reindex documents. + + + + + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode. + + + + + Organizer Update Error + + + + + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. + + + + + Organizer Clone Error + + + + + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. + + + + + Forget Organizer + + + + + ' Organizer? + + + + + Delete Organizer + + + + + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. + + + + + About MindForger + + + + + m8r::MainWindowView + + + Thinking Notebook + + + + + m8r::NerChooseTagTypesDialog + + + Choose entity types to be extracted: + + + + + persons + + + + + locations + + + + + organizations + + + + + other entities + + + + + &Choose + + + + + &Cancel + + + + + Choose Entity Type + + + + + m8r::NerLeaderboardModel + + + Name + + + + + Type + + + + + Score + + + + + person + + + + + location + + + + + organization + + + + + misc + + + + + m8r::NerResultDialog + + + Recognized named entities: + + + + + &Find Entity in Notes + + + + + &Cancel + + + + + Find Named Entities + + + + + m8r::NewFileDialog + + + Target directory: + + + + + File to be created: + + + + + Find Directory + + + + + &Cancel + + + + + Create New Markdown File + + + + + File name: + + + + + New + + + + + + name + + + + + Choose Directory + + + + + m8r::NewRepositoryDialog + + + Repository name: + + + + + Repository directory: + + + + + Repository to be created in: + + + + + Find Directory + + + + + include stencils + + + + + include documentation + + + + + &New + + + + + &Cancel + + + + + Create New Repository + + + + + + mindforger-repository + + + + + Choose Directory + + + + + m8r::NoteEditDialog::AdvancedTab + + + Metadata + + + + + Created + + + + + Last Modified + + + + + Last Read + + + + + Reads + + + + + Writes + + + + + File + + + + + Location + + + + + m8r::NoteEditDialog::GeneralTab + + + Basic + + + + + Type + + + + + Progress + + + + + Deadline + + + + + Deadline format: mm/dd/yy + + + + + Parent-child Relationship + + + + + Composition + + + + + Aggregation + + + + + Is-a + + + + + m8r::NoteEditPresenter + + + Note '%1' successfully saved + + + + + Attempt to save data from UI to Note, but no Note is set. + + + + + m8r::NoteEditorView + + + Exit Editor + + + + + Do you really want to exit editor without saving? + + + + + Full-text Search Result + + + + + No matching text found. + + + + + No spelling suggestions found + + + + + m8r::NoteNewDialog + + + General + + + + + Advanced + + + + + New Note + + + + + m8r::NoteNewDialog::AdvancedTab + + + File + + + + + Location + + + + + m8r::NoteNewDialog::GeneralTab + + + Basic + + + + + Name + + + + + + Note + + + + + Edit or view after creation + + + + + Type + + + + + Progress + + + + + Stencil + + + + + Position + + + + + m8r::NotesTableModel + + + Note + + + + + Notebook + + + + + m8r::OrganizerNewDialog + + + Organizer + + + + + New Organizer + + + + + Create + + + + + Update + + + + + Edit Organizer + + + + + New Organizer Error + + + + + Organizer must have non-empty name. + + + + + m8r::OrganizerQuadrantPresenter + + + Selected Notebook/Note not found! + + + + + No Notebook selected! + + + + + m8r::OrganizersTableModel + + + Organizers + + + + + m8r::OrlojPresenter + + + Eisenhower Matrix: + + + + + Kanban: + + + + + Organizer: ' + + + + + Selected Organizer not found! + + + + + No Organizer selected! + + + + + Selected Notebook not found! + + + + + + No Notebook selected! + + + + + Selected Tag not found! + + + + + + No Tag selected! + + + + + Note '%1' %2 + + + + + + Note + + + + + Selected Notebook/Note not found! + + + + + + No Note selected! + + + + + m8r::OutlineHeaderEditDialog::AdvancedTab + + + Metadata + + + + + Created + + + + + Last Modified + + + + + Last Read + + + + + Reads + + + + + Writes + + + + + File + + + + + Location + + + + + m8r::OutlineHeaderEditDialog::GeneralTab + + + Basic + + + + + Type + + + + + Importance + + + + + Urgency + + + + + Progress + + + + + m8r::OutlineHeaderEditDialog::PreambleTab + + + Text + + + + + Preamble + + + + + m8r::OutlineHeaderEditPresenter + + + Notebook '%1' successfully saved + + + + + Attempt to save data from UI to Notebook, but no Notebook is set. + + + + + m8r::OutlineNewDialog + + + General + + + + + Preamble + + + + + Advanced + + + + + New Notebook + + + + + m8r::OutlineNewDialog::AdvancedTab + + + Expected file name + + + + + Location + + + + + m8r::OutlineNewDialog::GeneralTab + + + Basic + + + + + Name + + + + + Notebook + + + + + Type + + + + + Importance + + + + + Urgency + + + + + Progress + + + + + Stencil + + + + + m8r::OutlineNewDialog::PreambleTab + + + Text + + + + + Preamble + + + + + m8r::OutlineTreeModel + + + Outline + + + + + Done + + + + + Rs + + + + + Ws + + + + + Modified + + + + + m8r::OutlineView + + + Click this Notebook name to open its Markdown preview in the right panel + + + + + m8r::OutlinesTableModel + + + Notebooks + + + + + Importance + + + + + Urgency + + + + + Done + + + + + Ns + + + + + Rs + + + + + Ws + + + + + Modified + + + + + m8r::RecentFilesMenu + + + Clear Menu + + + + + m8r::RecentNotesTableModel + + + Recent Notes + + + + + Notebook + + + + + Rs + + + + + Ws + + + + + Read + + + + + Modified + + + + + m8r::RefactorNoteToOutlineDialog + + + Refactor + + + + + Refactor Note to Notebook + + + + + m8r::RowsAndDepthDialog + + + Bulleted List Generator + + + + + Numbered List Generator + + + + + Tasklist Generator + + + + + Block Quote Generator + + + + + m8r::TagsTableModel + + + Tags + + + + + Ts + + + + + m8r::TerminalDialog + + + Terminal Command Error + + + + + m8r::ViewToEditEditButtonsPanel + + + View Notebook Header + + + + + View Notebook + + + + + Show preview of Notebook name and its description + + + + + &Edit + + + + + Full / Header Notebook Preview + + + + + Whole Notebook &Preview + + + + + Show whole Notebook preview or Notebook header preview + + + + + main + + + MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI. + + + + + MindForger repository or directory/file with Markdown(s) to open + + + + + Use 'dark', 'light' or other GUI <theme>. + + + + + theme + + + + + Load configuration from given <file>. + + + + + + file + + + + + Disable WebEngine security to allow loading of images on macOS. + + + + + Disable WebEngine security by running single process on macOS. + + + + + Disable WebEngine security by disabling sandbox on macOS. + + + + + Disable WebEngine security by user data dir specification on macOS. + + + + + Disable WebEngine security via site isolation trials on macOS. + + + + + Disable WebEngine security via acess file from file on macOS. + + + + + Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: ' + + + + + Ignoring unknown GUI theme: ' + + + + From 553326c9f3fadae8910812e6e4dac628077319f6 Mon Sep 17 00:00:00 2001 From: COMPUTER102 <55975631+COMPUTER102@users.noreply.github.com> Date: Sat, 6 Aug 2022 16:27:38 +0800 Subject: [PATCH 004/131] Something changed. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index e93db28c..1e9b346f 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ TEST_LOG*.* compile_commands.json .qmake.stash .DS_Store +deps/cmark-gfm +deps/mitie +deps/cmark-gfm From a21e3db2261a970b649a22755d715a71bd16c5e7 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Mon, 22 Aug 2022 08:22:07 +0200 Subject: [PATCH 005/131] Adding Chinese localization to resource files. --- app/app.pro | 3 ++- app/mf-resources.qrc | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/app.pro b/app/app.pro index 705b3ba4..7d6fc358 100644 --- a/app/app.pro +++ b/app/app.pro @@ -464,7 +464,8 @@ TRANSLATIONS = \ ./resources/qt/translations/mindforger_nerd_en.ts \ ./resources/qt/translations/mindforger_nerd_cs.ts \ ./resources/qt/translations/mindforger_en.ts \ - ./resources/qt/translations/mindforger_cs.ts + ./resources/qt/translations/mindforger_cs.ts \ + ./resources/qt/translations/mindforger_zh_cn.ts RESOURCES += \ ./mf-resources.qrc diff --git a/app/mf-resources.qrc b/app/mf-resources.qrc index 2d93f7ba..36bc6a29 100644 --- a/app/mf-resources.qrc +++ b/app/mf-resources.qrc @@ -24,6 +24,7 @@ resources/qt/translations/mindforger_en.qm resources/qt/translations/mindforger_nerd_cs.qm resources/qt/translations/mindforger_nerd_en.qm + resources/qt/translations/mindforger_zh_cn.ts resources/qt/css/dark.css From c3c7164da8693c7a4044af442bf34ecff946a38e Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sat, 27 Aug 2022 08:16:30 +0200 Subject: [PATCH 006/131] Improving doc 2 wiki script. --- .gitignore | 2 ++ build/doc/mf-doc-to-wiki.py | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 1e9b346f..49833601 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ Makefile.* Release/ Debug/ .vs/ +.idea/ +.venv/ *.o *.a *.*~ diff --git a/build/doc/mf-doc-to-wiki.py b/build/doc/mf-doc-to-wiki.py index b51b2b85..67e504ea 100755 --- a/build/doc/mf-doc-to-wiki.py +++ b/build/doc/mf-doc-to-wiki.py @@ -116,9 +116,19 @@ def doc_to_wiki(doc_mf_repo_path: str, wiki_repo_path: str): print("Converting mindforger-documentation to mindforger.wiki:") home_path = os.path.expanduser("~") _doc_mf_repo_path = os.path.join( - home_path, "p/mindforger/git/mindforger-documentation" + home_path, + "p", + "mindforger", + "git", + "mindforger-documentation", + ) + _wiki_repo_path = os.path.join( + home_path, + "p", + "mindforger", + "git", + "mindforger.wiki", ) - _wiki_repo_path = os.path.join(home_path, "p/mindforger/git/mindforger.wiki") print(f" from: {_doc_mf_repo_path}") print(f" to : {_wiki_repo_path}") From da1518eb019979cfc61814a25ad63ca55a8993c0 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sat, 27 Aug 2022 09:52:37 +0200 Subject: [PATCH 007/131] Fixing documentation link to spellcheck setup. --- .../qt/translations/mindforger_cs.ts | 1061 ++++++++-------- .../qt/translations/mindforger_en.ts | 1061 ++++++++-------- .../qt/translations/mindforger_nerd_cs.ts | 1059 ++++++++-------- .../qt/translations/mindforger_nerd_en.ts | 1061 ++++++++-------- .../qt/translations/mindforger_zh_cn.qm | Bin 0 -> 3409 bytes .../qt/translations/mindforger_zh_cn.ts | 1095 +++++++++-------- app/src/qt/dialogs/configuration_dialog.cpp | 2 +- 7 files changed, 2702 insertions(+), 2637 deletions(-) create mode 100644 app/resources/qt/translations/mindforger_zh_cn.qm diff --git a/app/resources/qt/translations/mindforger_cs.ts b/app/resources/qt/translations/mindforger_cs.ts index a1d44871..499fdeda 100644 --- a/app/resources/qt/translations/mindforger_cs.ts +++ b/app/resources/qt/translations/mindforger_cs.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -123,316 +123,6 @@ - - m8r - - - Notebook tags: - - - - - Notebooks: - - - - - &Open Notebook - - - - - &Find Note - - - - - - - - &Cancel - - - - - Find Notebook by Tags - - - - - - General - - - - - - Advanced - - - - - Edit Note - - - - - Name - - - - - Organizer - - - - - View as - - - - - Eisenhower Matrix - - - - - Kanban - - - - - Notebook scope - - - - - Notebook - - - - - Clear - - - - - &Create - - - - - Sort Notebooks by - - - - - importance - - - - - urgency - - - - - Filter by - - - - - notebooks - - - - - notes - - - - - notebooks and notes - - - - - Find Notebook as Scope - - - - - New Organizer - - - - - Preamble - - - - - Edit Notebook - - - - - Specify number of rows and depth to generate - - - - - rows - - - - - depth - - - - - &Generate - - - - - Format Generator - - - - - show Notebooks/Notes modified or viewed in recent - - - - - year(s) - - - - - month(s) - - - - - day(s) - - - - - hour(s) - - - - - minute(s) - - - - - show Notebooks with the following tags - - - - - &Set - - - - - Scope Mind - - - - - New Notebook - - - - - Open a directory with Markdowns or MindForger repository - - - - - Open Markdown file - - - - - View Dashboard - - - - - View Eisenhower Matrix - - - - - View Eisenhower Matrices - - - - - View Notebooks - - - - - View Knowledge Graph Navigator - - - - - View Tags - - - - - View Recent Notes - - - - - Add word to dictionary - - - - - Check spelling... - - - - - - Hit ⌘↩ to add tag - - - - - - Hit Ctrl+Enter to add tag - - - - - Add Filter Tag - - - - - Create New Tag - - - - - Remove Tag - - - m8r::AddLibraryDialog @@ -621,13 +311,13 @@ - - live spell check + + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - - Spell check dictionaries <a href='https://github.com/dvorka/mindforger-repository/blob/master/memory/mindforger/installation.md#spell-check-'>configuration documentation</a> + + live spell check @@ -840,6 +530,19 @@ + + + Hit ⌘↩ to add tag + + + + + + Hit Ctrl+Enter to add tag + + + + @@ -847,11 +550,17 @@ + Create New Tag + + + Remove Tag + + Add Existing Tag @@ -1006,6 +715,39 @@ + + m8r::FindOutlineByTagDialog + + + Notebook tags: + + + + + Notebooks: + + + + + &Open Notebook + + + + + &Find Note + + + + + &Cancel + + + + + Find Notebook by Tags + + + m8r::FtsDialog @@ -2764,107 +2506,157 @@ - - About Qt... + + About Qt... + + + + + &About MindForger + + + + + About MindForger... + + + + + &Help + + + + + m8r::MainToolbarView + + + Main Toolbar + + + + + New Notebook + + + + + Open a directory with Markdowns or MindForger repository + + + + + Open Markdown file + + + + + View Dashboard + + + + + View Eisenhower Matrix + + + + + View Eisenhower Matrices - - &About MindForger + + View Notebooks - - About MindForger... + + View Knowledge Graph Navigator - - &Help + + View Tags - - - m8r::MainToolbarView - - Main Toolbar + + View Recent Notes m8r::MainWindowPresenter - - + + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - - + + New Repository Error - + Specified repository path already exists! - + Failed to create empty repository! - + ERROR: repository created, but attempt to copy documentation and/or stencils failed - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn Directory or MindForger Repository - + Learn Markdown File - + Learn - + This is neither valid MindForger/Markdown repository nor file. @@ -2880,54 +2672,54 @@ - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note @@ -2937,489 +2729,489 @@ - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + Home Notebook is not defined! - + image - + File copied to repository path '%1' - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook - + Do you really want to forget ' - + ' Notebook? - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Library already indexed - use update action to reindex documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode. - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + About MindForger @@ -3644,6 +3436,24 @@ + + m8r::NoteEditDialog + + + General + + + + + Advanced + + + + + Edit Note + + + m8r::NoteEditDialog::AdvancedTab @@ -3750,6 +3560,16 @@ m8r::NoteEditorView + + + Add word to dictionary + + + + + Check spelling... + + Exit Editor @@ -3867,11 +3687,98 @@ m8r::OrganizerNewDialog + + Name + + + + Organizer + + View as + + + + + Eisenhower Matrix + + + + + Kanban + + + + + Notebook scope + + + + + Notebook + + + + + Clear + + + + + &Create + + + + + Sort Notebooks by + + + + + importance + + + + + urgency + + + + + Filter by + + + + + notebooks + + + + + notes + + + + + notebooks and notes + + + + + &Cancel + + + + + Find Notebook as Scope + + + + New Organizer @@ -3926,75 +3833,98 @@ m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - + Selected Notebook not found! - - + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! + + m8r::OutlineHeaderEditDialog + + + General + + + + + Preamble + + + + + Advanced + + + + + Edit Notebook + + + m8r::OutlineHeaderEditDialog::AdvancedTab @@ -4319,6 +4249,36 @@ m8r::RowsAndDepthDialog + + + Specify number of rows and depth to generate + + + + + rows + + + + + depth + + + + + &Generate + + + + + &Cancel + + + + + Format Generator + + Bulleted List Generator @@ -4340,6 +4300,59 @@ + + m8r::ScopeDialog + + + show Notebooks/Notes modified or viewed in recent + + + + + year(s) + + + + + month(s) + + + + + day(s) + + + + + hour(s) + + + + + minute(s) + + + + + show Notebooks with the following tags + + + + + &Set + + + + + &Cancel + + + + + Scope Mind + + + m8r::TagsTableModel @@ -4402,73 +4415,73 @@ main - + MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI. - + MindForger repository or directory/file with Markdown(s) to open - + Use 'dark', 'light' or other GUI <theme>. - + theme - + Load configuration from given <file>. - - + + file - + Disable WebEngine security to allow loading of images on macOS. - + Disable WebEngine security by running single process on macOS. - + Disable WebEngine security by disabling sandbox on macOS. - + Disable WebEngine security by user data dir specification on macOS. - + Disable WebEngine security via site isolation trials on macOS. - + Disable WebEngine security via acess file from file on macOS. - + Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: ' - + Ignoring unknown GUI theme: ' diff --git a/app/resources/qt/translations/mindforger_en.ts b/app/resources/qt/translations/mindforger_en.ts index ba0c700a..1928684d 100644 --- a/app/resources/qt/translations/mindforger_en.ts +++ b/app/resources/qt/translations/mindforger_en.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -123,316 +123,6 @@ - - m8r - - - Notebook tags: - - - - - Notebooks: - - - - - &Open Notebook - - - - - &Find Note - - - - - - - - &Cancel - - - - - Find Notebook by Tags - - - - - - General - - - - - - Advanced - - - - - Edit Note - - - - - Name - - - - - Organizer - - - - - View as - - - - - Eisenhower Matrix - - - - - Kanban - - - - - Notebook scope - - - - - Notebook - - - - - Clear - - - - - &Create - - - - - Sort Notebooks by - - - - - importance - - - - - urgency - - - - - Filter by - - - - - notebooks - - - - - notes - - - - - notebooks and notes - - - - - Find Notebook as Scope - - - - - New Organizer - - - - - Preamble - - - - - Edit Notebook - - - - - Specify number of rows and depth to generate - - - - - rows - - - - - depth - - - - - &Generate - - - - - Format Generator - - - - - show Notebooks/Notes modified or viewed in recent - - - - - year(s) - - - - - month(s) - - - - - day(s) - - - - - hour(s) - - - - - minute(s) - - - - - show Notebooks with the following tags - - - - - &Set - - - - - Scope Mind - - - - - New Notebook - - - - - Open a directory with Markdowns or MindForger repository - - - - - Open Markdown file - - - - - View Dashboard - - - - - View Eisenhower Matrix - - - - - View Eisenhower Matrices - - - - - View Notebooks - - - - - View Knowledge Graph Navigator - - - - - View Tags - - - - - View Recent Notes - - - - - Add word to dictionary - - - - - Check spelling... - - - - - - Hit ⌘↩ to add tag - - - - - - Hit Ctrl+Enter to add tag - - - - - Add Filter Tag - - - - - Create New Tag - - - - - Remove Tag - - - m8r::AddLibraryDialog @@ -622,13 +312,13 @@ - - live spell check + + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - - Spell check dictionaries <a href='https://github.com/dvorka/mindforger-repository/blob/master/memory/mindforger/installation.md#spell-check-'>configuration documentation</a> + + live spell check @@ -848,6 +538,19 @@ + + + Hit ⌘↩ to add tag + + + + + + Hit Ctrl+Enter to add tag + + + + @@ -855,11 +558,17 @@ + Create New Tag + + + Remove Tag + + Add Existing Tag @@ -1014,6 +723,39 @@ + + m8r::FindOutlineByTagDialog + + + Notebook tags: + + + + + Notebooks: + + + + + &Open Notebook + + + + + &Find Note + + + + + &Cancel + + + + + Find Notebook by Tags + + + m8r::FtsDialog @@ -2776,107 +2518,157 @@ - - About Qt... + + About Qt... + + + + + &About MindForger + + + + + About MindForger... + + + + + &Help + + + + + m8r::MainToolbarView + + + Main Toolbar + + + + + New Notebook + + + + + Open a directory with Markdowns or MindForger repository + + + + + Open Markdown file + + + + + View Dashboard + + + + + View Eisenhower Matrix + + + + + View Eisenhower Matrices - - &About MindForger + + View Notebooks - - About MindForger... + + View Knowledge Graph Navigator - - &Help + + View Tags - - - m8r::MainToolbarView - - Main Toolbar + + View Recent Notes m8r::MainWindowPresenter - - + + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - - + + New Repository Error - + Specified repository path already exists! - + Failed to create empty repository! - + ERROR: repository created, but attempt to copy documentation and/or stencils failed - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn Directory or MindForger Repository Open Directory or MindForger Repository - + Learn Markdown File Open Markdown File - + Learn Open - + This is neither valid MindForger/Markdown repository nor file. @@ -2892,54 +2684,54 @@ - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note @@ -2949,489 +2741,489 @@ - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + Home Notebook is not defined! - + image - + File copied to repository path '%1' - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook Deprecate Notebook - + Do you really want to forget ' - + ' Notebook? - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note Delete Note - + Please select a Note to forget. Please select a Note to delete. - - + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Library already indexed - use update action to reindex documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode. - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + About MindForger @@ -3656,6 +3448,24 @@ + + m8r::NoteEditDialog + + + General + + + + + Advanced + + + + + Edit Note + + + m8r::NoteEditDialog::AdvancedTab @@ -3762,6 +3572,16 @@ m8r::NoteEditorView + + + Add word to dictionary + + + + + Check spelling... + + Exit Editor @@ -3879,11 +3699,98 @@ m8r::OrganizerNewDialog + + Name + + + + Organizer + + View as + + + + + Eisenhower Matrix + + + + + Kanban + + + + + Notebook scope + + + + + Notebook + + + + + Clear + + + + + &Create + + + + + Sort Notebooks by + + + + + importance + + + + + urgency + + + + + Filter by + + + + + notebooks + + + + + notes + + + + + notebooks and notes + + + + + &Cancel + + + + + Find Notebook as Scope + + + + New Organizer @@ -3938,75 +3845,98 @@ m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - + Selected Notebook not found! - - + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! + + m8r::OutlineHeaderEditDialog + + + General + + + + + Preamble + + + + + Advanced + + + + + Edit Notebook + + + m8r::OutlineHeaderEditDialog::AdvancedTab @@ -4331,6 +4261,36 @@ m8r::RowsAndDepthDialog + + + Specify number of rows and depth to generate + + + + + rows + + + + + depth + + + + + &Generate + + + + + &Cancel + + + + + Format Generator + + Bulleted List Generator @@ -4352,6 +4312,59 @@ + + m8r::ScopeDialog + + + show Notebooks/Notes modified or viewed in recent + + + + + year(s) + + + + + month(s) + + + + + day(s) + + + + + hour(s) + + + + + minute(s) + + + + + show Notebooks with the following tags + + + + + &Set + + + + + &Cancel + + + + + Scope Mind + + + m8r::TagsTableModel @@ -4414,73 +4427,73 @@ main - + MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI. - + MindForger repository or directory/file with Markdown(s) to open - + Use 'dark', 'light' or other GUI <theme>. - + theme - + Load configuration from given <file>. - - + + file - + Disable WebEngine security to allow loading of images on macOS. - + Disable WebEngine security by running single process on macOS. - + Disable WebEngine security by disabling sandbox on macOS. - + Disable WebEngine security by user data dir specification on macOS. - + Disable WebEngine security via site isolation trials on macOS. - + Disable WebEngine security via acess file from file on macOS. - + Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: ' - + Ignoring unknown GUI theme: ' diff --git a/app/resources/qt/translations/mindforger_nerd_cs.ts b/app/resources/qt/translations/mindforger_nerd_cs.ts index 5fef71fc..bef81b83 100644 --- a/app/resources/qt/translations/mindforger_nerd_cs.ts +++ b/app/resources/qt/translations/mindforger_nerd_cs.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -123,316 +123,6 @@ - - m8r - - - Notebook tags: - - - - - Notebooks: - - - - - &Open Notebook - - - - - &Find Note - - - - - - - - &Cancel - - - - - Find Notebook by Tags - - - - - - General - - - - - - Advanced - - - - - Edit Note - - - - - Name - - - - - Organizer - - - - - View as - - - - - Eisenhower Matrix - - - - - Kanban - - - - - Notebook scope - - - - - Notebook - - - - - Clear - - - - - &Create - - - - - Sort Notebooks by - - - - - importance - - - - - urgency - - - - - Filter by - - - - - notebooks - - - - - notes - - - - - notebooks and notes - - - - - Find Notebook as Scope - - - - - New Organizer - - - - - Preamble - - - - - Edit Notebook - - - - - Specify number of rows and depth to generate - - - - - rows - - - - - depth - - - - - &Generate - - - - - Format Generator - - - - - show Notebooks/Notes modified or viewed in recent - - - - - year(s) - - - - - month(s) - - - - - day(s) - - - - - hour(s) - - - - - minute(s) - - - - - show Notebooks with the following tags - - - - - &Set - - - - - Scope Mind - - - - - New Notebook - - - - - Open a directory with Markdowns or MindForger repository - - - - - Open Markdown file - - - - - View Dashboard - - - - - View Eisenhower Matrix - - - - - View Eisenhower Matrices - - - - - View Notebooks - - - - - View Knowledge Graph Navigator - - - - - View Tags - - - - - View Recent Notes - - - - - Add word to dictionary - - - - - Check spelling... - - - - - - Hit ⌘↩ to add tag - - - - - - Hit Ctrl+Enter to add tag - - - - - Add Filter Tag - - - - - Create New Tag - - - - - Remove Tag - - - m8r::AddLibraryDialog @@ -629,13 +319,13 @@ - - live spell check + + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - - Spell check dictionaries <a href='https://github.com/dvorka/mindforger-repository/blob/master/memory/mindforger/installation.md#spell-check-'>configuration documentation</a> + + live spell check @@ -848,6 +538,19 @@ + + + Hit ⌘↩ to add tag + + + + + + Hit Ctrl+Enter to add tag + + + + @@ -855,11 +558,17 @@ + Create New Tag + + + Remove Tag + + Add Existing Tag @@ -1014,6 +723,39 @@ + + m8r::FindOutlineByTagDialog + + + Notebook tags: + + + + + Notebooks: + + + + + &Open Notebook + + + + + &Find Note + + + + + &Cancel + + + + + Find Notebook by Tags + + + m8r::FtsDialog @@ -2781,98 +2523,148 @@ - - About MindForger... - O aplikaci MindForger + + About MindForger... + O aplikaci MindForger + + + + &Help + + + + + F1 + + + + + m8r::MainToolbarView + + + Main Toolbar + + + + + New Notebook + + + + + Open a directory with Markdowns or MindForger repository + + + + + Open Markdown file + + + + + View Dashboard + + + + + View Eisenhower Matrix + + + + + View Eisenhower Matrices + + + + + View Notebooks + - - &Help + + View Knowledge Graph Navigator - - F1 + + View Tags - - - m8r::MainToolbarView - - Main Toolbar + + View Recent Notes m8r::MainWindowPresenter - - + + Cannot think - either Mind already dreaming or repository too big - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn - + This is neither valid MindForger/Markdown repository nor file. - + Full-text Search - - - + + + Note - - + + Note not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name - - + + New Note - + Failed to create new Note! - + Hyperlink %1 clicked... @@ -2882,171 +2674,171 @@ - + Autolinked Notebooks and Notes - + Link target not found for relative link %1 - - + + New Repository Error - + Specified repository path already exists! - + Failed to create empty repository! - + ERROR: repository created, but attempt to copy documentation and/or stencils failed - + New Markdown File Error - - - + + + Specified file path already exists! - + Learn Directory or MindForger Repository - + Learn Markdown File - + Notebook Full-text Search - + Note Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Find Note by Name in Notebook - + Edit Notebook - + Please open an Notebook to edit. - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - + Do you really want to forget ' - + ' Notebook? - + Notebook can be forgotten only when viewed. - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - + Find Note by Tags in Notebook @@ -3062,376 +2854,376 @@ - + Thing not found - - + + Find Note by Tags - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + Home Notebook is not defined! - + image - + File copied to repository path '%1' - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Home tag toggled/removed - Notebook '%1' is no longer home - - + + Forget Notebook - + Do you really want to deprecate ' - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Library already indexed - use update action to reindex documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode. - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + About MindForger @@ -3656,6 +3448,24 @@ + + m8r::NoteEditDialog + + + General + + + + + Advanced + + + + + Edit Note + + + m8r::NoteEditDialog::AdvancedTab @@ -3762,6 +3572,16 @@ m8r::NoteEditorView + + + Add word to dictionary + + + + + Check spelling... + + Exit Editor @@ -3879,11 +3699,98 @@ m8r::OrganizerNewDialog + + Name + + + + Organizer + + View as + + + + + Eisenhower Matrix + + + + + Kanban + + + + + Notebook scope + + + + + Notebook + + + + + Clear + + + + + &Create + + + + + Sort Notebooks by + + + + + importance + + + + + urgency + + + + + Filter by + + + + + notebooks + + + + + notes + + + + + notebooks and notes + + + + + &Cancel + + + + + Find Notebook as Scope + + + + New Organizer @@ -3938,75 +3845,98 @@ m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - + Selected Notebook not found! - - + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! + + m8r::OutlineHeaderEditDialog + + + General + + + + + Preamble + + + + + Advanced + + + + + Edit Notebook + + + m8r::OutlineHeaderEditDialog::AdvancedTab @@ -4331,6 +4261,36 @@ m8r::RowsAndDepthDialog + + + Specify number of rows and depth to generate + + + + + rows + + + + + depth + + + + + &Generate + + + + + &Cancel + + + + + Format Generator + + Bulleted List Generator @@ -4352,6 +4312,59 @@ + + m8r::ScopeDialog + + + show Notebooks/Notes modified or viewed in recent + + + + + year(s) + + + + + month(s) + + + + + day(s) + + + + + hour(s) + + + + + minute(s) + + + + + show Notebooks with the following tags + + + + + &Set + + + + + &Cancel + + + + + Scope Mind + + + m8r::TagsTableModel @@ -4414,73 +4427,73 @@ main - + MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI. - + MindForger repository or directory/file with Markdown(s) to open - + Use 'dark', 'light' or other GUI <theme>. - + theme - + Load configuration from given <file>. - - + + file - + Disable WebEngine security to allow loading of images on macOS. - + Disable WebEngine security by running single process on macOS. - + Disable WebEngine security by disabling sandbox on macOS. - + Disable WebEngine security by user data dir specification on macOS. - + Disable WebEngine security via site isolation trials on macOS. - + Disable WebEngine security via acess file from file on macOS. - + Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: ' - + Ignoring unknown GUI theme: ' diff --git a/app/resources/qt/translations/mindforger_nerd_en.ts b/app/resources/qt/translations/mindforger_nerd_en.ts index 306f273b..f54e6fee 100644 --- a/app/resources/qt/translations/mindforger_nerd_en.ts +++ b/app/resources/qt/translations/mindforger_nerd_en.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -123,316 +123,6 @@ - - m8r - - - Notebook tags: - - - - - Notebooks: - - - - - &Open Notebook - - - - - &Find Note - - - - - - - - &Cancel - - - - - Find Notebook by Tags - - - - - - General - - - - - - Advanced - - - - - Edit Note - - - - - Name - - - - - Organizer - - - - - View as - - - - - Eisenhower Matrix - - - - - Kanban - - - - - Notebook scope - - - - - Notebook - - - - - Clear - - - - - &Create - - - - - Sort Notebooks by - - - - - importance - - - - - urgency - - - - - Filter by - - - - - notebooks - - - - - notes - - - - - notebooks and notes - - - - - Find Notebook as Scope - - - - - New Organizer - - - - - Preamble - - - - - Edit Notebook - - - - - Specify number of rows and depth to generate - - - - - rows - - - - - depth - - - - - &Generate - - - - - Format Generator - - - - - show Notebooks/Notes modified or viewed in recent - - - - - year(s) - - - - - month(s) - - - - - day(s) - - - - - hour(s) - - - - - minute(s) - - - - - show Notebooks with the following tags - - - - - &Set - - - - - Scope Mind - - - - - New Notebook - - - - - Open a directory with Markdowns or MindForger repository - - - - - Open Markdown file - - - - - View Dashboard - - - - - View Eisenhower Matrix - - - - - View Eisenhower Matrices - - - - - View Notebooks - - - - - View Knowledge Graph Navigator - - - - - View Tags - - - - - View Recent Notes - - - - - Add word to dictionary - - - - - Check spelling... - - - - - - Hit ⌘↩ to add tag - - - - - - Hit Ctrl+Enter to add tag - - - - - Add Filter Tag - - - - - Create New Tag - - - - - Remove Tag - - - m8r::AddLibraryDialog @@ -621,13 +311,13 @@ - - live spell check + + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - - Spell check dictionaries <a href='https://github.com/dvorka/mindforger-repository/blob/master/memory/mindforger/installation.md#spell-check-'>configuration documentation</a> + + live spell check @@ -840,6 +530,19 @@ + + + Hit ⌘↩ to add tag + + + + + + Hit Ctrl+Enter to add tag + + + + @@ -847,11 +550,17 @@ + Create New Tag + + + Remove Tag + + Add Existing Tag @@ -1006,6 +715,39 @@ + + m8r::FindOutlineByTagDialog + + + Notebook tags: + + + + + Notebooks: + + + + + &Open Notebook + + + + + &Find Note + + + + + &Cancel + + + + + Find Notebook by Tags + + + m8r::FtsDialog @@ -2760,103 +2502,153 @@ - - About Qt... + + About Qt... + + + + + &About MindForger + + + + + About MindForger... + + + + + &Help + + + + + m8r::MainToolbarView + + + Main Toolbar + + + + + New Notebook + + + + + Open a directory with Markdowns or MindForger repository + + + + + Open Markdown file + + + + + View Dashboard + + + + + View Eisenhower Matrix + + + + + View Eisenhower Matrices - - &About MindForger + + View Notebooks - - About MindForger... + + View Knowledge Graph Navigator - - &Help + + View Tags - - - m8r::MainToolbarView - - Main Toolbar + + View Recent Notes m8r::MainWindowPresenter - - + + Cannot think - either Mind already dreaming or repository too big - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn - + This is neither valid MindForger/Markdown repository nor file. - + Full-text Search - - - + + + Note - - + + Note not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name - - + + New Note - + Failed to create new Note! - + Hyperlink %1 clicked... @@ -2866,171 +2658,171 @@ - + Autolinked Notebooks and Notes - + Link target not found for relative link %1 - - + + New Repository Error - + Specified repository path already exists! - + Failed to create empty repository! - + ERROR: repository created, but attempt to copy documentation and/or stencils failed - + New Markdown File Error - - - + + + Specified file path already exists! - + Learn Directory or MindForger Repository - + Learn Markdown File - + Notebook Full-text Search - + Note Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Find Note by Name in Notebook - + Edit Notebook - + Please open an Notebook to edit. - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - + Do you really want to forget ' - + ' Notebook? - + Notebook can be forgotten only when viewed. - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - + Find Note by Tags in Notebook @@ -3046,376 +2838,376 @@ - + Thing not found - - + + Find Note by Tags - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + Home Notebook is not defined! - + image - + File copied to repository path '%1' - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Home tag toggled/removed - Notebook '%1' is no longer home - - + + Forget Notebook - + Do you really want to deprecate ' - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Library already indexed - use update action to reindex documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode. - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + About MindForger @@ -3640,6 +3432,24 @@ + + m8r::NoteEditDialog + + + General + + + + + Advanced + + + + + Edit Note + + + m8r::NoteEditDialog::AdvancedTab @@ -3746,6 +3556,16 @@ m8r::NoteEditorView + + + Add word to dictionary + + + + + Check spelling... + + Exit Editor @@ -3863,11 +3683,98 @@ m8r::OrganizerNewDialog + + Name + + + + Organizer + + View as + + + + + Eisenhower Matrix + + + + + Kanban + + + + + Notebook scope + + + + + Notebook + + + + + Clear + + + + + &Create + + + + + Sort Notebooks by + + + + + importance + + + + + urgency + + + + + Filter by + + + + + notebooks + + + + + notes + + + + + notebooks and notes + + + + + &Cancel + + + + + Find Notebook as Scope + + + + New Organizer @@ -3922,75 +3829,98 @@ m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - + Selected Notebook not found! - - + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! + + m8r::OutlineHeaderEditDialog + + + General + + + + + Preamble + + + + + Advanced + + + + + Edit Notebook + + + m8r::OutlineHeaderEditDialog::AdvancedTab @@ -4315,6 +4245,36 @@ m8r::RowsAndDepthDialog + + + Specify number of rows and depth to generate + + + + + rows + + + + + depth + + + + + &Generate + + + + + &Cancel + + + + + Format Generator + + Bulleted List Generator @@ -4336,6 +4296,59 @@ + + m8r::ScopeDialog + + + show Notebooks/Notes modified or viewed in recent + + + + + year(s) + + + + + month(s) + + + + + day(s) + + + + + hour(s) + + + + + minute(s) + + + + + show Notebooks with the following tags + + + + + &Set + + + + + &Cancel + + + + + Scope Mind + + + m8r::TagsTableModel @@ -4398,73 +4411,73 @@ main - + MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI. - + MindForger repository or directory/file with Markdown(s) to open - + Use 'dark', 'light' or other GUI <theme>. - + theme - + Load configuration from given <file>. - - + + file - + Disable WebEngine security to allow loading of images on macOS. - + Disable WebEngine security by running single process on macOS. - + Disable WebEngine security by disabling sandbox on macOS. - + Disable WebEngine security by user data dir specification on macOS. - + Disable WebEngine security via site isolation trials on macOS. - + Disable WebEngine security via acess file from file on macOS. - + Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: ' - + Ignoring unknown GUI theme: ' diff --git a/app/resources/qt/translations/mindforger_zh_cn.qm b/app/resources/qt/translations/mindforger_zh_cn.qm new file mode 100644 index 0000000000000000000000000000000000000000..57dcc9a1ec2a0a17c3bba5984342a3246235e2ba GIT binary patch literal 3409 zcmb7GO>7%Q6n<%I$BrGlg)|BgDuWcQ5D5_n5YUDyO`K35PAn&Ckt(6Cy%T4Z^-i?A ziIrSHfVfb&1P~IH3YWr#OA%64i603G2}Dmws2t!zFK`Ga4h4buX4bo2JMp?CvUg`Z z?|a|-nfKn*bz|haKQ6y>^TGSSy!hegKhF^L5sgn5@O+z|`Pd`*SHAuh(SX%=^Tr-g z=95F$Sw|xioD6hcX}Rn$UAK^V46uMEz&851-z|{!9Kd{Y7@_ zY4D@7*}XeI5G5WPe0+|B&$EM57q1Z=`FrrnyHfwo;9hnLxcB9%yLrfelUuv+EBHN? zYkaj1{A}*)-x9#Tnty(J89eUfU%z$&yvq42BRH2j3KH2T4nxy0mB=AZtN6&LO;vom zDf~o9d=h62eZ%X=+erOM=j6#*VXvCCO-J`kVHZr@616^wlcHtPX^VI$nJV)-uUEJu zg^w%YIm7g3Ha$<+Zb`Sfr6flKNn)hopV0ysv}4^9U@_e`*aFwLcn{PeAQgbKp{%L` z&x>&D*XD&&bw7&|C%QOMf1#U?uT|frFVhJ4J z*HAR6fxlzNO3jlANhlAc5?ax;jUGZ8#B4G`p?$7>vc zXngV{&uBsRbaBvdo0l0al4uK5#*Y(Q6rPHB7nqrYVWpVT{;HOI@ZWiyqQoW zbIrsa&V`nbMO0RVSXU`m7h9Z}9`giSFzXc&6Nu-6h%2p(iqP$Vg8|JAuwZyP_%8av zqItEhfs@=_#jZ@cN%b_) zRny{=lan!2Uye{cn2sz78zAT^cS+*gp#eJH4D8D@RX8*FwV}?gDHA(Q56p8r416Kp zz?M-C-w>|p31?ect24uNcvUSMrnlB|g*4ucw_aY(&Z3nrbFEdix@6mBbz_8ouVJR| z0Cj&5JKsU-&ciV>=kC_ECeFJwaiHV&2f{xcWK-zaFlS0-{)iB+?0Fu_`^_uHjAzB!sNECf@8wH#z3lBc?5gs_Gza4Cq)J zXtOdvK}ETE5en*&0yz{w%Tgil$D&@3D;cA0=q0$`f%Dtx<^#+UcU&~ByCmC5RihP< ztwsD0kPWzMD|#&seIi0OK-VJG?O>OTH0et%nkr?z-ExqoRu%R2NNcn`}AixIqRH9NfnKf!(EgH?x>MxOm)$=i3!&&$hT$|gzWMieNxhl$4>?ACd5dD zqfor$Vju}V1w^j1<;d34tVL>@JB6@`w0F>Q*lc QObject - - 保存笔记 + + Save Note - - 是否要保存更改? + + Do you want to save changes? - - 放弃更改 + + Discard changes - - &放弃更改 + + &Discard changes - - - 自动保存 + + + Autosave - - 不再询问 & 自动保存 + + Do not ask & autosave - - 继续编辑 + + Continue editing - - 继续 &编辑 + + Continue &editing - - 保存 + + Save - - &保存 + + &Save @@ -59,377 +59,67 @@ SpellChecker - 检查拼写 + Check Spelling - &添加 + &Add - &忽略 + &Ignore - &全部忽略 + I&gnore All - &更正 + &Change - &全部更正 + C&hange All - 不在词典中: + Not in dictionary: - 更改为: + Change to: - 正在检查拼写... + Checking spelling... - 取消 + Cancel - 请稍等 + Please wait - 是否继续在文件开头检查? + Continue checking at beginning of file? - 拼写检查完成。 - - - - - m8r - - - 笔记本标签: - - - - - 笔记本: - - - - - &打开笔记本 - - - - - &查找笔记 - - - - - - - - &取消 - - - - - 按标签查找笔记本 - - - - - - 一般 - - - - - - 高级 - - - - - 编辑笔记 - - - - - 名称 - - - - - 组织者 - - - - - 查看为 - - - - - 艾森豪威尔矩阵 - - - - - 看板 - - - - - 笔记本范围 - - - - - 笔记本 - - - - - 清除 - - - - - &新建 - - - - - 笔记本排序依据 - - - - - 重要性 - - - - - 紧迫性 - - - - - 筛选依据 - - - - - 笔记本 - - - - - 笔记 - - - - - 笔记本和笔记 - - - - - 查找笔记本范围 - - - - - 新组织者 - - - - - 首部 - - - - - 编辑笔记本 - - - - - 指定要生成的行数和列数 - - - - - 行数 - - - - - 列数 - - - - - &生成 - - - - - 格式生成器 - - - - - 显示最近修改或查看的笔记本和笔记 - - - - - 年 - - - - - 月 - - - - - 日 - - - - - 小时 - - - - - 分钟 - - - - - 显示具有以下标记的笔记本 - - - - - &设置 - - - - - 范围思维 - - - - - 新笔记本 - - - - - 以Markdowns或MindForger存储库打开目录 - - - - - 打开Markdown文件 - - - - - 显示仪表板 - - - - - 显示艾森豪威尔矩阵 - - - - - 显示更多艾森豪威尔矩阵 - - - - - 显示笔记本列表 - - - - - 查看知识图谱导航器 - - - - - 显示标签列表 - - - - - 显示最近笔记 - - - - - 向词典添加单词 - - - - - 正在检查拼写... - - - - - - 按 ⌘↩ 添加标签 - - - - - - 按 Ctrl+Enter 添加标签 - - - - - 添加筛选器标签 - - - - - 新建标签 - - - - - 删除标签 + Spell check complete. @@ -622,13 +312,13 @@ - - live spell check + + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - - Spell check dictionaries <a href='https://github.com/dvorka/mindforger-repository/blob/master/memory/mindforger/installation.md#spell-check-'>configuration documentation</a> + + live spell check @@ -848,6 +538,19 @@ + + + Hit ⌘↩ to add tag + + + + + + Hit Ctrl+Enter to add tag + + + + @@ -855,11 +558,17 @@ + Create New Tag + + + Remove Tag + + Add Existing Tag @@ -994,23 +703,56 @@ - - &current Notebook's Notes only + + &current Notebook's Notes only + + + + + &Open Notebook + + + + + &Cancel + + + + + Find Notebook by Name + + + + + m8r::FindOutlineByTagDialog + + + Notebook tags: + + + + + Notebooks: + + + + + &Open Notebook - - &Open Notebook + + &Find Note - + &Cancel - - Find Notebook by Name + + Find Notebook by Tags @@ -2803,80 +2545,130 @@ Main Toolbar + + + New Notebook + + + + + Open a directory with Markdowns or MindForger repository + + + + + Open Markdown file + + + + + View Dashboard + + + + + View Eisenhower Matrix + + + + + View Eisenhower Matrices + + + + + View Notebooks + + + + + View Knowledge Graph Navigator + + + + + View Tags + + + + + View Recent Notes + + m8r::MainWindowPresenter - - + + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - - + + New Repository Error - + Specified repository path already exists! - + Failed to create empty repository! - + ERROR: repository created, but attempt to copy documentation and/or stencils failed - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn Directory or MindForger Repository Open Directory or MindForger Repository - + Learn Markdown File Open Markdown File - + Learn Open - + This is neither valid MindForger/Markdown repository nor file. @@ -2892,54 +2684,54 @@ - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note @@ -2949,489 +2741,489 @@ - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + Home Notebook is not defined! - + image - + File copied to repository path '%1' - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook Deprecate Notebook - + Do you really want to forget ' - + ' Notebook? - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note Delete Note - + Please select a Note to forget. Please select a Note to delete. - - + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Library already indexed - use update action to reindex documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode. - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + About MindForger @@ -3656,6 +3448,24 @@ + + m8r::NoteEditDialog + + + General + + + + + Advanced + + + + + Edit Note + + + m8r::NoteEditDialog::AdvancedTab @@ -3762,6 +3572,16 @@ m8r::NoteEditorView + + + Add word to dictionary + + + + + Check spelling... + + Exit Editor @@ -3879,11 +3699,98 @@ m8r::OrganizerNewDialog + + Name + + + + Organizer + + View as + + + + + Eisenhower Matrix + + + + + Kanban + + + + + Notebook scope + + + + + Notebook + + + + + Clear + + + + + &Create + + + + + Sort Notebooks by + + + + + importance + + + + + urgency + + + + + Filter by + + + + + notebooks + + + + + notes + + + + + notebooks and notes + + + + + &Cancel + + + + + Find Notebook as Scope + + + + New Organizer @@ -3938,75 +3845,98 @@ m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - + Selected Notebook not found! - - + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! + + m8r::OutlineHeaderEditDialog + + + General + + + + + Preamble + + + + + Advanced + + + + + Edit Notebook + + + m8r::OutlineHeaderEditDialog::AdvancedTab @@ -4331,6 +4261,36 @@ m8r::RowsAndDepthDialog + + + Specify number of rows and depth to generate + + + + + rows + + + + + depth + + + + + &Generate + + + + + &Cancel + + + + + Format Generator + + Bulleted List Generator @@ -4352,6 +4312,59 @@ + + m8r::ScopeDialog + + + show Notebooks/Notes modified or viewed in recent + + + + + year(s) + + + + + month(s) + + + + + day(s) + + + + + hour(s) + + + + + minute(s) + + + + + show Notebooks with the following tags + + + + + &Set + + + + + &Cancel + + + + + Scope Mind + + + m8r::TagsTableModel @@ -4414,73 +4427,73 @@ main - + MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI. - + MindForger repository or directory/file with Markdown(s) to open - + Use 'dark', 'light' or other GUI <theme>. - + theme - + Load configuration from given <file>. - - + + file - + Disable WebEngine security to allow loading of images on macOS. - + Disable WebEngine security by running single process on macOS. - + Disable WebEngine security by disabling sandbox on macOS. - + Disable WebEngine security by user data dir specification on macOS. - + Disable WebEngine security via site isolation trials on macOS. - + Disable WebEngine security via acess file from file on macOS. - + Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: ' - + Ignoring unknown GUI theme: ' diff --git a/app/src/qt/dialogs/configuration_dialog.cpp b/app/src/qt/dialogs/configuration_dialog.cpp index df147ef0..fc11839d 100644 --- a/app/src/qt/dialogs/configuration_dialog.cpp +++ b/app/src/qt/dialogs/configuration_dialog.cpp @@ -367,7 +367,7 @@ ConfigurationDialog::EditorTab::EditorTab(QWidget *parent) editorSpellCheckHelp = new QLabel( tr("Spell check dictionaries configuration documentation" ), this From eb4b2f66a4b5b732c982f11086d090ed84c4c588 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 28 Aug 2022 07:46:00 +0200 Subject: [PATCH 008/131] Source code update for 1.55.0 release. --- PAD.xml | 2 +- build/Makefile | 2 +- build/debian/debian-make-deb.sh | 2 +- build/debian/debian/changelog | 2 +- build/fedora/fedora-rpm-from-deb.sh | 2 +- build/macos/env.sh | 2 +- build/make/replace-version-all-files.py | 5 +++-- build/tarball/tarball-build.sh | 2 +- lib/src/app_info.h | 4 ++-- 9 files changed, 12 insertions(+), 11 deletions(-) diff --git a/PAD.xml b/PAD.xml index e6ffb278..248bc608 100644 --- a/PAD.xml +++ b/PAD.xml @@ -34,7 +34,7 @@ MindForger - 1.54.0 + 1.55.0 03 07 2022 diff --git a/build/Makefile b/build/Makefile index 35845985..d2fea339 100644 --- a/build/Makefile +++ b/build/Makefile @@ -18,7 +18,7 @@ .DEFAULT_GOAL := help -MINDFORGER_VERSION := 1.54.0 +MINDFORGER_VERSION := 1.55.0 MINDFORGER_RELEASE_BASE_DIR := /home/dvorka/p/mindforger/release MINDFORGER_RELEASE_DIR := $(MINDFORGER_RELEASE_BASE_DIR)/$(MINDFORGER_VERSION)-maker diff --git a/build/debian/debian-make-deb.sh b/build/debian/debian-make-deb.sh index de495e01..70a7df73 100755 --- a/build/debian/debian-make-deb.sh +++ b/build/debian/debian-make-deb.sh @@ -153,7 +153,7 @@ function buildDebPackage() { # # Main # # ############################################################################ -export ARG_VERSION="1.54.0" +export ARG_VERSION="1.55.0" export ARG_BAZAAR_MSG="MindForger ${ARG_VERSION} release." # Debian releases: https://www.debian.org/releases/ diff --git a/build/debian/debian/changelog b/build/debian/debian/changelog index 05cbaf03..ad39663a 100644 --- a/build/debian/debian/changelog +++ b/build/debian/debian/changelog @@ -1,4 +1,4 @@ -mindforger (1.54.0-1) unstable; urgency=low +mindforger (1.55.0-1) unstable; urgency=low * Initial New features. diff --git a/build/fedora/fedora-rpm-from-deb.sh b/build/fedora/fedora-rpm-from-deb.sh index 780bc200..7c1c17cc 100755 --- a/build/fedora/fedora-rpm-from-deb.sh +++ b/build/fedora/fedora-rpm-from-deb.sh @@ -31,7 +31,7 @@ echo "===============================================================" if [[ -z "${1}" ]] then - export MFVERSION="1.54.0" + export MFVERSION="1.55.0" else export MFVERSION="${1}" fi diff --git a/build/macos/env.sh b/build/macos/env.sh index 9eeb7cee..6c1235a7 100644 --- a/build/macos/env.sh +++ b/build/macos/env.sh @@ -17,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -export MINDFORGER_VERSION="1.54.0" +export MINDFORGER_VERSION="1.55.0" # aligned with Ubuntu 18.4 export QT_VERSION="5.9.9" diff --git a/build/make/replace-version-all-files.py b/build/make/replace-version-all-files.py index 8e8e9d33..b0b32213 100755 --- a/build/make/replace-version-all-files.py +++ b/build/make/replace-version-all-files.py @@ -83,9 +83,10 @@ def replace_files( if __name__ == "__main__": old_major_version = "1" - old_minor_version = "53" + old_minor_version = "54" + new_major_version = "1" - new_minor_version = "54" + new_minor_version = "55" # common files replacement replace_files( diff --git a/build/tarball/tarball-build.sh b/build/tarball/tarball-build.sh index 5f347bcd..5aa123ac 100755 --- a/build/tarball/tarball-build.sh +++ b/build/tarball/tarball-build.sh @@ -119,7 +119,7 @@ function buildGitHubTarball { # # Main # # ############################################################################ -export ARG_VERSION="1.54.0" +export ARG_VERSION="1.55.0" export ARG_BAZAAR_MSG="MindForger ${ARG_VERSION} release." buildGitHubTarball "${ARG_VERSION}" "${ARG_BAZAAR_MSG}" ${1} diff --git a/lib/src/app_info.h b/lib/src/app_info.h index 2153a905..145f8290 100644 --- a/lib/src/app_info.h +++ b/lib/src/app_info.h @@ -1,8 +1,8 @@ #define MINDFORGER_VERSION_MAJOR "1" #define MINDFORGER_VERSION_MINOR "54" #define MINDFORGER_VERSION_REVISION "0" -#define MINDFORGER_VERSION_STRING "1.54.0" -#define MINDFORGER_VERSION_DWORD 1,54,0,2 +#define MINDFORGER_VERSION_STRING "1.55.0" +#define MINDFORGER_VERSION_DWORD 1,55,0,2 #define MINDFORGER_APP_NAME "MindForger" #define MINDFORGER_APP_DESCRIPTION "MindForger Thinking Notebook" #define MINDFORGER_APP_AUTHOR "Martin Dvorak" From ec71df1bc910bfea587838dd09eb08e2093a57b0 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 28 Aug 2022 07:48:27 +0200 Subject: [PATCH 009/131] Updating known issues and changelog. --- Changelog | 4 ++++ KNOWN_ISSUES.md | 13 +++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Changelog b/Changelog index fa041cd8..662e489b 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,7 @@ +2022-??-?? Martin Dvorak + + * Released v1.54.0 - ... + 2022-03-07 Martin Dvorak * Released v1.54.0 - macOS fix release: Qt downgraded from 5.9.9 (security) diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index c89b3347..e4198e49 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -1,7 +1,16 @@ # Known Issues -MindForger known issues - see also -[GitHub issues](https://github.com/dvorka/mindforger/issues?q=is%3Aopen+is%3Aissue+label%3A%22bug+%3Alady_beetle%3A%22). +MindForger known issues - see [GitHub issues](https://github.com/dvorka/mindforger/issues?q=is%3Aopen+is%3Aissue+label%3A%22bug+%3Alady_beetle%3A%22) +for the complete list of bugs. + +# 1.55.0 + +* Autolinking can break MathJax code blocks/text integrity in Markdown text. +* Windows Server R2 2012: empty MF documentation repository in wrong location when MF is launched + at the end of installation. +* Notebook HTML export doesn't export local images: links to filesystem are kept intact, images + are not copied. +* Frontend memleaks. # 1.54.0 From 0900b97800eaa7ceef0f7b5746701d28a4135872 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 28 Aug 2022 07:53:51 +0200 Subject: [PATCH 010/131] Fixing compliation warnings. --- app/src/qt/outline_tree_view.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/qt/outline_tree_view.cpp b/app/src/qt/outline_tree_view.cpp index 1be6a981..0431bd5b 100644 --- a/app/src/qt/outline_tree_view.cpp +++ b/app/src/qt/outline_tree_view.cpp @@ -104,19 +104,19 @@ void OutlineTreeView::keyPressEvent(QKeyEvent* event) emit signalSelectNextRow(); break; case Qt::Key_Home: - MF_DEBUG(" OutlineTreeView::keyPressEvent HOME" << endl); + MF_DEBUG(" OutlineTreeView::keyPressEvent HOME" << std::endl); if(this->model()->rowCount() > 0) { this->selectRow(0); } return; case Qt::Key_End: - MF_DEBUG(" OutlineTreeView::keyPressEvent END" << endl); + MF_DEBUG(" OutlineTreeView::keyPressEvent END" << std::endl); if(this->model()->rowCount() > 0) { this->selectRow(this->model()->rowCount()-1); } return; case Qt::Key_PageUp: { - MF_DEBUG(" OutlineTreeView::keyPressEvent PAGE_UP" << endl); + MF_DEBUG(" OutlineTreeView::keyPressEvent PAGE_UP" << std::endl); // get currently selected row QModelIndexList indices = selectionModel()->selection().indexes(); // no indexes > no row > no selection @@ -134,7 +134,7 @@ void OutlineTreeView::keyPressEvent(QKeyEvent* event) return; } case Qt::Key_PageDown: { - MF_DEBUG(" OutlineTreeView::keyPressEvent PAGE_DOWN" << endl); + MF_DEBUG(" OutlineTreeView::keyPressEvent PAGE_DOWN" << std::endl); // get currently selected row QModelIndexList indices = selectionModel()->selection().indexes(); // no indexes > no row > no selection From 6b2d2c9595019ad2c4b599d9b8bbcf537b130d13 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 28 Aug 2022 08:22:32 +0200 Subject: [PATCH 011/131] Final version change. --- lib/src/app_info.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/app_info.h b/lib/src/app_info.h index 145f8290..b97353e9 100644 --- a/lib/src/app_info.h +++ b/lib/src/app_info.h @@ -1,5 +1,5 @@ #define MINDFORGER_VERSION_MAJOR "1" -#define MINDFORGER_VERSION_MINOR "54" +#define MINDFORGER_VERSION_MINOR "55" #define MINDFORGER_VERSION_REVISION "0" #define MINDFORGER_VERSION_STRING "1.55.0" #define MINDFORGER_VERSION_DWORD 1,55,0,2 From 8a900ce418447b57d59463e26dc095e4f7381c9f Mon Sep 17 00:00:00 2001 From: omgtehlion Date: Sun, 28 Aug 2022 14:21:35 +0300 Subject: [PATCH 012/131] Added modal parent to Save/Discard prompts --- app/src/qt/note_editor_view.cpp | 4 +++- app/src/qt/orloj_presenter.cpp | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/qt/note_editor_view.cpp b/app/src/qt/note_editor_view.cpp index f15cd37e..ac8eedc0 100644 --- a/app/src/qt/note_editor_view.cpp +++ b/app/src/qt/note_editor_view.cpp @@ -411,7 +411,9 @@ void NoteEditorView::keyPressEvent(QKeyEvent* event) QMessageBox msgBox{ QMessageBox::Question, tr("Exit Editor"), - tr("Do you really want to exit editor without saving?") + tr("Do you really want to exit editor without saving?"), + {}, + parent }; QPushButton* yes = msgBox.addButton("&Yes", QMessageBox::YesRole); #ifdef __APPLE__ diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp index 90a64974..2ed42f0a 100644 --- a/app/src/qt/orloj_presenter.cpp +++ b/app/src/qt/orloj_presenter.cpp @@ -154,13 +154,15 @@ OrlojPresenter::OrlojPresenter(MainWindowPresenter* mainPresenter, this, SLOT(slotShowOutlineHeader())); } -int dialogSaveOrCancel() +int dialogSaveOrCancel(QWidget* view) { // l10n by moving this dialog either to Qt class OR view class QMessageBox msgBox{ QMessageBox::Question, QObject::tr("Save Note"), - QObject::tr("Do you want to save changes?") + QObject::tr("Do you want to save changes?"), + {}, + view }; QPushButton* discard = msgBox.addButton( @@ -750,7 +752,7 @@ bool OrlojPresenter::avoidDataLossOnNoteEdit() if(Configuration::getInstance().isUiEditorAutosave()) { decision = OrlojButtonRoles::SAVE_ROLE; } else { - decision = dialogSaveOrCancel(); + decision = dialogSaveOrCancel(view); } switch(decision) { @@ -774,7 +776,7 @@ bool OrlojPresenter::avoidDataLossOnNoteEdit() return true; } } else if(activeFacet == OrlojPresenterFacets::FACET_EDIT_OUTLINE_HEADER) { - int decision = dialogSaveOrCancel(); + int decision = dialogSaveOrCancel(view); switch(decision) { case OrlojButtonRoles::DISCARD_ROLE: // do nothing From ea2640495808930fae4e3b2feba6dcb85986fb7f Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 4 Sep 2022 09:17:53 +0200 Subject: [PATCH 013/131] WIP context selection. --- app/src/qt/main_window_presenter.cpp | 2 ++ app/src/qt/outline_tree_presenter.cpp | 44 ++++++++++++++++++++------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 58dc2cea..4a0ae106 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -2467,9 +2467,11 @@ void MainWindowPresenter::doActionNoteForget() QAbstractButton* choosen = msgBox.clickedButton(); if(yes == choosen) { + // TODO getNearNote() getPreviousNote() getNextNote() Outline* outline = mind->noteForget(note); mind->remember(outline); orloj->showFacetOutline(orloj->getOutlineView()->getCurrentOutline()); + // TODO if nearNote then select nearNote } return; } diff --git a/app/src/qt/outline_tree_presenter.cpp b/app/src/qt/outline_tree_presenter.cpp index ddee3c2a..e5ee6270 100644 --- a/app/src/qt/outline_tree_presenter.cpp +++ b/app/src/qt/outline_tree_presenter.cpp @@ -35,17 +35,35 @@ OutlineTreePresenter::OutlineTreePresenter(OutlineTreeView* view, MainWindowPres this->view->setItemDelegate(delegate); // signals - QObject::connect(view, SIGNAL(signalSelectNextRow()), this, SLOT(slotSelectNextRow())); - QObject::connect(view, SIGNAL(signalSelectPreviousRow()), this, SLOT(slotSelectPreviousRow())); + QObject::connect( + view, SIGNAL(signalSelectNextRow()), + this, SLOT(slotSelectNextRow())); + QObject::connect( + view, SIGNAL(signalSelectPreviousRow()), + this, SLOT(slotSelectPreviousRow())); - QObject::connect(view, SIGNAL(signalOutlineShow()), mwp, SLOT(doActionOutlineShow())); + QObject::connect( + view, SIGNAL(signalOutlineShow()), + mwp, SLOT(doActionOutlineShow())); - QObject::connect(view, SIGNAL(signalChangePromote()), mwp, SLOT(doActionNotePromote())); - QObject::connect(view, SIGNAL(signalChangeDemote()), mwp, SLOT(doActionNoteDemote())); - QObject::connect(view, SIGNAL(signalChangeFirst()), mwp, SLOT(doActionNoteFirst())); - QObject::connect(view, SIGNAL(signalChangeUp()), mwp, SLOT(doActionNoteUp())); - QObject::connect(view, SIGNAL(signalChangeDown()), mwp, SLOT(doActionNoteDown())); - QObject::connect(view, SIGNAL(signalChangeLast()), mwp, SLOT(doActionNoteLast())); + QObject::connect( + view, SIGNAL(signalChangePromote()), + mwp, SLOT(doActionNotePromote())); + QObject::connect( + view, SIGNAL(signalChangeDemote()), + mwp, SLOT(doActionNoteDemote())); + QObject::connect( + view, SIGNAL(signalChangeFirst()), + mwp, SLOT(doActionNoteFirst())); + QObject::connect( + view, SIGNAL(signalChangeUp()), + mwp, SLOT(doActionNoteUp())); + QObject::connect( + view, SIGNAL(signalChangeDown()), + mwp, SLOT(doActionNoteDown())); + QObject::connect( + view, SIGNAL(signalChangeLast()), + mwp, SLOT(doActionNoteLast())); QObject::connect( view, SIGNAL(signalOutlineOrNoteEdit()), @@ -53,8 +71,12 @@ OutlineTreePresenter::OutlineTreePresenter(OutlineTreeView* view, MainWindowPres QObject::connect( view, SIGNAL(signalOutlineOrNoteExternalEdit()), mwp, SLOT(doActionNoteExternalEdit())); - QObject::connect(view, SIGNAL(signalEdit()), mwp, SLOT(doActionNoteEdit())); - QObject::connect(view, SIGNAL(signalForget()), mwp, SLOT(doActionNoteForget())); + QObject::connect( + view, SIGNAL(signalEdit()), + mwp, SLOT(doActionNoteEdit())); + QObject::connect( + view, SIGNAL(signalForget()), + mwp, SLOT(doActionNoteForget())); } OutlineTreePresenter::~OutlineTreePresenter() From 11de33c6bf40357eafc4771cb0472857180d4967 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 4 Sep 2022 09:26:06 +0200 Subject: [PATCH 014/131] Fixing replacement version script. --- build/make/replace-version-all-files.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/build/make/replace-version-all-files.py b/build/make/replace-version-all-files.py index b0b32213..24473d07 100755 --- a/build/make/replace-version-all-files.py +++ b/build/make/replace-version-all-files.py @@ -32,7 +32,7 @@ "../../build/fedora/fedora-rpm-from-deb.sh", # ^ export MFVERSION="1.53.0" "../../PAD.xml", - # ^ 1.54.0 + # ^ 1.54.0 "../../build/Makefile", # ^ MINDFORGER_VERSION := 1.54.0 "../../build/macos/env.sh", @@ -46,8 +46,10 @@ MINOR_VERSION_FILES = [ "../../lib/src/app_info.h", # ^ #define MINDFORGER_VERSION_DWORD 1,54,0,2 + # ^ #define MINDFORGER_VERSION_MINOR "55" ] + def replace_version( file_path: str, old_version: str, @@ -63,12 +65,13 @@ def replace_version( updated_data = data.replace(old_version, new_version) with open(file_path, 'w') as file: - data = file.write(updated_data) + file.write(updated_data) return raise FileNotFoundError(f"File {file_path} not found!") + def replace_files( file_paths: list, old_version: str, @@ -81,12 +84,13 @@ def replace_files( new_version=new_version, ) + if __name__ == "__main__": old_major_version = "1" - old_minor_version = "54" + old_minor_version = "55" new_major_version = "1" - new_minor_version = "55" + new_minor_version = "56" # common files replacement replace_files( @@ -102,4 +106,9 @@ def replace_files( new_version=f"{new_major_version},{new_minor_version},0", ) -# eof + # special files replacement + replace_version( + file_path=MINOR_VERSION_FILES[0], + old_version=f"\"{old_minor_version}\"", + new_version=f"\"{new_minor_version}\"", + ) From feccf5d99e37c601d5aac265c56dec161ce5f36a Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Thu, 17 Nov 2022 19:29:42 +0100 Subject: [PATCH 015/131] Adding selection of adjacent N on delete of N in the O tree. --- app/src/qt/main_window_presenter.cpp | 27 +++++++++++++++-- app/src/qt/outline_tree_presenter.cpp | 43 ++++++++++++++++++++++----- app/src/qt/outline_tree_presenter.h | 2 ++ 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 4a0ae106..0d6b9d58 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -2467,11 +2467,34 @@ void MainWindowPresenter::doActionNoteForget() QAbstractButton* choosen = msgBox.clickedButton(); if(yes == choosen) { - // TODO getNearNote() getPreviousNote() getNextNote() + // delete selected row & SELECT and adjacent row: + // - row is always deleted INCLUDING children + // - adjacent row must be identified BEFORE deleting the row + // consider the following scenarios: + // - N is the first row in O + // > row 0 w/ chidlren will be deleted and new row 0 + // will be selected AFTER the delete (if any N remains in O) + // - there are Ns above row to be deleted + // > simplest scenario - N above N to be deleted will be selected + // - N is the last N in O, it has children and it is deleted including children + // > no row is selected in this case + + Note* adjacentNote = nullptr; + if(orloj->getOutlineView()->getOutlineTree()->getModel()->rowCount() > 1) { + adjacentNote = orloj->getOutlineView()->getOutlineTree()->getAdjacentNote(); + } + Outline* outline = mind->noteForget(note); mind->remember(outline); orloj->showFacetOutline(orloj->getOutlineView()->getCurrentOutline()); - // TODO if nearNote then select nearNote + + if(orloj->getOutlineView()->getOutlineTree()->getModel()->rowCount()) { + if(adjacentNote) { + orloj->getOutlineView()->selectRowByNote(adjacentNote); + } else { + orloj->getOutlineView()->getOutlineTree()->selectRow(0); + } + } } return; } diff --git a/app/src/qt/outline_tree_presenter.cpp b/app/src/qt/outline_tree_presenter.cpp index e5ee6270..0b355510 100644 --- a/app/src/qt/outline_tree_presenter.cpp +++ b/app/src/qt/outline_tree_presenter.cpp @@ -148,13 +148,17 @@ void OutlineTreePresenter::refresh(Note* note) } } -void OutlineTreePresenter::insertAndSelect(Note* note) +void OutlineTreePresenter::selectRow(int row) { - int row = model->insertNote(note); view->scrollTo(model->index(row, 0)); view->selectRow(row); } +void OutlineTreePresenter::insertAndSelect(Note* note) +{ + this->selectRow(model->insertNote(note)); +} + void OutlineTreePresenter::clearSelection() { view->clearSelection(); @@ -188,18 +192,32 @@ Note* OutlineTreePresenter::getCurrentNote() const // IMPROVE constant w/ a name if(row != -1) { return model->item(row)->data().value(); - } else { - return nullptr; } + + return nullptr; } -void OutlineTreePresenter::slotSelectNextRow() +/** + * @brief Get adjacent N - adjacent above or below N. + * + * @return adjacent note or NULL if no such N. + */ +Note* OutlineTreePresenter::getAdjacentNote() const { int row = getCurrentRow(); - if(row < model->rowCount()-1) { - QModelIndex nextIndex = model->index(row+1, 0); - view->setCurrentIndex(nextIndex); + if(row != NO_ROW) { + if(row > 0) { + return model->item(row-1)->data().value(); + } + // ELSE row == 0 and child row cannot be selected + // as its not clear upfront whether/how many + // children will be deleted + // therefore it is expected that this function + // returns nullptr, so that row 0 can be selected + // AFTER N is deleted (if any row is remaining in O) } + + return nullptr; } void OutlineTreePresenter::slotSelectPreviousRow() @@ -211,4 +229,13 @@ void OutlineTreePresenter::slotSelectPreviousRow() } } +void OutlineTreePresenter::slotSelectNextRow() +{ + int row = getCurrentRow(); + if(row < model->rowCount()-1) { + QModelIndex nextIndex = model->index(row+1, 0); + view->setCurrentIndex(nextIndex); + } +} + } // m8r namespace diff --git a/app/src/qt/outline_tree_presenter.h b/app/src/qt/outline_tree_presenter.h index f9171ff5..dfbbfdca 100644 --- a/app/src/qt/outline_tree_presenter.h +++ b/app/src/qt/outline_tree_presenter.h @@ -59,6 +59,7 @@ class OutlineTreePresenter : public QObject void refresh(Outline* outline, Outline::Patch* patch=nullptr); void refresh(Note* note); + void selectRow(int row); void insertAndSelect(Note* note); void clearSelection(); @@ -67,6 +68,7 @@ class OutlineTreePresenter : public QObject int getCurrentRow() const; Note* getCurrentNote() const; + Note* getAdjacentNote() const; ~OutlineTreePresenter(); From 7dfd8d9da9ac9154d98cec2415f2e917084271b2 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 13 Jan 2023 06:17:07 +0100 Subject: [PATCH 016/131] 2022 -> 2023 --- Changelog | 5 +++-- PAD.xml | 2 +- app/app.pro | 2 +- app/src/qt/assoc_leaderboard_model.cpp | 2 +- app/src/qt/assoc_leaderboard_model.h | 2 +- app/src/qt/assoc_leaderboard_presenter.cpp | 2 +- app/src/qt/assoc_leaderboard_presenter.h | 2 +- app/src/qt/assoc_leaderboard_view.cpp | 2 +- app/src/qt/assoc_leaderboard_view.h | 2 +- app/src/qt/cli_n_breadcrumbs_presenter.cpp | 2 +- app/src/qt/cli_n_breadcrumbs_presenter.h | 2 +- app/src/qt/cli_n_breadcrumbs_view.cpp | 2 +- app/src/qt/cli_n_breadcrumbs_view.h | 2 +- app/src/qt/dashboard_presenter.cpp | 2 +- app/src/qt/dashboard_presenter.h | 2 +- app/src/qt/dashboard_view.cpp | 2 +- app/src/qt/dashboard_view.h | 2 +- app/src/qt/dialogs/add_library_dialog.cpp | 2 +- app/src/qt/dialogs/add_library_dialog.h | 2 +- app/src/qt/dialogs/configuration_dialog.cpp | 2 +- app/src/qt/dialogs/configuration_dialog.h | 2 +- app/src/qt/dialogs/export_csv_file_dialog.cpp | 2 +- app/src/qt/dialogs/export_csv_file_dialog.h | 2 +- app/src/qt/dialogs/export_file_dialog.cpp | 2 +- app/src/qt/dialogs/export_file_dialog.h | 2 +- app/src/qt/dialogs/find_note_by_name_dialog.cpp | 2 +- app/src/qt/dialogs/find_note_by_name_dialog.h | 2 +- app/src/qt/dialogs/find_note_by_tag_dialog.cpp | 2 +- app/src/qt/dialogs/find_note_by_tag_dialog.h | 2 +- app/src/qt/dialogs/find_outline_by_name_dialog.cpp | 2 +- app/src/qt/dialogs/find_outline_by_name_dialog.h | 2 +- app/src/qt/dialogs/find_outline_by_tag_dialog.cpp | 2 +- app/src/qt/dialogs/find_outline_by_tag_dialog.h | 2 +- app/src/qt/dialogs/fts_dialog.cpp | 2 +- app/src/qt/dialogs/fts_dialog.h | 2 +- app/src/qt/dialogs/fts_dialog_presenter.cpp | 2 +- app/src/qt/dialogs/fts_dialog_presenter.h | 2 +- app/src/qt/dialogs/insert_image_dialog.cpp | 2 +- app/src/qt/dialogs/insert_image_dialog.h | 2 +- app/src/qt/dialogs/insert_link_dialog.cpp | 2 +- app/src/qt/dialogs/insert_link_dialog.h | 2 +- app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp | 2 +- app/src/qt/dialogs/ner_choose_tag_types_dialog.h | 2 +- app/src/qt/dialogs/ner_result_dialog.cpp | 2 +- app/src/qt/dialogs/ner_result_dialog.h | 2 +- app/src/qt/dialogs/new_file_dialog.cpp | 2 +- app/src/qt/dialogs/new_file_dialog.h | 2 +- app/src/qt/dialogs/new_repository_dialog.cpp | 2 +- app/src/qt/dialogs/new_repository_dialog.h | 2 +- app/src/qt/dialogs/note_edit_dialog.cpp | 2 +- app/src/qt/dialogs/note_edit_dialog.h | 2 +- app/src/qt/dialogs/note_new_dialog.cpp | 2 +- app/src/qt/dialogs/note_new_dialog.h | 2 +- app/src/qt/dialogs/organizer_new_dialog.cpp | 2 +- app/src/qt/dialogs/organizer_new_dialog.h | 2 +- app/src/qt/dialogs/outline_header_edit_dialog.cpp | 2 +- app/src/qt/dialogs/outline_header_edit_dialog.h | 2 +- app/src/qt/dialogs/outline_new_dialog.cpp | 2 +- app/src/qt/dialogs/outline_new_dialog.h | 2 +- app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp | 2 +- app/src/qt/dialogs/refactor_note_to_outline_dialog.h | 2 +- app/src/qt/dialogs/rows_and_depth_dialog.cpp | 2 +- app/src/qt/dialogs/rows_and_depth_dialog.h | 2 +- app/src/qt/dialogs/scope_dialog.cpp | 2 +- app/src/qt/dialogs/scope_dialog.h | 2 +- app/src/qt/dialogs/terminal_dialog.cpp | 2 +- app/src/qt/dialogs/terminal_dialog.h | 2 +- app/src/qt/exceptions.h | 2 +- app/src/qt/gear/apple_utils.h | 2 +- app/src/qt/gear/async_task_notifications_distributor.cpp | 2 +- app/src/qt/gear/async_task_notifications_distributor.h | 2 +- app/src/qt/gear/qutils.cpp | 2 +- app/src/qt/gear/qutils.h | 2 +- app/src/qt/html_delegate.cpp | 2 +- app/src/qt/html_delegate.h | 2 +- app/src/qt/i18nl10n.cpp | 2 +- app/src/qt/i18nl10n.h | 2 +- app/src/qt/kanban_column_model.cpp | 2 +- app/src/qt/kanban_column_model.h | 2 +- app/src/qt/kanban_column_presenter.cpp | 2 +- app/src/qt/kanban_column_presenter.h | 2 +- app/src/qt/kanban_column_view.cpp | 2 +- app/src/qt/kanban_column_view.h | 2 +- app/src/qt/kanban_presenter.cpp | 2 +- app/src/qt/kanban_presenter.h | 2 +- app/src/qt/kanban_view.cpp | 2 +- app/src/qt/kanban_view.h | 2 +- app/src/qt/look_n_feel.cpp | 2 +- app/src/qt/look_n_feel.h | 2 +- app/src/qt/main_menu_presenter.cpp | 2 +- app/src/qt/main_menu_presenter.h | 2 +- app/src/qt/main_menu_view.cpp | 2 +- app/src/qt/main_menu_view.h | 2 +- app/src/qt/main_toolbar_view.cpp | 2 +- app/src/qt/main_toolbar_view.h | 2 +- app/src/qt/main_window_presenter.cpp | 4 ++-- app/src/qt/main_window_presenter.h | 2 +- app/src/qt/main_window_view.cpp | 2 +- app/src/qt/main_window_view.h | 2 +- app/src/qt/model_meta_definitions.h | 2 +- app/src/qt/navigator/edge.cpp | 2 +- app/src/qt/navigator/edge.h | 2 +- app/src/qt/navigator/navigator_view.cpp | 2 +- app/src/qt/navigator/navigator_view.h | 2 +- app/src/qt/navigator/node.cpp | 2 +- app/src/qt/navigator/node.h | 2 +- app/src/qt/navigator_presenter.cpp | 2 +- app/src/qt/navigator_presenter.h | 2 +- app/src/qt/ner_leaderboard_model.cpp | 2 +- app/src/qt/ner_leaderboard_model.h | 2 +- app/src/qt/ner_leaderboard_view.cpp | 2 +- app/src/qt/ner_leaderboard_view.h | 2 +- app/src/qt/ner_main_window_worker_thread.cpp | 2 +- app/src/qt/ner_main_window_worker_thread.h | 2 +- app/src/qt/note_edit_highlighter.cpp | 2 +- app/src/qt/note_edit_highlighter.h | 2 +- app/src/qt/note_edit_presenter.cpp | 2 +- app/src/qt/note_edit_presenter.h | 2 +- app/src/qt/note_edit_view.cpp | 2 +- app/src/qt/note_edit_view.h | 2 +- app/src/qt/note_editor_view.cpp | 2 +- app/src/qt/note_editor_view.h | 2 +- app/src/qt/note_smart_editor.cpp | 2 +- app/src/qt/note_smart_editor.h | 2 +- app/src/qt/note_view.cpp | 2 +- app/src/qt/note_view.h | 2 +- app/src/qt/note_view_model.cpp | 2 +- app/src/qt/note_view_model.h | 2 +- app/src/qt/note_view_presenter.cpp | 2 +- app/src/qt/note_view_presenter.h | 2 +- app/src/qt/notes_table_model.cpp | 2 +- app/src/qt/notes_table_model.h | 2 +- app/src/qt/notes_table_presenter.cpp | 2 +- app/src/qt/notes_table_presenter.h | 2 +- app/src/qt/notes_table_view.cpp | 2 +- app/src/qt/notes_table_view.h | 2 +- app/src/qt/organizer_presenter.cpp | 2 +- app/src/qt/organizer_presenter.h | 2 +- app/src/qt/organizer_quadrant_model.cpp | 2 +- app/src/qt/organizer_quadrant_model.h | 2 +- app/src/qt/organizer_quadrant_presenter.cpp | 2 +- app/src/qt/organizer_quadrant_presenter.h | 2 +- app/src/qt/organizer_quadrant_view.cpp | 2 +- app/src/qt/organizer_quadrant_view.h | 2 +- app/src/qt/organizer_view.cpp | 2 +- app/src/qt/organizer_view.h | 2 +- app/src/qt/organizers_table_model.cpp | 2 +- app/src/qt/organizers_table_model.h | 2 +- app/src/qt/organizers_table_presenter.cpp | 2 +- app/src/qt/organizers_table_presenter.h | 2 +- app/src/qt/organizers_table_view.cpp | 2 +- app/src/qt/organizers_table_view.h | 2 +- app/src/qt/orloj_presenter.cpp | 2 +- app/src/qt/orloj_presenter.h | 2 +- app/src/qt/orloj_view.cpp | 2 +- app/src/qt/orloj_view.h | 2 +- app/src/qt/outline_header_edit_presenter.cpp | 2 +- app/src/qt/outline_header_edit_presenter.h | 2 +- app/src/qt/outline_header_edit_view.cpp | 2 +- app/src/qt/outline_header_edit_view.h | 2 +- app/src/qt/outline_header_view.cpp | 2 +- app/src/qt/outline_header_view.h | 2 +- app/src/qt/outline_header_view_model.cpp | 2 +- app/src/qt/outline_header_view_model.h | 2 +- app/src/qt/outline_header_view_presenter.cpp | 2 +- app/src/qt/outline_header_view_presenter.h | 2 +- app/src/qt/outline_tree_model.cpp | 2 +- app/src/qt/outline_tree_model.h | 2 +- app/src/qt/outline_tree_presenter.cpp | 2 +- app/src/qt/outline_tree_presenter.h | 2 +- app/src/qt/outline_tree_view.cpp | 2 +- app/src/qt/outline_tree_view.h | 2 +- app/src/qt/outline_view.cpp | 2 +- app/src/qt/outline_view.h | 2 +- app/src/qt/outline_view_presenter.cpp | 2 +- app/src/qt/outline_view_presenter.h | 2 +- app/src/qt/outline_view_splitter.cpp | 2 +- app/src/qt/outline_view_splitter.h | 2 +- app/src/qt/outlines_table_model.cpp | 2 +- app/src/qt/outlines_table_model.h | 2 +- app/src/qt/outlines_table_presenter.cpp | 2 +- app/src/qt/outlines_table_presenter.h | 2 +- app/src/qt/outlines_table_view.cpp | 2 +- app/src/qt/outlines_table_view.h | 2 +- app/src/qt/palette.h | 2 +- app/src/qt/qt_commons.h | 2 +- app/src/qt/recent_notes_table_model.cpp | 2 +- app/src/qt/recent_notes_table_model.h | 2 +- app/src/qt/recent_notes_table_presenter.cpp | 2 +- app/src/qt/recent_notes_table_presenter.h | 2 +- app/src/qt/recent_notes_table_view.cpp | 2 +- app/src/qt/recent_notes_table_view.h | 2 +- app/src/qt/spelling/dictionary_manager.cpp | 2 +- app/src/qt/spelling/dictionary_manager.h | 2 +- app/src/qt/spelling/dictionary_provider_hunspell.cpp | 2 +- app/src/qt/status_bar_presenter.cpp | 2 +- app/src/qt/status_bar_presenter.h | 2 +- app/src/qt/status_bar_view.cpp | 2 +- app/src/qt/status_bar_view.h | 2 +- app/src/qt/tags_table_model.cpp | 2 +- app/src/qt/tags_table_model.h | 2 +- app/src/qt/tags_table_presenter.cpp | 2 +- app/src/qt/tags_table_presenter.h | 2 +- app/src/qt/tags_table_view.cpp | 2 +- app/src/qt/tags_table_view.h | 2 +- app/src/qt/web_engine_page_link_navigation_policy.cpp | 2 +- app/src/qt/web_engine_page_link_navigation_policy.h | 2 +- app/src/qt/widgets/edit_buttons_panel.cpp | 2 +- app/src/qt/widgets/edit_buttons_panel.h | 2 +- app/src/qt/widgets/edit_name_panel.cpp | 2 +- app/src/qt/widgets/edit_name_panel.h | 2 +- app/src/qt/widgets/edit_tags_panel.cpp | 2 +- app/src/qt/widgets/edit_tags_panel.h | 2 +- app/src/qt/widgets/importance_combo_box.cpp | 2 +- app/src/qt/widgets/importance_combo_box.h | 2 +- app/src/qt/widgets/labeled_edit_line_panel.cpp | 2 +- app/src/qt/widgets/labeled_edit_line_panel.h | 2 +- app/src/qt/widgets/line_number_panel.cpp | 2 +- app/src/qt/widgets/line_number_panel.h | 2 +- app/src/qt/widgets/mf_widgets.cpp | 2 +- app/src/qt/widgets/mf_widgets.h | 2 +- app/src/qt/widgets/urgency_combo_box.cpp | 2 +- app/src/qt/widgets/urgency_combo_box.h | 2 +- app/src/qt/widgets/view_to_edit_buttons_panel.cpp | 2 +- app/src/qt/widgets/view_to_edit_buttons_panel.h | 2 +- app/test/qt/mindforger-gui-tests.pro | 2 +- appveyor.yml | 2 +- build/Makefile | 2 +- build/build-win-app.bat | 2 +- build/build-win-cmake.bat | 2 +- build/build-win-installer.bat | 2 +- build/build-win-unit-tests.bat | 2 +- build/debian/debian-aptly-add-deb.sh | 2 +- build/debian/debian-make-deb.sh | 2 +- build/debian/debian-mentors-upload.sh | 2 +- build/debian/debian/changelog | 2 +- build/debian/debian/copyright | 2 +- build/doc/mf-doc-to-wiki.py | 2 +- build/docker/dockerized-mindforger-run.sh | 2 +- build/docker/dockerized-mindforger-start.sh | 2 +- build/docker/mindforger/Dockerfile | 4 ++-- build/env.bat | 2 +- build/fedora/fedora-distro-setup.sh | 2 +- build/fedora/fedora-rpm-from-deb.sh | 2 +- build/macos/cmark-gfm-build.sh | 2 +- build/macos/dmg-package-build.sh | 2 +- build/macos/env.sh | 2 +- build/macos/mindforger-build.sh | 2 +- build/make/check-n-fix-codestyle.py | 8 ++++---- build/make/doc-mf-screenshot-size-window.sh | 2 +- build/make/gen-64k-lines-test-md.py | 2 +- build/make/gen-cpp-class.py | 6 +++--- build/make/gen-cpp-deletes.py | 2 +- build/make/gen-cpp-menu.py | 2 +- build/make/gen-cpp-ui-class.py | 6 +++--- build/make/gen-l10n.sh | 2 +- build/make/gen-qt-project.prefix | 2 +- build/make/gen-qt-project.sh | 2 +- build/make/l10n-edit-and-release.sh | 2 +- build/make/l10n-update-strings.sh | 2 +- build/make/make-demo-repo.sh | 2 +- build/make/make-mf-snapshot.sh | 2 +- build/make/make-qt-webengine.sh | 2 +- build/make/profile-gprof.sh | 2 +- build/make/replace-version-all-files.py | 2 +- build/make/statistic.sh | 2 +- build/make/test-all.sh | 2 +- build/make/test-autolinking.sh | 2 +- build/make/test-gui.sh | 2 +- build/make/test-init-mf-repo-in-tmp.sh | 2 +- build/make/test-l10n.sh | 2 +- build/make/test-lib-units.sh | 2 +- build/release/release-tgz-deb-rpm-exe.sh | 2 +- build/run-win-app.bat | 2 +- build/run-win-unit-tests.bat | 2 +- build/tarball/tarball-build.sh | 2 +- build/travis-ci/.travis.yml | 2 +- build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh | 2 +- build/ubuntu/build-all-clean-system.sh | 2 +- build/ubuntu/debian/changelog | 2 +- build/ubuntu/debian/copyright | 2 +- build/ubuntu/ubuntu-launchpad-releases-from-beast.sh | 2 +- build/ubuntu/ubuntu-pbuilder-add-distros.sh | 2 +- build/windows/build-win-installer.bat | 2 +- deps/zlib-win/include/zconf.h | 2 +- lib/lib.pro | 2 +- lib/src/app_info.h | 2 +- lib/src/compilation.h | 2 +- lib/src/config/color.h | 2 +- lib/src/config/configuration.cpp | 2 +- lib/src/config/configuration.h | 2 +- lib/src/config/palette.cpp | 2 +- lib/src/config/palette.h | 2 +- lib/src/config/repository.cpp | 2 +- lib/src/config/repository.h | 2 +- lib/src/config/repository_configuration.cpp | 2 +- lib/src/config/repository_configuration.h | 2 +- lib/src/config/time_scope.cpp | 2 +- lib/src/config/time_scope.h | 2 +- lib/src/debug.h | 2 +- lib/src/definitions.h | 2 +- lib/src/exceptions.h | 2 +- lib/src/gear/async_utils.cpp | 2 +- lib/src/gear/async_utils.h | 2 +- lib/src/gear/datetime_utils.cpp | 2 +- lib/src/gear/datetime_utils.h | 2 +- lib/src/gear/file_utils.cpp | 2 +- lib/src/gear/file_utils.h | 2 +- lib/src/gear/hash_map.h | 2 +- lib/src/gear/lang_utils.h | 2 +- lib/src/gear/math_utils.cpp | 2 +- lib/src/gear/math_utils.h | 2 +- lib/src/gear/string_utils.cpp | 2 +- lib/src/gear/string_utils.h | 2 +- lib/src/gear/trie.cpp | 2 +- lib/src/gear/trie.h | 2 +- lib/src/install/installer.cpp | 2 +- lib/src/install/installer.h | 2 +- lib/src/mind/ai/aa_model.cpp | 2 +- lib/src/mind/ai/aa_model.h | 2 +- lib/src/mind/ai/aa_notes_feature.cpp | 2 +- lib/src/mind/ai/aa_notes_feature.h | 2 +- lib/src/mind/ai/ai.cpp | 2 +- lib/src/mind/ai/ai.h | 2 +- lib/src/mind/ai/ai_aa.h | 2 +- lib/src/mind/ai/ai_aa_bow.cpp | 2 +- lib/src/mind/ai/ai_aa_bow.h | 2 +- lib/src/mind/ai/ai_aa_weighted_fts.cpp | 2 +- lib/src/mind/ai/ai_aa_weighted_fts.h | 2 +- lib/src/mind/ai/autolinking/autolinking_mind.cpp | 2 +- lib/src/mind/ai/autolinking/autolinking_mind.h | 2 +- .../cmark_aho_corasick_block_autolinking_preprocessor.cpp | 2 +- .../cmark_aho_corasick_block_autolinking_preprocessor.h | 2 +- .../cmark_trie_line_autolinking_preprocessor.cpp | 2 +- .../cmark_trie_line_autolinking_preprocessor.h | 2 +- .../ai/autolinking/naive_autolinking_preprocessor.cpp | 2 +- .../mind/ai/autolinking/naive_autolinking_preprocessor.h | 2 +- lib/src/mind/ai/autolinking_preprocessor.cpp | 2 +- lib/src/mind/ai/autolinking_preprocessor.h | 2 +- lib/src/mind/ai/nlp/bag_of_words.cpp | 2 +- lib/src/mind/ai/nlp/bag_of_words.h | 2 +- lib/src/mind/ai/nlp/char_provider.h | 2 +- lib/src/mind/ai/nlp/common_words_blacklist.cpp | 2 +- lib/src/mind/ai/nlp/common_words_blacklist.h | 2 +- lib/src/mind/ai/nlp/lexicon.cpp | 2 +- lib/src/mind/ai/nlp/lexicon.h | 2 +- lib/src/mind/ai/nlp/markdown_tokenizer.cpp | 2 +- lib/src/mind/ai/nlp/markdown_tokenizer.h | 2 +- lib/src/mind/ai/nlp/named_entity_recognition.cpp | 2 +- lib/src/mind/ai/nlp/named_entity_recognition.h | 2 +- lib/src/mind/ai/nlp/ner_named_entity.cpp | 2 +- lib/src/mind/ai/nlp/ner_named_entity.h | 2 +- lib/src/mind/ai/nlp/note_char_provider.cpp | 2 +- lib/src/mind/ai/nlp/note_char_provider.h | 2 +- lib/src/mind/ai/nlp/outline_char_provider.cpp | 2 +- lib/src/mind/ai/nlp/outline_char_provider.h | 2 +- lib/src/mind/ai/nlp/stemmer/stemmer.cpp | 2 +- lib/src/mind/ai/nlp/stemmer/stemmer.h | 2 +- lib/src/mind/ai/nlp/string_char_provider.cpp | 2 +- lib/src/mind/ai/nlp/string_char_provider.h | 2 +- lib/src/mind/ai/nlp/word_frequency_list.cpp | 2 +- lib/src/mind/ai/nlp/word_frequency_list.h | 2 +- lib/src/mind/aspect/aspect.h | 2 +- lib/src/mind/aspect/mind_scope_aspect.cpp | 2 +- lib/src/mind/aspect/mind_scope_aspect.h | 2 +- lib/src/mind/aspect/tag_scope_aspect.cpp | 2 +- lib/src/mind/aspect/tag_scope_aspect.h | 2 +- lib/src/mind/aspect/time_scope_aspect.cpp | 2 +- lib/src/mind/aspect/time_scope_aspect.h | 2 +- lib/src/mind/associated_notes.cpp | 2 +- lib/src/mind/associated_notes.h | 2 +- lib/src/mind/dikw/dikw_pyramid.cpp | 2 +- lib/src/mind/dikw/dikw_pyramid.h | 2 +- lib/src/mind/dikw/filesystem_information.cpp | 2 +- lib/src/mind/dikw/filesystem_information.h | 2 +- lib/src/mind/dikw/information.cpp | 2 +- lib/src/mind/dikw/information.h | 2 +- lib/src/mind/galaxy.cpp | 2 +- lib/src/mind/galaxy.h | 2 +- lib/src/mind/knowledge_graph.cpp | 2 +- lib/src/mind/knowledge_graph.h | 2 +- lib/src/mind/limbo.cpp | 2 +- lib/src/mind/limbo.h | 2 +- lib/src/mind/memory.cpp | 2 +- lib/src/mind/memory.h | 2 +- lib/src/mind/memory_dwell.cpp | 2 +- lib/src/mind/memory_dwell.h | 2 +- lib/src/mind/mind.cpp | 2 +- lib/src/mind/mind.h | 2 +- lib/src/mind/mind_listener.h | 2 +- lib/src/mind/ontology/ontology.cpp | 2 +- lib/src/mind/ontology/ontology.h | 2 +- lib/src/mind/ontology/ontology_vocabulary.h | 2 +- lib/src/mind/ontology/taxonomy.h | 2 +- lib/src/mind/ontology/thing_class_rel_triple.cpp | 2 +- lib/src/mind/ontology/thing_class_rel_triple.h | 2 +- lib/src/mind/working_memory.cpp | 2 +- lib/src/mind/working_memory.h | 2 +- lib/src/model/eisenhower_matrix.cpp | 2 +- lib/src/model/eisenhower_matrix.h | 2 +- lib/src/model/kanban.cpp | 2 +- lib/src/model/kanban.h | 2 +- lib/src/model/link.cpp | 2 +- lib/src/model/link.h | 2 +- lib/src/model/note.cpp | 2 +- lib/src/model/note.h | 2 +- lib/src/model/note_type.cpp | 2 +- lib/src/model/note_type.h | 2 +- lib/src/model/organizer.cpp | 2 +- lib/src/model/organizer.h | 2 +- lib/src/model/outline.cpp | 2 +- lib/src/model/outline.h | 2 +- lib/src/model/outline_type.cpp | 2 +- lib/src/model/outline_type.h | 2 +- lib/src/model/resource_types.h | 2 +- lib/src/model/stencil.cpp | 2 +- lib/src/model/stencil.h | 2 +- lib/src/model/tag.cpp | 2 +- lib/src/model/tag.h | 2 +- lib/src/persistence/configuration_persistence.cpp | 2 +- lib/src/persistence/configuration_persistence.h | 2 +- lib/src/persistence/filesystem_persistence.cpp | 2 +- lib/src/persistence/filesystem_persistence.h | 2 +- lib/src/persistence/persistence.cpp | 2 +- lib/src/persistence/persistence.h | 2 +- lib/src/repository_indexer.cpp | 2 +- lib/src/repository_indexer.h | 2 +- .../representations/csv/csv_outline_representation.cpp | 2 +- lib/src/representations/csv/csv_outline_representation.h | 2 +- lib/src/representations/html/html_document.cpp | 2 +- lib/src/representations/html/html_document.h | 2 +- .../representations/html/html_outline_representation.cpp | 2 +- .../representations/html/html_outline_representation.h | 2 +- .../markdown/cmark_gfm_markdown_transcoder.cpp | 2 +- .../markdown/cmark_gfm_markdown_transcoder.h | 2 +- lib/src/representations/markdown/markdown_ast_node.cpp | 2 +- lib/src/representations/markdown/markdown_ast_node.h | 2 +- .../markdown/markdown_configuration_representation.cpp | 2 +- .../markdown/markdown_configuration_representation.h | 2 +- lib/src/representations/markdown/markdown_document.cpp | 2 +- lib/src/representations/markdown/markdown_document.h | 2 +- .../markdown/markdown_document_representation.cpp | 2 +- .../markdown/markdown_document_representation.h | 2 +- lib/src/representations/markdown/markdown_lexem.cpp | 2 +- lib/src/representations/markdown/markdown_lexem.h | 2 +- .../representations/markdown/markdown_lexer_sections.cpp | 2 +- .../representations/markdown/markdown_lexer_sections.h | 2 +- .../representations/markdown/markdown_note_metadata.cpp | 2 +- lib/src/representations/markdown/markdown_note_metadata.h | 2 +- .../markdown/markdown_outline_metadata.cpp | 2 +- .../representations/markdown/markdown_outline_metadata.h | 2 +- .../markdown/markdown_outline_representation.cpp | 2 +- .../markdown/markdown_outline_representation.h | 2 +- .../representations/markdown/markdown_parser_sections.cpp | 2 +- .../representations/markdown/markdown_parser_sections.h | 2 +- .../markdown_repository_configuration_representation.cpp | 2 +- .../markdown_repository_configuration_representation.h | 2 +- .../markdown/markdown_section_metadata.cpp | 2 +- .../representations/markdown/markdown_section_metadata.h | 2 +- lib/src/representations/markdown/markdown_transcoder.h | 2 +- lib/src/representations/outline_representation.cpp | 2 +- lib/src/representations/outline_representation.h | 2 +- lib/src/representations/representation_interceptor.h | 2 +- lib/src/representations/representation_type.h | 2 +- .../twiki/twiki_outline_representation.cpp | 2 +- .../representations/twiki/twiki_outline_representation.h | 2 +- lib/src/representations/unicode.cpp | 2 +- lib/src/representations/unicode.h | 2 +- lib/src/version.h | 2 +- lib/test/benchmark/ai_benchmark.cpp | 2 +- lib/test/benchmark/html_benchmark.cpp | 2 +- lib/test/benchmark/markdown_benchmark.cpp | 2 +- lib/test/benchmark/trie_benchmark.cpp | 2 +- lib/test/mindforger-lib-unit-tests.pro | 2 +- lib/test/src/ai/autolinking_cmark_test.cpp | 2 +- lib/test/src/ai/autolinking_test.cpp | 2 +- lib/test/src/ai/nlp_test.cpp | 2 +- lib/test/src/config/configuration_test.cpp | 2 +- lib/test/src/gear/datetime_test.cpp | 2 +- lib/test/src/gear/file_utils_test.cpp | 2 +- lib/test/src/gear/string_utils_test.cpp | 2 +- lib/test/src/gear/trie_test.cpp | 2 +- lib/test/src/html/html_test.cpp | 2 +- lib/test/src/indexer/repository_indexer_test.cpp | 2 +- lib/test/src/markdown/markdown_test.cpp | 2 +- lib/test/src/mind/filesystem_information_test.cpp | 2 +- lib/test/src/mind/fts_test.cpp | 2 +- lib/test/src/mind/memory_test.cpp | 2 +- lib/test/src/mind/mind_test.cpp | 2 +- lib/test/src/mind/note_test.cpp | 2 +- lib/test/src/mind/organizer_test.cpp | 2 +- lib/test/src/mind/outline_test.cpp | 2 +- lib/test/src/mindforger_lib_unit_tests.cpp | 2 +- lib/test/src/src.pro | 2 +- lib/test/src/test_utils.cpp | 2 +- lib/test/src/test_utils.h | 2 +- mindforger.pro | 2 +- 497 files changed, 508 insertions(+), 507 deletions(-) diff --git a/Changelog b/Changelog index 662e489b..9a436d19 100644 --- a/Changelog +++ b/Changelog @@ -1,6 +1,7 @@ -2022-??-?? Martin Dvorak +2023-??-?? Martin Dvorak - * Released v1.54.0 - ... + * Released v1.55.0 - delete of a Note in the outline view keeps selected + an adjacent Note, improved page up/page down navigation in table widgets. 2022-03-07 Martin Dvorak diff --git a/PAD.xml b/PAD.xml index 248bc608..b04058a1 100644 --- a/PAD.xml +++ b/PAD.xml @@ -37,7 +37,7 @@ 1.55.0 03 07 - 2022 + 2023 diff --git a/app/app.pro b/app/app.pro index 7d6fc358..4e6636cb 100644 --- a/app/app.pro +++ b/app/app.pro @@ -1,6 +1,6 @@ # app.pro Qt project file for MindForger Qt-based frontend # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_model.cpp b/app/src/qt/assoc_leaderboard_model.cpp index e1a47dfd..7cb71f86 100644 --- a/app/src/qt/assoc_leaderboard_model.cpp +++ b/app/src/qt/assoc_leaderboard_model.cpp @@ -1,7 +1,7 @@ /* assoc_leaderboard_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_model.h b/app/src/qt/assoc_leaderboard_model.h index b9392198..b3a3a6d3 100644 --- a/app/src/qt/assoc_leaderboard_model.h +++ b/app/src/qt/assoc_leaderboard_model.h @@ -1,7 +1,7 @@ /* assoc_leaderboard_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_presenter.cpp b/app/src/qt/assoc_leaderboard_presenter.cpp index d0e9d2e2..3b952c46 100644 --- a/app/src/qt/assoc_leaderboard_presenter.cpp +++ b/app/src/qt/assoc_leaderboard_presenter.cpp @@ -1,7 +1,7 @@ /* assoc_leaderboard_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_presenter.h b/app/src/qt/assoc_leaderboard_presenter.h index 8bf9a13d..8cdb2116 100644 --- a/app/src/qt/assoc_leaderboard_presenter.h +++ b/app/src/qt/assoc_leaderboard_presenter.h @@ -1,7 +1,7 @@ /* assoc_leaderboard_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_view.cpp b/app/src/qt/assoc_leaderboard_view.cpp index ce4c58fd..ac00b58b 100644 --- a/app/src/qt/assoc_leaderboard_view.cpp +++ b/app/src/qt/assoc_leaderboard_view.cpp @@ -1,7 +1,7 @@ /* assoc_leaderboard_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_view.h b/app/src/qt/assoc_leaderboard_view.h index 6194e3c6..cfaf8e5d 100644 --- a/app/src/qt/assoc_leaderboard_view.h +++ b/app/src/qt/assoc_leaderboard_view.h @@ -1,7 +1,7 @@ /* assoc_leaderboard_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.cpp b/app/src/qt/cli_n_breadcrumbs_presenter.cpp index e1132028..d3712a03 100644 --- a/app/src/qt/cli_n_breadcrumbs_presenter.cpp +++ b/app/src/qt/cli_n_breadcrumbs_presenter.cpp @@ -1,7 +1,7 @@ /* cli_n_breadcrumbs_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.h b/app/src/qt/cli_n_breadcrumbs_presenter.h index f66923d8..82bee235 100644 --- a/app/src/qt/cli_n_breadcrumbs_presenter.h +++ b/app/src/qt/cli_n_breadcrumbs_presenter.h @@ -1,7 +1,7 @@ /* cli_n_breadcrumbs_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/cli_n_breadcrumbs_view.cpp b/app/src/qt/cli_n_breadcrumbs_view.cpp index 2da1a3c5..d9f3db1f 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.cpp +++ b/app/src/qt/cli_n_breadcrumbs_view.cpp @@ -1,7 +1,7 @@ /* cli_n_breadcrumbs_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/cli_n_breadcrumbs_view.h b/app/src/qt/cli_n_breadcrumbs_view.h index 8b60cc58..a02b6026 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.h +++ b/app/src/qt/cli_n_breadcrumbs_view.h @@ -1,7 +1,7 @@ /* cli_n_breadcrumbs_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dashboard_presenter.cpp b/app/src/qt/dashboard_presenter.cpp index e91b590d..9de6aaad 100644 --- a/app/src/qt/dashboard_presenter.cpp +++ b/app/src/qt/dashboard_presenter.cpp @@ -1,7 +1,7 @@ /* dashboard_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dashboard_presenter.h b/app/src/qt/dashboard_presenter.h index 1f4f63b7..549c848c 100644 --- a/app/src/qt/dashboard_presenter.h +++ b/app/src/qt/dashboard_presenter.h @@ -1,7 +1,7 @@ /* dashboard_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dashboard_view.cpp b/app/src/qt/dashboard_view.cpp index d6ffca33..9eeb3fea 100644 --- a/app/src/qt/dashboard_view.cpp +++ b/app/src/qt/dashboard_view.cpp @@ -1,7 +1,7 @@ /* organizer_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dashboard_view.h b/app/src/qt/dashboard_view.h index 1ad47960..e4d8a8ff 100644 --- a/app/src/qt/dashboard_view.h +++ b/app/src/qt/dashboard_view.h @@ -1,7 +1,7 @@ /* dashboard_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/add_library_dialog.cpp b/app/src/qt/dialogs/add_library_dialog.cpp index 54fd7695..4b126253 100644 --- a/app/src/qt/dialogs/add_library_dialog.cpp +++ b/app/src/qt/dialogs/add_library_dialog.cpp @@ -1,7 +1,7 @@ /* add_library_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/add_library_dialog.h b/app/src/qt/dialogs/add_library_dialog.h index 1a84ee8c..ec15beac 100644 --- a/app/src/qt/dialogs/add_library_dialog.h +++ b/app/src/qt/dialogs/add_library_dialog.h @@ -1,7 +1,7 @@ /* add_library_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/configuration_dialog.cpp b/app/src/qt/dialogs/configuration_dialog.cpp index fc11839d..4235109c 100644 --- a/app/src/qt/dialogs/configuration_dialog.cpp +++ b/app/src/qt/dialogs/configuration_dialog.cpp @@ -1,7 +1,7 @@ /* configuration_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/configuration_dialog.h b/app/src/qt/dialogs/configuration_dialog.h index b70de021..a753d8a8 100644 --- a/app/src/qt/dialogs/configuration_dialog.h +++ b/app/src/qt/dialogs/configuration_dialog.h @@ -1,7 +1,7 @@ /* configuration_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/export_csv_file_dialog.cpp b/app/src/qt/dialogs/export_csv_file_dialog.cpp index 608bdf6e..5a2b050e 100644 --- a/app/src/qt/dialogs/export_csv_file_dialog.cpp +++ b/app/src/qt/dialogs/export_csv_file_dialog.cpp @@ -1,7 +1,7 @@ /* export_csv_file_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/export_csv_file_dialog.h b/app/src/qt/dialogs/export_csv_file_dialog.h index 3178705b..92a670e2 100644 --- a/app/src/qt/dialogs/export_csv_file_dialog.h +++ b/app/src/qt/dialogs/export_csv_file_dialog.h @@ -1,7 +1,7 @@ /* export_csv_file_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/export_file_dialog.cpp b/app/src/qt/dialogs/export_file_dialog.cpp index b8a7d609..6f53d6f8 100644 --- a/app/src/qt/dialogs/export_file_dialog.cpp +++ b/app/src/qt/dialogs/export_file_dialog.cpp @@ -1,7 +1,7 @@ /* export_file_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/export_file_dialog.h b/app/src/qt/dialogs/export_file_dialog.h index 8d82cc23..8dd8520b 100644 --- a/app/src/qt/dialogs/export_file_dialog.h +++ b/app/src/qt/dialogs/export_file_dialog.h @@ -1,7 +1,7 @@ /* export_file_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_note_by_name_dialog.cpp b/app/src/qt/dialogs/find_note_by_name_dialog.cpp index ebe8d5d1..3dd3522a 100644 --- a/app/src/qt/dialogs/find_note_by_name_dialog.cpp +++ b/app/src/qt/dialogs/find_note_by_name_dialog.cpp @@ -1,7 +1,7 @@ /* find_note_by_name_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_note_by_name_dialog.h b/app/src/qt/dialogs/find_note_by_name_dialog.h index 63f37729..04c33432 100644 --- a/app/src/qt/dialogs/find_note_by_name_dialog.h +++ b/app/src/qt/dialogs/find_note_by_name_dialog.h @@ -1,7 +1,7 @@ /* find_note_by_name_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_note_by_tag_dialog.cpp b/app/src/qt/dialogs/find_note_by_tag_dialog.cpp index 69fb90dc..b5e4bd7c 100644 --- a/app/src/qt/dialogs/find_note_by_tag_dialog.cpp +++ b/app/src/qt/dialogs/find_note_by_tag_dialog.cpp @@ -1,7 +1,7 @@ /* find_note_by_tag_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_note_by_tag_dialog.h b/app/src/qt/dialogs/find_note_by_tag_dialog.h index 0370b31d..2a73f59e 100644 --- a/app/src/qt/dialogs/find_note_by_tag_dialog.h +++ b/app/src/qt/dialogs/find_note_by_tag_dialog.h @@ -1,7 +1,7 @@ /* find_note_by_tag_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_outline_by_name_dialog.cpp b/app/src/qt/dialogs/find_outline_by_name_dialog.cpp index a9f535ee..d9ad288e 100644 --- a/app/src/qt/dialogs/find_outline_by_name_dialog.cpp +++ b/app/src/qt/dialogs/find_outline_by_name_dialog.cpp @@ -1,7 +1,7 @@ /* find_outline_by_name_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_outline_by_name_dialog.h b/app/src/qt/dialogs/find_outline_by_name_dialog.h index 1407f1d3..1510e237 100644 --- a/app/src/qt/dialogs/find_outline_by_name_dialog.h +++ b/app/src/qt/dialogs/find_outline_by_name_dialog.h @@ -1,7 +1,7 @@ /* find_outline_by_name_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp b/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp index 30fe9f69..e46be327 100644 --- a/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp +++ b/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp @@ -1,7 +1,7 @@ /* find_outline_by_tag.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_outline_by_tag_dialog.h b/app/src/qt/dialogs/find_outline_by_tag_dialog.h index 9316b6d7..b0241280 100644 --- a/app/src/qt/dialogs/find_outline_by_tag_dialog.h +++ b/app/src/qt/dialogs/find_outline_by_tag_dialog.h @@ -1,7 +1,7 @@ /* find_outline_by_tag.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/fts_dialog.cpp b/app/src/qt/dialogs/fts_dialog.cpp index 8d5d78b8..560de291 100644 --- a/app/src/qt/dialogs/fts_dialog.cpp +++ b/app/src/qt/dialogs/fts_dialog.cpp @@ -1,7 +1,7 @@ /* fts_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/fts_dialog.h b/app/src/qt/dialogs/fts_dialog.h index ca4a5129..3fc367ab 100644 --- a/app/src/qt/dialogs/fts_dialog.h +++ b/app/src/qt/dialogs/fts_dialog.h @@ -1,7 +1,7 @@ /* fts_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/fts_dialog_presenter.cpp b/app/src/qt/dialogs/fts_dialog_presenter.cpp index 6060c650..22b9f95d 100644 --- a/app/src/qt/dialogs/fts_dialog_presenter.cpp +++ b/app/src/qt/dialogs/fts_dialog_presenter.cpp @@ -1,7 +1,7 @@ /* fts_dialog_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/fts_dialog_presenter.h b/app/src/qt/dialogs/fts_dialog_presenter.h index e8ba0249..7b3e2a37 100644 --- a/app/src/qt/dialogs/fts_dialog_presenter.h +++ b/app/src/qt/dialogs/fts_dialog_presenter.h @@ -1,7 +1,7 @@ /* fts_dialog_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/insert_image_dialog.cpp b/app/src/qt/dialogs/insert_image_dialog.cpp index ea3bda75..e3eec24e 100644 --- a/app/src/qt/dialogs/insert_image_dialog.cpp +++ b/app/src/qt/dialogs/insert_image_dialog.cpp @@ -1,7 +1,7 @@ /* insert_image_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/insert_image_dialog.h b/app/src/qt/dialogs/insert_image_dialog.h index 12b226cd..e18d3ddc 100644 --- a/app/src/qt/dialogs/insert_image_dialog.h +++ b/app/src/qt/dialogs/insert_image_dialog.h @@ -1,7 +1,7 @@ /* insert_image_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/insert_link_dialog.cpp b/app/src/qt/dialogs/insert_link_dialog.cpp index d933213c..5d13168f 100644 --- a/app/src/qt/dialogs/insert_link_dialog.cpp +++ b/app/src/qt/dialogs/insert_link_dialog.cpp @@ -1,7 +1,7 @@ /* insert_link_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/insert_link_dialog.h b/app/src/qt/dialogs/insert_link_dialog.h index 53799f73..63b41fd3 100644 --- a/app/src/qt/dialogs/insert_link_dialog.h +++ b/app/src/qt/dialogs/insert_link_dialog.h @@ -1,7 +1,7 @@ /* insert_link_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp b/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp index 61684e22..153511f0 100644 --- a/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp +++ b/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp @@ -1,7 +1,7 @@ /* ner_choose_tag_types_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/ner_choose_tag_types_dialog.h b/app/src/qt/dialogs/ner_choose_tag_types_dialog.h index 79279897..15dae1a1 100644 --- a/app/src/qt/dialogs/ner_choose_tag_types_dialog.h +++ b/app/src/qt/dialogs/ner_choose_tag_types_dialog.h @@ -1,7 +1,7 @@ /* ner_choose_tag_types_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/ner_result_dialog.cpp b/app/src/qt/dialogs/ner_result_dialog.cpp index df6b8368..a3e597d1 100644 --- a/app/src/qt/dialogs/ner_result_dialog.cpp +++ b/app/src/qt/dialogs/ner_result_dialog.cpp @@ -1,7 +1,7 @@ /* ner_result_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/ner_result_dialog.h b/app/src/qt/dialogs/ner_result_dialog.h index f9e29ace..ef382525 100644 --- a/app/src/qt/dialogs/ner_result_dialog.h +++ b/app/src/qt/dialogs/ner_result_dialog.h @@ -1,7 +1,7 @@ /* ner_result_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/new_file_dialog.cpp b/app/src/qt/dialogs/new_file_dialog.cpp index 330174ce..d18b895e 100644 --- a/app/src/qt/dialogs/new_file_dialog.cpp +++ b/app/src/qt/dialogs/new_file_dialog.cpp @@ -1,7 +1,7 @@ /* new_file_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/new_file_dialog.h b/app/src/qt/dialogs/new_file_dialog.h index af5c5e68..c1b6d43b 100644 --- a/app/src/qt/dialogs/new_file_dialog.h +++ b/app/src/qt/dialogs/new_file_dialog.h @@ -1,7 +1,7 @@ /* new_file_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/new_repository_dialog.cpp b/app/src/qt/dialogs/new_repository_dialog.cpp index 7b3c62d1..d46c6c8e 100644 --- a/app/src/qt/dialogs/new_repository_dialog.cpp +++ b/app/src/qt/dialogs/new_repository_dialog.cpp @@ -1,7 +1,7 @@ /* new_repository_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/new_repository_dialog.h b/app/src/qt/dialogs/new_repository_dialog.h index 5591939d..7457a2e3 100644 --- a/app/src/qt/dialogs/new_repository_dialog.h +++ b/app/src/qt/dialogs/new_repository_dialog.h @@ -1,7 +1,7 @@ /* new_repository_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/note_edit_dialog.cpp b/app/src/qt/dialogs/note_edit_dialog.cpp index c89ee77e..228c3d13 100644 --- a/app/src/qt/dialogs/note_edit_dialog.cpp +++ b/app/src/qt/dialogs/note_edit_dialog.cpp @@ -1,7 +1,7 @@ /* note_edit_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/note_edit_dialog.h b/app/src/qt/dialogs/note_edit_dialog.h index 4231387d..a6467832 100644 --- a/app/src/qt/dialogs/note_edit_dialog.h +++ b/app/src/qt/dialogs/note_edit_dialog.h @@ -1,7 +1,7 @@ /* note_edit_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/note_new_dialog.cpp b/app/src/qt/dialogs/note_new_dialog.cpp index e0eacb94..e6f2aaac 100644 --- a/app/src/qt/dialogs/note_new_dialog.cpp +++ b/app/src/qt/dialogs/note_new_dialog.cpp @@ -1,7 +1,7 @@ /* note_new_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/note_new_dialog.h b/app/src/qt/dialogs/note_new_dialog.h index 87e16474..0c310fcb 100644 --- a/app/src/qt/dialogs/note_new_dialog.h +++ b/app/src/qt/dialogs/note_new_dialog.h @@ -1,7 +1,7 @@ /* note_new_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/organizer_new_dialog.cpp b/app/src/qt/dialogs/organizer_new_dialog.cpp index 1c0acf41..f4c0683e 100644 --- a/app/src/qt/dialogs/organizer_new_dialog.cpp +++ b/app/src/qt/dialogs/organizer_new_dialog.cpp @@ -1,7 +1,7 @@ /* new_organizer_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/organizer_new_dialog.h b/app/src/qt/dialogs/organizer_new_dialog.h index 9d27665b..e08b5d3f 100644 --- a/app/src/qt/dialogs/organizer_new_dialog.h +++ b/app/src/qt/dialogs/organizer_new_dialog.h @@ -1,7 +1,7 @@ /* organizer_new_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/outline_header_edit_dialog.cpp b/app/src/qt/dialogs/outline_header_edit_dialog.cpp index 1036fee6..ab74a26a 100644 --- a/app/src/qt/dialogs/outline_header_edit_dialog.cpp +++ b/app/src/qt/dialogs/outline_header_edit_dialog.cpp @@ -1,7 +1,7 @@ /* outline_header_edit_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/outline_header_edit_dialog.h b/app/src/qt/dialogs/outline_header_edit_dialog.h index d484e00b..917989bb 100644 --- a/app/src/qt/dialogs/outline_header_edit_dialog.h +++ b/app/src/qt/dialogs/outline_header_edit_dialog.h @@ -1,7 +1,7 @@ /* outline_header_edit_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/outline_new_dialog.cpp b/app/src/qt/dialogs/outline_new_dialog.cpp index 1d04e06a..92b6b483 100644 --- a/app/src/qt/dialogs/outline_new_dialog.cpp +++ b/app/src/qt/dialogs/outline_new_dialog.cpp @@ -1,7 +1,7 @@ /* outline_new_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/outline_new_dialog.h b/app/src/qt/dialogs/outline_new_dialog.h index 39aa332c..1cef0eed 100644 --- a/app/src/qt/dialogs/outline_new_dialog.h +++ b/app/src/qt/dialogs/outline_new_dialog.h @@ -1,7 +1,7 @@ /* outline_new_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp b/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp index 4d7cff02..531279cb 100644 --- a/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp +++ b/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp @@ -1,7 +1,7 @@ /* refactor_note_to_outline_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/refactor_note_to_outline_dialog.h b/app/src/qt/dialogs/refactor_note_to_outline_dialog.h index 1fd64bc1..f16dd119 100644 --- a/app/src/qt/dialogs/refactor_note_to_outline_dialog.h +++ b/app/src/qt/dialogs/refactor_note_to_outline_dialog.h @@ -1,7 +1,7 @@ /* refactor_note_to_outline_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/rows_and_depth_dialog.cpp b/app/src/qt/dialogs/rows_and_depth_dialog.cpp index fbccc850..ed9ee8c9 100644 --- a/app/src/qt/dialogs/rows_and_depth_dialog.cpp +++ b/app/src/qt/dialogs/rows_and_depth_dialog.cpp @@ -1,7 +1,7 @@ /* rows_and_depth_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/rows_and_depth_dialog.h b/app/src/qt/dialogs/rows_and_depth_dialog.h index 18150135..885df06f 100644 --- a/app/src/qt/dialogs/rows_and_depth_dialog.h +++ b/app/src/qt/dialogs/rows_and_depth_dialog.h @@ -1,7 +1,7 @@ /* rows_and_depth_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/scope_dialog.cpp b/app/src/qt/dialogs/scope_dialog.cpp index 892f7c95..44df8404 100644 --- a/app/src/qt/dialogs/scope_dialog.cpp +++ b/app/src/qt/dialogs/scope_dialog.cpp @@ -1,7 +1,7 @@ /* scope_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/scope_dialog.h b/app/src/qt/dialogs/scope_dialog.h index 95bd47b3..5f8560da 100644 --- a/app/src/qt/dialogs/scope_dialog.h +++ b/app/src/qt/dialogs/scope_dialog.h @@ -1,7 +1,7 @@ /* scope_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/terminal_dialog.cpp b/app/src/qt/dialogs/terminal_dialog.cpp index 1ce52fd0..ac4e3227 100644 --- a/app/src/qt/dialogs/terminal_dialog.cpp +++ b/app/src/qt/dialogs/terminal_dialog.cpp @@ -1,7 +1,7 @@ /* terminal_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/terminal_dialog.h b/app/src/qt/dialogs/terminal_dialog.h index 56f6283e..a9013eb5 100644 --- a/app/src/qt/dialogs/terminal_dialog.h +++ b/app/src/qt/dialogs/terminal_dialog.h @@ -1,7 +1,7 @@ /* terminal_dialog.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/exceptions.h b/app/src/qt/exceptions.h index f0eabfc0..fe5889e1 100644 --- a/app/src/qt/exceptions.h +++ b/app/src/qt/exceptions.h @@ -1,7 +1,7 @@ /* exceptions.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/apple_utils.h b/app/src/qt/gear/apple_utils.h index cec09db0..7d2918ad 100644 --- a/app/src/qt/gear/apple_utils.h +++ b/app/src/qt/gear/apple_utils.h @@ -1,7 +1,7 @@ /* apple_utils.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/async_task_notifications_distributor.cpp b/app/src/qt/gear/async_task_notifications_distributor.cpp index ca084b66..e0976ccf 100644 --- a/app/src/qt/gear/async_task_notifications_distributor.cpp +++ b/app/src/qt/gear/async_task_notifications_distributor.cpp @@ -1,7 +1,7 @@ /* async_task_notifications_distributor.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/async_task_notifications_distributor.h b/app/src/qt/gear/async_task_notifications_distributor.h index c63f581a..1e3aedbd 100644 --- a/app/src/qt/gear/async_task_notifications_distributor.h +++ b/app/src/qt/gear/async_task_notifications_distributor.h @@ -1,7 +1,7 @@ /* async_task_notifications_distributor.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/qutils.cpp b/app/src/qt/gear/qutils.cpp index 76ea56d8..942cbb86 100644 --- a/app/src/qt/gear/qutils.cpp +++ b/app/src/qt/gear/qutils.cpp @@ -1,7 +1,7 @@ /* qutils.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/qutils.h b/app/src/qt/gear/qutils.h index 1f9868c4..75acbf0b 100644 --- a/app/src/qt/gear/qutils.h +++ b/app/src/qt/gear/qutils.h @@ -1,7 +1,7 @@ /* qutils.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/html_delegate.cpp b/app/src/qt/html_delegate.cpp index e129fdb9..15936302 100644 --- a/app/src/qt/html_delegate.cpp +++ b/app/src/qt/html_delegate.cpp @@ -1,7 +1,7 @@ /* html_delegate.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/html_delegate.h b/app/src/qt/html_delegate.h index c08fa5e9..44cb6e20 100644 --- a/app/src/qt/html_delegate.h +++ b/app/src/qt/html_delegate.h @@ -1,7 +1,7 @@ /* html_delegate.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/i18nl10n.cpp b/app/src/qt/i18nl10n.cpp index 4ad45b08..dc7e05ef 100644 --- a/app/src/qt/i18nl10n.cpp +++ b/app/src/qt/i18nl10n.cpp @@ -1,7 +1,7 @@ /* i18n.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/i18nl10n.h b/app/src/qt/i18nl10n.h index d92997c5..48aea4a8 100644 --- a/app/src/qt/i18nl10n.h +++ b/app/src/qt/i18nl10n.h @@ -1,7 +1,7 @@ /* i18nl10n.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_model.cpp b/app/src/qt/kanban_column_model.cpp index c76e4525..dcb64e4f 100644 --- a/app/src/qt/kanban_column_model.cpp +++ b/app/src/qt/kanban_column_model.cpp @@ -1,7 +1,7 @@ /* kanban_column_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_model.h b/app/src/qt/kanban_column_model.h index 6932687d..ecf8efc2 100644 --- a/app/src/qt/kanban_column_model.h +++ b/app/src/qt/kanban_column_model.h @@ -1,7 +1,7 @@ /* kanban_column_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_presenter.cpp b/app/src/qt/kanban_column_presenter.cpp index d4964f55..882a80d0 100644 --- a/app/src/qt/kanban_column_presenter.cpp +++ b/app/src/qt/kanban_column_presenter.cpp @@ -1,7 +1,7 @@ /* kanban_column_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_presenter.h b/app/src/qt/kanban_column_presenter.h index 689e29d1..0f4990d9 100644 --- a/app/src/qt/kanban_column_presenter.h +++ b/app/src/qt/kanban_column_presenter.h @@ -1,7 +1,7 @@ /* kanban_column_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_view.cpp b/app/src/qt/kanban_column_view.cpp index 29b0efde..96772f1a 100644 --- a/app/src/qt/kanban_column_view.cpp +++ b/app/src/qt/kanban_column_view.cpp @@ -1,7 +1,7 @@ /* kanban_column_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_view.h b/app/src/qt/kanban_column_view.h index 0df5b25c..b8ef863a 100644 --- a/app/src/qt/kanban_column_view.h +++ b/app/src/qt/kanban_column_view.h @@ -1,7 +1,7 @@ /* kanban_column_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_presenter.cpp b/app/src/qt/kanban_presenter.cpp index 148e265c..6bd8c1f9 100644 --- a/app/src/qt/kanban_presenter.cpp +++ b/app/src/qt/kanban_presenter.cpp @@ -1,7 +1,7 @@ /* kanban_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_presenter.h b/app/src/qt/kanban_presenter.h index 5d135deb..2603d341 100644 --- a/app/src/qt/kanban_presenter.h +++ b/app/src/qt/kanban_presenter.h @@ -1,7 +1,7 @@ /* kanban_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_view.cpp b/app/src/qt/kanban_view.cpp index d1b07882..7e0d69f3 100644 --- a/app/src/qt/kanban_view.cpp +++ b/app/src/qt/kanban_view.cpp @@ -1,7 +1,7 @@ /* kanban_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_view.h b/app/src/qt/kanban_view.h index 8413eefc..427ae7cb 100644 --- a/app/src/qt/kanban_view.h +++ b/app/src/qt/kanban_view.h @@ -1,7 +1,7 @@ /* kanban_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/look_n_feel.cpp b/app/src/qt/look_n_feel.cpp index d0712481..7a6e925c 100644 --- a/app/src/qt/look_n_feel.cpp +++ b/app/src/qt/look_n_feel.cpp @@ -1,7 +1,7 @@ /* look_n_feel.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/look_n_feel.h b/app/src/qt/look_n_feel.h index 5844a512..e5b611d6 100644 --- a/app/src/qt/look_n_feel.h +++ b/app/src/qt/look_n_feel.h @@ -1,7 +1,7 @@ /* look_n_feel.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp index 6c6eef65..1cdbad00 100644 --- a/app/src/qt/main_menu_presenter.cpp +++ b/app/src/qt/main_menu_presenter.cpp @@ -1,7 +1,7 @@ /* main_menu_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_menu_presenter.h b/app/src/qt/main_menu_presenter.h index 66333f80..8a96c74d 100644 --- a/app/src/qt/main_menu_presenter.h +++ b/app/src/qt/main_menu_presenter.h @@ -1,7 +1,7 @@ /* main_menu_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index c365120c..5cd834a7 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -1,7 +1,7 @@ /* main_menu_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h index edc773d1..71c721eb 100644 --- a/app/src/qt/main_menu_view.h +++ b/app/src/qt/main_menu_view.h @@ -1,7 +1,7 @@ /* main_menu.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_toolbar_view.cpp b/app/src/qt/main_toolbar_view.cpp index 803cbfae..0ebb2130 100644 --- a/app/src/qt/main_toolbar_view.cpp +++ b/app/src/qt/main_toolbar_view.cpp @@ -1,7 +1,7 @@ /* main_toolbar_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_toolbar_view.h b/app/src/qt/main_toolbar_view.h index f0bccf4c..60df32c5 100644 --- a/app/src/qt/main_toolbar_view.h +++ b/app/src/qt/main_toolbar_view.h @@ -1,7 +1,7 @@ /* main_toolbar_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 0d6b9d58..d33f3528 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -1,7 +1,7 @@ /* main_window_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -3305,7 +3305,7 @@ void MainWindowPresenter::doActionHelpAboutMindForger() "
Contact me at <martin.dvorak@mindforger.com>" " or see www.mindforger.com for more information." "
" - "
Copyright (C) 2016-2022 Martin Dvorak and contributors." + "
Copyright (C) 2016-2023 Martin Dvorak and contributors." }); } diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index e1f95350..2c1849bd 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -1,7 +1,7 @@ /* main_window_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_window_view.cpp b/app/src/qt/main_window_view.cpp index 9c88dcd3..49505d65 100644 --- a/app/src/qt/main_window_view.cpp +++ b/app/src/qt/main_window_view.cpp @@ -1,7 +1,7 @@ /* main_window_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_window_view.h b/app/src/qt/main_window_view.h index 3e269f3c..34dd4d8c 100644 --- a/app/src/qt/main_window_view.h +++ b/app/src/qt/main_window_view.h @@ -1,7 +1,7 @@ /* main_window_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/model_meta_definitions.h b/app/src/qt/model_meta_definitions.h index 6d581c8c..e17715c8 100644 --- a/app/src/qt/model_meta_definitions.h +++ b/app/src/qt/model_meta_definitions.h @@ -1,7 +1,7 @@ /* model_meta_definitions.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/edge.cpp b/app/src/qt/navigator/edge.cpp index 8189800f..b7b90b1d 100644 --- a/app/src/qt/navigator/edge.cpp +++ b/app/src/qt/navigator/edge.cpp @@ -1,7 +1,7 @@ /* edge.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/edge.h b/app/src/qt/navigator/edge.h index 7f9ee39b..ffc9dc40 100644 --- a/app/src/qt/navigator/edge.h +++ b/app/src/qt/navigator/edge.h @@ -1,7 +1,7 @@ /* edge.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/navigator_view.cpp b/app/src/qt/navigator/navigator_view.cpp index 10e53a45..62d5c3c1 100644 --- a/app/src/qt/navigator/navigator_view.cpp +++ b/app/src/qt/navigator/navigator_view.cpp @@ -1,7 +1,7 @@ /* mind-navigator.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/navigator_view.h b/app/src/qt/navigator/navigator_view.h index 3f7bfa61..32414ca7 100644 --- a/app/src/qt/navigator/navigator_view.h +++ b/app/src/qt/navigator/navigator_view.h @@ -1,7 +1,7 @@ /* mind_navigator.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/node.cpp b/app/src/qt/navigator/node.cpp index bdc7b9a6..4478f5e0 100644 --- a/app/src/qt/navigator/node.cpp +++ b/app/src/qt/navigator/node.cpp @@ -1,7 +1,7 @@ /* node.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/node.h b/app/src/qt/navigator/node.h index 45a4d6d4..bf0b146a 100644 --- a/app/src/qt/navigator/node.h +++ b/app/src/qt/navigator/node.h @@ -1,7 +1,7 @@ /* node.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator_presenter.cpp b/app/src/qt/navigator_presenter.cpp index ba4018ac..255c89b3 100644 --- a/app/src/qt/navigator_presenter.cpp +++ b/app/src/qt/navigator_presenter.cpp @@ -1,7 +1,7 @@ /* navigator_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator_presenter.h b/app/src/qt/navigator_presenter.h index d7a1abd2..ea01e48b 100644 --- a/app/src/qt/navigator_presenter.h +++ b/app/src/qt/navigator_presenter.h @@ -1,7 +1,7 @@ /* navigator_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_leaderboard_model.cpp b/app/src/qt/ner_leaderboard_model.cpp index 3bc82cc0..da55bea8 100644 --- a/app/src/qt/ner_leaderboard_model.cpp +++ b/app/src/qt/ner_leaderboard_model.cpp @@ -1,7 +1,7 @@ /* ner_leaderboard_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_leaderboard_model.h b/app/src/qt/ner_leaderboard_model.h index 10e9d27f..908caabc 100644 --- a/app/src/qt/ner_leaderboard_model.h +++ b/app/src/qt/ner_leaderboard_model.h @@ -1,7 +1,7 @@ /* ner_leaderboard_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_leaderboard_view.cpp b/app/src/qt/ner_leaderboard_view.cpp index 049bba9f..3d3e93a4 100644 --- a/app/src/qt/ner_leaderboard_view.cpp +++ b/app/src/qt/ner_leaderboard_view.cpp @@ -1,7 +1,7 @@ /* ner_leaderboard_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_leaderboard_view.h b/app/src/qt/ner_leaderboard_view.h index 01f2cfb4..56029427 100644 --- a/app/src/qt/ner_leaderboard_view.h +++ b/app/src/qt/ner_leaderboard_view.h @@ -1,7 +1,7 @@ /* ner_leaderboard_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_main_window_worker_thread.cpp b/app/src/qt/ner_main_window_worker_thread.cpp index f01ca207..12d9c310 100644 --- a/app/src/qt/ner_main_window_worker_thread.cpp +++ b/app/src/qt/ner_main_window_worker_thread.cpp @@ -1,7 +1,7 @@ /* ner_main_window_worker_thread.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_main_window_worker_thread.h b/app/src/qt/ner_main_window_worker_thread.h index 9a99ac65..70490aac 100644 --- a/app/src/qt/ner_main_window_worker_thread.h +++ b/app/src/qt/ner_main_window_worker_thread.h @@ -1,7 +1,7 @@ /* ner_main_window_worker_thread.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_highlighter.cpp b/app/src/qt/note_edit_highlighter.cpp index 51d2d857..449ce62a 100644 --- a/app/src/qt/note_edit_highlighter.cpp +++ b/app/src/qt/note_edit_highlighter.cpp @@ -1,7 +1,7 @@ /* note_edit_highlighter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_highlighter.h b/app/src/qt/note_edit_highlighter.h index 49c6b0c3..eae6902e 100644 --- a/app/src/qt/note_edit_highlighter.h +++ b/app/src/qt/note_edit_highlighter.h @@ -1,7 +1,7 @@ /* note_edit_highlighter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_presenter.cpp b/app/src/qt/note_edit_presenter.cpp index 6792b234..31eeab04 100644 --- a/app/src/qt/note_edit_presenter.cpp +++ b/app/src/qt/note_edit_presenter.cpp @@ -1,7 +1,7 @@ /* note_edit_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_presenter.h b/app/src/qt/note_edit_presenter.h index 4b104b50..f93b1b21 100644 --- a/app/src/qt/note_edit_presenter.h +++ b/app/src/qt/note_edit_presenter.h @@ -1,7 +1,7 @@ /* note_edit_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_view.cpp b/app/src/qt/note_edit_view.cpp index 77d39e10..af523da7 100644 --- a/app/src/qt/note_edit_view.cpp +++ b/app/src/qt/note_edit_view.cpp @@ -1,7 +1,7 @@ /* note_edit_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_view.h b/app/src/qt/note_edit_view.h index 54afb426..1adab4ac 100644 --- a/app/src/qt/note_edit_view.h +++ b/app/src/qt/note_edit_view.h @@ -1,7 +1,7 @@ /* note_edit_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_editor_view.cpp b/app/src/qt/note_editor_view.cpp index f15cd37e..7cf3c2e4 100644 --- a/app/src/qt/note_editor_view.cpp +++ b/app/src/qt/note_editor_view.cpp @@ -1,7 +1,7 @@ /* note_editor_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_editor_view.h b/app/src/qt/note_editor_view.h index 17a05c81..3042f552 100644 --- a/app/src/qt/note_editor_view.h +++ b/app/src/qt/note_editor_view.h @@ -1,7 +1,7 @@ /* note_editor_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_smart_editor.cpp b/app/src/qt/note_smart_editor.cpp index e646a2cd..05407b10 100644 --- a/app/src/qt/note_smart_editor.cpp +++ b/app/src/qt/note_smart_editor.cpp @@ -1,7 +1,7 @@ /* note_smart_editor.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_smart_editor.h b/app/src/qt/note_smart_editor.h index f4eea43c..95658367 100644 --- a/app/src/qt/note_smart_editor.h +++ b/app/src/qt/note_smart_editor.h @@ -1,7 +1,7 @@ /* note_smart_editor.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view.cpp b/app/src/qt/note_view.cpp index 0c0dbeec..1c0f297c 100644 --- a/app/src/qt/note_view.cpp +++ b/app/src/qt/note_view.cpp @@ -1,7 +1,7 @@ /* note_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view.h b/app/src/qt/note_view.h index 17c8d2ba..75412bac 100644 --- a/app/src/qt/note_view.h +++ b/app/src/qt/note_view.h @@ -1,7 +1,7 @@ /* note_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view_model.cpp b/app/src/qt/note_view_model.cpp index c41c2171..1f632a1c 100644 --- a/app/src/qt/note_view_model.cpp +++ b/app/src/qt/note_view_model.cpp @@ -1,7 +1,7 @@ /* note_view_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view_model.h b/app/src/qt/note_view_model.h index 1b9bc117..cede85fe 100644 --- a/app/src/qt/note_view_model.h +++ b/app/src/qt/note_view_model.h @@ -1,7 +1,7 @@ /* note_view_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view_presenter.cpp b/app/src/qt/note_view_presenter.cpp index 1b9a3e52..746bd543 100644 --- a/app/src/qt/note_view_presenter.cpp +++ b/app/src/qt/note_view_presenter.cpp @@ -1,7 +1,7 @@ /* note_view_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view_presenter.h b/app/src/qt/note_view_presenter.h index 774ee67d..59c7442c 100644 --- a/app/src/qt/note_view_presenter.h +++ b/app/src/qt/note_view_presenter.h @@ -1,7 +1,7 @@ /* note_view_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_model.cpp b/app/src/qt/notes_table_model.cpp index 8bef420f..bbc93bb8 100644 --- a/app/src/qt/notes_table_model.cpp +++ b/app/src/qt/notes_table_model.cpp @@ -1,7 +1,7 @@ /* notes_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_model.h b/app/src/qt/notes_table_model.h index 0cfe0d30..9f4ec8c8 100644 --- a/app/src/qt/notes_table_model.h +++ b/app/src/qt/notes_table_model.h @@ -1,7 +1,7 @@ /* notes_table_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_presenter.cpp b/app/src/qt/notes_table_presenter.cpp index 6837c921..0a373cb0 100644 --- a/app/src/qt/notes_table_presenter.cpp +++ b/app/src/qt/notes_table_presenter.cpp @@ -1,7 +1,7 @@ /* notes_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_presenter.h b/app/src/qt/notes_table_presenter.h index 33f40169..f03fb342 100644 --- a/app/src/qt/notes_table_presenter.h +++ b/app/src/qt/notes_table_presenter.h @@ -1,7 +1,7 @@ /* notes_table_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_view.cpp b/app/src/qt/notes_table_view.cpp index c9569dee..c61c5b2a 100644 --- a/app/src/qt/notes_table_view.cpp +++ b/app/src/qt/notes_table_view.cpp @@ -1,7 +1,7 @@ /* notes_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_view.h b/app/src/qt/notes_table_view.h index 7a95d3e5..62b2c82f 100644 --- a/app/src/qt/notes_table_view.h +++ b/app/src/qt/notes_table_view.h @@ -1,7 +1,7 @@ /* notes_table_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_presenter.cpp b/app/src/qt/organizer_presenter.cpp index f07d24fd..9c79f0d6 100644 --- a/app/src/qt/organizer_presenter.cpp +++ b/app/src/qt/organizer_presenter.cpp @@ -1,7 +1,7 @@ /* organizer_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_presenter.h b/app/src/qt/organizer_presenter.h index fcbcfd20..b96ffed1 100644 --- a/app/src/qt/organizer_presenter.h +++ b/app/src/qt/organizer_presenter.h @@ -1,7 +1,7 @@ /* organizer_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_model.cpp b/app/src/qt/organizer_quadrant_model.cpp index 3d106b48..a76502cb 100644 --- a/app/src/qt/organizer_quadrant_model.cpp +++ b/app/src/qt/organizer_quadrant_model.cpp @@ -1,7 +1,7 @@ /* organizer_quadrant_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_model.h b/app/src/qt/organizer_quadrant_model.h index 3722012b..893542ad 100644 --- a/app/src/qt/organizer_quadrant_model.h +++ b/app/src/qt/organizer_quadrant_model.h @@ -1,7 +1,7 @@ /* organizer_quadrant_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_presenter.cpp b/app/src/qt/organizer_quadrant_presenter.cpp index 848f2fbd..0db16bcc 100644 --- a/app/src/qt/organizer_quadrant_presenter.cpp +++ b/app/src/qt/organizer_quadrant_presenter.cpp @@ -1,7 +1,7 @@ /* organizer_quadrant_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_presenter.h b/app/src/qt/organizer_quadrant_presenter.h index 34443e23..31ec0153 100644 --- a/app/src/qt/organizer_quadrant_presenter.h +++ b/app/src/qt/organizer_quadrant_presenter.h @@ -1,7 +1,7 @@ /* organizer_quadrant_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_view.cpp b/app/src/qt/organizer_quadrant_view.cpp index 77b81dda..11483d9d 100644 --- a/app/src/qt/organizer_quadrant_view.cpp +++ b/app/src/qt/organizer_quadrant_view.cpp @@ -1,7 +1,7 @@ /* organizer_quadrant_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_view.h b/app/src/qt/organizer_quadrant_view.h index 8327695a..6fca0db0 100644 --- a/app/src/qt/organizer_quadrant_view.h +++ b/app/src/qt/organizer_quadrant_view.h @@ -1,7 +1,7 @@ /* organizer_quadrant_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_view.cpp b/app/src/qt/organizer_view.cpp index b00d8bc6..aa125f02 100644 --- a/app/src/qt/organizer_view.cpp +++ b/app/src/qt/organizer_view.cpp @@ -1,7 +1,7 @@ /* organizer_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_view.h b/app/src/qt/organizer_view.h index a4ac80e9..ef8cfd1b 100644 --- a/app/src/qt/organizer_view.h +++ b/app/src/qt/organizer_view.h @@ -1,7 +1,7 @@ /* organizer_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_model.cpp b/app/src/qt/organizers_table_model.cpp index 6b0b4813..37735a13 100644 --- a/app/src/qt/organizers_table_model.cpp +++ b/app/src/qt/organizers_table_model.cpp @@ -1,7 +1,7 @@ /* organizers_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_model.h b/app/src/qt/organizers_table_model.h index 286b36c8..a68585e0 100644 --- a/app/src/qt/organizers_table_model.h +++ b/app/src/qt/organizers_table_model.h @@ -1,7 +1,7 @@ /* organizers_table_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_presenter.cpp b/app/src/qt/organizers_table_presenter.cpp index 5d8eaeea..afbd85c9 100644 --- a/app/src/qt/organizers_table_presenter.cpp +++ b/app/src/qt/organizers_table_presenter.cpp @@ -1,7 +1,7 @@ /* organizers_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_presenter.h b/app/src/qt/organizers_table_presenter.h index d40ac4df..aa40cd81 100644 --- a/app/src/qt/organizers_table_presenter.h +++ b/app/src/qt/organizers_table_presenter.h @@ -1,7 +1,7 @@ /* organizers_table_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_view.cpp b/app/src/qt/organizers_table_view.cpp index eed75370..8bf631e3 100644 --- a/app/src/qt/organizers_table_view.cpp +++ b/app/src/qt/organizers_table_view.cpp @@ -1,7 +1,7 @@ /* organizers_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_view.h b/app/src/qt/organizers_table_view.h index ba2815d1..974412a8 100644 --- a/app/src/qt/organizers_table_view.h +++ b/app/src/qt/organizers_table_view.h @@ -1,7 +1,7 @@ /* organizers_table_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp index 82924549..88dd09af 100644 --- a/app/src/qt/orloj_presenter.cpp +++ b/app/src/qt/orloj_presenter.cpp @@ -1,7 +1,7 @@ /* outline_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/orloj_presenter.h b/app/src/qt/orloj_presenter.h index 6119cc16..ce1bc6cc 100644 --- a/app/src/qt/orloj_presenter.h +++ b/app/src/qt/orloj_presenter.h @@ -1,7 +1,7 @@ /* outline_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/orloj_view.cpp b/app/src/qt/orloj_view.cpp index c5d39a03..4e1c5511 100644 --- a/app/src/qt/orloj_view.cpp +++ b/app/src/qt/orloj_view.cpp @@ -1,7 +1,7 @@ /* orloj_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/orloj_view.h b/app/src/qt/orloj_view.h index 236584d6..455398a4 100644 --- a/app/src/qt/orloj_view.h +++ b/app/src/qt/orloj_view.h @@ -1,7 +1,7 @@ /* orloj_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_edit_presenter.cpp b/app/src/qt/outline_header_edit_presenter.cpp index d556fddd..fe113b4d 100644 --- a/app/src/qt/outline_header_edit_presenter.cpp +++ b/app/src/qt/outline_header_edit_presenter.cpp @@ -1,7 +1,7 @@ /* outline_header_edit_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_edit_presenter.h b/app/src/qt/outline_header_edit_presenter.h index 6b6a2691..87f1745b 100644 --- a/app/src/qt/outline_header_edit_presenter.h +++ b/app/src/qt/outline_header_edit_presenter.h @@ -1,7 +1,7 @@ /* outline_header_edit_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_edit_view.cpp b/app/src/qt/outline_header_edit_view.cpp index 8b7d8fff..01c34723 100644 --- a/app/src/qt/outline_header_edit_view.cpp +++ b/app/src/qt/outline_header_edit_view.cpp @@ -1,7 +1,7 @@ /* outline_header_edit_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_edit_view.h b/app/src/qt/outline_header_edit_view.h index c62082b7..fbe85cae 100644 --- a/app/src/qt/outline_header_edit_view.h +++ b/app/src/qt/outline_header_edit_view.h @@ -1,7 +1,7 @@ /* outline_header_edit_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view.cpp b/app/src/qt/outline_header_view.cpp index 3d5a0896..0fc1edc1 100644 --- a/app/src/qt/outline_header_view.cpp +++ b/app/src/qt/outline_header_view.cpp @@ -1,7 +1,7 @@ /* outline_header_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view.h b/app/src/qt/outline_header_view.h index fd8a38f7..1a6b361b 100644 --- a/app/src/qt/outline_header_view.h +++ b/app/src/qt/outline_header_view.h @@ -1,7 +1,7 @@ /* outline_header_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view_model.cpp b/app/src/qt/outline_header_view_model.cpp index 5861230b..12a668b5 100644 --- a/app/src/qt/outline_header_view_model.cpp +++ b/app/src/qt/outline_header_view_model.cpp @@ -1,7 +1,7 @@ /* outline_header_view_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view_model.h b/app/src/qt/outline_header_view_model.h index 6e424fe3..30b26df3 100644 --- a/app/src/qt/outline_header_view_model.h +++ b/app/src/qt/outline_header_view_model.h @@ -1,7 +1,7 @@ /* outline_header_view_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view_presenter.cpp b/app/src/qt/outline_header_view_presenter.cpp index 3b8b8e51..948c2670 100644 --- a/app/src/qt/outline_header_view_presenter.cpp +++ b/app/src/qt/outline_header_view_presenter.cpp @@ -1,7 +1,7 @@ /* outline_header_view_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view_presenter.h b/app/src/qt/outline_header_view_presenter.h index 437028cf..b2df74a5 100644 --- a/app/src/qt/outline_header_view_presenter.h +++ b/app/src/qt/outline_header_view_presenter.h @@ -1,7 +1,7 @@ /* outline_header_view_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_model.cpp b/app/src/qt/outline_tree_model.cpp index 9be45de6..0f85b276 100644 --- a/app/src/qt/outline_tree_model.cpp +++ b/app/src/qt/outline_tree_model.cpp @@ -1,7 +1,7 @@ /* outline_tree_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_model.h b/app/src/qt/outline_tree_model.h index 43affd86..63ad0276 100644 --- a/app/src/qt/outline_tree_model.h +++ b/app/src/qt/outline_tree_model.h @@ -1,7 +1,7 @@ /* outline_tree_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_presenter.cpp b/app/src/qt/outline_tree_presenter.cpp index 0b355510..239d7ad5 100644 --- a/app/src/qt/outline_tree_presenter.cpp +++ b/app/src/qt/outline_tree_presenter.cpp @@ -1,7 +1,7 @@ /* outline_tree_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_presenter.h b/app/src/qt/outline_tree_presenter.h index dfbbfdca..d410de7f 100644 --- a/app/src/qt/outline_tree_presenter.h +++ b/app/src/qt/outline_tree_presenter.h @@ -1,7 +1,7 @@ /* outline_tree_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_view.cpp b/app/src/qt/outline_tree_view.cpp index 0431bd5b..97a8d5b9 100644 --- a/app/src/qt/outline_tree_view.cpp +++ b/app/src/qt/outline_tree_view.cpp @@ -1,7 +1,7 @@ /* outline_tree_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_view.h b/app/src/qt/outline_tree_view.h index 763ab940..18dcdec6 100644 --- a/app/src/qt/outline_tree_view.h +++ b/app/src/qt/outline_tree_view.h @@ -1,7 +1,7 @@ /* outline_tree_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view.cpp b/app/src/qt/outline_view.cpp index d07c705c..a91f40bc 100644 --- a/app/src/qt/outline_view.cpp +++ b/app/src/qt/outline_view.cpp @@ -1,7 +1,7 @@ /* outline_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view.h b/app/src/qt/outline_view.h index f537bfcd..8858bf33 100644 --- a/app/src/qt/outline_view.h +++ b/app/src/qt/outline_view.h @@ -1,7 +1,7 @@ /* outline_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view_presenter.cpp b/app/src/qt/outline_view_presenter.cpp index 0f5e27f0..36101a99 100644 --- a/app/src/qt/outline_view_presenter.cpp +++ b/app/src/qt/outline_view_presenter.cpp @@ -1,7 +1,7 @@ /* outline_view_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view_presenter.h b/app/src/qt/outline_view_presenter.h index 1dbb5c63..c4155d6a 100644 --- a/app/src/qt/outline_view_presenter.h +++ b/app/src/qt/outline_view_presenter.h @@ -1,7 +1,7 @@ /* outline_view_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view_splitter.cpp b/app/src/qt/outline_view_splitter.cpp index e0974944..1a087dc8 100644 --- a/app/src/qt/outline_view_splitter.cpp +++ b/app/src/qt/outline_view_splitter.cpp @@ -1,7 +1,7 @@ /* outline_view_splitter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view_splitter.h b/app/src/qt/outline_view_splitter.h index 7fcd3cdc..4e540af1 100644 --- a/app/src/qt/outline_view_splitter.h +++ b/app/src/qt/outline_view_splitter.h @@ -1,7 +1,7 @@ /* outline_view_splitter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_model.cpp b/app/src/qt/outlines_table_model.cpp index ac37f557..96ffacff 100644 --- a/app/src/qt/outlines_table_model.cpp +++ b/app/src/qt/outlines_table_model.cpp @@ -1,7 +1,7 @@ /* notes_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_model.h b/app/src/qt/outlines_table_model.h index 2f5e035c..fba84d5b 100644 --- a/app/src/qt/outlines_table_model.h +++ b/app/src/qt/outlines_table_model.h @@ -1,7 +1,7 @@ /* outlines_table_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_presenter.cpp b/app/src/qt/outlines_table_presenter.cpp index 285f805c..45024f14 100644 --- a/app/src/qt/outlines_table_presenter.cpp +++ b/app/src/qt/outlines_table_presenter.cpp @@ -1,7 +1,7 @@ /* outlines_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_presenter.h b/app/src/qt/outlines_table_presenter.h index 35ceafc6..4d335183 100644 --- a/app/src/qt/outlines_table_presenter.h +++ b/app/src/qt/outlines_table_presenter.h @@ -1,7 +1,7 @@ /* outlines_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_view.cpp b/app/src/qt/outlines_table_view.cpp index a41e3ee3..e8a14247 100644 --- a/app/src/qt/outlines_table_view.cpp +++ b/app/src/qt/outlines_table_view.cpp @@ -1,7 +1,7 @@ /* outlines_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_view.h b/app/src/qt/outlines_table_view.h index 221a3127..625f12d0 100644 --- a/app/src/qt/outlines_table_view.h +++ b/app/src/qt/outlines_table_view.h @@ -1,7 +1,7 @@ /* outlines_table_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/palette.h b/app/src/qt/palette.h index 826dbe77..b804cadd 100644 --- a/app/src/qt/palette.h +++ b/app/src/qt/palette.h @@ -1,7 +1,7 @@ /* palette.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/qt_commons.h b/app/src/qt/qt_commons.h index 001ef42e..98164d2a 100644 --- a/app/src/qt/qt_commons.h +++ b/app/src/qt/qt_commons.h @@ -1,7 +1,7 @@ /* qt_commons.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_model.cpp b/app/src/qt/recent_notes_table_model.cpp index eddd713c..2d6b0a8d 100644 --- a/app/src/qt/recent_notes_table_model.cpp +++ b/app/src/qt/recent_notes_table_model.cpp @@ -1,7 +1,7 @@ /* recent_notes_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_model.h b/app/src/qt/recent_notes_table_model.h index d74085e3..f7d2c982 100644 --- a/app/src/qt/recent_notes_table_model.h +++ b/app/src/qt/recent_notes_table_model.h @@ -1,7 +1,7 @@ /* recent_notes_table_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_presenter.cpp b/app/src/qt/recent_notes_table_presenter.cpp index 249f000d..4d1e90b4 100644 --- a/app/src/qt/recent_notes_table_presenter.cpp +++ b/app/src/qt/recent_notes_table_presenter.cpp @@ -1,7 +1,7 @@ /* recent_notes_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_presenter.h b/app/src/qt/recent_notes_table_presenter.h index ae53d8f9..628d4a17 100644 --- a/app/src/qt/recent_notes_table_presenter.h +++ b/app/src/qt/recent_notes_table_presenter.h @@ -1,7 +1,7 @@ /* recent_notes_table_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_view.cpp b/app/src/qt/recent_notes_table_view.cpp index 3bd23616..a39787e7 100644 --- a/app/src/qt/recent_notes_table_view.cpp +++ b/app/src/qt/recent_notes_table_view.cpp @@ -1,7 +1,7 @@ /* recent_notes_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_view.h b/app/src/qt/recent_notes_table_view.h index d76fde0d..9d7cae5c 100644 --- a/app/src/qt/recent_notes_table_view.h +++ b/app/src/qt/recent_notes_table_view.h @@ -1,7 +1,7 @@ /* recent_notes_table_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/spelling/dictionary_manager.cpp b/app/src/qt/spelling/dictionary_manager.cpp index bd0e2c60..aae9caad 100644 --- a/app/src/qt/spelling/dictionary_manager.cpp +++ b/app/src/qt/spelling/dictionary_manager.cpp @@ -1,7 +1,7 @@ /*********************************************************************** * * Copyright (C) 2009, 2010, 2011, 2012, 2013 Graeme Gott - * Copyright (C) 2021-2022 Martin Dvorak + * Copyright (C) 2021-2023 Martin Dvorak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/app/src/qt/spelling/dictionary_manager.h b/app/src/qt/spelling/dictionary_manager.h index e58529dd..6eacb20e 100644 --- a/app/src/qt/spelling/dictionary_manager.h +++ b/app/src/qt/spelling/dictionary_manager.h @@ -1,7 +1,7 @@ /*********************************************************************** * * Copyright (C) 2009, 2010, 2011, 2012, 2013 Graeme Gott - * Copyright (C) 2021-2022 Martin Dvorak + * Copyright (C) 2021-2023 Martin Dvorak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/app/src/qt/spelling/dictionary_provider_hunspell.cpp b/app/src/qt/spelling/dictionary_provider_hunspell.cpp index 0dc77f13..60a84bce 100644 --- a/app/src/qt/spelling/dictionary_provider_hunspell.cpp +++ b/app/src/qt/spelling/dictionary_provider_hunspell.cpp @@ -2,7 +2,7 @@ * * Copyright (C) 2009, 2010, 2011, 2012, 2013 Graeme Gott * Copyright (C) 2014-2020 wereturtle - * Copyright (C) 2021-2022 Martin Dvorak + * Copyright (C) 2021-2023 Martin Dvorak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/app/src/qt/status_bar_presenter.cpp b/app/src/qt/status_bar_presenter.cpp index 312aea01..f506a441 100644 --- a/app/src/qt/status_bar_presenter.cpp +++ b/app/src/qt/status_bar_presenter.cpp @@ -1,7 +1,7 @@ /* status_bar_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/status_bar_presenter.h b/app/src/qt/status_bar_presenter.h index 00b2f9a2..d60a8d0c 100644 --- a/app/src/qt/status_bar_presenter.h +++ b/app/src/qt/status_bar_presenter.h @@ -1,7 +1,7 @@ /* status_bar_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/status_bar_view.cpp b/app/src/qt/status_bar_view.cpp index 36769a05..311e3e62 100644 --- a/app/src/qt/status_bar_view.cpp +++ b/app/src/qt/status_bar_view.cpp @@ -1,7 +1,7 @@ /* status_bar_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/status_bar_view.h b/app/src/qt/status_bar_view.h index 0f6228db..b891b015 100644 --- a/app/src/qt/status_bar_view.h +++ b/app/src/qt/status_bar_view.h @@ -1,7 +1,7 @@ /* status_bar_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_model.cpp b/app/src/qt/tags_table_model.cpp index d6ac5713..be4c6a66 100644 --- a/app/src/qt/tags_table_model.cpp +++ b/app/src/qt/tags_table_model.cpp @@ -1,7 +1,7 @@ /* tags_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_model.h b/app/src/qt/tags_table_model.h index e405ea85..5c9e7813 100644 --- a/app/src/qt/tags_table_model.h +++ b/app/src/qt/tags_table_model.h @@ -1,7 +1,7 @@ /* tags_table_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_presenter.cpp b/app/src/qt/tags_table_presenter.cpp index b145ca57..2e4017f5 100644 --- a/app/src/qt/tags_table_presenter.cpp +++ b/app/src/qt/tags_table_presenter.cpp @@ -1,7 +1,7 @@ /* tags_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_presenter.h b/app/src/qt/tags_table_presenter.h index c0ec35f4..ad3286ee 100644 --- a/app/src/qt/tags_table_presenter.h +++ b/app/src/qt/tags_table_presenter.h @@ -1,7 +1,7 @@ /* tags_table_presenter.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_view.cpp b/app/src/qt/tags_table_view.cpp index 9fbad45b..33fb0db8 100644 --- a/app/src/qt/tags_table_view.cpp +++ b/app/src/qt/tags_table_view.cpp @@ -1,7 +1,7 @@ /* tags_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_view.h b/app/src/qt/tags_table_view.h index 23a5ab06..21608053 100644 --- a/app/src/qt/tags_table_view.h +++ b/app/src/qt/tags_table_view.h @@ -1,7 +1,7 @@ /* tags_table_view.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/web_engine_page_link_navigation_policy.cpp b/app/src/qt/web_engine_page_link_navigation_policy.cpp index 6c76e368..979b62e6 100644 --- a/app/src/qt/web_engine_page_link_navigation_policy.cpp +++ b/app/src/qt/web_engine_page_link_navigation_policy.cpp @@ -1,7 +1,7 @@ /* web_engine_page_link_navigation_policy.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/web_engine_page_link_navigation_policy.h b/app/src/qt/web_engine_page_link_navigation_policy.h index b363e7a7..4005a6fd 100644 --- a/app/src/qt/web_engine_page_link_navigation_policy.h +++ b/app/src/qt/web_engine_page_link_navigation_policy.h @@ -1,7 +1,7 @@ /* web_engine_page_link_navigation_policy.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_buttons_panel.cpp b/app/src/qt/widgets/edit_buttons_panel.cpp index a35d217b..414815bf 100644 --- a/app/src/qt/widgets/edit_buttons_panel.cpp +++ b/app/src/qt/widgets/edit_buttons_panel.cpp @@ -1,7 +1,7 @@ /* edit_buttons_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_buttons_panel.h b/app/src/qt/widgets/edit_buttons_panel.h index 2e9825bf..42a8a654 100644 --- a/app/src/qt/widgets/edit_buttons_panel.h +++ b/app/src/qt/widgets/edit_buttons_panel.h @@ -1,7 +1,7 @@ /* edit_buttons_panel.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_name_panel.cpp b/app/src/qt/widgets/edit_name_panel.cpp index 146ea445..4c7f930b 100644 --- a/app/src/qt/widgets/edit_name_panel.cpp +++ b/app/src/qt/widgets/edit_name_panel.cpp @@ -1,7 +1,7 @@ /* edit_name_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_name_panel.h b/app/src/qt/widgets/edit_name_panel.h index 9e88ec4a..6db89a36 100644 --- a/app/src/qt/widgets/edit_name_panel.h +++ b/app/src/qt/widgets/edit_name_panel.h @@ -1,7 +1,7 @@ /* edit_name_panel.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_tags_panel.cpp b/app/src/qt/widgets/edit_tags_panel.cpp index e5ab5869..2f348784 100644 --- a/app/src/qt/widgets/edit_tags_panel.cpp +++ b/app/src/qt/widgets/edit_tags_panel.cpp @@ -1,7 +1,7 @@ /* edit_tags_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_tags_panel.h b/app/src/qt/widgets/edit_tags_panel.h index 650c4080..efa26b59 100644 --- a/app/src/qt/widgets/edit_tags_panel.h +++ b/app/src/qt/widgets/edit_tags_panel.h @@ -1,7 +1,7 @@ /* edit_tags_panel.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/importance_combo_box.cpp b/app/src/qt/widgets/importance_combo_box.cpp index 0ccfea00..8c6681a4 100644 --- a/app/src/qt/widgets/importance_combo_box.cpp +++ b/app/src/qt/widgets/importance_combo_box.cpp @@ -1,7 +1,7 @@ /* importance_combo_box.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/importance_combo_box.h b/app/src/qt/widgets/importance_combo_box.h index a1b35fda..776e21ca 100644 --- a/app/src/qt/widgets/importance_combo_box.h +++ b/app/src/qt/widgets/importance_combo_box.h @@ -1,7 +1,7 @@ /* importance_combo_box.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/labeled_edit_line_panel.cpp b/app/src/qt/widgets/labeled_edit_line_panel.cpp index f45c379b..2f68cf74 100644 --- a/app/src/qt/widgets/labeled_edit_line_panel.cpp +++ b/app/src/qt/widgets/labeled_edit_line_panel.cpp @@ -1,7 +1,7 @@ /* labeled_edit_line_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/labeled_edit_line_panel.h b/app/src/qt/widgets/labeled_edit_line_panel.h index da682280..cebb693b 100644 --- a/app/src/qt/widgets/labeled_edit_line_panel.h +++ b/app/src/qt/widgets/labeled_edit_line_panel.h @@ -1,7 +1,7 @@ /* labeled_edit_line_panel.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/line_number_panel.cpp b/app/src/qt/widgets/line_number_panel.cpp index fd2c791f..bccc6069 100644 --- a/app/src/qt/widgets/line_number_panel.cpp +++ b/app/src/qt/widgets/line_number_panel.cpp @@ -1,7 +1,7 @@ /* line_number_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/line_number_panel.h b/app/src/qt/widgets/line_number_panel.h index 0ba275eb..04339d37 100644 --- a/app/src/qt/widgets/line_number_panel.h +++ b/app/src/qt/widgets/line_number_panel.h @@ -1,7 +1,7 @@ /* line_number_panel.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/mf_widgets.cpp b/app/src/qt/widgets/mf_widgets.cpp index 6c02807a..dcbd58cc 100644 --- a/app/src/qt/widgets/mf_widgets.cpp +++ b/app/src/qt/widgets/mf_widgets.cpp @@ -1,7 +1,7 @@ /* mf_widgets.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/mf_widgets.h b/app/src/qt/widgets/mf_widgets.h index 16b1267a..68bf64ce 100644 --- a/app/src/qt/widgets/mf_widgets.h +++ b/app/src/qt/widgets/mf_widgets.h @@ -1,7 +1,7 @@ /* mf_widgets.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/urgency_combo_box.cpp b/app/src/qt/widgets/urgency_combo_box.cpp index c9edf3a8..d3614112 100644 --- a/app/src/qt/widgets/urgency_combo_box.cpp +++ b/app/src/qt/widgets/urgency_combo_box.cpp @@ -1,7 +1,7 @@ /* urgency_combo_box.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/urgency_combo_box.h b/app/src/qt/widgets/urgency_combo_box.h index a816a190..15fcd123 100644 --- a/app/src/qt/widgets/urgency_combo_box.h +++ b/app/src/qt/widgets/urgency_combo_box.h @@ -1,7 +1,7 @@ /* urgency_combo_box.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/view_to_edit_buttons_panel.cpp b/app/src/qt/widgets/view_to_edit_buttons_panel.cpp index 20abac11..ad5765fa 100644 --- a/app/src/qt/widgets/view_to_edit_buttons_panel.cpp +++ b/app/src/qt/widgets/view_to_edit_buttons_panel.cpp @@ -1,7 +1,7 @@ /* view_to_edit_buttons_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/view_to_edit_buttons_panel.h b/app/src/qt/widgets/view_to_edit_buttons_panel.h index 746e4308..360efc37 100644 --- a/app/src/qt/widgets/view_to_edit_buttons_panel.h +++ b/app/src/qt/widgets/view_to_edit_buttons_panel.h @@ -1,7 +1,7 @@ /* view_to_edit_buttons_panel.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/test/qt/mindforger-gui-tests.pro b/app/test/qt/mindforger-gui-tests.pro index 6fbca13b..eabd80d0 100644 --- a/app/test/qt/mindforger-gui-tests.pro +++ b/app/test/qt/mindforger-gui-tests.pro @@ -1,6 +1,6 @@ # mindforger-gui-unit-tests.pro MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/appveyor.yml b/appveyor.yml index 759711ce..a98f8b4a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ # appveyor.yml AppVeyor CI configuration file for MindForger # -# Copyright (C) 2016-2022 +# Copyright (C) 2016-2023 # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/Makefile b/build/Makefile index d2fea339..c39f1dba 100644 --- a/build/Makefile +++ b/build/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # MindForger thinking notebook # diff --git a/build/build-win-app.bat b/build/build-win-app.bat index c12d275d..f2e641e7 100644 --- a/build/build-win-app.bat +++ b/build/build-win-app.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2022 +rem Copyright (C) 2016-2023 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/build-win-cmake.bat b/build/build-win-cmake.bat index 8c80e041..f02c2aef 100644 --- a/build/build-win-cmake.bat +++ b/build/build-win-cmake.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2022 +rem Copyright (C) 2016-2023 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/build-win-installer.bat b/build/build-win-installer.bat index f6f32009..9faf2d6d 100644 --- a/build/build-win-installer.bat +++ b/build/build-win-installer.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2022 +rem Copyright (C) 2016-2023 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/build-win-unit-tests.bat b/build/build-win-unit-tests.bat index 3810f600..ff005a31 100644 --- a/build/build-win-unit-tests.bat +++ b/build/build-win-unit-tests.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2022 +rem Copyright (C) 2016-2023 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/debian/debian-aptly-add-deb.sh b/build/debian/debian-aptly-add-deb.sh index 0a2830ef..f07de60c 100755 --- a/build/debian/debian-aptly-add-deb.sh +++ b/build/debian/debian-aptly-add-deb.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/debian/debian-make-deb.sh b/build/debian/debian-make-deb.sh index 70a7df73..7274b6a0 100755 --- a/build/debian/debian-make-deb.sh +++ b/build/debian/debian-make-deb.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/debian/debian-mentors-upload.sh b/build/debian/debian-mentors-upload.sh index e5fff508..0be4e3fb 100755 --- a/build/debian/debian-mentors-upload.sh +++ b/build/debian/debian-mentors-upload.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/debian/debian/changelog b/build/debian/debian/changelog index ad39663a..d59154ca 100644 --- a/build/debian/debian/changelog +++ b/build/debian/debian/changelog @@ -2,5 +2,5 @@ mindforger (1.55.0-1) unstable; urgency=low * Initial New features. - -- Martin Dvorak (Dvorka) Sat, 1 Jan 2022 14:11:33 +0100 + -- Martin Dvorak (Dvorka) Sat, 1 Jan 2023 14:11:33 +0100 diff --git a/build/debian/debian/copyright b/build/debian/debian/copyright index 4a130cd6..a983d196 100644 --- a/build/debian/debian/copyright +++ b/build/debian/debian/copyright @@ -3,7 +3,7 @@ Upstream-Name: mindforger Source: https://github.com/dvorka/mindforger Files: debian/* -Copyright: 2016-2022 Martin Dvorak +Copyright: 2016-2023 Martin Dvorak License: GPL-2+ MindForger is licensed under GNU GPL version 2 or any later version. . diff --git a/build/doc/mf-doc-to-wiki.py b/build/doc/mf-doc-to-wiki.py index 67e504ea..911b5c44 100755 --- a/build/doc/mf-doc-to-wiki.py +++ b/build/doc/mf-doc-to-wiki.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/docker/dockerized-mindforger-run.sh b/build/docker/dockerized-mindforger-run.sh index a56d26a5..9c1af5f3 100755 --- a/build/docker/dockerized-mindforger-run.sh +++ b/build/docker/dockerized-mindforger-run.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/docker/dockerized-mindforger-start.sh b/build/docker/dockerized-mindforger-start.sh index 52e9f4a5..00ad8250 100755 --- a/build/docker/dockerized-mindforger-start.sh +++ b/build/docker/dockerized-mindforger-start.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/docker/mindforger/Dockerfile b/build/docker/mindforger/Dockerfile index 01a11aa2..ccf2e195 100644 --- a/build/docker/mindforger/Dockerfile +++ b/build/docker/mindforger/Dockerfile @@ -1,6 +1,6 @@ # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -21,7 +21,7 @@ # Run MindForger image: # $ xhost +local:root && docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" mindforger:latest mindforger -FROM ubuntu:16.04 +FROM ubuntu:18.04 MAINTAINER "Martin Dvorak" diff --git a/build/env.bat b/build/env.bat index 2313a78b..5d3fce75 100644 --- a/build/env.bat +++ b/build/env.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2022 +rem Copyright (C) 2016-2023 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/fedora/fedora-distro-setup.sh b/build/fedora/fedora-distro-setup.sh index 2952f0cf..666c64a6 100755 --- a/build/fedora/fedora-distro-setup.sh +++ b/build/fedora/fedora-distro-setup.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/fedora/fedora-rpm-from-deb.sh b/build/fedora/fedora-rpm-from-deb.sh index 7c1c17cc..e3f2b359 100755 --- a/build/fedora/fedora-rpm-from-deb.sh +++ b/build/fedora/fedora-rpm-from-deb.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/macos/cmark-gfm-build.sh b/build/macos/cmark-gfm-build.sh index 3a372f28..5c5b03d3 100755 --- a/build/macos/cmark-gfm-build.sh +++ b/build/macos/cmark-gfm-build.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/macos/dmg-package-build.sh b/build/macos/dmg-package-build.sh index b4c21219..949f89b6 100755 --- a/build/macos/dmg-package-build.sh +++ b/build/macos/dmg-package-build.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/macos/env.sh b/build/macos/env.sh index 6c1235a7..50d27224 100644 --- a/build/macos/env.sh +++ b/build/macos/env.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/macos/mindforger-build.sh b/build/macos/mindforger-build.sh index 9c65e30e..01471187 100755 --- a/build/macos/mindforger-build.sh +++ b/build/macos/mindforger-build.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/check-n-fix-codestyle.py b/build/make/check-n-fix-codestyle.py index 572324a1..a4921a62 100755 --- a/build/make/check-n-fix-codestyle.py +++ b/build/make/check-n-fix-codestyle.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -91,9 +91,9 @@ 'mindforger/licenses/hoedown-license.txt', } -COPYRIGHT_CPP = 'Copyright (C) 2016-2022 Martin Dvorak ' -COPYRIGHT_PYTHON = '# Copyright (C) 2016-2022 Martin Dvorak ' -COPYRIGHT_XML = '' +COPYRIGHT_CPP = 'Copyright (C) 2016-2023 Martin Dvorak ' +COPYRIGHT_PYTHON = '# Copyright (C) 2016-2023 Martin Dvorak ' +COPYRIGHT_XML = '' ESC_LIGHT_RED = '' ESC_LIGHT_GREEN = '' diff --git a/build/make/doc-mf-screenshot-size-window.sh b/build/make/doc-mf-screenshot-size-window.sh index 440509a7..18d4bf7c 100755 --- a/build/make/doc-mf-screenshot-size-window.sh +++ b/build/make/doc-mf-screenshot-size-window.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-64k-lines-test-md.py b/build/make/gen-64k-lines-test-md.py index 507b6e1d..384010cd 100755 --- a/build/make/gen-64k-lines-test-md.py +++ b/build/make/gen-64k-lines-test-md.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-cpp-class.py b/build/make/gen-cpp-class.py index 5b901204..3e3b72fc 100755 --- a/build/make/gen-cpp-class.py +++ b/build/make/gen-cpp-class.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -27,7 +27,7 @@ TEMPLATE_HEADER_FILE = """/* {}.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -65,7 +65,7 @@ class {} TEMPLATE_CPP_FILE = """/* {}.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/build/make/gen-cpp-deletes.py b/build/make/gen-cpp-deletes.py index 2e6c8def..933a0b5e 100755 --- a/build/make/gen-cpp-deletes.py +++ b/build/make/gen-cpp-deletes.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-cpp-menu.py b/build/make/gen-cpp-menu.py index 50997d30..a2c08f49 100755 --- a/build/make/gen-cpp-menu.py +++ b/build/make/gen-cpp-menu.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-cpp-ui-class.py b/build/make/gen-cpp-ui-class.py index f08a6b23..e783701b 100755 --- a/build/make/gen-cpp-ui-class.py +++ b/build/make/gen-cpp-ui-class.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -27,7 +27,7 @@ TEMPLATE_HEADER_FILE = """/* {}.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -69,7 +69,7 @@ class {} : public QObject TEMPLATE_CPP_FILE = """/* {}.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/build/make/gen-l10n.sh b/build/make/gen-l10n.sh index 1c80731c..24e0c503 100755 --- a/build/make/gen-l10n.sh +++ b/build/make/gen-l10n.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-qt-project.prefix b/build/make/gen-qt-project.prefix index 502d2198..60167c6a 100644 --- a/build/make/gen-qt-project.prefix +++ b/build/make/gen-qt-project.prefix @@ -1,6 +1,6 @@ # mindforger.pro MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-qt-project.sh b/build/make/gen-qt-project.sh index 3f5fb268..523f97dd 100755 --- a/build/make/gen-qt-project.sh +++ b/build/make/gen-qt-project.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/l10n-edit-and-release.sh b/build/make/l10n-edit-and-release.sh index faa46a72..dc8c5ed2 100755 --- a/build/make/l10n-edit-and-release.sh +++ b/build/make/l10n-edit-and-release.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/l10n-update-strings.sh b/build/make/l10n-update-strings.sh index 4302c3bd..18e650a5 100755 --- a/build/make/l10n-update-strings.sh +++ b/build/make/l10n-update-strings.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/make-demo-repo.sh b/build/make/make-demo-repo.sh index 877ae6f5..578a5963 100755 --- a/build/make/make-demo-repo.sh +++ b/build/make/make-demo-repo.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/make-mf-snapshot.sh b/build/make/make-mf-snapshot.sh index fb64e95b..4bf18e9e 100755 --- a/build/make/make-mf-snapshot.sh +++ b/build/make/make-mf-snapshot.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/make-qt-webengine.sh b/build/make/make-qt-webengine.sh index 3c0ba8fb..419e7292 100755 --- a/build/make/make-qt-webengine.sh +++ b/build/make/make-qt-webengine.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/profile-gprof.sh b/build/make/profile-gprof.sh index 4e0edb2c..ad2fa5ae 100755 --- a/build/make/profile-gprof.sh +++ b/build/make/profile-gprof.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/replace-version-all-files.py b/build/make/replace-version-all-files.py index 24473d07..89ec093f 100755 --- a/build/make/replace-version-all-files.py +++ b/build/make/replace-version-all-files.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/statistic.sh b/build/make/statistic.sh index 8ec950fe..4c4fc9b6 100755 --- a/build/make/statistic.sh +++ b/build/make/statistic.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-all.sh b/build/make/test-all.sh index dbeed638..5520fe92 100755 --- a/build/make/test-all.sh +++ b/build/make/test-all.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-autolinking.sh b/build/make/test-autolinking.sh index 004ea3f7..94aca0a8 100755 --- a/build/make/test-autolinking.sh +++ b/build/make/test-autolinking.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-gui.sh b/build/make/test-gui.sh index 3024c5e4..ff8b46b3 100755 --- a/build/make/test-gui.sh +++ b/build/make/test-gui.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-init-mf-repo-in-tmp.sh b/build/make/test-init-mf-repo-in-tmp.sh index de3702d4..34e094fd 100755 --- a/build/make/test-init-mf-repo-in-tmp.sh +++ b/build/make/test-init-mf-repo-in-tmp.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-l10n.sh b/build/make/test-l10n.sh index 4ac6c3a5..271f1667 100755 --- a/build/make/test-l10n.sh +++ b/build/make/test-l10n.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-lib-units.sh b/build/make/test-lib-units.sh index a0ff045e..0fb2d24e 100755 --- a/build/make/test-lib-units.sh +++ b/build/make/test-lib-units.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/release/release-tgz-deb-rpm-exe.sh b/build/release/release-tgz-deb-rpm-exe.sh index 1aa615ab..c6e5d7c6 100755 --- a/build/release/release-tgz-deb-rpm-exe.sh +++ b/build/release/release-tgz-deb-rpm-exe.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/run-win-app.bat b/build/run-win-app.bat index 0002beb7..07c01868 100644 --- a/build/run-win-app.bat +++ b/build/run-win-app.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2022 +rem Copyright (C) 2016-2023 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/run-win-unit-tests.bat b/build/run-win-unit-tests.bat index a40ac715..fd799e12 100644 --- a/build/run-win-unit-tests.bat +++ b/build/run-win-unit-tests.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2022 +rem Copyright (C) 2016-2023 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/tarball/tarball-build.sh b/build/tarball/tarball-build.sh index 5aa123ac..4ef7490c 100755 --- a/build/tarball/tarball-build.sh +++ b/build/tarball/tarball-build.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/travis-ci/.travis.yml b/build/travis-ci/.travis.yml index df0114ec..7f04df3e 100644 --- a/build/travis-ci/.travis.yml +++ b/build/travis-ci/.travis.yml @@ -1,6 +1,6 @@ # .travis.yml Travis CI configuration file for MindForger # -# Copyright (C) 2014-2022 Martin Dvorak +# Copyright (C) 2014-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh index 1a09c1a7..fe88088b 100755 --- a/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh +++ b/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/ubuntu/build-all-clean-system.sh b/build/ubuntu/build-all-clean-system.sh index 887064f9..f3c5a8bf 100755 --- a/build/ubuntu/build-all-clean-system.sh +++ b/build/ubuntu/build-all-clean-system.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/ubuntu/debian/changelog b/build/ubuntu/debian/changelog index 9dd38553..1de6243b 100644 --- a/build/ubuntu/debian/changelog +++ b/build/ubuntu/debian/changelog @@ -2,5 +2,5 @@ mindforger (1.54.1-0ubuntu1) trusty; urgency=low * Experimental packaging. - -- Martin Dvorak (Dvorka) Sat, 1 Jan 2022 14:11:33 +0100 + -- Martin Dvorak (Dvorka) Sat, 1 Jan 2023 14:11:33 +0100 diff --git a/build/ubuntu/debian/copyright b/build/ubuntu/debian/copyright index 4a130cd6..a983d196 100644 --- a/build/ubuntu/debian/copyright +++ b/build/ubuntu/debian/copyright @@ -3,7 +3,7 @@ Upstream-Name: mindforger Source: https://github.com/dvorka/mindforger Files: debian/* -Copyright: 2016-2022 Martin Dvorak +Copyright: 2016-2023 Martin Dvorak License: GPL-2+ MindForger is licensed under GNU GPL version 2 or any later version. . diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh b/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh index 8886465b..af04343b 100755 --- a/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh +++ b/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/ubuntu/ubuntu-pbuilder-add-distros.sh b/build/ubuntu/ubuntu-pbuilder-add-distros.sh index 6f0d8b3d..a65d6918 100755 --- a/build/ubuntu/ubuntu-pbuilder-add-distros.sh +++ b/build/ubuntu/ubuntu-pbuilder-add-distros.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/windows/build-win-installer.bat b/build/windows/build-win-installer.bat index 3cb352f0..83a96279 100644 --- a/build/windows/build-win-installer.bat +++ b/build/windows/build-win-installer.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2022 +rem Copyright (C) 2016-2023 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/deps/zlib-win/include/zconf.h b/deps/zlib-win/include/zconf.h index d8c78e99..76a7876b 100644 --- a/deps/zlib-win/include/zconf.h +++ b/deps/zlib-win/include/zconf.h @@ -5,7 +5,7 @@ /* * MindForger thinking notebook - * Copyright (C) 2016-2022 Martin Dvorak + * Copyright (C) 2016-2023 Martin Dvorak * * This header file has been modified for MindForger as follows: diff --git a/lib/lib.pro b/lib/lib.pro index 9b047581..c0c8b3dd 100644 --- a/lib/lib.pro +++ b/lib/lib.pro @@ -1,6 +1,6 @@ # mindforger-lib.pro MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software ; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/src/app_info.h b/lib/src/app_info.h index b97353e9..3c2697a0 100644 --- a/lib/src/app_info.h +++ b/lib/src/app_info.h @@ -8,5 +8,5 @@ #define MINDFORGER_APP_AUTHOR "Martin Dvorak" #define MINDFORGER_APP_URL "https://www.mindforger.com" #define MINDFORGER_APP_COMPANY MINDFORGER_APP_NAME -#define MINDFORGER_APP_LEGAL "\xA9 2016-2022 Martin Dvorak. All Rights Reserved" +#define MINDFORGER_APP_LEGAL "\xA9 2016-2023 Martin Dvorak. All Rights Reserved" #define MINDFORGER_APP_EXE "mindforger.exe" diff --git a/lib/src/compilation.h b/lib/src/compilation.h index b275aaaa..faf58578 100644 --- a/lib/src/compilation.h +++ b/lib/src/compilation.h @@ -1,7 +1,7 @@ /* compilation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/color.h b/lib/src/config/color.h index 380b1c2a..ba1e34e2 100644 --- a/lib/src/config/color.h +++ b/lib/src/config/color.h @@ -1,7 +1,7 @@ /* color.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/configuration.cpp b/lib/src/config/configuration.cpp index 291cdb52..bba26ec0 100644 --- a/lib/src/config/configuration.cpp +++ b/lib/src/config/configuration.cpp @@ -1,7 +1,7 @@ /* configuration.cpp M8r configuration management - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h index 9e72e99c..ce760392 100644 --- a/lib/src/config/configuration.h +++ b/lib/src/config/configuration.h @@ -1,7 +1,7 @@ /* configuration.h M8r configuration management - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/palette.cpp b/lib/src/config/palette.cpp index a1b0a4d6..b0ba1c6c 100644 --- a/lib/src/config/palette.cpp +++ b/lib/src/config/palette.cpp @@ -1,7 +1,7 @@ /* palette.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/palette.h b/lib/src/config/palette.h index 7a566293..ec6f8c0b 100644 --- a/lib/src/config/palette.h +++ b/lib/src/config/palette.h @@ -1,7 +1,7 @@ /* palette.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/repository.cpp b/lib/src/config/repository.cpp index 3451b582..a93df25d 100644 --- a/lib/src/config/repository.cpp +++ b/lib/src/config/repository.cpp @@ -1,7 +1,7 @@ /* repository.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/repository.h b/lib/src/config/repository.h index 1b82ef0d..380f848e 100644 --- a/lib/src/config/repository.h +++ b/lib/src/config/repository.h @@ -1,7 +1,7 @@ /* repository.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/repository_configuration.cpp b/lib/src/config/repository_configuration.cpp index f607ca24..537289dd 100644 --- a/lib/src/config/repository_configuration.cpp +++ b/lib/src/config/repository_configuration.cpp @@ -1,7 +1,7 @@ /* repository_configuration.cpp M8r configuration management - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/repository_configuration.h b/lib/src/config/repository_configuration.h index 3da7591a..2615c659 100644 --- a/lib/src/config/repository_configuration.h +++ b/lib/src/config/repository_configuration.h @@ -1,7 +1,7 @@ /* repository_configuration.h M8r configuration management - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/time_scope.cpp b/lib/src/config/time_scope.cpp index adbda343..0f40023f 100644 --- a/lib/src/config/time_scope.cpp +++ b/lib/src/config/time_scope.cpp @@ -1,7 +1,7 @@ /* time_scope.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/time_scope.h b/lib/src/config/time_scope.h index 645940e7..1f571e3d 100644 --- a/lib/src/config/time_scope.h +++ b/lib/src/config/time_scope.h @@ -1,7 +1,7 @@ /* time_scope.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/debug.h b/lib/src/debug.h index 0c87d801..70fe53a9 100644 --- a/lib/src/debug.h +++ b/lib/src/debug.h @@ -1,7 +1,7 @@ /* debug.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/definitions.h b/lib/src/definitions.h index 1e5a210f..04a40668 100644 --- a/lib/src/definitions.h +++ b/lib/src/definitions.h @@ -1,7 +1,7 @@ /* definitions.h MindForger type, include, ... definitions - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/exceptions.h b/lib/src/exceptions.h index d5f646cc..a8e08648 100644 --- a/lib/src/exceptions.h +++ b/lib/src/exceptions.h @@ -1,7 +1,7 @@ /* exceptions.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/async_utils.cpp b/lib/src/gear/async_utils.cpp index 6e581e86..047ea1d5 100644 --- a/lib/src/gear/async_utils.cpp +++ b/lib/src/gear/async_utils.cpp @@ -1,7 +1,7 @@ /* async_utils.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/async_utils.h b/lib/src/gear/async_utils.h index 0382f08d..e2a4393e 100644 --- a/lib/src/gear/async_utils.h +++ b/lib/src/gear/async_utils.h @@ -1,7 +1,7 @@ /* async_utils.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/datetime_utils.cpp b/lib/src/gear/datetime_utils.cpp index 97ea7c05..d34125b3 100644 --- a/lib/src/gear/datetime_utils.cpp +++ b/lib/src/gear/datetime_utils.cpp @@ -1,7 +1,7 @@ /* datetime_utils.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/datetime_utils.h b/lib/src/gear/datetime_utils.h index c3cb92df..e2f39db5 100644 --- a/lib/src/gear/datetime_utils.h +++ b/lib/src/gear/datetime_utils.h @@ -1,7 +1,7 @@ /* datetime_utils.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/file_utils.cpp b/lib/src/gear/file_utils.cpp index bf0f7f1a..b73b71e2 100644 --- a/lib/src/gear/file_utils.cpp +++ b/lib/src/gear/file_utils.cpp @@ -1,7 +1,7 @@ /* file_utils.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/file_utils.h b/lib/src/gear/file_utils.h index c0a3b429..bcd21761 100644 --- a/lib/src/gear/file_utils.h +++ b/lib/src/gear/file_utils.h @@ -1,7 +1,7 @@ /* file_utils.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/hash_map.h b/lib/src/gear/hash_map.h index 2b66c168..60fb0dcf 100644 --- a/lib/src/gear/hash_map.h +++ b/lib/src/gear/hash_map.h @@ -1,7 +1,7 @@ /* hash_map.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/lang_utils.h b/lib/src/gear/lang_utils.h index f4038732..0e5e86c1 100644 --- a/lib/src/gear/lang_utils.h +++ b/lib/src/gear/lang_utils.h @@ -1,7 +1,7 @@ /* lang-utils.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/math_utils.cpp b/lib/src/gear/math_utils.cpp index 12d12a19..284dd6fa 100644 --- a/lib/src/gear/math_utils.cpp +++ b/lib/src/gear/math_utils.cpp @@ -1,7 +1,7 @@ /* math_utils.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/math_utils.h b/lib/src/gear/math_utils.h index a579ff24..e17c4240 100644 --- a/lib/src/gear/math_utils.h +++ b/lib/src/gear/math_utils.h @@ -1,7 +1,7 @@ /* math_utils.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/string_utils.cpp b/lib/src/gear/string_utils.cpp index 7c98082d..5f5876a2 100644 --- a/lib/src/gear/string_utils.cpp +++ b/lib/src/gear/string_utils.cpp @@ -1,7 +1,7 @@ /* string-utils.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/string_utils.h b/lib/src/gear/string_utils.h index 257220b9..de3e993f 100644 --- a/lib/src/gear/string_utils.h +++ b/lib/src/gear/string_utils.h @@ -1,7 +1,7 @@ /* string-utils.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/trie.cpp b/lib/src/gear/trie.cpp index 467a82fc..49cb3701 100644 --- a/lib/src/gear/trie.cpp +++ b/lib/src/gear/trie.cpp @@ -1,7 +1,7 @@ /* trie.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/trie.h b/lib/src/gear/trie.h index 63d51043..1ec11ab5 100644 --- a/lib/src/gear/trie.h +++ b/lib/src/gear/trie.h @@ -1,7 +1,7 @@ /* trie.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/install/installer.cpp b/lib/src/install/installer.cpp index 21caedf1..509c2020 100644 --- a/lib/src/install/installer.cpp +++ b/lib/src/install/installer.cpp @@ -1,7 +1,7 @@ /* installer.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/install/installer.h b/lib/src/install/installer.h index 5fc3f5dd..b194f814 100644 --- a/lib/src/install/installer.h +++ b/lib/src/install/installer.h @@ -1,7 +1,7 @@ /* installer.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/aa_model.cpp b/lib/src/mind/ai/aa_model.cpp index b9825e42..141fc073 100644 --- a/lib/src/mind/ai/aa_model.cpp +++ b/lib/src/mind/ai/aa_model.cpp @@ -1,7 +1,7 @@ /* aa_model.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/aa_model.h b/lib/src/mind/ai/aa_model.h index bf077fd8..2e4cbc2c 100644 --- a/lib/src/mind/ai/aa_model.h +++ b/lib/src/mind/ai/aa_model.h @@ -1,7 +1,7 @@ /* aa_model.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/aa_notes_feature.cpp b/lib/src/mind/ai/aa_notes_feature.cpp index 32f30369..5e1fba8f 100644 --- a/lib/src/mind/ai/aa_notes_feature.cpp +++ b/lib/src/mind/ai/aa_notes_feature.cpp @@ -1,7 +1,7 @@ /* aa_notes_feature.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/aa_notes_feature.h b/lib/src/mind/ai/aa_notes_feature.h index b759ddbe..aa77659f 100644 --- a/lib/src/mind/ai/aa_notes_feature.h +++ b/lib/src/mind/ai/aa_notes_feature.h @@ -1,7 +1,7 @@ /* aa_notes_feature.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai.cpp b/lib/src/mind/ai/ai.cpp index 45ec930a..8cbf5641 100644 --- a/lib/src/mind/ai/ai.cpp +++ b/lib/src/mind/ai/ai.cpp @@ -1,7 +1,7 @@ /* ai.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai.h b/lib/src/mind/ai/ai.h index 3116b0e4..4b7ad5b4 100644 --- a/lib/src/mind/ai/ai.h +++ b/lib/src/mind/ai/ai.h @@ -1,7 +1,7 @@ /* ai.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai_aa.h b/lib/src/mind/ai/ai_aa.h index d021e05b..13a69ecd 100644 --- a/lib/src/mind/ai/ai_aa.h +++ b/lib/src/mind/ai/ai_aa.h @@ -1,7 +1,7 @@ /* ai_aa.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai_aa_bow.cpp b/lib/src/mind/ai/ai_aa_bow.cpp index 96153a49..03874d96 100644 --- a/lib/src/mind/ai/ai_aa_bow.cpp +++ b/lib/src/mind/ai/ai_aa_bow.cpp @@ -1,7 +1,7 @@ /* ai_aa_bow.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai_aa_bow.h b/lib/src/mind/ai/ai_aa_bow.h index 3393069b..326171c3 100644 --- a/lib/src/mind/ai/ai_aa_bow.h +++ b/lib/src/mind/ai/ai_aa_bow.h @@ -1,7 +1,7 @@ /* ai_aa_bow.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai_aa_weighted_fts.cpp b/lib/src/mind/ai/ai_aa_weighted_fts.cpp index 22020888..5c9a001e 100644 --- a/lib/src/mind/ai/ai_aa_weighted_fts.cpp +++ b/lib/src/mind/ai/ai_aa_weighted_fts.cpp @@ -1,7 +1,7 @@ /* ai_aa_weighted_fts.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai_aa_weighted_fts.h b/lib/src/mind/ai/ai_aa_weighted_fts.h index 0a77a5ea..bfd5825d 100644 --- a/lib/src/mind/ai/ai_aa_weighted_fts.h +++ b/lib/src/mind/ai/ai_aa_weighted_fts.h @@ -1,7 +1,7 @@ /* ai_aa_weighted_fts.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/autolinking_mind.cpp b/lib/src/mind/ai/autolinking/autolinking_mind.cpp index fc67a52f..74a99709 100644 --- a/lib/src/mind/ai/autolinking/autolinking_mind.cpp +++ b/lib/src/mind/ai/autolinking/autolinking_mind.cpp @@ -1,7 +1,7 @@ /* autolinking_mind.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/autolinking_mind.h b/lib/src/mind/ai/autolinking/autolinking_mind.h index b31e92ed..b436883d 100644 --- a/lib/src/mind/ai/autolinking/autolinking_mind.h +++ b/lib/src/mind/ai/autolinking/autolinking_mind.h @@ -1,7 +1,7 @@ /* autolinking_mind.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp index 9702d6ff..7daac9e0 100644 --- a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp @@ -1,7 +1,7 @@ /* cmark_aho_corasick_block_autolinking_preprocessor.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h index 6c93d461..5a22faf3 100644 --- a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h +++ b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h @@ -1,7 +1,7 @@ /* cmark_aho_corasick_block_autolinking_preprocessor.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.cpp index 733fbf8c..a28136e2 100644 --- a/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.cpp @@ -1,7 +1,7 @@ /* cmark_trie_line_autolinking_preprocessor.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.h b/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.h index 970b6e16..04e2eb42 100644 --- a/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.h +++ b/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.h @@ -1,7 +1,7 @@ /* cmark_trie_line_autolinking_preprocessor.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.cpp index 53eac510..73fefc05 100644 --- a/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.cpp @@ -1,7 +1,7 @@ /* naive_autolinking_preprocessor.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.h b/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.h index e2dbdf66..8f07fd54 100644 --- a/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.h +++ b/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.h @@ -1,7 +1,7 @@ /* naive_autolinking_preprocessor.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking_preprocessor.cpp index 5c99e639..0748e8df 100644 --- a/lib/src/mind/ai/autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking_preprocessor.cpp @@ -1,7 +1,7 @@ /* autolinking_preprocessor.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking_preprocessor.h b/lib/src/mind/ai/autolinking_preprocessor.h index 4e92ebcf..db1e5513 100644 --- a/lib/src/mind/ai/autolinking_preprocessor.h +++ b/lib/src/mind/ai/autolinking_preprocessor.h @@ -1,7 +1,7 @@ /* autolinking_preprocessor.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/bag_of_words.cpp b/lib/src/mind/ai/nlp/bag_of_words.cpp index 414ff1e1..d56fd8e4 100644 --- a/lib/src/mind/ai/nlp/bag_of_words.cpp +++ b/lib/src/mind/ai/nlp/bag_of_words.cpp @@ -1,7 +1,7 @@ /* bag_of_words.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/bag_of_words.h b/lib/src/mind/ai/nlp/bag_of_words.h index 1dac64ae..3209418b 100644 --- a/lib/src/mind/ai/nlp/bag_of_words.h +++ b/lib/src/mind/ai/nlp/bag_of_words.h @@ -1,7 +1,7 @@ /* bag_of_words.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/char_provider.h b/lib/src/mind/ai/nlp/char_provider.h index b3e07232..c602087b 100644 --- a/lib/src/mind/ai/nlp/char_provider.h +++ b/lib/src/mind/ai/nlp/char_provider.h @@ -1,7 +1,7 @@ /* char_provider.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/common_words_blacklist.cpp b/lib/src/mind/ai/nlp/common_words_blacklist.cpp index d7c3dc16..3531a7cd 100644 --- a/lib/src/mind/ai/nlp/common_words_blacklist.cpp +++ b/lib/src/mind/ai/nlp/common_words_blacklist.cpp @@ -1,7 +1,7 @@ /* common_words_blacklist.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/common_words_blacklist.h b/lib/src/mind/ai/nlp/common_words_blacklist.h index 801bd8cd..0665734f 100644 --- a/lib/src/mind/ai/nlp/common_words_blacklist.h +++ b/lib/src/mind/ai/nlp/common_words_blacklist.h @@ -1,7 +1,7 @@ /* common_words_blacklist.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/lexicon.cpp b/lib/src/mind/ai/nlp/lexicon.cpp index a57f0d4c..525a2fc2 100644 --- a/lib/src/mind/ai/nlp/lexicon.cpp +++ b/lib/src/mind/ai/nlp/lexicon.cpp @@ -1,7 +1,7 @@ /* lexicon.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/lexicon.h b/lib/src/mind/ai/nlp/lexicon.h index 1d2094eb..f17edb0e 100644 --- a/lib/src/mind/ai/nlp/lexicon.h +++ b/lib/src/mind/ai/nlp/lexicon.h @@ -1,7 +1,7 @@ /* lexicon.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/markdown_tokenizer.cpp b/lib/src/mind/ai/nlp/markdown_tokenizer.cpp index 2942de79..69e0fb5e 100644 --- a/lib/src/mind/ai/nlp/markdown_tokenizer.cpp +++ b/lib/src/mind/ai/nlp/markdown_tokenizer.cpp @@ -1,7 +1,7 @@ /* markdown_tokenizer.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/markdown_tokenizer.h b/lib/src/mind/ai/nlp/markdown_tokenizer.h index 055cbe23..0f64f491 100644 --- a/lib/src/mind/ai/nlp/markdown_tokenizer.h +++ b/lib/src/mind/ai/nlp/markdown_tokenizer.h @@ -1,7 +1,7 @@ /* markdown_tokenizer.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/named_entity_recognition.cpp b/lib/src/mind/ai/nlp/named_entity_recognition.cpp index 1b08066e..30643744 100644 --- a/lib/src/mind/ai/nlp/named_entity_recognition.cpp +++ b/lib/src/mind/ai/nlp/named_entity_recognition.cpp @@ -1,7 +1,7 @@ /* named_entity_recognition.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/named_entity_recognition.h b/lib/src/mind/ai/nlp/named_entity_recognition.h index f1eea089..10501c15 100644 --- a/lib/src/mind/ai/nlp/named_entity_recognition.h +++ b/lib/src/mind/ai/nlp/named_entity_recognition.h @@ -1,7 +1,7 @@ /* named_entity_recognition.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/ner_named_entity.cpp b/lib/src/mind/ai/nlp/ner_named_entity.cpp index c2d5be45..a99932fd 100644 --- a/lib/src/mind/ai/nlp/ner_named_entity.cpp +++ b/lib/src/mind/ai/nlp/ner_named_entity.cpp @@ -1,7 +1,7 @@ /* ner_named_entity.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/ner_named_entity.h b/lib/src/mind/ai/nlp/ner_named_entity.h index c0b9b8ac..ff5e4d68 100644 --- a/lib/src/mind/ai/nlp/ner_named_entity.h +++ b/lib/src/mind/ai/nlp/ner_named_entity.h @@ -1,7 +1,7 @@ /* ner_named_entity.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/note_char_provider.cpp b/lib/src/mind/ai/nlp/note_char_provider.cpp index 2983828a..55cb47f9 100644 --- a/lib/src/mind/ai/nlp/note_char_provider.cpp +++ b/lib/src/mind/ai/nlp/note_char_provider.cpp @@ -1,7 +1,7 @@ /* note_char_provider.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/note_char_provider.h b/lib/src/mind/ai/nlp/note_char_provider.h index 0549f9f0..d5c275e1 100644 --- a/lib/src/mind/ai/nlp/note_char_provider.h +++ b/lib/src/mind/ai/nlp/note_char_provider.h @@ -1,7 +1,7 @@ /* note_char_provider.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/outline_char_provider.cpp b/lib/src/mind/ai/nlp/outline_char_provider.cpp index 73a94188..382fb08d 100644 --- a/lib/src/mind/ai/nlp/outline_char_provider.cpp +++ b/lib/src/mind/ai/nlp/outline_char_provider.cpp @@ -1,7 +1,7 @@ /* outline_char_provider.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/outline_char_provider.h b/lib/src/mind/ai/nlp/outline_char_provider.h index b048e39f..916324da 100644 --- a/lib/src/mind/ai/nlp/outline_char_provider.h +++ b/lib/src/mind/ai/nlp/outline_char_provider.h @@ -1,7 +1,7 @@ /* outline_char_provider.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/stemmer/stemmer.cpp b/lib/src/mind/ai/nlp/stemmer/stemmer.cpp index f1c095ef..39b0f165 100644 --- a/lib/src/mind/ai/nlp/stemmer/stemmer.cpp +++ b/lib/src/mind/ai/nlp/stemmer/stemmer.cpp @@ -1,7 +1,7 @@ /* stemmer.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/stemmer/stemmer.h b/lib/src/mind/ai/nlp/stemmer/stemmer.h index 657a07d0..f3847a4f 100644 --- a/lib/src/mind/ai/nlp/stemmer/stemmer.h +++ b/lib/src/mind/ai/nlp/stemmer/stemmer.h @@ -1,7 +1,7 @@ /* stemmer.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/string_char_provider.cpp b/lib/src/mind/ai/nlp/string_char_provider.cpp index 2adacc40..732f2f92 100644 --- a/lib/src/mind/ai/nlp/string_char_provider.cpp +++ b/lib/src/mind/ai/nlp/string_char_provider.cpp @@ -1,7 +1,7 @@ /* string_char_provider.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/string_char_provider.h b/lib/src/mind/ai/nlp/string_char_provider.h index 4accdfe4..0eabc7e7 100644 --- a/lib/src/mind/ai/nlp/string_char_provider.h +++ b/lib/src/mind/ai/nlp/string_char_provider.h @@ -1,7 +1,7 @@ /* string_char_provider.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/word_frequency_list.cpp b/lib/src/mind/ai/nlp/word_frequency_list.cpp index 8aacf752..cd527400 100644 --- a/lib/src/mind/ai/nlp/word_frequency_list.cpp +++ b/lib/src/mind/ai/nlp/word_frequency_list.cpp @@ -1,7 +1,7 @@ /* word_frequency_list.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/word_frequency_list.h b/lib/src/mind/ai/nlp/word_frequency_list.h index 9c8fcbd6..bc13ff17 100644 --- a/lib/src/mind/ai/nlp/word_frequency_list.h +++ b/lib/src/mind/ai/nlp/word_frequency_list.h @@ -1,7 +1,7 @@ /* word_frequency_list.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/aspect.h b/lib/src/mind/aspect/aspect.h index d8d04333..1daf35ef 100644 --- a/lib/src/mind/aspect/aspect.h +++ b/lib/src/mind/aspect/aspect.h @@ -1,7 +1,7 @@ /* aspect.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/mind_scope_aspect.cpp b/lib/src/mind/aspect/mind_scope_aspect.cpp index 970ea97c..cee95e66 100644 --- a/lib/src/mind/aspect/mind_scope_aspect.cpp +++ b/lib/src/mind/aspect/mind_scope_aspect.cpp @@ -1,7 +1,7 @@ /* mind_scope_aspect.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/mind_scope_aspect.h b/lib/src/mind/aspect/mind_scope_aspect.h index 17a129b4..261bfdf6 100644 --- a/lib/src/mind/aspect/mind_scope_aspect.h +++ b/lib/src/mind/aspect/mind_scope_aspect.h @@ -1,7 +1,7 @@ /* mind_scope_aspect.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/tag_scope_aspect.cpp b/lib/src/mind/aspect/tag_scope_aspect.cpp index 40b34ad6..f9b782c9 100644 --- a/lib/src/mind/aspect/tag_scope_aspect.cpp +++ b/lib/src/mind/aspect/tag_scope_aspect.cpp @@ -1,7 +1,7 @@ /* tag_scope_aspect.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/tag_scope_aspect.h b/lib/src/mind/aspect/tag_scope_aspect.h index 812a7771..5459d3db 100644 --- a/lib/src/mind/aspect/tag_scope_aspect.h +++ b/lib/src/mind/aspect/tag_scope_aspect.h @@ -1,7 +1,7 @@ /* tag_scope_aspect.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/time_scope_aspect.cpp b/lib/src/mind/aspect/time_scope_aspect.cpp index 9795a439..ac29377e 100644 --- a/lib/src/mind/aspect/time_scope_aspect.cpp +++ b/lib/src/mind/aspect/time_scope_aspect.cpp @@ -1,7 +1,7 @@ /* forget_aspect.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/time_scope_aspect.h b/lib/src/mind/aspect/time_scope_aspect.h index b7b16835..9200eee5 100644 --- a/lib/src/mind/aspect/time_scope_aspect.h +++ b/lib/src/mind/aspect/time_scope_aspect.h @@ -1,7 +1,7 @@ /* time_scope_aspect.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/associated_notes.cpp b/lib/src/mind/associated_notes.cpp index ba49725a..98bf10e0 100644 --- a/lib/src/mind/associated_notes.cpp +++ b/lib/src/mind/associated_notes.cpp @@ -1,7 +1,7 @@ /* associated_notes.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/associated_notes.h b/lib/src/mind/associated_notes.h index fe1100dc..0d904ba0 100644 --- a/lib/src/mind/associated_notes.h +++ b/lib/src/mind/associated_notes.h @@ -1,7 +1,7 @@ /* associated_notes.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/dikw_pyramid.cpp b/lib/src/mind/dikw/dikw_pyramid.cpp index a56648c9..53f6a1ba 100644 --- a/lib/src/mind/dikw/dikw_pyramid.cpp +++ b/lib/src/mind/dikw/dikw_pyramid.cpp @@ -1,7 +1,7 @@ /* dikw_pyramid.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/dikw_pyramid.h b/lib/src/mind/dikw/dikw_pyramid.h index 124a6800..a34bf3f2 100644 --- a/lib/src/mind/dikw/dikw_pyramid.h +++ b/lib/src/mind/dikw/dikw_pyramid.h @@ -1,7 +1,7 @@ /* dikw_pyramid.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/filesystem_information.cpp b/lib/src/mind/dikw/filesystem_information.cpp index 8cafa062..3c4ee220 100644 --- a/lib/src/mind/dikw/filesystem_information.cpp +++ b/lib/src/mind/dikw/filesystem_information.cpp @@ -1,7 +1,7 @@ /* filesystem_information.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/filesystem_information.h b/lib/src/mind/dikw/filesystem_information.h index 4211a9ec..772fcbee 100644 --- a/lib/src/mind/dikw/filesystem_information.h +++ b/lib/src/mind/dikw/filesystem_information.h @@ -1,7 +1,7 @@ /* filesystem_information.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/information.cpp b/lib/src/mind/dikw/information.cpp index 5bd5f4fa..82969e11 100644 --- a/lib/src/mind/dikw/information.cpp +++ b/lib/src/mind/dikw/information.cpp @@ -1,7 +1,7 @@ /* information.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/information.h b/lib/src/mind/dikw/information.h index 7b1f8bfe..e6474f51 100644 --- a/lib/src/mind/dikw/information.h +++ b/lib/src/mind/dikw/information.h @@ -1,7 +1,7 @@ /* information.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/galaxy.cpp b/lib/src/mind/galaxy.cpp index 808dde88..a075b802 100644 --- a/lib/src/mind/galaxy.cpp +++ b/lib/src/mind/galaxy.cpp @@ -1,7 +1,7 @@ /* galaxy.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/galaxy.h b/lib/src/mind/galaxy.h index 22534b0a..7c2ee8ba 100644 --- a/lib/src/mind/galaxy.h +++ b/lib/src/mind/galaxy.h @@ -1,7 +1,7 @@ /* galaxy.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/knowledge_graph.cpp b/lib/src/mind/knowledge_graph.cpp index 7edd04d5..c888793c 100644 --- a/lib/src/mind/knowledge_graph.cpp +++ b/lib/src/mind/knowledge_graph.cpp @@ -1,7 +1,7 @@ /* knowledge_graph.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/knowledge_graph.h b/lib/src/mind/knowledge_graph.h index 4bd22d0d..4edd1050 100644 --- a/lib/src/mind/knowledge_graph.h +++ b/lib/src/mind/knowledge_graph.h @@ -1,7 +1,7 @@ /* knowledge_graph.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/limbo.cpp b/lib/src/mind/limbo.cpp index fe597bea..ff809842 100644 --- a/lib/src/mind/limbo.cpp +++ b/lib/src/mind/limbo.cpp @@ -1,7 +1,7 @@ /* limbo.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/limbo.h b/lib/src/mind/limbo.h index 52aec810..32997aba 100644 --- a/lib/src/mind/limbo.h +++ b/lib/src/mind/limbo.h @@ -1,7 +1,7 @@ /* limbo.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/memory.cpp b/lib/src/mind/memory.cpp index fd468d8a..4d156dfc 100644 --- a/lib/src/mind/memory.cpp +++ b/lib/src/mind/memory.cpp @@ -1,7 +1,7 @@ /* memory.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/memory.h b/lib/src/mind/memory.h index b06679d1..5a570948 100644 --- a/lib/src/mind/memory.h +++ b/lib/src/mind/memory.h @@ -1,7 +1,7 @@ /* memory.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/memory_dwell.cpp b/lib/src/mind/memory_dwell.cpp index 10c3299b..8cd24518 100644 --- a/lib/src/mind/memory_dwell.cpp +++ b/lib/src/mind/memory_dwell.cpp @@ -1,7 +1,7 @@ /* memory_dwell.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/memory_dwell.h b/lib/src/mind/memory_dwell.h index d3a227e6..587b94b8 100644 --- a/lib/src/mind/memory_dwell.h +++ b/lib/src/mind/memory_dwell.h @@ -1,7 +1,7 @@ /* memory_dwell.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp index 5b03de67..4d4b166a 100644 --- a/lib/src/mind/mind.cpp +++ b/lib/src/mind/mind.cpp @@ -1,7 +1,7 @@ /* mind.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h index 571a201d..77cee573 100644 --- a/lib/src/mind/mind.h +++ b/lib/src/mind/mind.h @@ -1,7 +1,7 @@ /* mind.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/mind_listener.h b/lib/src/mind/mind_listener.h index 5b4ca9c2..8b97eb4e 100644 --- a/lib/src/mind/mind_listener.h +++ b/lib/src/mind/mind_listener.h @@ -1,7 +1,7 @@ /* mind_listener.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/ontology.cpp b/lib/src/mind/ontology/ontology.cpp index 3221042f..058f0eb1 100644 --- a/lib/src/mind/ontology/ontology.cpp +++ b/lib/src/mind/ontology/ontology.cpp @@ -1,7 +1,7 @@ /* ontology.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/ontology.h b/lib/src/mind/ontology/ontology.h index 7fd37fcf..72029fb7 100644 --- a/lib/src/mind/ontology/ontology.h +++ b/lib/src/mind/ontology/ontology.h @@ -1,7 +1,7 @@ /* ontology.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/ontology_vocabulary.h b/lib/src/mind/ontology/ontology_vocabulary.h index ab3b339e..b0bdfbc7 100644 --- a/lib/src/mind/ontology/ontology_vocabulary.h +++ b/lib/src/mind/ontology/ontology_vocabulary.h @@ -1,7 +1,7 @@ /* ontology_map.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/taxonomy.h b/lib/src/mind/ontology/taxonomy.h index 85ee15f6..ac2d3a68 100644 --- a/lib/src/mind/ontology/taxonomy.h +++ b/lib/src/mind/ontology/taxonomy.h @@ -1,7 +1,7 @@ /* taxonomy.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/thing_class_rel_triple.cpp b/lib/src/mind/ontology/thing_class_rel_triple.cpp index 359a1b74..8400a2d2 100644 --- a/lib/src/mind/ontology/thing_class_rel_triple.cpp +++ b/lib/src/mind/ontology/thing_class_rel_triple.cpp @@ -1,7 +1,7 @@ /* thing.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/thing_class_rel_triple.h b/lib/src/mind/ontology/thing_class_rel_triple.h index f99db098..446b2df5 100644 --- a/lib/src/mind/ontology/thing_class_rel_triple.h +++ b/lib/src/mind/ontology/thing_class_rel_triple.h @@ -1,7 +1,7 @@ /* thing_class_rel_triple.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/working_memory.cpp b/lib/src/mind/working_memory.cpp index fd07eca7..5d2eb656 100644 --- a/lib/src/mind/working_memory.cpp +++ b/lib/src/mind/working_memory.cpp @@ -1,7 +1,7 @@ /* working_memory.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/working_memory.h b/lib/src/mind/working_memory.h index 5c379e37..00e2b16e 100644 --- a/lib/src/mind/working_memory.h +++ b/lib/src/mind/working_memory.h @@ -1,7 +1,7 @@ /* working_memory.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/eisenhower_matrix.cpp b/lib/src/model/eisenhower_matrix.cpp index 155c6141..5331d87e 100644 --- a/lib/src/model/eisenhower_matrix.cpp +++ b/lib/src/model/eisenhower_matrix.cpp @@ -1,7 +1,7 @@ /* eisenhower_matrix.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/eisenhower_matrix.h b/lib/src/model/eisenhower_matrix.h index 8ddb7793..e9deaa81 100644 --- a/lib/src/model/eisenhower_matrix.h +++ b/lib/src/model/eisenhower_matrix.h @@ -1,7 +1,7 @@ /* eisenhower_matrix.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/kanban.cpp b/lib/src/model/kanban.cpp index f9e06dc0..71459e8a 100644 --- a/lib/src/model/kanban.cpp +++ b/lib/src/model/kanban.cpp @@ -1,7 +1,7 @@ /* kanban.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/kanban.h b/lib/src/model/kanban.h index 91a00640..3d865a0b 100644 --- a/lib/src/model/kanban.h +++ b/lib/src/model/kanban.h @@ -1,7 +1,7 @@ /* kanban.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/link.cpp b/lib/src/model/link.cpp index 31dcbd6c..10d89883 100644 --- a/lib/src/model/link.cpp +++ b/lib/src/model/link.cpp @@ -1,7 +1,7 @@ /* link.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/link.h b/lib/src/model/link.h index 2da33691..16846fb1 100644 --- a/lib/src/model/link.h +++ b/lib/src/model/link.h @@ -1,7 +1,7 @@ /* link.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/note.cpp b/lib/src/model/note.cpp index 86fe458c..0549b9bb 100644 --- a/lib/src/model/note.cpp +++ b/lib/src/model/note.cpp @@ -1,7 +1,7 @@ /* note.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/note.h b/lib/src/model/note.h index f3ad3157..dbcda3a4 100644 --- a/lib/src/model/note.h +++ b/lib/src/model/note.h @@ -1,7 +1,7 @@ /* note.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/note_type.cpp b/lib/src/model/note_type.cpp index a5234371..cef050ae 100644 --- a/lib/src/model/note_type.cpp +++ b/lib/src/model/note_type.cpp @@ -1,7 +1,7 @@ /* note_type.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/note_type.h b/lib/src/model/note_type.h index 186312e4..8b41dbc8 100644 --- a/lib/src/model/note_type.h +++ b/lib/src/model/note_type.h @@ -1,7 +1,7 @@ /* note_type.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/organizer.cpp b/lib/src/model/organizer.cpp index 733f4fdb..bdca18bd 100644 --- a/lib/src/model/organizer.cpp +++ b/lib/src/model/organizer.cpp @@ -1,7 +1,7 @@ /* organizer.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/organizer.h b/lib/src/model/organizer.h index 2f25a61f..de57e9a9 100644 --- a/lib/src/model/organizer.h +++ b/lib/src/model/organizer.h @@ -1,7 +1,7 @@ /* organizer.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/outline.cpp b/lib/src/model/outline.cpp index ff866e50..acf291a6 100644 --- a/lib/src/model/outline.cpp +++ b/lib/src/model/outline.cpp @@ -1,7 +1,7 @@ /* outline.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/outline.h b/lib/src/model/outline.h index c4b7610f..78cb7c5f 100644 --- a/lib/src/model/outline.h +++ b/lib/src/model/outline.h @@ -1,7 +1,7 @@ /* outline.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/outline_type.cpp b/lib/src/model/outline_type.cpp index 7f33efa0..4d5004bc 100644 --- a/lib/src/model/outline_type.cpp +++ b/lib/src/model/outline_type.cpp @@ -1,7 +1,7 @@ /* outline_type.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/outline_type.h b/lib/src/model/outline_type.h index b8c86817..6d07a281 100644 --- a/lib/src/model/outline_type.h +++ b/lib/src/model/outline_type.h @@ -1,7 +1,7 @@ /* outline_type.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/resource_types.h b/lib/src/model/resource_types.h index 82e8e1fb..02b99e80 100644 --- a/lib/src/model/resource_types.h +++ b/lib/src/model/resource_types.h @@ -1,7 +1,7 @@ /* resource_types.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/stencil.cpp b/lib/src/model/stencil.cpp index aceb4314..11ff5c69 100644 --- a/lib/src/model/stencil.cpp +++ b/lib/src/model/stencil.cpp @@ -1,7 +1,7 @@ /* concept_stencil.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/stencil.h b/lib/src/model/stencil.h index 565f38b4..9b8fa7a9 100644 --- a/lib/src/model/stencil.h +++ b/lib/src/model/stencil.h @@ -1,7 +1,7 @@ /* concept_stencil.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/tag.cpp b/lib/src/model/tag.cpp index 339563c9..b5813042 100644 --- a/lib/src/model/tag.cpp +++ b/lib/src/model/tag.cpp @@ -1,7 +1,7 @@ /* tag.cpp MindForger application entry point - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/tag.h b/lib/src/model/tag.h index 41150c07..93b4b1df 100644 --- a/lib/src/model/tag.h +++ b/lib/src/model/tag.h @@ -1,7 +1,7 @@ /* tag.h MindForger application entry point - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/configuration_persistence.cpp b/lib/src/persistence/configuration_persistence.cpp index cff4a41b..e02fad19 100644 --- a/lib/src/persistence/configuration_persistence.cpp +++ b/lib/src/persistence/configuration_persistence.cpp @@ -1,7 +1,7 @@ /* configuration_persistence.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/configuration_persistence.h b/lib/src/persistence/configuration_persistence.h index 1620140f..985bbc14 100644 --- a/lib/src/persistence/configuration_persistence.h +++ b/lib/src/persistence/configuration_persistence.h @@ -1,7 +1,7 @@ /* configuration_persistence.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/filesystem_persistence.cpp b/lib/src/persistence/filesystem_persistence.cpp index 6da47064..b12b1448 100644 --- a/lib/src/persistence/filesystem_persistence.cpp +++ b/lib/src/persistence/filesystem_persistence.cpp @@ -1,7 +1,7 @@ /* filesystem_persistence.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/filesystem_persistence.h b/lib/src/persistence/filesystem_persistence.h index 53f29e3c..2f3ea14d 100644 --- a/lib/src/persistence/filesystem_persistence.h +++ b/lib/src/persistence/filesystem_persistence.h @@ -1,7 +1,7 @@ /* filesystem_persistence.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/persistence.cpp b/lib/src/persistence/persistence.cpp index f265acee..a83b6c7e 100644 --- a/lib/src/persistence/persistence.cpp +++ b/lib/src/persistence/persistence.cpp @@ -1,7 +1,7 @@ /* persistence.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/persistence.h b/lib/src/persistence/persistence.h index 1cf9e628..3379e3c4 100644 --- a/lib/src/persistence/persistence.h +++ b/lib/src/persistence/persistence.h @@ -1,7 +1,7 @@ /* persistence.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/repository_indexer.cpp b/lib/src/repository_indexer.cpp index d2379fb8..a113f584 100644 --- a/lib/src/repository_indexer.cpp +++ b/lib/src/repository_indexer.cpp @@ -1,7 +1,7 @@ /* repository_indexer.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/repository_indexer.h b/lib/src/repository_indexer.h index 88cc4810..5144d0a8 100644 --- a/lib/src/repository_indexer.h +++ b/lib/src/repository_indexer.h @@ -1,7 +1,7 @@ /* repository_indexer.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/csv/csv_outline_representation.cpp b/lib/src/representations/csv/csv_outline_representation.cpp index ed9c660e..47d56b87 100644 --- a/lib/src/representations/csv/csv_outline_representation.cpp +++ b/lib/src/representations/csv/csv_outline_representation.cpp @@ -1,7 +1,7 @@ /* csv_outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/csv/csv_outline_representation.h b/lib/src/representations/csv/csv_outline_representation.h index d58315aa..916f1aed 100644 --- a/lib/src/representations/csv/csv_outline_representation.h +++ b/lib/src/representations/csv/csv_outline_representation.h @@ -1,7 +1,7 @@ /* csv_outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/html/html_document.cpp b/lib/src/representations/html/html_document.cpp index b5c55e52..3e7314cb 100644 --- a/lib/src/representations/html/html_document.cpp +++ b/lib/src/representations/html/html_document.cpp @@ -1,7 +1,7 @@ /* html_document.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/html/html_document.h b/lib/src/representations/html/html_document.h index 20c98104..ad2af47c 100644 --- a/lib/src/representations/html/html_document.h +++ b/lib/src/representations/html/html_document.h @@ -1,7 +1,7 @@ /* html_document.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/html/html_outline_representation.cpp b/lib/src/representations/html/html_outline_representation.cpp index 2c2a5556..960c77da 100644 --- a/lib/src/representations/html/html_outline_representation.cpp +++ b/lib/src/representations/html/html_outline_representation.cpp @@ -1,7 +1,7 @@ /* html_outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/html/html_outline_representation.h b/lib/src/representations/html/html_outline_representation.h index 50e828d5..cb157712 100644 --- a/lib/src/representations/html/html_outline_representation.h +++ b/lib/src/representations/html/html_outline_representation.h @@ -1,7 +1,7 @@ /* html_outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.cpp b/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.cpp index 153fc337..496d3e18 100644 --- a/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.cpp +++ b/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.cpp @@ -1,7 +1,7 @@ /* cmark_gfm_markdown_transcoder.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.h b/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.h index 2c19ed8a..c66cfc3b 100644 --- a/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.h +++ b/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.h @@ -1,7 +1,7 @@ /* cmark_gfm_markdown_transcoder.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_ast_node.cpp b/lib/src/representations/markdown/markdown_ast_node.cpp index 1796208a..405ed254 100644 --- a/lib/src/representations/markdown/markdown_ast_node.cpp +++ b/lib/src/representations/markdown/markdown_ast_node.cpp @@ -1,7 +1,7 @@ /* markdown_ast_node.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_ast_node.h b/lib/src/representations/markdown/markdown_ast_node.h index 4caa0bb6..0d8d862b 100644 --- a/lib/src/representations/markdown/markdown_ast_node.h +++ b/lib/src/representations/markdown/markdown_ast_node.h @@ -1,7 +1,7 @@ /* markdown_ast_node.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_configuration_representation.cpp b/lib/src/representations/markdown/markdown_configuration_representation.cpp index e2b95fcc..050e4238 100644 --- a/lib/src/representations/markdown/markdown_configuration_representation.cpp +++ b/lib/src/representations/markdown/markdown_configuration_representation.cpp @@ -1,7 +1,7 @@ /* markdown_configuration_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_configuration_representation.h b/lib/src/representations/markdown/markdown_configuration_representation.h index 6be7aef3..92894552 100644 --- a/lib/src/representations/markdown/markdown_configuration_representation.h +++ b/lib/src/representations/markdown/markdown_configuration_representation.h @@ -1,7 +1,7 @@ /* markdown_configuration_representation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_document.cpp b/lib/src/representations/markdown/markdown_document.cpp index 94a16407f..c8dc5c14 100644 --- a/lib/src/representations/markdown/markdown_document.cpp +++ b/lib/src/representations/markdown/markdown_document.cpp @@ -1,7 +1,7 @@ /* markdown.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_document.h b/lib/src/representations/markdown/markdown_document.h index 8e884d0c..493fe480 100644 --- a/lib/src/representations/markdown/markdown_document.h +++ b/lib/src/representations/markdown/markdown_document.h @@ -1,7 +1,7 @@ /* markdown.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_document_representation.cpp b/lib/src/representations/markdown/markdown_document_representation.cpp index 162aec94..e0609d57 100644 --- a/lib/src/representations/markdown/markdown_document_representation.cpp +++ b/lib/src/representations/markdown/markdown_document_representation.cpp @@ -1,7 +1,7 @@ /* markdown_document_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_document_representation.h b/lib/src/representations/markdown/markdown_document_representation.h index bc61bace..35ff3cf1 100644 --- a/lib/src/representations/markdown/markdown_document_representation.h +++ b/lib/src/representations/markdown/markdown_document_representation.h @@ -1,7 +1,7 @@ /* markdown_document_representation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_lexem.cpp b/lib/src/representations/markdown/markdown_lexem.cpp index 2f56015f..2c25ce4a 100644 --- a/lib/src/representations/markdown/markdown_lexem.cpp +++ b/lib/src/representations/markdown/markdown_lexem.cpp @@ -1,7 +1,7 @@ /* markdown_lexem.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_lexem.h b/lib/src/representations/markdown/markdown_lexem.h index 7c5d58b8..fd2528bc 100644 --- a/lib/src/representations/markdown/markdown_lexem.h +++ b/lib/src/representations/markdown/markdown_lexem.h @@ -1,7 +1,7 @@ /* markdown_lexem.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_lexer_sections.cpp b/lib/src/representations/markdown/markdown_lexer_sections.cpp index f484e3a8..251dabdb 100644 --- a/lib/src/representations/markdown/markdown_lexer_sections.cpp +++ b/lib/src/representations/markdown/markdown_lexer_sections.cpp @@ -1,7 +1,7 @@ /* markdown_lexer-sections.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_lexer_sections.h b/lib/src/representations/markdown/markdown_lexer_sections.h index 429702cc..0d70431b 100644 --- a/lib/src/representations/markdown/markdown_lexer_sections.h +++ b/lib/src/representations/markdown/markdown_lexer_sections.h @@ -1,7 +1,7 @@ /* markdown_lexer_sections.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_note_metadata.cpp b/lib/src/representations/markdown/markdown_note_metadata.cpp index 718d0d09..7ea8b45a 100644 --- a/lib/src/representations/markdown/markdown_note_metadata.cpp +++ b/lib/src/representations/markdown/markdown_note_metadata.cpp @@ -1,7 +1,7 @@ /* markdown_note_metadata.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_note_metadata.h b/lib/src/representations/markdown/markdown_note_metadata.h index 8da846a9..e7ffc93e 100644 --- a/lib/src/representations/markdown/markdown_note_metadata.h +++ b/lib/src/representations/markdown/markdown_note_metadata.h @@ -1,7 +1,7 @@ /* markdown_note_metadata.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_outline_metadata.cpp b/lib/src/representations/markdown/markdown_outline_metadata.cpp index fec6ee45..ffb5216c 100644 --- a/lib/src/representations/markdown/markdown_outline_metadata.cpp +++ b/lib/src/representations/markdown/markdown_outline_metadata.cpp @@ -1,7 +1,7 @@ /* markdown_outline_metadata.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_outline_metadata.h b/lib/src/representations/markdown/markdown_outline_metadata.h index a0e48bac..e2ca0a00 100644 --- a/lib/src/representations/markdown/markdown_outline_metadata.h +++ b/lib/src/representations/markdown/markdown_outline_metadata.h @@ -1,7 +1,7 @@ /* markdown_outline_metadata.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_outline_representation.cpp b/lib/src/representations/markdown/markdown_outline_representation.cpp index d853f46f..973be8ba 100644 --- a/lib/src/representations/markdown/markdown_outline_representation.cpp +++ b/lib/src/representations/markdown/markdown_outline_representation.cpp @@ -1,7 +1,7 @@ /* markdown_outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_outline_representation.h b/lib/src/representations/markdown/markdown_outline_representation.h index 1ab44c33..4a601c38 100644 --- a/lib/src/representations/markdown/markdown_outline_representation.h +++ b/lib/src/representations/markdown/markdown_outline_representation.h @@ -1,7 +1,7 @@ /* markdown_outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_parser_sections.cpp b/lib/src/representations/markdown/markdown_parser_sections.cpp index 1b5d540b..a08549d3 100644 --- a/lib/src/representations/markdown/markdown_parser_sections.cpp +++ b/lib/src/representations/markdown/markdown_parser_sections.cpp @@ -1,7 +1,7 @@ /* markdown_parser_sections.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_parser_sections.h b/lib/src/representations/markdown/markdown_parser_sections.h index 50cb4ba5..b3e7ca0e 100644 --- a/lib/src/representations/markdown/markdown_parser_sections.h +++ b/lib/src/representations/markdown/markdown_parser_sections.h @@ -1,7 +1,7 @@ /* markdown_parser_sections.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp index 13c479ed..5842de54 100644 --- a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp +++ b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp @@ -1,7 +1,7 @@ /* markdown_configuration_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_repository_configuration_representation.h b/lib/src/representations/markdown/markdown_repository_configuration_representation.h index d7c3c42c..a3415982 100644 --- a/lib/src/representations/markdown/markdown_repository_configuration_representation.h +++ b/lib/src/representations/markdown/markdown_repository_configuration_representation.h @@ -1,7 +1,7 @@ /* markdown_configuration_representation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_section_metadata.cpp b/lib/src/representations/markdown/markdown_section_metadata.cpp index 72ba41b8..05451180 100644 --- a/lib/src/representations/markdown/markdown_section_metadata.cpp +++ b/lib/src/representations/markdown/markdown_section_metadata.cpp @@ -1,7 +1,7 @@ /* markdown_section_metadata.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_section_metadata.h b/lib/src/representations/markdown/markdown_section_metadata.h index 6a672298..390cad78 100644 --- a/lib/src/representations/markdown/markdown_section_metadata.h +++ b/lib/src/representations/markdown/markdown_section_metadata.h @@ -1,7 +1,7 @@ /* markdown_section_metadata.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_transcoder.h b/lib/src/representations/markdown/markdown_transcoder.h index cd8b0f91..11728b6e 100644 --- a/lib/src/representations/markdown/markdown_transcoder.h +++ b/lib/src/representations/markdown/markdown_transcoder.h @@ -1,7 +1,7 @@ /* markdown_transcoder.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/outline_representation.cpp b/lib/src/representations/outline_representation.cpp index 5a5e6c15..086c06b8 100644 --- a/lib/src/representations/outline_representation.cpp +++ b/lib/src/representations/outline_representation.cpp @@ -1,7 +1,7 @@ /* outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/outline_representation.h b/lib/src/representations/outline_representation.h index 179875fc..e2cbf5f2 100644 --- a/lib/src/representations/outline_representation.h +++ b/lib/src/representations/outline_representation.h @@ -1,7 +1,7 @@ /* outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/representation_interceptor.h b/lib/src/representations/representation_interceptor.h index d007f182..72afef71 100644 --- a/lib/src/representations/representation_interceptor.h +++ b/lib/src/representations/representation_interceptor.h @@ -1,7 +1,7 @@ /* representation_interceptor.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/representation_type.h b/lib/src/representations/representation_type.h index c99932c7..d5a29838 100644 --- a/lib/src/representations/representation_type.h +++ b/lib/src/representations/representation_type.h @@ -1,7 +1,7 @@ /* representation_type.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/twiki/twiki_outline_representation.cpp b/lib/src/representations/twiki/twiki_outline_representation.cpp index f5ba61c7..f5a87f34 100644 --- a/lib/src/representations/twiki/twiki_outline_representation.cpp +++ b/lib/src/representations/twiki/twiki_outline_representation.cpp @@ -1,7 +1,7 @@ /* twiki_outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/twiki/twiki_outline_representation.h b/lib/src/representations/twiki/twiki_outline_representation.h index 4de3fb00..2fd7fa16 100644 --- a/lib/src/representations/twiki/twiki_outline_representation.h +++ b/lib/src/representations/twiki/twiki_outline_representation.h @@ -1,7 +1,7 @@ /* twiki_outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/unicode.cpp b/lib/src/representations/unicode.cpp index e9cc2c0b..6c387a04 100644 --- a/lib/src/representations/unicode.cpp +++ b/lib/src/representations/unicode.cpp @@ -1,7 +1,7 @@ /* unicode.cpp MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/unicode.h b/lib/src/representations/unicode.h index 230492cb..e86ec658 100644 --- a/lib/src/representations/unicode.h +++ b/lib/src/representations/unicode.h @@ -1,7 +1,7 @@ /* unicode.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/version.h b/lib/src/version.h index 9cb81d79..0105a777 100644 --- a/lib/src/version.h +++ b/lib/src/version.h @@ -1,7 +1,7 @@ /* version.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/benchmark/ai_benchmark.cpp b/lib/test/benchmark/ai_benchmark.cpp index 9656e5b0..0b5a211c 100644 --- a/lib/test/benchmark/ai_benchmark.cpp +++ b/lib/test/benchmark/ai_benchmark.cpp @@ -1,7 +1,7 @@ /* ai_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/benchmark/html_benchmark.cpp b/lib/test/benchmark/html_benchmark.cpp index 800c5b70..c2bb4caf 100644 --- a/lib/test/benchmark/html_benchmark.cpp +++ b/lib/test/benchmark/html_benchmark.cpp @@ -1,7 +1,7 @@ /* markdown_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/benchmark/markdown_benchmark.cpp b/lib/test/benchmark/markdown_benchmark.cpp index 06458021..8d2e403c 100644 --- a/lib/test/benchmark/markdown_benchmark.cpp +++ b/lib/test/benchmark/markdown_benchmark.cpp @@ -1,7 +1,7 @@ /* markdown_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/benchmark/trie_benchmark.cpp b/lib/test/benchmark/trie_benchmark.cpp index 4fc63c4e..20271910 100644 --- a/lib/test/benchmark/trie_benchmark.cpp +++ b/lib/test/benchmark/trie_benchmark.cpp @@ -1,7 +1,7 @@ /* trie_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/mindforger-lib-unit-tests.pro b/lib/test/mindforger-lib-unit-tests.pro index 92a5524e..400b0a3b 100644 --- a/lib/test/mindforger-lib-unit-tests.pro +++ b/lib/test/mindforger-lib-unit-tests.pro @@ -1,6 +1,6 @@ # mindforger-lib-unit-tests.pro Qt project file for MindForger # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/test/src/ai/autolinking_cmark_test.cpp b/lib/test/src/ai/autolinking_cmark_test.cpp index 7a63be5b..9c1f1347 100644 --- a/lib/test/src/ai/autolinking_cmark_test.cpp +++ b/lib/test/src/ai/autolinking_cmark_test.cpp @@ -1,7 +1,7 @@ /* autolinkin_cmark_test.cpp MindForger application test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/ai/autolinking_test.cpp b/lib/test/src/ai/autolinking_test.cpp index d4c544c6..12352068 100644 --- a/lib/test/src/ai/autolinking_test.cpp +++ b/lib/test/src/ai/autolinking_test.cpp @@ -1,7 +1,7 @@ /* autolinkin_test.cpp MindForger application test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/ai/nlp_test.cpp b/lib/test/src/ai/nlp_test.cpp index ff563a5e..4e798db9 100644 --- a/lib/test/src/ai/nlp_test.cpp +++ b/lib/test/src/ai/nlp_test.cpp @@ -1,7 +1,7 @@ /* nlp_test.cpp MindForger application test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/config/configuration_test.cpp b/lib/test/src/config/configuration_test.cpp index d460df8e..98f9dc37 100644 --- a/lib/test/src/config/configuration_test.cpp +++ b/lib/test/src/config/configuration_test.cpp @@ -1,7 +1,7 @@ /* configuration_test.cpp MindForger configuration test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/gear/datetime_test.cpp b/lib/test/src/gear/datetime_test.cpp index d7fd1a96..8d1581b6 100644 --- a/lib/test/src/gear/datetime_test.cpp +++ b/lib/test/src/gear/datetime_test.cpp @@ -1,7 +1,7 @@ /* datetime_test.cpp MindForger application test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/gear/file_utils_test.cpp b/lib/test/src/gear/file_utils_test.cpp index f068d388..cdb50f8e 100644 --- a/lib/test/src/gear/file_utils_test.cpp +++ b/lib/test/src/gear/file_utils_test.cpp @@ -1,7 +1,7 @@ /* file_utils_test.cpp MindForger application test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/gear/string_utils_test.cpp b/lib/test/src/gear/string_utils_test.cpp index 8972dde3..58828743 100644 --- a/lib/test/src/gear/string_utils_test.cpp +++ b/lib/test/src/gear/string_utils_test.cpp @@ -1,7 +1,7 @@ /* string_utils_test.cpp MindForger application test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/gear/trie_test.cpp b/lib/test/src/gear/trie_test.cpp index e8ab3a48..a9ce2d1b 100644 --- a/lib/test/src/gear/trie_test.cpp +++ b/lib/test/src/gear/trie_test.cpp @@ -1,7 +1,7 @@ /* trie_test.cpp MindForger application test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/html/html_test.cpp b/lib/test/src/html/html_test.cpp index e2c97f6c..3781f97c 100644 --- a/lib/test/src/html/html_test.cpp +++ b/lib/test/src/html/html_test.cpp @@ -1,7 +1,7 @@ /* markdown_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/indexer/repository_indexer_test.cpp b/lib/test/src/indexer/repository_indexer_test.cpp index 51d66c08..09ce744b 100644 --- a/lib/test/src/indexer/repository_indexer_test.cpp +++ b/lib/test/src/indexer/repository_indexer_test.cpp @@ -1,7 +1,7 @@ /* repository_indexer_test.cpp MindForger indexer test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/markdown/markdown_test.cpp b/lib/test/src/markdown/markdown_test.cpp index 34d41859..7285f4dc 100644 --- a/lib/test/src/markdown/markdown_test.cpp +++ b/lib/test/src/markdown/markdown_test.cpp @@ -1,7 +1,7 @@ /* markdown_test.cpp MindForger markdown test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/filesystem_information_test.cpp b/lib/test/src/mind/filesystem_information_test.cpp index 5646253c..2e8cb3f5 100644 --- a/lib/test/src/mind/filesystem_information_test.cpp +++ b/lib/test/src/mind/filesystem_information_test.cpp @@ -1,7 +1,7 @@ /* filesystem_information_test.cpp MindForger fullt text search test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/fts_test.cpp b/lib/test/src/mind/fts_test.cpp index 6a8ed177..fecabd95 100644 --- a/lib/test/src/mind/fts_test.cpp +++ b/lib/test/src/mind/fts_test.cpp @@ -1,7 +1,7 @@ /* fts_test.cpp MindForger fullt text search test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/memory_test.cpp b/lib/test/src/mind/memory_test.cpp index ef5cb69c..d502da1d 100644 --- a/lib/test/src/mind/memory_test.cpp +++ b/lib/test/src/mind/memory_test.cpp @@ -1,7 +1,7 @@ /* memory_test.cpp MindForger memory test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/mind_test.cpp b/lib/test/src/mind/mind_test.cpp index e07e1551..df4d73c1 100644 --- a/lib/test/src/mind/mind_test.cpp +++ b/lib/test/src/mind/mind_test.cpp @@ -1,7 +1,7 @@ /* mind_test.cpp MindForger mind test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/note_test.cpp b/lib/test/src/mind/note_test.cpp index dbdc0150..c75e53a9 100644 --- a/lib/test/src/mind/note_test.cpp +++ b/lib/test/src/mind/note_test.cpp @@ -1,7 +1,7 @@ /* note_test.cpp MindForger test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/organizer_test.cpp b/lib/test/src/mind/organizer_test.cpp index 4345438d..67403803 100644 --- a/lib/test/src/mind/organizer_test.cpp +++ b/lib/test/src/mind/organizer_test.cpp @@ -1,7 +1,7 @@ /* organizer_test.cpp MindForger test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/outline_test.cpp b/lib/test/src/mind/outline_test.cpp index 89b376cb..38e0f350 100644 --- a/lib/test/src/mind/outline_test.cpp +++ b/lib/test/src/mind/outline_test.cpp @@ -1,7 +1,7 @@ /* outline_test.cpp MindForger test - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mindforger_lib_unit_tests.cpp b/lib/test/src/mindforger_lib_unit_tests.cpp index e924a44b..840ba6f3 100644 --- a/lib/test/src/mindforger_lib_unit_tests.cpp +++ b/lib/test/src/mindforger_lib_unit_tests.cpp @@ -1,7 +1,7 @@ /* mindforger_lib_unit_tests.cpp MindForger library unit tests - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/src.pro b/lib/test/src/src.pro index 526abe69..850fbf37 100644 --- a/lib/test/src/src.pro +++ b/lib/test/src/src.pro @@ -1,6 +1,6 @@ # mindforger-lib-unit-tests.pro MindForger thinking notebook # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software ; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/test/src/test_utils.cpp b/lib/test/src/test_utils.cpp index 5e52dc52..972adeb3 100644 --- a/lib/test/src/test_utils.cpp +++ b/lib/test/src/test_utils.cpp @@ -1,7 +1,7 @@ /* test_gear.cpp MindForger test utils and gears - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/test_utils.h b/lib/test/src/test_utils.h index 2abec681..8df32246 100644 --- a/lib/test/src/test_utils.h +++ b/lib/test/src/test_utils.h @@ -1,7 +1,7 @@ /* test_gear.h MindForger thinking notebook - Copyright (C) 2016-2022 Martin Dvorak + Copyright (C) 2016-2023 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/mindforger.pro b/mindforger.pro index 4a473cea..5d636eb3 100644 --- a/mindforger.pro +++ b/mindforger.pro @@ -1,6 +1,6 @@ # mindforger.pro Qt project file for MindForger # -# Copyright (C) 2016-2022 Martin Dvorak +# Copyright (C) 2016-2023 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License From e1af4ec7d8a2ceeca26ceb7e7ce6f57f238ac03a Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 13 Jan 2023 08:06:44 +0100 Subject: [PATCH 017/131] Adding code style guidelines. --- CONTRIBUTING.md | 72 +++++++++++++++++++++++++++- app/src/qt/main_window_presenter.cpp | 2 +- lib/src/config/configuration.cpp | 2 + lib/src/config/configuration.h | 4 ++ 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 587985f8..1fbcdbda 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,15 +19,21 @@ with MindForger development will be **highly appreciated**! * Write a document, block post; create YouTube video, ... Don't hesitate to contact [me](mailto:martin.dvorak@mindforger.com). + + # Code of Conduct This project and everyone participating in it is governed by the [MindForger Code of Conduct](./CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. + + # Styleguide: Git Commit Messages * Commit messages must provide concise change description. * Reference issues and pull requests related to the commit. * Close bugs with issue references in commit messages. * If possible, limit commit message length to 72 characters. + + # Styleguide: C++ Code style: @@ -39,7 +45,9 @@ Code style: * Use `{}` with constructor having 0/1 parameter, () otherwise. * `CamelCase` class names (no underscores). * Lines to have at most 88 columns. -* See `/lib/src` source code for as code style reference. +* 4 spaces indentation. +* Python's black like formatting. +* Use `/lib/src` source code as code style reference. Example of class `{}` style: @@ -78,7 +86,7 @@ bool MyClass::myFunction(const QString& myArg) } ``` -Example of how to format code to keep it under 88 columns: +Example of how to format code to keep it under 88 columns (Python's black style): ```cpp void MainWindowPresenter::doActionOrganizerMoveNoteToNextVisibleQuadrant(Note* note) @@ -109,8 +117,68 @@ void MainWindowPresenter::doActionOrganizerMoveNoteToNextVisibleQuadrant(Note* n } } } +``` + + +# Styleguide: C++ comments +Comments should be used to explain tricky and/or +important code only. Don't use comments to explain +obvious things as comments might diverge from the +actual code (e.g. after code refactoring) and may +cause confusion. Make comments brief, consistent +and concise + +Code style: + +```cpp +/** + * @brief Brief class description. + * + * Detailed class description which may include + * `examples` of use, _ASCII diagrams_ or **bullet lists**. + * Do ~~not~~ worry. + * + * Code block: + * + * int codeBlockExampleVariable; + * + * @see Text (as sentence) or URL. + * @see [The link text](http://example.com/) + * @see [The link text](#MyOtherClass) + */ +class MyClass +{ + + int field; // brief field description in the lower case + +public: + +... + /** + * @brief Brief method description. + * + * Detailed method description which may include + * examples of use, ASCII diagrams or bullet/numbered + * lists like: + * + * 1. The first item. + * 2. The second item with the reference of `field`. + * 3. The third item. + * + * @param myParam Parameter documentation as sentence(s). + * @return Return value description as sentence(s). + * + * @see [The link text](#MyOtherClass) + */ + void myMethod(int myParam) { ... } + +... + +} ``` + + # Styleguide: Qt * MindForger uses MVP pattern (see `main_window_presenter.h/.cpp`) diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index d33f3528..e94130e5 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -1140,7 +1140,7 @@ void MainWindowPresenter::handleFtsNerEntity() void MainWindowPresenter::doActionViewRecentNotes() { vector notes{}; - mind->getAllNotes(notes, true, true); + mind->getAllNotes(notes, true, config.isRecentIncludeOs()); orloj->showFacetRecentNotes(notes); } diff --git a/lib/src/config/configuration.cpp b/lib/src/config/configuration.cpp index bba26ec0..f1b99d54 100644 --- a/lib/src/config/configuration.cpp +++ b/lib/src/config/configuration.cpp @@ -50,6 +50,7 @@ Configuration::Configuration() md2HtmlOptions{}, distributorSleepInterval{DEFAULT_DISTRIBUTOR_SLEEP_INTERVAL}, markdownQuoteSections{}, + recentIncludeOs{DEFAULT_RECENT_INCLUDE_OS}, uiNerdTargetAudience{DEFAULT_UI_NERD_MENU}, uiHtmlZoom{}, externalEditorCmd{}, @@ -143,6 +144,7 @@ void Configuration::clear() timeScopeAsString.assign(DEFAULT_TIME_SCOPE); tagsScope.clear(); markdownQuoteSections = DEFAULT_MD_QUOTE_SECTIONS; + recentIncludeOs = DEFAULT_RECENT_INCLUDE_OS; // Markdown 2 HTML options md2HtmlOptions = 0 diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h index ce760392..ff784e85 100644 --- a/lib/src/config/configuration.h +++ b/lib/src/config/configuration.h @@ -206,6 +206,7 @@ class Configuration { static constexpr const bool DEFAULT_EDITOR_AUTOSAVE = false; static constexpr const bool DEFAULT_FULL_O_PREVIEW = false; static constexpr const bool DEFAULT_MD_QUOTE_SECTIONS = true; + static constexpr const bool DEFAULT_RECENT_INCLUDE_OS= false; static constexpr const bool DEFAULT_SPELLCHECK_LIVE = true; static constexpr const bool DEFAULT_MD_HIGHLIGHT = true; static constexpr const bool DEFAULT_MD_MATH = false; @@ -256,6 +257,7 @@ class Configuration { AssociationAssessmentAlgorithm aaAlgorithm; int distributorSleepInterval; bool markdownQuoteSections; + bool recentIncludeOs; // subjectively it's better show visited/editor Ns only as user can always easily get to O description + automatically added Os are increasing entropy of the recent view too much // GUI configuration bool uiNerdTargetAudience; @@ -399,6 +401,8 @@ class Configuration { void setDistributorSleepInterval(int sleepInterval) { distributorSleepInterval = sleepInterval; } bool isMarkdownQuoteSections() const { return markdownQuoteSections; } void setMarkdownQuoteSections(bool markdownQuoteSections) { this->markdownQuoteSections = markdownQuoteSections; } + bool isRecentIncludeOs() const { return recentIncludeOs; } + void setRecentIncludeOs(bool recentIncludeOs) { this->recentIncludeOs = recentIncludeOs; } /* * GUI From 47f208eff1be2d12188e7e979e9df44dc838506b Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 13 Jan 2023 08:14:11 +0100 Subject: [PATCH 018/131] Improving style. --- CONTRIBUTING.md | 9 +++++++++ lib/src/config/configuration.h | 9 ++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1fbcdbda..98c75d52 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -150,6 +150,15 @@ class MyClass { int field; // brief field description in the lower case + /** + * @brief Another field. + * + * Field with a long description must be documented using + * this style of the comment. The text of description to be + * formed by sentences. Apart to that you can use any formatting + * syntax from below. + */ + int anotherField; public: diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h index ff784e85..0d766cc3 100644 --- a/lib/src/config/configuration.h +++ b/lib/src/config/configuration.h @@ -257,7 +257,14 @@ class Configuration { AssociationAssessmentAlgorithm aaAlgorithm; int distributorSleepInterval; bool markdownQuoteSections; - bool recentIncludeOs; // subjectively it's better show visited/editor Ns only as user can always easily get to O description + automatically added Os are increasing entropy of the recent view too much + /** + * @brief Do include Outlines in the recent view or not. + * + * Subjectively it's better to show visited/editor Ns only as user + * can always easily get to O description + automatically added + * Os are increasing entropy of the recent view too much. + */ + bool recentIncludeOs; // GUI configuration bool uiNerdTargetAudience; From 364268798d521df9c9fc4ca08155256907e14ff9 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sat, 14 Jan 2023 15:15:54 +0100 Subject: [PATCH 019/131] Setting UTF-8 in HTML meta which resolves #1483 --- lib/src/representations/html/html_outline_representation.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/src/representations/html/html_outline_representation.cpp b/lib/src/representations/html/html_outline_representation.cpp index 960c77da..c26554b6 100644 --- a/lib/src/representations/html/html_outline_representation.cpp +++ b/lib/src/representations/html/html_outline_representation.cpp @@ -144,6 +144,7 @@ void HtmlOutlineRepresentation::header(string& html, string* basePath, bool stan html.assign( "\n" "" + "" "
";
@@ -152,7 +153,9 @@ void HtmlOutlineRepresentation::header(string& html, string* basePath, bool stan
         html.assign(
             "\n"
             ""
-            "");
+            ""
+            ""
+        );
 #ifdef DO_MF_DEBUG
         html += "\n";
 #endif

From 32658379a1731e6304107e10c660e91f7a3ab162 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sat, 14 Jan 2023 19:17:53 +0100
Subject: [PATCH 020/131] Adding tools and toc (w/ and w/o tags)

---
 app/resources/icons/mindforger.ico            | Bin 270398 -> 114389 bytes
 app/resources/icons/mindforger.png            | Bin 8835 -> 7079 bytes
 app/resources/icons/mindforger128x128.png     | Bin 10138 -> 8108 bytes
 .../qt/translations/mindforger_cs.ts          |  96 +++++++++---------
 .../qt/translations/mindforger_en.ts          |  96 +++++++++---------
 .../qt/translations/mindforger_nerd_cs.ts     |  96 +++++++++---------
 .../qt/translations/mindforger_nerd_en.ts     |  96 +++++++++---------
 .../qt/translations/mindforger_zh_cn.ts       |  96 +++++++++---------
 app/src/qt/main_menu_presenter.cpp            |  11 +-
 app/src/qt/main_menu_view.cpp                 |  44 +++++++-
 app/src/qt/main_menu_view.h                   |  15 ++-
 app/src/qt/main_window_presenter.cpp          |  56 +++++++++-
 app/src/qt/main_window_presenter.h            |  11 +-
 build/Makefile                                |  39 ++++++-
 14 files changed, 405 insertions(+), 251 deletions(-)

diff --git a/app/resources/icons/mindforger.ico b/app/resources/icons/mindforger.ico
index 21f9a15d9a3c4a8cea55429ec67f4b8aca246d2c..b4de1d24420bd201df98898b8e4dffd68fcca301 100644
GIT binary patch
literal 114389
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
Re1ZS~002ovPDHLkV1oHBh$;X8

literal 8835
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
FV1gjKxl#ZC

diff --git a/app/resources/icons/mindforger128x128.png b/app/resources/icons/mindforger128x128.png
index 571c02fe7ec5019802c18c11da422435dabcb6b1..2c61a4bb2fe3fd51b971a16a57336823e53695ba 100644
GIT binary patch
literal 8108
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
IM6N<$f(?=^761SM

diff --git a/app/resources/qt/translations/mindforger_cs.ts b/app/resources/qt/translations/mindforger_cs.ts
index 499fdeda..9578e0c6 100644
--- a/app/resources/qt/translations/mindforger_cs.ts
+++ b/app/resources/qt/translations/mindforger_cs.ts
@@ -2918,7 +2918,7 @@
         
     
     
-        
+        
         Do you really want to forget '
         
     
@@ -3024,194 +3024,194 @@
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
         
-        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
diff --git a/app/resources/qt/translations/mindforger_en.ts b/app/resources/qt/translations/mindforger_en.ts
index 1928684d..517ca7a3 100644
--- a/app/resources/qt/translations/mindforger_en.ts
+++ b/app/resources/qt/translations/mindforger_en.ts
@@ -2930,7 +2930,7 @@
         Deprecate Notebook
     
     
-        
+        
         Do you really want to forget '
         
     
@@ -3036,194 +3036,194 @@
         
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         Please select a Note to forget.
         Please select a Note to delete.
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
         
-        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_cs.ts b/app/resources/qt/translations/mindforger_nerd_cs.ts
index bef81b83..6675366a 100644
--- a/app/resources/qt/translations/mindforger_nerd_cs.ts
+++ b/app/resources/qt/translations/mindforger_nerd_cs.ts
@@ -2807,7 +2807,7 @@
         
     
     
-        
+        
         Do you really want to forget '
         
     
@@ -3036,194 +3036,194 @@
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
         
-        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_en.ts b/app/resources/qt/translations/mindforger_nerd_en.ts
index f54e6fee..d7b77140 100644
--- a/app/resources/qt/translations/mindforger_nerd_en.ts
+++ b/app/resources/qt/translations/mindforger_nerd_en.ts
@@ -2791,7 +2791,7 @@
         
     
     
-        
+        
         Do you really want to forget '
         
     
@@ -3020,194 +3020,194 @@
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
         
-        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
diff --git a/app/resources/qt/translations/mindforger_zh_cn.ts b/app/resources/qt/translations/mindforger_zh_cn.ts
index cf9a7050..1b280817 100644
--- a/app/resources/qt/translations/mindforger_zh_cn.ts
+++ b/app/resources/qt/translations/mindforger_zh_cn.ts
@@ -2930,7 +2930,7 @@
         Deprecate Notebook
     
     
-        
+        
         Do you really want to forget '
         
     
@@ -3036,194 +3036,194 @@
         
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         Please select a Note to forget.
         Please select a Note to delete.
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
         
-        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp
index 1cdbad00..02a2ce7e 100644
--- a/app/src/qt/main_menu_presenter.cpp
+++ b/app/src/qt/main_menu_presenter.cpp
@@ -270,7 +270,8 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
     QObject::connect(view->actionFormatListNumber, SIGNAL(triggered()), mwp, SLOT(doActionFormatListNumber()));
     QObject::connect(view->actionFormatListTask, SIGNAL(triggered()), mwp, SLOT(doActionFormatListTask()));
     QObject::connect(view->actionFormatListTaskItem, SIGNAL(triggered()), mwp, SLOT(doActionFormatListTaskItem()));
-    QObject::connect(view->actionFormatToc, SIGNAL(triggered()), mwp, SLOT(doActionFormatToc()));
+    QObject::connect(view->actionFormatTocWithoutTags, SIGNAL(triggered()), mwp, SLOT(doActionFormatTocWithoutTags()));
+    QObject::connect(view->actionFormatTocWithTags, SIGNAL(triggered()), mwp, SLOT(doActionFormatTocWithTags()));
     QObject::connect(view->actionFormatTimestamp, SIGNAL(triggered()), mwp, SLOT(doActionFormatTimestamp()));
     QObject::connect(view->actionFormatCodeBlock, SIGNAL(triggered()), mwp, SLOT(doActionFormatCodeBlock()));
     QObject::connect(view->actionFormatMathBlock, SIGNAL(triggered()), mwp, SLOT(doActionFormatMathBlock()));
@@ -287,6 +288,14 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
     QObject::connect(view->actionFormatTable, SIGNAL(triggered()), mwp, SLOT(doActionFormatTable()));
     QObject::connect(view->actionFormatHr, SIGNAL(triggered()), mwp, SLOT(doActionFormatHr()));
 
+    // menu: tools
+    QObject::connect(view->actionToolsArxiv, SIGNAL(triggered()), mwp, SLOT(doActionToolsArxiv()));
+    QObject::connect(view->actionToolsPandoc, SIGNAL(triggered()), mwp, SLOT(doActionToolsPandoc()));
+    QObject::connect(view->actionToolsChatGpt, SIGNAL(triggered()), mwp, SLOT(doActionToolsChatGpt()));
+    QObject::connect(view->actionToolsWikipedia, SIGNAL(triggered()), mwp, SLOT(doActionToolsWikipedia()));
+    QObject::connect(view->actionToolsDocusaurus, SIGNAL(triggered()), mwp, SLOT(doActionToolsDocusaurus()));
+    QObject::connect(view->actionToolsDuckDuckGo, SIGNAL(triggered()), mwp, SLOT(doActionToolsDucDuckGo()));
+
     // menu: help
     QObject::connect(view->actionHelpDocumentation, SIGNAL(triggered()), mwp, SLOT(doActionHelpDocumentation()));
     QObject::connect(view->actionHelpWeb, SIGNAL(triggered()), mwp, SLOT(doActionHelpWeb()));
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index 5cd834a7..887cfd8f 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -351,7 +351,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionNavigatorShuffle = new QAction(tr("&Shuffle\tSpace"), mainWindow);
     actionNavigatorShuffle->setStatusTip(tr("Shuffle knowledge graph"));
 
-    menuNavigator = qMenuBar->addMenu(tr("Na&vigate"));
+    menuNavigator = qMenuBar->addMenu(tr("N&avigate"));
     menuNavigator->addAction(actionNavigatorEdgesStretch);
     menuNavigator->addAction(actionNavigatorEdgesShrink);
     menuNavigator->addSeparator();
@@ -856,8 +856,14 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionFormatStrikethrough = new QAction(tr("&Strikethrough"), mainWindow);
     actionFormatStrikethrough->setStatusTip(tr("Format text as strikethrough"));
 
-    actionFormatToc = new QAction(tr("T&able of Contents"), mainWindow);
-    actionFormatToc ->setStatusTip(tr("Insert Notebook's table of contents"));
+    // toc
+    submenuFormatToc = menuFormat->addMenu(tr("T&able of Contents"));
+    actionFormatTocWithoutTags = new QAction(tr("With&out tags"), mainWindow);
+    actionFormatTocWithoutTags ->setStatusTip(tr("Insert Notebook's table of contents without tags"));
+    submenuFormatToc->addAction(actionFormatTocWithoutTags);
+    actionFormatTocWithTags = new QAction(tr("&With tags"), mainWindow);
+    actionFormatTocWithTags ->setStatusTip(tr("Insert Notebook's table of contents with tags"));
+    submenuFormatToc->addAction(actionFormatTocWithTags);
 
     actionFormatTimestamp = new QAction(tr("Timestam&p"), mainWindow);
     actionFormatTimestamp ->setStatusTip(tr("Insert current date and time"));
@@ -888,7 +894,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuFormat->addAction(actionFormatKeyboard);
     menuFormat->addAction(actionFormatComment);
     menuFormat->addSeparator();
-    menuFormat->addAction(actionFormatToc);
+    menuFormat->addMenu(submenuFormatToc);
     menuFormat->addMenu(submenuFormatLists);
     menuFormat->addMenu(submenuFormatBlocks);
     menuFormat->addMenu(submenuFormatDiagrams);
@@ -901,6 +907,36 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuFormat->addAction(actionFormatImage);
     menuFormat->setEnabled(false);
 
+    // menu: tools
+
+#ifdef MF_WIP
+    menuTools = qMenuBar->addMenu(tr("&Tools"));
+
+    actionToolsWikipedia = new QAction(QIcon(":/menu-icons/link.svg"), tr("&Wikipedia"), mainWindow);
+    actionToolsWikipedia->setStatusTip(tr("Open Wikipadia and find entry of the selected entity..."));
+    menuTools->addAction(actionToolsWikipedia);
+
+    actionToolsArxiv = new QAction(QIcon(":/menu-icons/link.svg"), tr("&arXiv"), mainWindow);
+    actionToolsArxiv->setStatusTip(tr("Open arXiv and find papers related to the selected entity..."));
+    menuTools->addAction(actionToolsArxiv);
+
+    actionToolsChatGpt = new QAction(QIcon(":/menu-icons/link.svg"), tr("&ChatGPT: Explain ... in simple terms."), mainWindow);
+    actionToolsChatGpt->setStatusTip(tr("Let ChatGPT to explain the selected entry..."));
+    menuTools->addAction(actionToolsChatGpt);
+
+    actionToolsDuckDuckGo = new QAction(QIcon(":/menu-icons/link.svg"), tr("&DuckDuckGo"), mainWindow);
+    actionToolsDuckDuckGo->setStatusTip(tr("Open DuckDuckGo and search web for the selected entity..."));
+    menuTools->addAction(actionToolsDuckDuckGo);
+
+    actionToolsPandoc = new QAction(QIcon(":/menu-icons/link.svg"), tr("&Pandoc"), mainWindow);
+    actionToolsPandoc ->setStatusTip(tr("Use Pandoc to convert MindForger's Markdown documents..."));
+    menuTools->addAction(actionToolsPandoc);
+
+    actionToolsDocusaurus = new QAction(QIcon(":/menu-icons/link.svg"), tr("D&ocusaurus"), mainWindow);
+    actionToolsDocusaurus->setStatusTip(tr("Build your web with MindForger's Markdown documents and Docusaurus..."));
+    menuTools->addAction(actionToolsDocusaurus);
+#endif
+
     // menu: help
 
     actionHelpDocumentation = new QAction(QIcon(":/menu-icons/help.svg"), tr("&Documentation"), mainWindow);
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index 71c721eb..9d1513ad 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -61,6 +61,9 @@ class MainMenuView : public QObject
     QMenu* menuNote;
     QMenu* menuEdit;
     QMenu* menuFormat;
+#ifdef MF_WIP
+    QMenu* menuTools;
+#endif
     QMenu* menuHelp;
 
 #ifdef DO_MF_DEBUG
@@ -202,6 +205,9 @@ class MainMenuView : public QObject
     QAction* actionFormatCode;
     QAction* actionFormatCodeBlock;
     QMenu* submenuFormatMathJax;
+    QMenu* submenuFormatToc;
+    QAction* actionFormatTocWithoutTags;
+    QAction* actionFormatTocWithTags;
     QMenu* submenuFormatLists;
     QMenu* submenuFormatBlocks;
     QMenu* submenuFormatDiagrams;
@@ -241,9 +247,16 @@ class MainMenuView : public QObject
     QAction* actionFormatImage;
     QAction* actionFormatTable;
     QAction* actionFormatHr;
-    QAction* actionFormatToc;
     QAction* actionFormatTimestamp;
 
+    // menu: Tools
+    QAction* actionToolsWikipedia;
+    QAction* actionToolsArxiv;
+    QAction* actionToolsChatGpt;
+    QAction* actionToolsDuckDuckGo;
+    QAction* actionToolsPandoc;
+    QAction* actionToolsDocusaurus;
+
     // menu: Help
     QAction* actionHelpDocumentation;
     QAction* actionHelpWeb;
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index e94130e5..4675ae19 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -1470,12 +1470,12 @@ void MainWindowPresenter::doActionFormatListTaskItem()
     }
 }
 
-void MainWindowPresenter::doActionFormatToc()
+void MainWindowPresenter::doActionFormatToc(bool withTags)
 {
     if(orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_NOTE)
             || orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_OUTLINE_HEADER))
     {
-        string* text = mdRepresentation->toc(orloj->getOutlineView()->getCurrentOutline());
+        string* text = mdRepresentation->toc(orloj->getOutlineView()->getCurrentOutline(), withTags);
 
         if(orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_NOTE)) {
             orloj->getNoteEdit()->getView()->getNoteEditor()->insertMarkdownText(QString::fromStdString(*text));
@@ -1487,6 +1487,16 @@ void MainWindowPresenter::doActionFormatToc()
     }
 }
 
+void MainWindowPresenter::doActionFormatTocWithTags()
+{
+    this->doActionFormatToc(true);
+}
+
+void MainWindowPresenter::doActionFormatTocWithoutTags()
+{
+    this->doActionFormatToc(false);
+}
+
 // IMPROVE: consolidate methods which just insert a (semi)static string
 void MainWindowPresenter::doActionFormatTimestamp()
 {
@@ -3224,6 +3234,48 @@ void MainWindowPresenter::doActionOrganizerForget()
     }
 }
 
+void MainWindowPresenter::doActionToolsWikipedia()
+{
+    QDesktopServices::openUrl(
+        QUrl{"https://wikipedia.org"}
+    );
+}
+
+void MainWindowPresenter::doActionToolsArxiv()
+{
+    QDesktopServices::openUrl(
+        QUrl{"https://arxiv.org/multi?group=grp_math&%2Ffind=Search"}
+    );
+}
+
+void MainWindowPresenter::doActionToolsDuckDuckGo()
+{
+    QDesktopServices::openUrl(
+        QUrl{"https://duckduckgo.com/"}
+    );
+}
+
+void MainWindowPresenter::doActionToolsDocusaurus()
+{
+    QDesktopServices::openUrl(
+        QUrl{"https://docusaurus.io/docs/installation"}
+    );
+}
+
+void MainWindowPresenter::doActionToolsPandoc()
+{
+    QDesktopServices::openUrl(
+        QUrl{"https://pandoc.org/installing.html"}
+    );
+}
+
+void MainWindowPresenter::doActionToolsChatGpt()
+{
+    QDesktopServices::openUrl(
+        QUrl{"https://chat.openai.com/chat"}
+    );
+}
+
 void MainWindowPresenter::doActionHelpDocumentation()
 {
     QDesktopServices::openUrl(
diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h
index 2c1849bd..b7e18c48 100644
--- a/app/src/qt/main_window_presenter.h
+++ b/app/src/qt/main_window_presenter.h
@@ -297,7 +297,9 @@ public slots:
     void doActionFormatListNumber();
     void doActionFormatListTask();
     void doActionFormatListTaskItem();
-    void doActionFormatToc();
+    void doActionFormatToc(bool withTags);
+    void doActionFormatTocWithTags();
+    void doActionFormatTocWithoutTags();
     void doActionFormatTimestamp();
     void doActionFormatCodeBlock();
     void doActionFormatMathBlock();    
@@ -357,6 +359,13 @@ public slots:
     void doActionToggleLiveNotePreview();
     void doActionNameDescFocusSwap();
     void doActionSpellCheck();
+    // tools
+    void doActionToolsWikipedia();
+    void doActionToolsArxiv();
+    void doActionToolsChatGpt();
+    void doActionToolsDuckDuckGo();
+    void doActionToolsPandoc();
+    void doActionToolsDocusaurus();
     // help
     void doActionHelpDocumentation();
     void doActionHelpWeb();
diff --git a/build/Makefile b/build/Makefile
index c39f1dba..69f4ba0b 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -29,8 +29,10 @@ CLASS_NAME := "New_Class"
 # l10n language: en, cs
 MF_LANG := "en"
 
+
+.PHONY: help
 help:
-	@echo "MindForger maker help:"
+	@echo "MindForger tooling help:"
 	@echo "git-subs-update   update git submodules"
 	@echo "gen-lib-class     generate lib C++ class skeleton: CLASS_NAME=My_Class"
 	@echo "gen-ui-class      generate UI C++ class skeleton: CLASS_NAME=My_Class"
@@ -50,6 +52,8 @@ help:
 	@echo "api-reference     generate Doxygen documentation"
 	@echo "dev-install-local compile and install binary to ~/bin as MIND"
 
+
+.PHONY: clean
 clean:
 	rm -vf ../app/mindforger
 	rm -vf ../lib/libmindforger.a
@@ -57,56 +61,75 @@ clean:
 	cd .. && make clean
 	cd ../lib/test && make clean
 
+
+.PHONY: git-subs-update
 git-subs-update:
 	cd .. && git submodule update --init --recursive
 
+
+.PHONY: gen-lib-class
 gen-lib-class:
 	@echo "Generating lib C++ class for name: $(CLASS_NAME)"
 	./make/gen-cpp-class.py $(CLASS_NAME)
 
+
+.PHONY: gen-ui-class
 gen-ui-class:
 	@echo "Generating UI C++ class for name: $(CLASS_NAME)"
 	./make/gen-cpp-ui-class.py $(CLASS_NAME)
 
 
+.PHONY: build
 build: clean
 	cd .. && qmake -r mindforger.pro && make -j 7
 	@echo "If build succeeded, then MindForger executable can be found in:\n  app/mindforger"
 	ls -al ../app/mindforger
 
+
 build-ci: clean
 	@echo "MindForger CI build..."
 	cd .. && qmake CONFIG+=mfci -r mindforger.pro && make -j 7
 	@echo "If CI build succeeded, then MindForger executable can be found in:\n  app/mindforger"
 	ls -al ../app/mindforger
 
+
+.PHONY: l10n
 l10n:
 	cd make && ./l10n-update-strings.sh && ./l10n-edit-and-release.sh $(MF_LANG)
 
+
 test-lib: clean
 	cd make && ./test-lib-units.sh
 
+
+.PHONY: dist-work-clean
 dist-work-clean:
 	rm -rvf $(MF_MAKER_WORKING_DIR)
 
+
 $(MF_MAKER_WORKING_DIR):
 	mkdir -vp $(MF_MAKER_WORKING_DIR)
 
+
 $(MINDFORGER_RELEASE_DIR):
 	mkdir -v $(MINDFORGER_RELEASE_DIR) || echo "$(MINDFORGER_RELEASE_DIR) already exists"
 
+
 dist-tarball: dist-work-clean $(MF_MAKER_WORKING_DIR) $(MINDFORGER_RELEASE_DIR)
 	@echo "Building TARBALL distribution..."
 	mkdir -vp $(MF_MAKER_WORKING_DIR)
 	cp -vf ./tarball/tarball-build.sh $(MF_MAKER_WORKING_DIR) && cd $(MF_MAKER_WORKING_DIR) && ./tarball-build.sh
 	cp -vf $(MF_MAKER_WORKING_DIR)/`cd $(MF_MAKER_WORKING_DIR) && ls -d mindforger*`/mindforger_$(MINDFORGER_VERSION)_tarball.tgz $(MINDFORGER_RELEASE_DIR)
 
+
 dist-deb: dist-work-clean $(MF_MAKER_WORKING_DIR) $(MINDFORGER_RELEASE_DIR)
 	@echo "Building DEB distribution..."
 	mkdir -vp $(MF_MAKER_WORKING_DIR)
 	cp -vf ./debian/debian-make-deb.sh $(MF_MAKER_WORKING_DIR) && cd $(MF_MAKER_WORKING_DIR) && ./debian-make-deb.sh
 	cp -vf $(MF_MAKER_WORKING_DIR)/`cd $(MF_MAKER_WORKING_DIR) && ls -d mindforger*`/mindforger_$(MINDFORGER_VERSION)-1_amd64.deb $(MINDFORGER_RELEASE_DIR)
 
+
+.PHONY: dist-rpm
 dist-rpm:
 	@echo "IMPORTANT: this target MUST be run on Fedora!"
 	cd fedora && ./fedora-distro-setup.sh
@@ -114,29 +137,41 @@ dist-rpm:
 	cp -vf ./fedora-rpm-from-deb.sh ~/alien && cd ~/alien && sudo ./fedora-rpm-from-deb.sh $(MINDFORGER_VERSION)
 	@echo "Find .rpm in ~/alien directory"
 
+
+.PHONY: dist-dmg
 dist-dmg:
 	@echo "Building .dmg package..."
 	cd macos && ./mindforger-build.sh && ./dmg-package-build.sh
 
+
+.PHONY: dist-debian-ppa
 dist-debian-ppa:
 	cd debian && ./debian-aptly-add-deb.sh
 
+
+.PHONY: dist-all-clean
 dist-all-clean:
 	rm -rvf $(MINDFORGER_RELEASE_DIR)
 
+
 dist-all: dist-all-clean $(MINDFORGER_RELEASE_DIR) dist-tarball dist-deb
 	@echo "Building all $(MINDFORGER_VERSION) distributions"
 
+
+.PHONY: statistic
 statistic:
 	cd make && ./statistic.sh
 
+
+.PHONY: doc-to-wiki
 doc-to-wiki:
 	cd doc && ./mf-doc-to-wiki.py
 
+
+.PHONY: api-reference
 api-reference:
 	cd doxygen && doxygen ./mindforger.cfg
 
-# private development targets
 
 dev-install-local: build-ci ../app/mindforger
 	cp -vf ../app/mindforger ~/bin

From f271557b6b973aeaf44582a63314ab3b758de12e Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sat, 14 Jan 2023 19:28:37 +0100
Subject: [PATCH 021/131] Version updates 1.55.0

---
 Changelog                                            |  3 ++-
 appveyor.yml                                         |  2 +-
 build/debian/debian-aptly-add-deb.sh                 |  2 +-
 build/make/replace-version-all-files.py              | 12 ++++++------
 .../WIP-ubuntu-launchpad-releases-from-mind.sh       |  6 +++---
 build/ubuntu/debian/changelog                        |  2 +-
 build/ubuntu/ubuntu-launchpad-releases-from-beast.sh |  2 +-
 7 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/Changelog b/Changelog
index 9a436d19..21921ff5 100644
--- a/Changelog
+++ b/Changelog
@@ -1,7 +1,8 @@
 2023-??-??  Martin Dvorak  
 
     * Released v1.55.0 - delete of a Note in the outline view keeps selected
-      an adjacent Note, improved page up/page down navigation in table widgets.
+      an adjacent Note, improved page up/page down navigation in table widgets,
+      Tools menu, charset added to HTML head.
 
 2022-03-07  Martin Dvorak  
 
diff --git a/appveyor.yml b/appveyor.yml
index a98f8b4a..5d0bd051 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -15,7 +15,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see .
 
-version: 1.53.{build}
+version: 1.55.{build}
 
 skip_commits:
   files:
diff --git a/build/debian/debian-aptly-add-deb.sh b/build/debian/debian-aptly-add-deb.sh
index f07de60c..c0ca3ca5 100755
--- a/build/debian/debian-aptly-add-deb.sh
+++ b/build/debian/debian-aptly-add-deb.sh
@@ -32,7 +32,7 @@
 # See 'MindForger Release Guide#Debian and my PPA' notebook for detailed steps description...
 
 # .deb package to be added
-export NEW_VERSION_NAME="1.53.0"
+export NEW_VERSION_NAME="1.55.0"
 export NEW_RELEASE_NAME="mindforger_${NEW_VERSION_NAME}"
 export NEW_DEB_NAME="${NEW_RELEASE_NAME}-1_amd64.deb"
 # Debian release ~ aptly publish
diff --git a/build/make/replace-version-all-files.py b/build/make/replace-version-all-files.py
index 89ec093f..7234fd20 100755
--- a/build/make/replace-version-all-files.py
+++ b/build/make/replace-version-all-files.py
@@ -23,14 +23,14 @@
 
 SEMANTIC_VERSION_FILES = [
     "../../build/debian/debian-aptly-add-deb.sh",
-    # ^ export NEW_DEB="mindforger_1.53.0-1_amd64.deb"
-    # ^ export NEW_VERSION="1.53.0"
+    # ^ export NEW_DEB="mindforger_1.54.0-1_amd64.deb"
+    # ^ export NEW_VERSION="1.54.0"
     "../../build/debian/debian-make-deb.sh",
-    # ^ export ARG_VERSION="1.53.0"
+    # ^ export ARG_VERSION="1.54.0"
     "../../build/debian/debian/changelog",
-    # ^ mindforger (1.53.0-1) unstable; urgency=low
+    # ^ mindforger (1.54.0-1) unstable; urgency=low
     "../../build/fedora/fedora-rpm-from-deb.sh",
-    # ^ export MFVERSION="1.53.0"
+    # ^ export MFVERSION="1.54.0"
     "../../PAD.xml",
     # ^ 1.54.0
     "../../build/Makefile",
@@ -45,7 +45,7 @@
 
 MINOR_VERSION_FILES = [
     "../../lib/src/app_info.h",
-    # ^ #define MINDFORGER_VERSION_DWORD 1,54,0,2
+    # ^ #define MINDFORGER_VERSION_DWORD 1,55,0,2
     # ^ #define MINDFORGER_VERSION_MINOR "55"
 ]
 
diff --git a/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh
index fe88088b..848006a6 100755
--- a/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh
+++ b/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh
@@ -95,7 +95,7 @@ function createTarball {
   cp -vf ../${MF}.tgz ../${MF}.orig.tar.gz
   cd ../${MF}
 
-  echo -e "\nMindForger TARBALL archives created using work/:\n  mindforger_1.53.4.orig.tar.gz\n  mindforger_1.53.4.tgz"
+  echo -e "\nMindForger TARBALL archives created using work/:\n  mindforger_1.55.4.orig.tar.gz\n  mindforger_1.55.4.tgz"
 }
 
 # ############################################################################
@@ -242,7 +242,7 @@ function releaseForParticularUbuntuVersion {
     #   - DEBUG: /var/cache/pbuilder/base.tgz ... last build's distro of Ubuntu
     #   - DEBUG: ~/pbuilder                   ... Ubuntu distro snapshots ^
     # DRY RUN
-    #   cd /home/dvorka/p/mindforger/launchpad/mindforger-2021-12-26--09-17-35/build-area && export PBUILDFOLDER=/tmp/mindforger-pbuilder-tmp && rm -rvf ${PBUILDFOLDER} ; mkdir -p ${PBUILDFOLDER} ; cp -rvf ~/pbuilder/*.tgz ${PBUILDFOLDER} ; pbuilder-dist xenial build mindforger_1.53.4-0ubuntu1.dsc
+    #   cd /home/dvorka/p/mindforger/launchpad/mindforger-2021-12-26--09-17-35/build-area && export PBUILDFOLDER=/tmp/mindforger-pbuilder-tmp && rm -rvf ${PBUILDFOLDER} ; mkdir -p ${PBUILDFOLDER} ; cp -rvf ~/pbuilder/*.tgz ${PBUILDFOLDER} ; pbuilder-dist xenial build mindforger_1.55.4-0ubuntu1.dsc
     # SHARP run:
     cd ../build-area
     # CLEAN build directory for pbuilder in tmp/
@@ -296,7 +296,7 @@ then
     exit 1
 fi
 
-export ARG_MAJOR_VERSION=1.53.
+export ARG_MAJOR_VERSION=1.55.
 export ARG_MINOR_VERSION=4 # minor version is incremented for every Ubuntu version
 export ARG_BAZAAR_MSG="MindForger ${ARG_MAJOR_VERSION}${ARG_MINOR_VERSION} release."
 
diff --git a/build/ubuntu/debian/changelog b/build/ubuntu/debian/changelog
index 1de6243b..0c85a074 100644
--- a/build/ubuntu/debian/changelog
+++ b/build/ubuntu/debian/changelog
@@ -1,4 +1,4 @@
-mindforger (1.54.1-0ubuntu1) trusty; urgency=low
+mindforger (1.55.1-0ubuntu1) trusty; urgency=low
 
   * Experimental packaging.
 
diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh b/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh
index af04343b..50268666 100755
--- a/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh
+++ b/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh
@@ -203,7 +203,7 @@ then
     exit 1
 fi
 
-export ARG_MAJOR_VERSION=1.54.
+export ARG_MAJOR_VERSION=1.55.
 export ARG_MINOR_VERSION=1 # minor version is incremented for every Ubuntu version
 export ARG_BAZAAR_MSG="MindForger ${ARG_MAJOR_VERSION}${ARG_MINOR_VERSION} release."
 

From 4e2f290b214a7fcee757fdc95edce1b8428f646e Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 15 Jan 2023 18:19:27 +0100
Subject: [PATCH 022/131] Complete rewrite of the Ubuntu release script for the
 mind machine.

---
 build/snap/README.md                          |  10 +-
 build/snap/snapcraft.yaml                     |  42 +++
 build/ubuntu/debian/changelog                 |   5 +-
 ...=> ubuntu-launchpad-releases-from-mind.sh} | 276 +++++++++++-------
 4 files changed, 219 insertions(+), 114 deletions(-)
 create mode 100644 build/snap/snapcraft.yaml
 rename build/ubuntu/{WIP-ubuntu-launchpad-releases-from-mind.sh => ubuntu-launchpad-releases-from-mind.sh} (53%)

diff --git a/build/snap/README.md b/build/snap/README.md
index c12fbb39..cd533cc9 100644
--- a/build/snap/README.md
+++ b/build/snap/README.md
@@ -5,9 +5,15 @@ Snap package to be implemented:
 
 How to package:
 
-* [ ] https://www.digitalocean.com/community/tutorials/how-to-package-and-publish-a-snap-application-on-ubuntu-18-04
+* https://ubuntu.com/blog/how-to-create-snap-packages-on-qt-applications
+* https://www.digitalocean.com/community/tutorials/how-to-package-and-publish-a-snap-application-on-ubuntu-18-04
+* https://wiki.freepascal.org/Create_snap_package
+
+Qt apps examples:
+
+* https://github.com/search?q=filename%3Asnapcraft.yaml+%22plugin%3A+qmake%22&type=Code
+* https://github.com/liu-xiao-guo/deepin-movie/blob/598d5c10bc1e3aa25e6214696c07376bdbbe2001/snap/snapcraft.yaml
 
 Resources:
 
 * https://snapcraft.io/store
-  
diff --git a/build/snap/snapcraft.yaml b/build/snap/snapcraft.yaml
new file mode 100644
index 00000000..0002222a
--- /dev/null
+++ b/build/snap/snapcraft.yaml
@@ -0,0 +1,42 @@
+# snapcraft.yaml     snap builder configuration
+#
+# MindForger knowledge management tool
+#
+# Copyright (C) 2016-2023 Martin Dvorak 
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# https://docs.snapcraft.io/build-snaps/your-first-snap
+#
+
+name: mindforger
+version: '0.55.0'
+base: core18 # build core on Ubuntu 18.04 LTS
+version: git
+grade: stable
+summary: Markdown Editor and Thinking Notebook
+description: |
+  MindForger is open, free, well performing Markdown editor which respects
+  your privacy and enables security. MindForger is actually more than
+  an editor or IDE - it's human mind inspired personal knowledge management tool.
+confinement: devmode
+# confinement: classic
+
+apps:
+  mindforger:
+    command: desktop-launch bin/mindforger
+    plugs:
+    - home
+
+...
diff --git a/build/ubuntu/debian/changelog b/build/ubuntu/debian/changelog
index 0c85a074..36627e3d 100644
--- a/build/ubuntu/debian/changelog
+++ b/build/ubuntu/debian/changelog
@@ -1,6 +1,5 @@
-mindforger (1.55.1-0ubuntu1) trusty; urgency=low
+mindforger (1.55.1-0ubuntu1) bionic; urgency=low
 
-  * Experimental packaging.
+  * New version.
 
  -- Martin Dvorak (Dvorka)   Sat, 1 Jan 2023 14:11:33 +0100
-
diff --git a/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
similarity index 53%
rename from build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh
rename to build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
index 848006a6..1605e6f1 100755
--- a/build/ubuntu/WIP-ubuntu-launchpad-releases-from-mind.sh
+++ b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
@@ -28,10 +28,60 @@
 #   Debian formal doc:
 #     https://www.debian.org/doc/debian-policy/
 #
+# Tips:
+# - run the script from Emacs shell to easily analyze script output
+# - set OPT_* for PUSH and RELEASE to false to get .deb for any Ubuntu
+#   version locally
+#
 
-# ############################################################################
-# # Checkout MindForger from bazaar, copy over new sources, clean result #
-# ############################################################################
+# ########################################################################
+# # Configuration
+# ########################################################################
+
+# Ubuntu version:
+# - https://wiki.ubuntu.com/Releases
+# - obsolete:
+#     precise quantal saucy precise utopic vivid wily yakkety artful cosmic
+# - current :
+#     (trusty) xenial bionic (cosmic disco eoan) focal (groovy) (hirsute) (impish) jammy kinetic
+# - command (Bash tuple of distro names):
+#     trusty xenial bionic focal jammy kinetic
+UBUNTU_VERSIONS=(focal)
+
+# environment variables
+export MAJOR_VERSION=1
+export MINOR_VERSION=55
+export PATCH_VERSION=1 # patch version is incremented for every Ubuntu build @ Launchpad
+export MF_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}" # semantic version
+export RM_CMD="rm -vrf "
+export CP_CMD="cp -vrf "
+
+# shell variables
+OPT_VERBOSE="v"
+OPT_DO_PUSH="false" # "true" to upload src to bazaar
+OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+
+# ########################################################################
+# # Helpers
+# ########################################################################
+
+function echoStep {
+    echo -e "\n# ${1} ###################################################"
+}
+
+function echoStepDone {
+    echo -e "\n# DONE: ${1} #############################################"
+    pwd
+}
+
+function debugExit {
+    echo "EXITING SCRIPT: intentional development script exit"
+    exit 1    
+}
+
+# ########################################################################
+# # Checkout MindForger from bazaar, copy over new sources, clean result
+# ########################################################################
 
 function checkoutMindforger {
     # use `bzr` to manually check and work with Bazaar repository:
@@ -46,19 +96,19 @@ function checkoutMindforger {
     # delete OLD files from Bazaar directory
     cd mindforger
     mv .bzr ..
-    rm -rvf app build deps lib man LICENSE *.md
+    rm -rf$OPT_VERBOSE} app build deps lib man LICENSE *.md
     mv ../.bzr .
 
     # copy NEW project files to Bazaar directory
     echo -e "\n# copy over new MindForger files ############################"
-    cp -rvf ${MFSRC}/* ${MFSRC}/*.*  .
+    cp -rf$OPT_VERBOSE} ${MFSRC}/* ${MFSRC}/*.*  .
 
     # prune MindForger project files: tests, *.o/... build files, ...
     echo -e "\n# CLEANUP development and build artifacts ###################"
-    rm -vrf ./.git ./.qmake.stash ./app/mindforger ./build ./app/test ./lib/test
-    rm -vrf ./deps/cmark-gfm/.github
-    rm -vrf ./deps/mitie
-    rm -vrf ./lib/.qmake.stash ./lib/lib.pro.user ./lib/src/mindforger-lib-unit-tests
+    rm -rf$OPT_VERBOSE} ./.git ./.qmake.stash ./app/mindforger ./build ./app/test ./lib/test
+    rm -rf$OPT_VERBOSE} ./lib/.qmake.stash ./lib/lib.pro.user ./lib/src/mindforger-lib-unit-tests
+    rm -rf$OPT_VERBOSE} ./deps/cmark-gfm/.github
+    rm -rf$OPT_VERBOSE} ./deps/mitie
     # IMPROVE: static libraries lib*.a are NOT deleted to keep cmark-gfm dependency libs
     find . -type f \( -name "*moc_*.cpp" -or -name "*.o" -or -name "*.*~" -or -name ".gitignore" -or -name ".git" \) | while read F; do rm -vf $F; done
     
@@ -66,40 +116,48 @@ function checkoutMindforger {
 }
 
 # ############################################################################
-# # Create updated changelog #
+# # Create updated changelog
 # ############################################################################
 
 function createChangelog {
   export MYTS=`date "+%a, %d %b %Y %H:%M:%S"`
   echo "Changelog timestamp: ${MYTS}"
-  echo "mindforger (${MFFULLVERSION}) ${UBUNTUVERSION}; urgency=low" > $1
+  echo "mindforger (${MFFULLVERSION}) ${UBUNTU_VERSION}; urgency=low" > $1
   echo " " >> $1
   echo "  * ${MFBZRMSG}" >> $1
   echo " " >> $1
   echo " -- Martin Dvorak (Dvorka)   ${MYTS} +0100" >> $1
-  echo "" >> $1
+  # additional new line removed as it's not in HSTR
+  #echo "" >> $1
 }
 
 # ############################################################################
-# # Create upstream tarball in work/ #
+# # Create upstream tarball in work/
 # ############################################################################
 
 function createTarball {
-  cd ..
-  mkdir work
-  cd work
-  cp -vrf ../${MF} .
-  rm -rvf ${MF}/.bzr
-  tar zcf ../${MF}.tgz ${MF}
-  # .orig.tar.gz is required Debian convention
-  cp -vf ../${MF}.tgz ../${MF}.orig.tar.gz
-  cd ../${MF}
-
-  echo -e "\nMindForger TARBALL archives created using work/:\n  mindforger_1.55.4.orig.tar.gz\n  mindforger_1.55.4.tgz"
+    echoStep "Create TARBALL ${MF}"
+    # .orig.tar.gz is required Debian convention
+    TARBALL_FILE="${MF}.orig.tar.gz"
+    
+    cd ..
+    mkdir work
+    cd work
+    cp -rf${OPT_VERBOSE} ../${MF} .
+    # remove bazaar control files
+    rm -rf${OPT_VERBOSE} ${MF}/.bzr
+    # create archives
+    tar zcf ../${MF}.tgz ${MF}
+    cp -fv ../${MF}.tgz ../${TARBALL_FILE}
+    # change back to the directory which was zipped as tarball
+    cd ../${MF}
+
+    echoStepDone "TARBALL archive created in $(pwd)/..:"
+    ls -l ../*.gz
 }
 
 # ############################################################################
-# # Patch qmake location (if needed) #
+# # Patch qmake location (if needed)
 # ############################################################################
 
 function patchQmakePathInMakefile {
@@ -118,8 +176,10 @@ function patchQmakePathInMakefile {
 }
 
 # ############################################################################
-# # Release for *ONE* particular Ubuntu version #
+# # Release for *ONE* particular Ubuntu version
 # ############################################################################
+# - this is the main() function of this script
+# - step by step it releases MindForger for one particular Ubuntu version
 
 function releaseForParticularUbuntuVersion {
     export SCRIPTHOME=`pwd`
@@ -134,38 +194,46 @@ function releaseForParticularUbuntuVersion {
     export MFBUILD=mindforger-${NOW}
     
     # 1) clean up
-    echo -e "\n# Cleanup ####################################################"
+    echoStep "Cleanup"
     rm -rvf *.*~ ./debian
     
-    # 2) checkout MindForger from Launchpad's bazaar to work directory (will be needed to build SOURCE .deb package)
-    echo -e "\n# Checkout MindForger from Launchpad's Bazaar ################"
+    # 2) checkout MindForger from Launchpad's bazaar to work directory
+    #    (will be needed to build SOURCE .deb package)
+    echoStep "Checkout MF from LaunchPad bazaar"
     mkdir ${MFBUILD}
     cd ${MFBUILD}
     checkoutMindforger ${MF} ${MFSRC}
 
     # 3) update Debian control files (changelog, descriptor, ...) in bzr clone
-    echo -e "\n# Building deb ###############################################"
+    echoStep "Create Debian control files"
     cd mindforger && cp -rvf ${MFSRC}/build/ubuntu/debian .
     createChangelog ./debian/changelog
+    echo "Changelog:"
+    cat ./debian/changelog
 
-    # 4) prepare MindForger dependencies/libraries
-    echo -e "\n---------------------------------------------------------------"
-    echo "4.1) build MF dependencies/libs: cmark-gfm, ..."
-    rm -rvf deps/cmark-gfm/build
+    # 4) build MF dependencies
+    echoStep "Build MindForger library dependencies: cmark-gfm"
+    rm -rf${OPT_VERBOSE} deps/cmark-gfm/build
     cd deps/cmark-gfm && mkdir -v build && cd build && cmake -DCMARK_TESTS=OFF -DCMARK_SHARED=OFF .. && cmake --build . && cd ../../..
-        
-    echo -e "\n---------------------------------------------------------------"
-    echo "4.2) Qt: generate Makefiles using qmake"
+    echoStepDone "cmark-gfm build"
+    # cmark-gfm static library:
+    ls -l deps/cmark-gfm/build/src/libcmark-gfm.a
+    if [[ $? -eq 0 ]] ; then echo "  SUCCESSFULL"; else echo "  FAILED"; exit 1; fi
+    
+    # 5) generate MF Makefiles using qmake
+    echoStep "Generate Makefiles using qmake"
     cd ..
     mv mindforger ${MF}
     cd ${MF}
-    # qt version MUST be specified as it CANNOT be configured by installing
+    # Qt version MUST be specified as it CANNOT be configured by installing
     # qt5-default package: Debian control file does NOT allow virtual packages
-    # like this qt5-default. Instead debian/rules file exports env var w/ Qt choice
+    # like this qt5-default.
+    # Instead debian/rules file exports env var w/ Qt choice
     # .pro file is also extended to have 'make install' target
     qmake -r mindforger.pro
-    # PATCH optionally patch source files e.g. different Ubuntu distro specific paths
-    echo "  PATCH files prior TARBALL in '`pwd`'"
+    
+    # 6) optionally PATCH source files e.g. different Ubuntu distro specific paths
+    echoStep "Patch Makefiles - fix Qt paths for Ubuntu versions"
     #if [[ "xenial" = "${UBUNTUVERSION}" ]]
     #then
 	patchQmakePathInMakefile "Makefile"
@@ -173,35 +241,32 @@ function releaseForParticularUbuntuVersion {
 	patchQmakePathInMakefile "lib/Makefile"
 	patchQmakePathInMakefile "lib/src/Makefile"
     #fi
-    
-    # xxx LATER
-    # xxx LATER
-    # xxx LATER
-    # 5) add new version to LOCAL Bazaar
-    #echo -e "\n# bazaar add & commit  #######################################"
-    #bzr add .
-    # IMPORTANT: commit UPLOADs branch to server
-    #bzr commit -m "Update for ${MF} at ${NOW}."
 
-    # 5) create tarball ~ .tgz archive w/ source and required Debian cfg files
+    # 7) create tarball ~ .tgz archive w/ source and required Debian cfg files
     echo -e "\n---------------------------------------------------------------"
     echo -e "5.1) create TARBALL: prepare files to work/ directory"
     createTarball
     
-    # start GPG agent if it's NOT running
-    echo -e "\n---------------------------------------------------------------"
-    echo -e "5.2) GPG agent: start agent process if it is NOT running"
+    # 8) start GPG agent if it's NOT running
+    echoStep "Start GPG agent process (if it is NOT running)"
     if [ -e "${HOME}/.gnupg/S.gpg-agent" ]
     then
 	echo "OK: GPG agent running."
     else
 	gpg-agent --daemon
     fi    
-    
-    # 6) build SOURCE .deb package
-    echo -e "\n# source & binary .deb packages  ######################################"
-    echo -e "\n---------------------------------------------------------------"
-    echo -e "6.1) build SIGNED SOURCE .deb package on HOST system (not FAKEROOT build) using sources prepared by TARBALL in work/ directory"
+
+    # 9) add new version to LOCAL Bazaar branch (which will be used for .deb build)
+    echoStep "add & commit ${MF} prepared files to the current bazaar branch"
+    bzr add .
+    # IMPORTANT: commit UPLOADs branch to server
+    # https://code.launchpad.net/~ultradvorka/+junk/mindforger
+    #   ^ browse changes/code and pushes @ Launchpad
+    bzr commit -m "Update for ${MF} at ${NOW}."
+
+    # 10) build SOURCE .deb package (copy sources, add control files and .tgz it to get .deb package)
+    echoStep "Build SIGNED SOURCE .deb package from bzr branch"
+    echo "  Building .deb package on HOST system (not FAKEROOT build) using sources prepared by TARBALL in bazaar work/ directory:"
     pwd
     # Build of SOURCE .deb package
     #   - build is made using Makefile(s) generated by qmake ABOVE
@@ -217,22 +282,25 @@ function releaseForParticularUbuntuVersion {
     #   -b  ... build BINARY package (SOURCE package otherwise w/ -S)
     #   -i  ... ignore build-in deps conflicts
     # doc and man:
+    #   http://doc.bazaar.canonical.com/plugins/en/builddeb-plugin.html
     #   http://manpages.ubuntu.com/manpages/xenial/en/man1/dpkg-buildpackage.1.html
     #   http://manpages.ubuntu.com/manpages/xenial/en/man1/debuild.1.html
     #   man debuild
     # build SIGNED source .deb package:
-    bzr builddeb --source
-    # verify build result
+    bzr builddeb --verbose --source
+    # verify build result and EXIT on failure
     build_status=$?
-    echo -e "SOURCE .deb package build on HOST system (buildarea/mindforger_...orig.tar.gz):"
-    [ $build_status -eq 0 ] && echo "  SUCCESSFULL" || exit 1
+    echo -e "DONE: SOURCE .deb package build on HOST system (buildarea/mindforger_...orig.tar.gz):"
+    if [[ $build_status -eq 0 ]] ; then echo "  SUCCESSFULL"; else echo "  FAILED"; exit 1; fi
     
-    # 7) build BINARY .deb from source deb on CLEAN system - no deps installed
-    echo -e "\n# CLEAN SYSTEM MindForger build by pbuilder @ FAKEROOT #########"
-    echo -e "5.4) build SIGNED BINARY .deb package on FAKEROOT system using sources prepared by SOURCE .deb build"
+    # 11) build BINARY .deb from source .deb on CLEAN system - no deps installed
+    echoStep "Build SIGNED BINARY .deb package from source .deb (created in previous step) on CLEAN system (FAKEROOT mounted) - this is actual deps installation, compilation and link of the executable to create .deb file with the binary, HOWEVER, the binar .deb is NOT uploaded, this steps is made just to verify that the build will NOT fail on Launchpad (for the build is used just signed .dsc file)"
     # Build is made using Makefile(s) generated by qmake above:
+    #   - build is made using GPG signed .dsc file which pbuild-dist takes as a parameter
+    #     - .dsc files was created in the previous steps for .deb files
     #   - build-area/ directory created by SOURCE `bzr buildeb` in the previous step
     #     is used to build MindForger using `pbuilder-dist` on fakeroot system
+    #   - OUTPUT of the pbuild-dist is stored in /tmp/mindforger-pbuilder-tmp/_result
     #   - IMPORTANT: pbuilder's caches in /var and /home MUST be on same physical drive
     #     as build-area/
     #   - WARNING: mindforger/Makefile contains path to qmake which was determined
@@ -241,9 +309,6 @@ function releaseForParticularUbuntuVersion {
     #   - DEBUG: /var/cache/pbuilder          ... last build's artifacts
     #   - DEBUG: /var/cache/pbuilder/base.tgz ... last build's distro of Ubuntu
     #   - DEBUG: ~/pbuilder                   ... Ubuntu distro snapshots ^
-    # DRY RUN
-    #   cd /home/dvorka/p/mindforger/launchpad/mindforger-2021-12-26--09-17-35/build-area && export PBUILDFOLDER=/tmp/mindforger-pbuilder-tmp && rm -rvf ${PBUILDFOLDER} ; mkdir -p ${PBUILDFOLDER} ; cp -rvf ~/pbuilder/*.tgz ${PBUILDFOLDER} ; pbuilder-dist xenial build mindforger_1.55.4-0ubuntu1.dsc
-    # SHARP run:
     cd ../build-area
     # CLEAN build directory for pbuilder in tmp/
     export PBUILDFOLDER=/tmp/mindforger-pbuilder-tmp
@@ -255,40 +320,38 @@ function releaseForParticularUbuntuVersion {
     echo "  Running 'pbuilder-dist ${UBUNTUVERSION} build ${MFRELEASE}.dsc' in '`pwd`'"
     echo "    - mindfoger_..-0ubuntu1.dsc ... control descriptor according to which is build made"
     echo "    - mindfoger_...orig.tar.gz  ... TARBALL w/ Debian control files used to build .deb"
+    # pbuild-dist help: https://wiki.ubuntu.com/PbuilderHowto
     pbuilder-dist ${UBUNTUVERSION} build ${MFRELEASE}.dsc
     # VERIFY pbuilder-dist build result
     build_status=$?
-    echo -e "BINARY .deb package build on FAKEROOT system (${PBUILDFOLDER}):"
-    [ $build_status -eq 0 ] && echo "  SUCCESSFULL" || exit 1
-        
-    # 8) upload updated sources to Launchpad: push Bazaar and put changes
-    echo -e "\n# bzr push .deb to Launchpad ###################################"    
-    # from buildarea/ to ./dist
-    cd ../${MF}
-    echo "Before bzr push: " `pwd`
+    echo -e "DONE: BINARY .deb package build on FAKEROOT system, result stored to ${PBUILDFOLDER}/${UBUNTUVERSION}_result:"
+    if [[ $build_status -eq 0 ]] ; then echo "  SUCCESSFULL"; else echo "  FAILED"; exit 1; fi
 
-    # TODO commit in bzr first
-    
-    echo -e "SKIPPED FOR NOW"
-    echo -e "SKIPPED FOR NOW"
-    echo -e "SKIPPED FOR NOW"
-    exit 0
-    exit 0
-    exit 0
-    
-    bzr push lp:~ultradvorka/+junk/mindforger
-    cd ..
-    echo "Before dput push: " `pwd`
-    # recently added /ppa to fix the path and package rejections
-    # MF PPA w/ 64b build only
-    dput ppa:ultradvorka/productivity ${MFRELEASE}_source.changes
-    # SKIP: HSTR PPA w/ 64b 32b and ARM builds
-    #dput ppa:ultradvorka/ppa ${MFRELEASE}_source.changes
+    if [[ ${OPT_DO_PUSH} == "true" ]]
+    then
+       # 12) push updated sources to Launchpad bazaar server
+       echoStep "Push updated sources to Launchpad bazaar"
+       cd ../${MF}
+       echo "Invoking bzr push in: $(pwd)"
+       bzr push lp:~ultradvorka/+junk/mindforger
+
+       if [[ ${OPT_DO_RELEASE} == "true" ]]
+       then       
+	   cd ..
+	   echo "Invoking dput in: $(pwd)"
+	   ls -l ${MFRELEASE}_source.changes
+	   # recently added /ppa to fix the path and package rejections
+	   # MF PPA w/ 64b build only
+	   dput ppa:ultradvorka/productivity ${MFRELEASE}_source.changes
+	   # SKIP: MF PPA w/ 64b 32b and ARM builds
+	   #dput ppa:ultradvorka/ppa ${MFRELEASE}_source.changes
+       fi
+    fi
 }
 
-# ############################################################################
-# # Main #
-# ############################################################################
+#############################################################################
+# Main
+#############################################################################
 
 if [ -e "../../.git" ]
 then
@@ -296,20 +359,15 @@ then
     exit 1
 fi
 
-export ARG_MAJOR_VERSION=1.55.
-export ARG_MINOR_VERSION=4 # minor version is incremented for every Ubuntu version
-export ARG_BAZAAR_MSG="MindForger ${ARG_MAJOR_VERSION}${ARG_MINOR_VERSION} release."
+export BAZAAR_MSG="MindForger ${MF_VERSION} release."
 
-# https://wiki.ubuntu.com/Releases
-# obsolete: precise quantal saucy precise utopic vivid wily yakkety artful cosmic
-# current : (trusty) xenial bionic (cosmic disco eoan) focal (groovy) hirsute impish
-# xenial bionic focal hirsute impish
-# WIP: trusty xenial bionic focal hirsute impish
-for UBUNTU_VERSION in bionic
+for UBUNTU_VERSION in ${UBUNTU_VERSIONS}
 do
-    echo "Releasing MF for Ubuntu version: ${UBUNTU_VERSION}"
-    releaseForParticularUbuntuVersion ${UBUNTU_VERSION} ${ARG_MAJOR_VERSION}${ARG_MINOR_VERSION} "${ARG_BAZAAR_MSG}"
-    ARG_MINOR_VERSION=`expr $ARG_MINOR_VERSION + 1`
+    echo -e "\n###################################################"
+    echo "# Releasing MF for Ubuntu version: ${UBUNTU_VERSION}"
+    echo "###################################################"
+    releaseForParticularUbuntuVersion ${UBUNTU_VERSION} "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}" "${BAZAAR_MSG}"
+    MINOR_VERSION=`expr $MINOR_VERSION + 1`
 done
 
 # eof

From aeb486d08100bc41b4caf7c5f9a9bfd513796ba2 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 15 Jan 2023 18:21:51 +0100
Subject: [PATCH 023/131] Polishing Ubuntu release script.

---
 build/ubuntu/ubuntu-launchpad-releases-from-mind.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
index 1605e6f1..361255f1 100755
--- a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
+++ b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
@@ -293,7 +293,7 @@ function releaseForParticularUbuntuVersion {
     echo -e "DONE: SOURCE .deb package build on HOST system (buildarea/mindforger_...orig.tar.gz):"
     if [[ $build_status -eq 0 ]] ; then echo "  SUCCESSFULL"; else echo "  FAILED"; exit 1; fi
     
-    # 11) build BINARY .deb from source .deb on CLEAN system - no deps installed
+    # 11) build BINARY .deb from source .deb on CLEAN system to dry run build @ Launchpad
     echoStep "Build SIGNED BINARY .deb package from source .deb (created in previous step) on CLEAN system (FAKEROOT mounted) - this is actual deps installation, compilation and link of the executable to create .deb file with the binary, HOWEVER, the binar .deb is NOT uploaded, this steps is made just to verify that the build will NOT fail on Launchpad (for the build is used just signed .dsc file)"
     # Build is made using Makefile(s) generated by qmake above:
     #   - build is made using GPG signed .dsc file which pbuild-dist takes as a parameter

From ca2068261f8795e909a4baea6eabee2e0ce5502b Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 15 Jan 2023 19:29:55 +0100
Subject: [PATCH 024/131] Adding make target to build any Ubuntu version.

---
 build/Makefile | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/build/Makefile b/build/Makefile
index 69f4ba0b..266d2dfa 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -28,16 +28,17 @@ MF_MAKER_WORKING_DIR := $(MINDFORGER_RELEASE_BASE_DIR)/maker-at-work
 CLASS_NAME := "New_Class"
 # l10n language: en, cs
 MF_LANG := "en"
-
+# Ubuntu distro: trusty xenial bionic focal jammy kinetic
+DISTRO := "bionic"
 
 .PHONY: help
 help:
-	@echo "MindForger tooling help:"
+	@echo "MindForger Swiss knife help:"
 	@echo "git-subs-update   update git submodules"
 	@echo "gen-lib-class     generate lib C++ class skeleton: CLASS_NAME=My_Class"
 	@echo "gen-ui-class      generate UI C++ class skeleton: CLASS_NAME=My_Class"
 	@echo "clean             clean build artifacts"
-	@echo "build             build MindForger binary"
+	@echo "build             build MindForger application binary"
 	@echo "l10n              update and release localization strings: MF_LANG=en"
 	@echo "test-lib          compile and run lib/ unit tests"
 	@echo "test-app          compile and run app/ integration tests"
@@ -47,6 +48,8 @@ help:
 	@echo "dist-rpm          build .rpm package on Fedora"
 	@echo "dist-dmg          build macOS Disk iMaGe .dmg package"
 	@echo "dist-debian-ppa   add .deb to aptly PPA"
+	@echo "dist-ubuntu-deb   locally build .deb for any Ubuntu version:"
+	@echo "                  DISTRO=focal"
 	@echo "statistic         show source code statistic"
 	@echo "doc-to-wiki       mindforger-documentation to mindforger.wiki"
 	@echo "api-reference     generate Doxygen documentation"
@@ -149,6 +152,15 @@ dist-debian-ppa:
 	cd debian && ./debian-aptly-add-deb.sh
 
 
+.PHONY: dist-ubuntu-deb
+dist-ubuntu-deb:
+	@echo "Building Ubuntu $(DISTRO) .deb ..."
+	@echo "Copying latest version of .sh script to launchpad/ ..."
+	@echo "Running .sh script ..."
+	@echo "Copying .deb from build area to the current directory ..."
+	false
+
+
 .PHONY: dist-all-clean
 dist-all-clean:
 	rm -rvf $(MINDFORGER_RELEASE_DIR)

From ca768e22029cfef0501dad4b7cd1f5338afe2232 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 15 Jan 2023 23:09:37 +0100
Subject: [PATCH 025/131] Source code style (columns) + debugging of missing EM
 #1489

---
 CONTRIBUTING.md                                           | 1 +
 app/src/qt/main_window_presenter.cpp                      | 8 ++++++--
 app/src/qt/organizer_quadrant_model.cpp                   | 6 ++++--
 app/src/qt/organizer_quadrant_presenter.cpp               | 5 +++--
 app/src/qt/organizers_table_model.cpp                     | 4 +++-
 app/src/qt/organizers_table_model.h                       | 4 +++-
 app/src/qt/organizers_table_presenter.cpp                 | 5 +++--
 app/src/qt/organizers_table_presenter.h                   | 4 +++-
 build/ubuntu/ubuntu-launchpad-releases-from-mind.sh       | 8 +++++---
 lib/src/model/eisenhower_matrix.cpp                       | 4 +++-
 lib/src/model/eisenhower_matrix.h                         | 3 ++-
 .../markdown_repository_configuration_representation.cpp  | 8 +++++---
 12 files changed, 41 insertions(+), 19 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 98c75d52..a6437ab1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -45,6 +45,7 @@ Code style:
 * Use `{}` with constructor having 0/1 parameter, () otherwise.
 * `CamelCase` class names (no underscores).
 * Lines to have at most 88 columns.
+  - Guide in Qt Creator: `Tools` > `Options` > `Text editor` > `Display` > `Display right margin at column` = 88
 * 4 spaces indentation.
 * Python's black like formatting.
 * Use `/lib/src` source code as code style reference.
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index 4675ae19..36779f27 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -1161,8 +1161,12 @@ void MainWindowPresenter::sortAndSaveOrganizersConfig()
 
 void MainWindowPresenter::doActionViewOrganizers()
 {
-    if(config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY) {
-        orloj->showFacetOrganizerList(config.getRepositoryConfiguration().getOrganizers());
+    if(config.getActiveRepository()->getMode()
+       == Repository::RepositoryMode::REPOSITORY
+    ) {
+        orloj->showFacetOrganizerList(
+            config.getRepositoryConfiguration().getOrganizers()
+        );
     }
 }
 
diff --git a/app/src/qt/organizer_quadrant_model.cpp b/app/src/qt/organizer_quadrant_model.cpp
index a76502cb..a6d4f23d 100644
--- a/app/src/qt/organizer_quadrant_model.cpp
+++ b/app/src/qt/organizer_quadrant_model.cpp
@@ -93,7 +93,8 @@ void OrganizerQuadrantModel::addRow(
         // item
         item = new QStandardItem(html);
         item->setToolTip(html);
-        // TODO under which ROLE this is > I should declare CUSTOM role (user+1 as constant)
+        // TODO under which ROLE this is > I should declare CUSTOM role
+        //   (user+1 as constant)
         item->setData(QVariant::fromValue(note));
         items += item;
     } else {
@@ -104,7 +105,8 @@ void OrganizerQuadrantModel::addRow(
         // item
         item = new QStandardItem(html);
         item->setToolTip(html);
-        // TODO under which ROLE this is > I should declare CUSTOM role (user+1 as constant)
+        // TODO under which ROLE this is > I should declare CUSTOM role
+        //   (user+1 as constant)
         item->setData(QVariant::fromValue(note));
         items += item;
     }
diff --git a/app/src/qt/organizer_quadrant_presenter.cpp b/app/src/qt/organizer_quadrant_presenter.cpp
index 0db16bcc..9f361ab6 100644
--- a/app/src/qt/organizer_quadrant_presenter.cpp
+++ b/app/src/qt/organizer_quadrant_presenter.cpp
@@ -111,8 +111,9 @@ void OrganizerQuadrantPresenter::slotShowSelectedNote()
     }
 }
 
-void OrganizerQuadrantPresenter::slotShowNote(const QItemSelection& selected, const QItemSelection& deselected)
-{
+void OrganizerQuadrantPresenter::slotShowNote(
+        const QItemSelection& selected, const QItemSelection& deselected
+) {
     Q_UNUSED(deselected);
 
     QModelIndexList indices = selected.indexes();
diff --git a/app/src/qt/organizers_table_model.cpp b/app/src/qt/organizers_table_model.cpp
index 37735a13..4bf1cd86 100644
--- a/app/src/qt/organizers_table_model.cpp
+++ b/app/src/qt/organizers_table_model.cpp
@@ -23,7 +23,9 @@ namespace m8r {
 
 using namespace std;
 
-OrganizersTableModel::OrganizersTableModel(QObject* parent, HtmlOutlineRepresentation* htmlRepresentation)
+OrganizersTableModel::OrganizersTableModel(
+    QObject* parent, HtmlOutlineRepresentation* htmlRepresentation
+)
     : QStandardItemModel(parent), htmlRepresentation(htmlRepresentation)
 {
     setColumnCount(1);
diff --git a/app/src/qt/organizers_table_model.h b/app/src/qt/organizers_table_model.h
index a68585e0..fd150ebc 100644
--- a/app/src/qt/organizers_table_model.h
+++ b/app/src/qt/organizers_table_model.h
@@ -33,7 +33,9 @@ class OrganizersTableModel : public QStandardItemModel
 public:
     HtmlOutlineRepresentation* htmlRepresentation;
 
-    explicit OrganizersTableModel(QObject* parent, HtmlOutlineRepresentation* htmlRepresentation);
+    explicit OrganizersTableModel(
+        QObject* parent, HtmlOutlineRepresentation* htmlRepresentation
+    );
     OrganizersTableModel(const OrganizersTableModel&) = delete;
     OrganizersTableModel(const OrganizersTableModel&&) = delete;
     OrganizersTableModel &operator=(const OrganizersTableModel&) = delete;
diff --git a/app/src/qt/organizers_table_presenter.cpp b/app/src/qt/organizers_table_presenter.cpp
index afbd85c9..59ef0737 100644
--- a/app/src/qt/organizers_table_presenter.cpp
+++ b/app/src/qt/organizers_table_presenter.cpp
@@ -22,8 +22,9 @@ namespace m8r {
 
 using namespace std;
 
-OrganizersTablePresenter::OrganizersTablePresenter(OrganizersTableView* view, HtmlOutlineRepresentation* htmlRepresentation)
-{
+OrganizersTablePresenter::OrganizersTablePresenter(
+    OrganizersTableView* view, HtmlOutlineRepresentation* htmlRepresentation
+) {
     this->view = view;
     this->model = new OrganizersTableModel(this, htmlRepresentation);
     this->view->setModel(this->model);
diff --git a/app/src/qt/organizers_table_presenter.h b/app/src/qt/organizers_table_presenter.h
index aa40cd81..8982832e 100644
--- a/app/src/qt/organizers_table_presenter.h
+++ b/app/src/qt/organizers_table_presenter.h
@@ -41,7 +41,9 @@ class OrganizersTablePresenter : public QObject
     static const int NO_ROW = -1;
 
 public:
-    explicit OrganizersTablePresenter(OrganizersTableView* view, HtmlOutlineRepresentation* htmlRepresentation);
+    explicit OrganizersTablePresenter(
+        OrganizersTableView* view, HtmlOutlineRepresentation* htmlRepresentation
+    );
     OrganizersTablePresenter(const OrganizersTablePresenter&) = delete;
     OrganizersTablePresenter(const OrganizersTablePresenter&&) = delete;
     OrganizersTablePresenter &operator=(const OrganizersTablePresenter&) = delete;
diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
index 361255f1..c20bb7a1 100755
--- a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
+++ b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
@@ -56,10 +56,12 @@ export MF_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}" # semanti
 export RM_CMD="rm -vrf "
 export CP_CMD="cp -vrf "
 
+export OPT_VERBOSE="v"
+export OPT_DO_PUSH="false" # "true" to upload src to bazaar
+export OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+
 # shell variables
-OPT_VERBOSE="v"
-OPT_DO_PUSH="false" # "true" to upload src to bazaar
-OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+# ...
 
 # ########################################################################
 # # Helpers
diff --git a/lib/src/model/eisenhower_matrix.cpp b/lib/src/model/eisenhower_matrix.cpp
index 5331d87e..5cae4569 100644
--- a/lib/src/model/eisenhower_matrix.cpp
+++ b/lib/src/model/eisenhower_matrix.cpp
@@ -64,7 +64,9 @@ const string EisenhowerMatrix::getSortByAsStr() {
 }
 
 EisenhowerMatrix* EisenhowerMatrix::createEisenhowMatrixOrganizer() {
-    EisenhowerMatrix* eisenhowerMatrixOrganizer = new EisenhowerMatrix("Eisenhower Matrix");
+    EisenhowerMatrix* eisenhowerMatrixOrganizer = new EisenhowerMatrix(
+        "Eisenhower Matrix"
+    );
     eisenhowerMatrixOrganizer->setKey(EisenhowerMatrix::KEY_EISENHOWER_MATRIX);
 
     eisenhowerMatrixOrganizer->setUpperRightTag("important & urgent");
diff --git a/lib/src/model/eisenhower_matrix.h b/lib/src/model/eisenhower_matrix.h
index e9deaa81..c9370037 100644
--- a/lib/src/model/eisenhower_matrix.h
+++ b/lib/src/model/eisenhower_matrix.h
@@ -37,7 +37,8 @@ class EisenhowerMatrix : public Organizer
     static constexpr const auto CONFIG_VALUE_SORT_BY_I = "importance";
     static constexpr const auto CONFIG_VALUE_SORT_BY_U = "urgency";
 
-    static constexpr const auto KEY_EISENHOWER_MATRIX = "/m1ndf0rg3r/organizers/eisenhower-matrix";
+    static constexpr const auto KEY_EISENHOWER_MATRIX =
+        "/m1ndf0rg3r/organizers/eisenhower-matrix";
 
     static std::string createEisenhowerMatrixKey();
 
diff --git a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
index 5842de54..9d084d77 100644
--- a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
+++ b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
@@ -53,8 +53,9 @@ MarkdownRepositoryConfigurationRepresentation::~MarkdownRepositoryConfigurationR
  * as ROBUST as possible ~ handle eventual user typos and incorrect
  * formatting.
  */
-void MarkdownRepositoryConfigurationRepresentation::repositoryConfiguration(vector* ast, Configuration& c)
-{
+void MarkdownRepositoryConfigurationRepresentation::repositoryConfiguration(
+    vector* ast, Configuration& c
+) {
     c.getRepositoryConfiguration().clear();
 
     if(ast) {
@@ -239,7 +240,8 @@ Organizer* MarkdownRepositoryConfigurationRepresentation::repositoryConfiguratio
         }
         set::iterator it = keys.find(o->getKey());
         if(it != keys.end()) {
-            cerr << "Error: skipping '" << o->getName() << "' organizer as another organizer "
+            cerr << "Error: skipping '" << o->getName()
+                 << "' organizer as another organizer "
                  << "with key '" << o->getKey() << "' is already defined" << endl;
             delete o;
             return nullptr;

From 3fb6eb7cb48387e99a2833cec49f47150769d4bb Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Tue, 17 Jan 2023 08:11:08 +0100
Subject: [PATCH 026/131] Repository > Workspace; TOC w/o and w/ tags; control
 files hunspell dep which resolves #1461 resolves #1488 related #1453

---
 .../qt/translations/mindforger_cs.ts          | 1218 ++++++++--------
 .../qt/translations/mindforger_en.qm          |  Bin 3416 -> 2522 bytes
 .../qt/translations/mindforger_en.ts          | 1212 ++++++++--------
 .../qt/translations/mindforger_nerd_cs.ts     | 1220 +++++++++--------
 .../qt/translations/mindforger_nerd_en.ts     | 1220 +++++++++--------
 .../qt/translations/mindforger_zh_cn.qm       |  Bin 3409 -> 2515 bytes
 .../qt/translations/mindforger_zh_cn.ts       | 1212 ++++++++--------
 app/src/qt/dialogs/insert_image_dialog.cpp    |    2 +-
 app/src/qt/dialogs/insert_link_dialog.cpp     |    2 +-
 app/src/qt/dialogs/new_repository_dialog.cpp  |   49 +-
 app/src/qt/main_menu_presenter.cpp            |    4 +
 app/src/qt/main_menu_view.cpp                 |   50 +-
 app/src/qt/main_menu_view.h                   |    1 +
 app/src/qt/main_toolbar_view.cpp              |    2 +-
 app/src/qt/main_window_presenter.cpp          |   79 +-
 app/src/qt/mindforger.cpp                     |   12 +-
 build/debian/debian/control                   |    2 +-
 build/ubuntu/debian/control                   |    4 +-
 .../ubuntu-launchpad-releases-from-mind.sh    |   20 +-
 19 files changed, 3431 insertions(+), 2878 deletions(-)

diff --git a/app/resources/qt/translations/mindforger_cs.ts b/app/resources/qt/translations/mindforger_cs.ts
index 9578e0c6..007f5651 100644
--- a/app/resources/qt/translations/mindforger_cs.ts
+++ b/app/resources/qt/translations/mindforger_cs.ts
@@ -845,7 +845,7 @@
     
     
         
-        copy image to repository
+        copy image to workspace
         
     
     
@@ -908,7 +908,7 @@
     
     
         
-        copy link target to repository
+        copy link target to workspace
         
     
     
@@ -983,1545 +983,1623 @@
         
     
     
-        
-        MindForger &Repository
-        
-    
-    
-        
-        Create a brand new MindForger repository...
-        
-    
-    
-        
-        
+        
+        
         Markdown &File
         
     
     
-        
+        
         Create a brand new Markdown file...
         
     
     
-        
-        &Directory with Markdowns or MindForger Repository
-        
-    
-    
-        
-        Learn knowledge by loading a MindForger repository or a directory with Markdown files...
-        
-    
-    
-        
-        Learn knowledge by loading a Markdown or MindForger file...
-        
-    
-    
-        
+        
         &Remind
         
     
     
-        
-        Re-learn recently opened MindForger repositories, Markdown repositories or files
-        
-    
-    
-        
+        
         Re&member
         
     
     
-        
+        
         Persist all Things in Memory
         
     
     
-        
+        
         &Think
         
     
     
-        
+        
         S&cope
         
     
     
-        
+        
         Don't show Notebooks and Notes older than...
         
     
     
-        
-        
+        
+        
         &Forget
         
     
     
-        
+        
         Limbo vs erase memory...
         
     
     
-        
+        
         Retain
         
     
-    
-        
-        Create backup archive of the current repository and store it in home directory
-        
-    
     
         &Adapt
         &Preferences
     
     
-        
+        
         Adapt Mind by setting your preferences...
         
     
     
-        
+        
         E&xit
         
     
     
-        
+        
         Leave application
         
     
     
-        
+        
         &Full-text Search
         
     
     
-        
+        
         Note full-text search
         
     
     
-        
+        
         Recall Note&book by Name
         
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Recall &Note by Name
         
     
     
-        
+        
         Find Note by name
         
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
+        
         Recall Note by &Tags
         
     
     
-        
+        
         Find Note by tags
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         &Recall
         
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
+        Run simple command line from current MindForger workspace...
+        
+    
+    
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
+        N&avigate
+        
+    
+    
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
-        Run simple command line from current MindForger repository...
+        
+        Create backup archive of the current workspace and store it in home directory
         
     
     
-        
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         &Know
         
     
     
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
-        Na&vigate
-        
-    
-    
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         &Learn
         
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
     
-        
+        
         Think to suggest matching, similar and associated Notes while searching, reading and writing
         
     
     
-        
+        
         &Autolink
         
     
     
-        
+        
         Automatically inject links to relevant Notebooks and Notes when browsing HTML preview
         
     
     
-        
+        
         A&dapt
         
     
     
-        
+        
         &CSV
         
     
     
-        
+        
         Export all Notebooks/Markdown files as a single CSV file
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
     
-        
+        
+        
+        &Workspace
+        
+    
+    
+        
+        Create a brand new MindForger workspace...
+        
+    
+    
+        
+        Learn knowledge by loading a MindForger workspace...
+        
+    
+    
+        
+        &Directory with Markdowns
+        
+    
+    
+        
+        Learn knowledge by loading a directory with Markdown files...
+        
+    
+    
+        
+        Learn knowledge by loading a Markdown file...
+        
+    
+    
+        
+        Re-learn recently opened MindForger workspaces, Markdown directories or files
+        
+    
+    
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
-        Insert Notebook's table of contents
+        
+        Insert current date and time
         
     
     
-        
-        Insert current date and time
+        
+        Format text block as math (MathJax)
         
     
     
-        
-        Format text block as math (MathJax)
+        
+        With&out tags
         
     
     
-        
+        
+        Insert Notebook's table of contents without tags
+        
+    
+    
+        
+        &With tags
+        
+    
+    
+        
+        Insert Notebook's table of contents with tags
+        
+    
+    
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
+        &Tools
+        
+    
+    
+        
+        Open Wikipadia and find entry of the selected entity...
+        
+    
+    
+        
+        Open arXiv and find papers related to the selected entity...
+        
+    
+    
+        
+        &ChatGPT: Explain ... in simple terms.
+        
+    
+    
+        
+        Let ChatGPT to explain the selected entry...
+        
+    
+    
+        
+        &DuckDuckGo
+        
+    
+    
+        
+        Open DuckDuckGo and search web for the selected entity...
+        
+    
+    
+        
+        &Pandoc
+        
+    
+    
+        
+        Use Pandoc to convert MindForger's Markdown documents...
+        
+    
+    
+        
+        D&ocusaurus
+        
+    
+    
+        
+        Build your web with MindForger's Markdown documents and Docusaurus...
+        
+    
+    
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
@@ -2540,7 +2618,7 @@
     
     
         
-        Open a directory with Markdowns or MindForger repository
+        Open directory with Markdowns or Workspace
         
     
     
@@ -2587,79 +2665,47 @@
 
     m8r::MainWindowPresenter
     
-        
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
-        
-        New Repository Error
-        
-    
-    
-        
-        Specified repository path already exists!
-        
-    
-    
-        
-        Failed to create empty repository!
-        
-    
-    
-        
-        ERROR: repository created, but attempt to copy documentation and/or stencils failed
-        
-    
-    
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
-        Learn Directory or MindForger Repository
-        
-    
-    
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Learn
         
     
-    
-        
-        This is neither valid MindForger/Markdown repository nor file.
-        
-    
     
         
         Export Notebook to HTML
@@ -2672,54 +2718,54 @@
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
@@ -2729,489 +2775,525 @@
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         Home Notebook is not defined!
         
     
     
-        
+        
         image
         
     
     
-        
-        File copied to repository path '%1'
-        
-    
-    
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
+        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
+        Cannot think - either Mind already dreaming or workspace too big
+        
+    
+    
+        
+        
+        New Workspace Error
+        
+    
+    
+        
+        Specified workspace path already exists!
+        
+    
+    
+        
+        Failed to create empty workspace!
+        
+    
+    
+        
+        ERROR: workspace created, but attempt to copy documentation and/or stencils failed
+        
+    
+    
+        
+        Learn Directory or MindForger Workspace
+        
+    
+    
+        
+        This is neither valid MindForger/Markdown workspace nor file.
+        
+    
+    
+        
+        File copied to workspace path '%1'
+        
+    
+    
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
-        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3380,58 +3462,58 @@
 
     m8r::NewRepositoryDialog
     
-        
-        Repository name:
+        
+        Workspace name:
         
     
     
-        
-        Repository directory:
+        
+        Workspace directory:
         
     
     
-        
-        Repository to be created in:
+        
+        Workspace to be created in:
         
     
     
-        
+        
         Find Directory
         
     
     
-        
+        
         include stencils
         
     
     
-        
+        
         include documentation
         
     
     
-        
+        
         &New
         
     
     
-        
+        
         &Cancel
         
     
     
-        
-        Create New Repository
+        
+        Create New Workspace
         
     
     
-        
-        
-        mindforger-repository
+        
+        
+        mindforger-workspace
         
     
     
-        
+        
         Choose Directory
         
     
@@ -3825,7 +3907,7 @@
 
     m8r::OrganizersTableModel
     
-        
+        
         Organizers
         
     
@@ -4421,7 +4503,7 @@
     
     
         
-        MindForger repository or directory/file with Markdown(s) to open
+        MindForger workspace or directory/file with Markdown(s) to open
         
     
     
@@ -4476,12 +4558,12 @@
         
     
     
-        
-        Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: '
+        
+        Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/resources/qt/translations/mindforger_en.qm b/app/resources/qt/translations/mindforger_en.qm
index 9d6722c805d93ada88fafc07838eead0939d9b9f..18fcd04e6f90010bba4a4826dfd3163323f4eb8b 100644
GIT binary patch
delta 278
zcmca1bxXM3W=D#|srPfHo>i3DpRjQ6T_*+xh6fDV4lWD~j8hogSCjzx3=Ba#`WP74
zH!_~x^^Spo!=Gsrh|d_uVgr(AvS#gB{*Qry?Ihd1u+2bPmg`#Y6QHge+)_`r0_i4h
zgICQA49wl!(PzE_=?C21GkAddPjdIvJEQ;&VBo&_Ycc}^OD~U>T`7=X524wad2DP!
z4)WkNbxj32;5DyJ!X}^rLA>*)0WD(P&-;$Y2568ZU-D#rpuS^#8PSh{4yfZRKadSn
zAINw3B`eU}*ZkfN!9d!Mf4&4zo;5TR=!=`oK$ADiF$OVDmSnTsoWh>KGC7^+BLF9`
BOjrN_

delta 1084
zcmaKqPiPZS5XL8IlBV5F(xQi2i>}~7v<)6CDvc5)#`-5JQL0dota-1=l65z1R+e~K
zQ4z%IWmN`9O)=*3=CNKYPGQJlBiZbFSs*u2c_ym`NGzV~TW
zwcCtMk*>FMW4C5D^h{^&KmWWJzyq))p1}1c?0={O`=qCC0JO`VnP)Ws?yWI8zp6RV0#<6GR~;Y6YSiilAyjs#8)(
zQq^))6GkMNMx#+{k9Vzkp@FLT$r_$oM3xc~=r&Usc^p=zgJ7Q3WE8e&{%0z)k8qM0FA?f+LY^Jm12wiWT@b#NxkVa6|wZXw=
zmgqQKN0ws|MOpu|;@^Qt*tG<`P31OJn~M{2%9m#7&ck)}Seo|9wy~&-D!Pn1i&UXR
zNHrOPL`%JO&F*Y4&8B0|pcSu5=h+?BqrmFPtGql_zFAriBF#rGn

diff --git a/app/resources/qt/translations/mindforger_en.ts b/app/resources/qt/translations/mindforger_en.ts
index 517ca7a3..05149b18 100644
--- a/app/resources/qt/translations/mindforger_en.ts
+++ b/app/resources/qt/translations/mindforger_en.ts
@@ -853,7 +853,7 @@
     
     
         
-        copy image to repository
+        copy image to workspace
         
     
     
@@ -916,7 +916,7 @@
     
     
         
-        copy link target to repository
+        copy link target to workspace
         
     
     
@@ -991,143 +991,120 @@
         
     
     
-        
-        MindForger &Repository
-        
-    
-    
-        
-        Create a brand new MindForger repository...
-        
-    
-    
-        
-        
+        
+        
         Markdown &File
         
     
     
-        
+        
         Create a brand new Markdown file...
         
     
     
-        
-        &Directory with Markdowns or MindForger Repository
-        
-    
-    
-        
         Learn knowledge by loading a MindForger repository or a directory with Markdown files...
-        Open MindForger repository or a directory with Markdown files...
+        Open MindForger repository or a directory with Markdown files...
     
     
-        
         Learn knowledge by loading a Markdown or MindForger file...
-        Open a Markdown or MindForger file...
+        Open a Markdown or MindForger file...
     
     
-        
+        
         &Remind
         &Recent
     
     
-        
         Re-learn recently opened MindForger repositories, Markdown repositories or files
-        Reopen recently opened MindForger repositories, Markdown repositories or files
+        Reopen recently opened MindForger repositories, Markdown repositories or files
     
     
-        
+        
         Re&member
         &Save
     
     
-        
+        
         Persist all Things in Memory
         
     
     
-        
+        
         &Think
         
     
     
-        
+        
         S&cope
         
     
     
-        
+        
         Don't show Notebooks and Notes older than...
         
     
     
-        
-        
+        
+        
         &Forget
         &Deprecate
     
     
-        
+        
         Limbo vs erase memory...
         
     
     
-        
+        
         Retain
         Reta&in
     
-    
-        
-        Create backup archive of the current repository and store it in home directory
-        
-    
     
         &Adapt
         &Preferences
     
     
-        
+        
         Adapt Mind by setting your preferences...
         
     
     
-        
+        
         E&xit
         
     
     
-        
+        
         Leave application
         
     
     
-        
+        
         &Full-text Search
         
     
     
-        
+        
         Note full-text search
         
     
     
-        
+        
         Recall Note&book by Name
         Find Note&book by Name
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Recall &Note by Name
         Find &Note by Name
     
     
-        
+        
         Find Note by name
         
     
@@ -1136,1404 +1113,1517 @@
         Find Notebook by T&ags
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
+        
         Recall Note by &Tags
         Find Note by &Tags
     
     
-        
+        
         Find Note by tags
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         Find &Persons
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         Find &Locations
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         Find Organizations
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         Find Other Entities
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         &Recall
         F&ind
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
+        Run simple command line from current MindForger workspace...
+        
+    
+    
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
+        N&avigate
+        
+    
+    
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
-        Run simple command line from current MindForger repository...
+        
+        Create backup archive of the current workspace and store it in home directory
         
     
     
-        
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         &Know
         
     
     
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
-        Na&vigate
-        
-    
-    
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
-        Insert Notebook's table of contents
-        
-    
-    
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         Delete Notebook and move it Limbo
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         Delete	Del
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         &Learn
         &Open
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
     
-        
+        
         Think to suggest matching, similar and associated Notes while searching, reading and writing
         
     
     
-        
+        
         &Autolink
         
     
     
-        
+        
         Automatically inject links to relevant Notebooks and Notes when browsing HTML preview
         
     
     
-        
+        
         A&dapt
         &Preferences
     
     
-        
+        
         &CSV
         
     
     
-        
+        
         Export all Notebooks/Markdown files as a single CSV file
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         Find Notebook by Ta&gs
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         Save	Ctrl+S
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
     
-        
+        
+        
+        &Workspace
+        
+    
+    
+        
+        Create a brand new MindForger workspace...
+        
+    
+    
+        
+        Learn knowledge by loading a MindForger workspace...
+        
+    
+    
+        
+        &Directory with Markdowns
+        
+    
+    
+        
+        Learn knowledge by loading a directory with Markdown files...
+        
+    
+    
+        
+        Learn knowledge by loading a Markdown file...
+        
+    
+    
+        
+        Re-learn recently opened MindForger workspaces, Markdown directories or files
+        
+    
+    
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
+        With&out tags
+        
+    
+    
+        
+        Insert Notebook's table of contents without tags
+        
+    
+    
+        
+        &With tags
+        
+    
+    
+        
+        Insert Notebook's table of contents with tags
+        
+    
+    
+        
         Timestam&p
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
+        &Tools
+        
+    
+    
+        
+        Open Wikipadia and find entry of the selected entity...
+        
+    
+    
+        
+        Open arXiv and find papers related to the selected entity...
+        
+    
+    
+        
+        &ChatGPT: Explain ... in simple terms.
+        
+    
+    
+        
+        Let ChatGPT to explain the selected entry...
+        
+    
+    
+        
+        &DuckDuckGo
+        
+    
+    
+        
+        Open DuckDuckGo and search web for the selected entity...
+        
+    
+    
+        
+        &Pandoc
+        
+    
+    
+        
+        Use Pandoc to convert MindForger's Markdown documents...
+        
+    
+    
+        
+        D&ocusaurus
+        
+    
+    
+        
+        Build your web with MindForger's Markdown documents and Docusaurus...
+        
+    
+    
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
@@ -2552,7 +2642,7 @@
     
     
         
-        Open a directory with Markdowns or MindForger repository
+        Open directory with Markdowns or Workspace
         
     
     
@@ -2599,79 +2689,51 @@
 
     m8r::MainWindowPresenter
     
-        
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
-        
-        New Repository Error
-        
-    
-    
-        
-        Specified repository path already exists!
-        
-    
-    
-        
-        Failed to create empty repository!
-        
-    
-    
-        
-        ERROR: repository created, but attempt to copy documentation and/or stencils failed
-        
-    
-    
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
         Learn Directory or MindForger Repository
-        Open Directory or MindForger Repository
+        Open Directory or MindForger Repository
     
     
-        
+        
         Learn Markdown File
         Open Markdown File
     
     
-        
+        
         Learn
         Open
     
-    
-        
-        This is neither valid MindForger/Markdown repository nor file.
-        
-    
     
         
         Export Notebook to HTML
@@ -2684,54 +2746,54 @@
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
@@ -2741,489 +2803,525 @@
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         Home Notebook is not defined!
         
     
     
-        
+        
         image
         
     
     
-        
-        File copied to repository path '%1'
-        
-    
-    
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         Deprecate Notebook
     
     
-        
+        
+        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
+        Cannot think - either Mind already dreaming or workspace too big
+        
+    
+    
+        
+        
+        New Workspace Error
+        
+    
+    
+        
+        Specified workspace path already exists!
+        
+    
+    
+        
+        Failed to create empty workspace!
+        
+    
+    
+        
+        ERROR: workspace created, but attempt to copy documentation and/or stencils failed
+        
+    
+    
+        
+        Learn Directory or MindForger Workspace
+        
+    
+    
+        
+        This is neither valid MindForger/Markdown workspace nor file.
+        
+    
+    
+        
+        File copied to workspace path '%1'
+        
+    
+    
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         Please select a Note to forget.
         Please select a Note to delete.
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
-        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3392,58 +3490,58 @@
 
     m8r::NewRepositoryDialog
     
-        
-        Repository name:
+        
+        Workspace name:
         
     
     
-        
-        Repository directory:
+        
+        Workspace directory:
         
     
     
-        
-        Repository to be created in:
+        
+        Workspace to be created in:
         
     
     
-        
+        
         Find Directory
         
     
     
-        
+        
         include stencils
         
     
     
-        
+        
         include documentation
         
     
     
-        
+        
         &New
         
     
     
-        
+        
         &Cancel
         
     
     
-        
-        Create New Repository
+        
+        Create New Workspace
         
     
     
-        
-        
-        mindforger-repository
+        
+        
+        mindforger-workspace
         
     
     
-        
+        
         Choose Directory
         
     
@@ -3837,7 +3935,7 @@
 
     m8r::OrganizersTableModel
     
-        
+        
         Organizers
         
     
@@ -4433,7 +4531,7 @@
     
     
         
-        MindForger repository or directory/file with Markdown(s) to open
+        MindForger workspace or directory/file with Markdown(s) to open
         
     
     
@@ -4488,12 +4586,12 @@
         
     
     
-        
-        Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: '
+        
+        Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_cs.ts b/app/resources/qt/translations/mindforger_nerd_cs.ts
index 6675366a..21a4c355 100644
--- a/app/resources/qt/translations/mindforger_nerd_cs.ts
+++ b/app/resources/qt/translations/mindforger_nerd_cs.ts
@@ -853,7 +853,7 @@
     
     
         
-        copy image to repository
+        copy image to workspace
         
     
     
@@ -916,7 +916,7 @@
     
     
         
-        copy link target to repository
+        copy link target to workspace
         
     
     
@@ -986,35 +986,30 @@
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         &Nový
     
     
-        
-        Create a brand new MindForger repository...
-        
-    
-    
-        
+        
         &Learn
         Naučit
     
     
-        
+        
         Re&member
         
     
     
-        
+        
         &Recall
         
     
     
-        
+        
         &Think
         Mysli
     
@@ -1023,33 +1018,28 @@
         Spi
     
     
-        
-        
+        
+        
         &Forget
         Zapomeň
     
     
-        
+        
         Limbo vs erase memory...
         
     
     
-        
-        Create backup archive of the current repository and store it in home directory
-        
-    
-    
-        
+        
         Adapt Mind by setting your preferences...
         
     
     
-        
+        
         E&xit
         Konec
     
     
-        
+        
         Leave application
         
     
@@ -1059,32 +1049,32 @@
         &Mysl
     
     
-        
+        
         &Full-text Search
         
     
     
-        
+        
         Note full-text search
         
     
     
-        
+        
         Recall &Note by Name
         
     
     
-        
+        
         Find Note by name
         
     
     
-        
+        
         Recall Note by &Tags
         
     
     
-        
+        
         Find Note by tags
         
     
@@ -1093,1447 +1083,1535 @@
         Domů
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         Don't show Notebooks and Notes older than...
         
     
     
-        
-        Run simple command line from current MindForger repository...
+        
+        Create backup archive of the current workspace and store it in home directory
         
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         &Know
         
     
     
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
-        Na&vigate
-        
-    
-    
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
+        With&out tags
+        
+    
+    
+        
+        Insert Notebook's table of contents without tags
+        
+    
+    
+        
+        &With tags
+        
+    
+    
+        
+        Insert Notebook's table of contents with tags
+        
+    
+    
+        
+        &Tools
+        
+    
+    
+        
+        Open Wikipadia and find entry of the selected entity...
+        
+    
+    
+        
+        Open arXiv and find papers related to the selected entity...
+        
+    
+    
+        
+        &ChatGPT: Explain ... in simple terms.
+        
+    
+    
+        
+        Let ChatGPT to explain the selected entry...
+        
+    
+    
+        
+        &DuckDuckGo
+        
+    
+    
+        
+        Open DuckDuckGo and search web for the selected entity...
+        
+    
+    
+        
+        &Pandoc
+        
+    
+    
+        
+        Use Pandoc to convert MindForger's Markdown documents...
+        
+    
+    
+        
+        D&ocusaurus
+        
+    
+    
+        
+        Build your web with MindForger's Markdown documents and Docusaurus...
+        
+    
+    
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         &Formát
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Make &Home
         
     
     
-        
-        MindForger &Repository
-        
-    
-    
-        
-        
+        
+        
         Markdown &File
         
     
     
-        
+        
         Create a brand new Markdown file...
         
     
     
-        
-        &Directory with Markdowns or MindForger Repository
-        
-    
-    
-        
-        Learn knowledge by loading a MindForger repository or a directory with Markdown files...
-        
-    
-    
-        
-        Learn knowledge by loading a Markdown or MindForger file...
-        
-    
-    
-        
+        
         &Remind
         
     
     
-        
-        Re-learn recently opened MindForger repositories, Markdown repositories or files
-        
-    
-    
-        
+        
         Persist all Things in Memory
         
     
     
-        
+        
         S&cope
         
     
     
-        
+        
         Retain
         
     
     
-        
+        
         Recall Note&book by Name
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         E&xport
         E&xport
     
     
-        
+        
         &Import
         
     
     
-        
+        
         Think to suggest matching, similar and associated Notes while searching, reading and writing
         
     
     
-        
+        
         &Autolink
         
     
     
-        
+        
         Automatically inject links to relevant Notebooks and Notes when browsing HTML preview
         
     
     
-        
+        
         A&dapt
         
     
     
-        
+        
         &CSV
         
     
     
-        
+        
         Export all Notebooks/Markdown files as a single CSV file
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
     
-        
+        
+        
+        &Workspace
+        
+    
+    
+        
+        Create a brand new MindForger workspace...
+        
+    
+    
+        
+        Learn knowledge by loading a MindForger workspace...
+        
+    
+    
+        
+        &Directory with Markdowns
+        
+    
+    
+        
+        Learn knowledge by loading a directory with Markdown files...
+        
+    
+    
+        
+        Learn knowledge by loading a Markdown file...
+        
+    
+    
+        
+        Re-learn recently opened MindForger workspaces, Markdown directories or files
+        
+    
+    
+        
         Ter&minal
         
     
     
-        
+        
+        Run simple command line from current MindForger workspace...
+        
+    
+    
+        
+        N&avigate
+        
+    
+    
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
-        Insert Notebook's table of contents
-        
-    
-    
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         O aplikaci MindForger
     
     
-        
+        
         &Help
         
     
     
-        
+        
         F1
         
     
@@ -2552,7 +2630,7 @@
     
     
         
-        Open a directory with Markdowns or MindForger repository
+        Open directory with Markdowns or Workspace
         
     
     
@@ -2599,72 +2677,66 @@
 
     m8r::MainWindowPresenter
     
-        
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
+        
         Learn
         
     
     
-        
-        This is neither valid MindForger/Markdown repository nor file.
-        
-    
-    
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
@@ -2674,171 +2746,155 @@
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
-        
-        New Repository Error
-        
-    
-    
-        
-        Specified repository path already exists!
-        
-    
-    
-        
-        Failed to create empty repository!
-        
-    
-    
-        
-        ERROR: repository created, but attempt to copy documentation and/or stencils failed
-        
-    
-    
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
-        Learn Directory or MindForger Repository
-        
-    
-    
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
+        File copied to workspace path '%1'
+        
+    
+    
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
+        
+        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
@@ -2854,376 +2910,402 @@
         
     
     
-        
+        
+        Cannot think - either Mind already dreaming or workspace too big
+        
+    
+    
+        
+        
+        New Workspace Error
+        
+    
+    
+        
+        Specified workspace path already exists!
+        
+    
+    
+        
+        Failed to create empty workspace!
+        
+    
+    
+        
+        ERROR: workspace created, but attempt to copy documentation and/or stencils failed
+        
+    
+    
+        
+        Learn Directory or MindForger Workspace
+        
+    
+    
+        
+        This is neither valid MindForger/Markdown workspace nor file.
+        
+    
+    
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         Home Notebook is not defined!
         
     
     
-        
+        
         image
         
     
     
-        
-        File copied to repository path '%1'
-        
-    
-    
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
-        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3392,58 +3474,58 @@
 
     m8r::NewRepositoryDialog
     
-        
-        Repository name:
+        
+        Workspace name:
         
     
     
-        
-        Repository directory:
+        
+        Workspace directory:
         
     
     
-        
-        Repository to be created in:
+        
+        Workspace to be created in:
         
     
     
-        
+        
         Find Directory
         
     
     
-        
+        
         include stencils
         
     
     
-        
+        
         include documentation
         
     
     
-        
+        
         &New
         &Nový
     
     
-        
+        
         &Cancel
         
     
     
-        
-        Create New Repository
+        
+        Create New Workspace
         
     
     
-        
-        
-        mindforger-repository
+        
+        
+        mindforger-workspace
         
     
     
-        
+        
         Choose Directory
         
     
@@ -3837,7 +3919,7 @@
 
     m8r::OrganizersTableModel
     
-        
+        
         Organizers
         
     
@@ -4433,7 +4515,7 @@
     
     
         
-        MindForger repository or directory/file with Markdown(s) to open
+        MindForger workspace or directory/file with Markdown(s) to open
         
     
     
@@ -4488,12 +4570,12 @@
         
     
     
-        
-        Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: '
+        
+        Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_en.ts b/app/resources/qt/translations/mindforger_nerd_en.ts
index d7b77140..c18cf0ef 100644
--- a/app/resources/qt/translations/mindforger_nerd_en.ts
+++ b/app/resources/qt/translations/mindforger_nerd_en.ts
@@ -845,7 +845,7 @@
     
     
         
-        copy image to repository
+        copy image to workspace
         
     
     
@@ -908,7 +908,7 @@
     
     
         
-        copy link target to repository
+        copy link target to workspace
         
     
     
@@ -978,66 +978,56 @@
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
-        Create a brand new MindForger repository...
-        
-    
-    
-        
+        
         &Learn
         
     
     
-        
+        
         Re&member
         
     
     
-        
+        
         &Recall
         
     
     
-        
+        
         &Think
         
     
     
-        
-        
+        
+        
         &Forget
         
     
     
-        
+        
         Limbo vs erase memory...
         
     
     
-        
-        Create backup archive of the current repository and store it in home directory
-        
-    
-    
-        
+        
         Adapt Mind by setting your preferences...
         
     
     
-        
+        
         E&xit
         
     
     
-        
+        
         Leave application
         
     
@@ -1047,1477 +1037,1565 @@
         &Mind
     
     
-        
+        
         &Full-text Search
         
     
     
-        
+        
         Note full-text search
         
     
     
-        
+        
         Recall &Note by Name
         
     
     
-        
+        
         Find Note by name
         
     
     
-        
+        
         Recall Note by &Tags
         
     
     
-        
+        
         Find Note by tags
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         Don't show Notebooks and Notes older than...
         
     
     
-        
-        Run simple command line from current MindForger repository...
+        
+        Create backup archive of the current workspace and store it in home directory
         
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         &Know
         
     
     
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
-        Na&vigate
-        
-    
-    
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
+        With&out tags
+        
+    
+    
+        
+        Insert Notebook's table of contents without tags
+        
+    
+    
+        
+        &With tags
+        
+    
+    
+        
+        Insert Notebook's table of contents with tags
+        
+    
+    
+        
+        &Tools
+        
+    
+    
+        
+        Open Wikipadia and find entry of the selected entity...
+        
+    
+    
+        
+        Open arXiv and find papers related to the selected entity...
+        
+    
+    
+        
+        &ChatGPT: Explain ... in simple terms.
+        
+    
+    
+        
+        Let ChatGPT to explain the selected entry...
+        
+    
+    
+        
+        &DuckDuckGo
+        
+    
+    
+        
+        Open DuckDuckGo and search web for the selected entity...
+        
+    
+    
+        
+        &Pandoc
+        
+    
+    
+        
+        Use Pandoc to convert MindForger's Markdown documents...
+        
+    
+    
+        
+        D&ocusaurus
+        
+    
+    
+        
+        Build your web with MindForger's Markdown documents and Docusaurus...
+        
+    
+    
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Make &Home
         
     
     
-        
-        MindForger &Repository
-        
-    
-    
-        
-        
+        
+        
         Markdown &File
         
     
     
-        
+        
         Create a brand new Markdown file...
         
     
     
-        
-        &Directory with Markdowns or MindForger Repository
-        
-    
-    
-        
-        Learn knowledge by loading a MindForger repository or a directory with Markdown files...
-        
-    
-    
-        
-        Learn knowledge by loading a Markdown or MindForger file...
-        
-    
-    
-        
+        
         &Remind
         
     
     
-        
-        Re-learn recently opened MindForger repositories, Markdown repositories or files
-        
-    
-    
-        
+        
         Persist all Things in Memory
         
     
     
-        
+        
         S&cope
         
     
     
-        
+        
         Retain
         
     
     
-        
+        
         Recall Note&book by Name
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Import
         
     
     
-        
+        
         Think to suggest matching, similar and associated Notes while searching, reading and writing
         
     
     
-        
+        
         &Autolink
         
     
     
-        
+        
         Automatically inject links to relevant Notebooks and Notes when browsing HTML preview
         
     
     
-        
+        
         A&dapt
         
     
     
-        
+        
         &CSV
         
     
     
-        
+        
         Export all Notebooks/Markdown files as a single CSV file
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
     
-        
+        
+        
+        &Workspace
+        
+    
+    
+        
+        Create a brand new MindForger workspace...
+        
+    
+    
+        
+        Learn knowledge by loading a MindForger workspace...
+        
+    
+    
+        
+        &Directory with Markdowns
+        
+    
+    
+        
+        Learn knowledge by loading a directory with Markdown files...
+        
+    
+    
+        
+        Learn knowledge by loading a Markdown file...
+        
+    
+    
+        
+        Re-learn recently opened MindForger workspaces, Markdown directories or files
+        
+    
+    
+        
         Ter&minal
         
     
     
-        
+        
+        Run simple command line from current MindForger workspace...
+        
+    
+    
+        
+        N&avigate
+        
+    
+    
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
-        Insert Notebook's table of contents
-        
-    
-    
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
@@ -2536,7 +2614,7 @@
     
     
         
-        Open a directory with Markdowns or MindForger repository
+        Open directory with Markdowns or Workspace
         
     
     
@@ -2583,72 +2661,66 @@
 
     m8r::MainWindowPresenter
     
-        
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
+        
         Learn
         
     
     
-        
-        This is neither valid MindForger/Markdown repository nor file.
-        
-    
-    
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
@@ -2658,171 +2730,155 @@
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
-        
-        New Repository Error
-        
-    
-    
-        
-        Specified repository path already exists!
-        
-    
-    
-        
-        Failed to create empty repository!
-        
-    
-    
-        
-        ERROR: repository created, but attempt to copy documentation and/or stencils failed
-        
-    
-    
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
-        Learn Directory or MindForger Repository
-        
-    
-    
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
+        File copied to workspace path '%1'
+        
+    
+    
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
+        
+        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
@@ -2838,376 +2894,402 @@
         
     
     
-        
+        
+        Cannot think - either Mind already dreaming or workspace too big
+        
+    
+    
+        
+        
+        New Workspace Error
+        
+    
+    
+        
+        Specified workspace path already exists!
+        
+    
+    
+        
+        Failed to create empty workspace!
+        
+    
+    
+        
+        ERROR: workspace created, but attempt to copy documentation and/or stencils failed
+        
+    
+    
+        
+        Learn Directory or MindForger Workspace
+        
+    
+    
+        
+        This is neither valid MindForger/Markdown workspace nor file.
+        
+    
+    
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         Home Notebook is not defined!
         
     
     
-        
+        
         image
         
     
     
-        
-        File copied to repository path '%1'
-        
-    
-    
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
-        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3376,58 +3458,58 @@
 
     m8r::NewRepositoryDialog
     
-        
-        Repository name:
+        
+        Workspace name:
         
     
     
-        
-        Repository directory:
+        
+        Workspace directory:
         
     
     
-        
-        Repository to be created in:
+        
+        Workspace to be created in:
         
     
     
-        
+        
         Find Directory
         
     
     
-        
+        
         include stencils
         
     
     
-        
+        
         include documentation
         
     
     
-        
+        
         &New
         
     
     
-        
+        
         &Cancel
         
     
     
-        
-        Create New Repository
+        
+        Create New Workspace
         
     
     
-        
-        
-        mindforger-repository
+        
+        
+        mindforger-workspace
         
     
     
-        
+        
         Choose Directory
         
     
@@ -3821,7 +3903,7 @@
 
     m8r::OrganizersTableModel
     
-        
+        
         Organizers
         
     
@@ -4417,7 +4499,7 @@
     
     
         
-        MindForger repository or directory/file with Markdown(s) to open
+        MindForger workspace or directory/file with Markdown(s) to open
         
     
     
@@ -4472,12 +4554,12 @@
         
     
     
-        
-        Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: '
+        
+        Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/resources/qt/translations/mindforger_zh_cn.qm b/app/resources/qt/translations/mindforger_zh_cn.qm
index 57dcc9a1ec2a0a17c3bba5984342a3246235e2ba..c1abd06588388bc986dd3ea26a1b6092c4d81006 100644
GIT binary patch
delta 278
zcmca8by>LHW=D#|srPfHo>i3DpRjQ6T_*+xh6fDV4lWD~j8hogSCjzx3=Ba#`WP74
zH!_~x^^Spo!=Gsrh|d_uVgr(AvS#gB{*Qry?Ihd1u+2bPmg`#Y6QHge+)_`r0_i4h
zgICQA49wl!(PzE_=?C21GkAddPjdIvJEQ;&VBo&_Ycc}^OD~U>T`7=X524wad2DP!
z4)WkNbxj32;5DyJ!X}^rLA>*)0WD(P&-;$Y2568ZU-D#rpuS^#8PSh{4yfZRKadSn
zAINw3B`eU}*ZkfN!9d!Mf4&4zo;5TR=!=`oK$ADiF$OVDmSnTsoWh>KGC7^+6#y86
BOhW(w

delta 1084
zcmaKqO=uHQ5XUEJnx@@N(xQi2i>}~7v<)6CDvc5)#`+PJC{-v(*1Xqb$+{bMSC)8L
zQ4z%IWmNaOcAPn%;xoLprE#baB
z6oK}Ik(9h33TaU*64g`$RTI)3
zl0s6dmZzF9EXgz$i`l#UtF3c&RETg_>-pQ+I`~wT}h*tWn4ysOs6^
zVlzt&9Ih+NwTPmu|5@?xKqTy{Lr+7wb=B6wgxvDQ8G7^ZTs@MZy|QC0>Y|Dvqs|gl
zC=t>Ph9FVBr>5DP4W`+2oEfy>Rp~gr&3+JEIdM6V4OoZjTu(OeZ@HVuM!4iYc;p*g
a3zME9?B>;&GYiJ~wX)qCT5o?3efbO25)~W(

diff --git a/app/resources/qt/translations/mindforger_zh_cn.ts b/app/resources/qt/translations/mindforger_zh_cn.ts
index 1b280817..625f46e1 100644
--- a/app/resources/qt/translations/mindforger_zh_cn.ts
+++ b/app/resources/qt/translations/mindforger_zh_cn.ts
@@ -853,7 +853,7 @@
     
     
         
-        copy image to repository
+        copy image to workspace
         
     
     
@@ -916,7 +916,7 @@
     
     
         
-        copy link target to repository
+        copy link target to workspace
         
     
     
@@ -991,143 +991,120 @@
         
     
     
-        
-        MindForger &Repository
-        
-    
-    
-        
-        Create a brand new MindForger repository...
-        
-    
-    
-        
-        
+        
+        
         Markdown &File
         
     
     
-        
+        
         Create a brand new Markdown file...
         
     
     
-        
-        &Directory with Markdowns or MindForger Repository
-        
-    
-    
-        
         Learn knowledge by loading a MindForger repository or a directory with Markdown files...
-        Open MindForger repository or a directory with Markdown files...
+        Open MindForger repository or a directory with Markdown files...
     
     
-        
         Learn knowledge by loading a Markdown or MindForger file...
-        Open a Markdown or MindForger file...
+        Open a Markdown or MindForger file...
     
     
-        
+        
         &Remind
         &Recent
     
     
-        
         Re-learn recently opened MindForger repositories, Markdown repositories or files
-        Reopen recently opened MindForger repositories, Markdown repositories or files
+        Reopen recently opened MindForger repositories, Markdown repositories or files
     
     
-        
+        
         Re&member
         &Save
     
     
-        
+        
         Persist all Things in Memory
         
     
     
-        
+        
         &Think
         
     
     
-        
+        
         S&cope
         
     
     
-        
+        
         Don't show Notebooks and Notes older than...
         
     
     
-        
-        
+        
+        
         &Forget
         &Deprecate
     
     
-        
+        
         Limbo vs erase memory...
         
     
     
-        
+        
         Retain
         Reta&in
     
-    
-        
-        Create backup archive of the current repository and store it in home directory
-        
-    
     
         &Adapt
         &Preferences
     
     
-        
+        
         Adapt Mind by setting your preferences...
         
     
     
-        
+        
         E&xit
         
     
     
-        
+        
         Leave application
         
     
     
-        
+        
         &Full-text Search
         
     
     
-        
+        
         Note full-text search
         
     
     
-        
+        
         Recall Note&book by Name
         Find Note&book by Name
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Recall &Note by Name
         Find &Note by Name
     
     
-        
+        
         Find Note by name
         
     
@@ -1136,1404 +1113,1517 @@
         Find Notebook by T&ags
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
+        
         Recall Note by &Tags
         Find Note by &Tags
     
     
-        
+        
         Find Note by tags
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         Find &Persons
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         Find &Locations
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         Find Organizations
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         Find Other Entities
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         &Recall
         F&ind
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
+        Run simple command line from current MindForger workspace...
+        
+    
+    
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
+        N&avigate
+        
+    
+    
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
-        Run simple command line from current MindForger repository...
+        
+        Create backup archive of the current workspace and store it in home directory
         
     
     
-        
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         &Know
         
     
     
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
-        Na&vigate
-        
-    
-    
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
-        Insert Notebook's table of contents
-        
-    
-    
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         Delete Notebook and move it Limbo
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         Delete	Del
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         &Learn
         &Open
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
     
-        
+        
         Think to suggest matching, similar and associated Notes while searching, reading and writing
         
     
     
-        
+        
         &Autolink
         
     
     
-        
+        
         Automatically inject links to relevant Notebooks and Notes when browsing HTML preview
         
     
     
-        
+        
         A&dapt
         &Preferences
     
     
-        
+        
         &CSV
         
     
     
-        
+        
         Export all Notebooks/Markdown files as a single CSV file
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         Find Notebook by Ta&gs
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         Save	Ctrl+S
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
     
-        
+        
+        
+        &Workspace
+        
+    
+    
+        
+        Create a brand new MindForger workspace...
+        
+    
+    
+        
+        Learn knowledge by loading a MindForger workspace...
+        
+    
+    
+        
+        &Directory with Markdowns
+        
+    
+    
+        
+        Learn knowledge by loading a directory with Markdown files...
+        
+    
+    
+        
+        Learn knowledge by loading a Markdown file...
+        
+    
+    
+        
+        Re-learn recently opened MindForger workspaces, Markdown directories or files
+        
+    
+    
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
+        With&out tags
+        
+    
+    
+        
+        Insert Notebook's table of contents without tags
+        
+    
+    
+        
+        &With tags
+        
+    
+    
+        
+        Insert Notebook's table of contents with tags
+        
+    
+    
+        
         Timestam&p
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
+        &Tools
+        
+    
+    
+        
+        Open Wikipadia and find entry of the selected entity...
+        
+    
+    
+        
+        Open arXiv and find papers related to the selected entity...
+        
+    
+    
+        
+        &ChatGPT: Explain ... in simple terms.
+        
+    
+    
+        
+        Let ChatGPT to explain the selected entry...
+        
+    
+    
+        
+        &DuckDuckGo
+        
+    
+    
+        
+        Open DuckDuckGo and search web for the selected entity...
+        
+    
+    
+        
+        &Pandoc
+        
+    
+    
+        
+        Use Pandoc to convert MindForger's Markdown documents...
+        
+    
+    
+        
+        D&ocusaurus
+        
+    
+    
+        
+        Build your web with MindForger's Markdown documents and Docusaurus...
+        
+    
+    
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
@@ -2552,7 +2642,7 @@
     
     
         
-        Open a directory with Markdowns or MindForger repository
+        Open directory with Markdowns or Workspace
         
     
     
@@ -2599,79 +2689,51 @@
 
     m8r::MainWindowPresenter
     
-        
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
-        
-        New Repository Error
-        
-    
-    
-        
-        Specified repository path already exists!
-        
-    
-    
-        
-        Failed to create empty repository!
-        
-    
-    
-        
-        ERROR: repository created, but attempt to copy documentation and/or stencils failed
-        
-    
-    
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
         Learn Directory or MindForger Repository
-        Open Directory or MindForger Repository
+        Open Directory or MindForger Repository
     
     
-        
+        
         Learn Markdown File
         Open Markdown File
     
     
-        
+        
         Learn
         Open
     
-    
-        
-        This is neither valid MindForger/Markdown repository nor file.
-        
-    
     
         
         Export Notebook to HTML
@@ -2684,54 +2746,54 @@
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
@@ -2741,489 +2803,525 @@
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         Home Notebook is not defined!
         
     
     
-        
+        
         image
         
     
     
-        
-        File copied to repository path '%1'
-        
-    
-    
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         Deprecate Notebook
     
     
-        
+        
+        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
+        Cannot think - either Mind already dreaming or workspace too big
+        
+    
+    
+        
+        
+        New Workspace Error
+        
+    
+    
+        
+        Specified workspace path already exists!
+        
+    
+    
+        
+        Failed to create empty workspace!
+        
+    
+    
+        
+        ERROR: workspace created, but attempt to copy documentation and/or stencils failed
+        
+    
+    
+        
+        Learn Directory or MindForger Workspace
+        
+    
+    
+        
+        This is neither valid MindForger/Markdown workspace nor file.
+        
+    
+    
+        
+        File copied to workspace path '%1'
+        
+    
+    
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         Please select a Note to forget.
         Please select a Note to delete.
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Library already indexed - use update action to reindex documents.
         
     
     
-        
-        Unable to index documents on library path - either memory directory doesn't exist or not in MindForger repository mode.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3392,58 +3490,58 @@
 
     m8r::NewRepositoryDialog
     
-        
-        Repository name:
+        
+        Workspace name:
         
     
     
-        
-        Repository directory:
+        
+        Workspace directory:
         
     
     
-        
-        Repository to be created in:
+        
+        Workspace to be created in:
         
     
     
-        
+        
         Find Directory
         
     
     
-        
+        
         include stencils
         
     
     
-        
+        
         include documentation
         
     
     
-        
+        
         &New
         
     
     
-        
+        
         &Cancel
         
     
     
-        
-        Create New Repository
+        
+        Create New Workspace
         
     
     
-        
-        
-        mindforger-repository
+        
+        
+        mindforger-workspace
         
     
     
-        
+        
         Choose Directory
         
     
@@ -3837,7 +3935,7 @@
 
     m8r::OrganizersTableModel
     
-        
+        
         Organizers
         
     
@@ -4433,7 +4531,7 @@
     
     
         
-        MindForger repository or directory/file with Markdown(s) to open
+        MindForger workspace or directory/file with Markdown(s) to open
         
     
     
@@ -4488,12 +4586,12 @@
         
     
     
-        
-        Error: Unable to find given repository/file to open - open MindForger without parameters and create it from menu Mind/New: '
+        
+        Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/src/qt/dialogs/insert_image_dialog.cpp b/app/src/qt/dialogs/insert_image_dialog.cpp
index e3eec24e..124ea21d 100644
--- a/app/src/qt/dialogs/insert_image_dialog.cpp
+++ b/app/src/qt/dialogs/insert_image_dialog.cpp
@@ -30,7 +30,7 @@ InsertImageDialog::InsertImageDialog(QWidget* parent)
     pathEdit = new QLineEdit{};
 
     findFileButton = new QPushButton{tr("File")};
-    copyToRepoCheckBox = new QCheckBox{tr("copy image to repository")};
+    copyToRepoCheckBox = new QCheckBox{tr("copy image to workspace")};
     copyToRepoCheckBox->setChecked(true);
     copyToRepoCheckBox->setEnabled(true);
 
diff --git a/app/src/qt/dialogs/insert_link_dialog.cpp b/app/src/qt/dialogs/insert_link_dialog.cpp
index 5d13168f..f576e6d6 100644
--- a/app/src/qt/dialogs/insert_link_dialog.cpp
+++ b/app/src/qt/dialogs/insert_link_dialog.cpp
@@ -36,7 +36,7 @@ InsertLinkDialog::InsertLinkDialog(QWidget* parent)
     findFileButton = new QPushButton{tr("File")};
     findDirectoryButton = new QPushButton{tr("Directory")};
 
-    copyToRepoCheckBox = new QCheckBox{tr("copy link target to repository")};
+    copyToRepoCheckBox = new QCheckBox{tr("copy link target to workspace")};
     copyToRepoCheckBox->setChecked(true);
     copyToRepoCheckBox->setEnabled(true);
 
diff --git a/app/src/qt/dialogs/new_repository_dialog.cpp b/app/src/qt/dialogs/new_repository_dialog.cpp
index d46c6c8e..559fca09 100644
--- a/app/src/qt/dialogs/new_repository_dialog.cpp
+++ b/app/src/qt/dialogs/new_repository_dialog.cpp
@@ -23,14 +23,16 @@ namespace m8r {
 NewRepositoryDialog::NewRepositoryDialog(QWidget* parent)
     : QDialog(parent)
 {
-    homeDirectory = QStandardPaths::locate(QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory);
+    homeDirectory = QStandardPaths::locate(
+        QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory
+    );
 
     // widgets
-    repositoryNameLabel = new QLabel{tr("Repository name:")};
+    repositoryNameLabel = new QLabel{tr("Workspace name:")};
     repositoryNameEdit = new QLineEdit{};
-    dirLabel = new QLabel{tr("Repository directory:")};
+    dirLabel = new QLabel{tr("Workspace directory:")};
     dirEdit = new QLineEdit{};
-    pathLabel = new QLabel{tr("Repository to be created in:")};
+    pathLabel = new QLabel{tr("Workspace to be created in:")};
     pathEdit = new QLineEdit{};
     pathEdit->setEnabled(false);
 
@@ -45,11 +47,26 @@ NewRepositoryDialog::NewRepositoryDialog(QWidget* parent)
     closeButton = new QPushButton{tr("&Cancel")};
 
     // signals
-    QObject::connect(repositoryNameEdit, SIGNAL(textChanged(const QString&)), this, SLOT(refreshPath()));
-    QObject::connect(dirEdit, SIGNAL(textChanged(const QString&)), this, SLOT(refreshPath()));
-    QObject::connect(findDirectoryButton, SIGNAL(clicked()), this, SLOT(handleFindDirectory()));
-    QObject::connect(newButton, SIGNAL(clicked()), this, SLOT(close()));
-    QObject::connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
+    QObject::connect(
+        repositoryNameEdit, SIGNAL(textChanged(const QString&)),
+        this, SLOT(refreshPath())
+    );
+    QObject::connect(
+        dirEdit, SIGNAL(textChanged(const QString&)),
+        this, SLOT(refreshPath())
+    );
+    QObject::connect(
+        findDirectoryButton, SIGNAL(clicked()),
+        this, SLOT(handleFindDirectory())
+    );
+    QObject::connect(
+        newButton, SIGNAL(clicked()),
+        this, SLOT(close())
+    );
+    QObject::connect(
+        closeButton, SIGNAL(clicked()),
+        this, SLOT(close())
+    );
 
     // assembly
     QVBoxLayout* mainLayout = new QVBoxLayout{};
@@ -76,7 +93,7 @@ NewRepositoryDialog::NewRepositoryDialog(QWidget* parent)
     setLayout(mainLayout);
 
     // dialog
-    setWindowTitle(tr("Create New Repository"));
+    setWindowTitle(tr("Create New Workspace"));
     resize(fontMetrics().averageCharWidth()*60, height());
     setModal(true);
 }
@@ -87,7 +104,7 @@ NewRepositoryDialog::~NewRepositoryDialog()
 
 void NewRepositoryDialog::show()
 {
-    repositoryNameEdit->setText(tr("mindforger-repository"));
+    repositoryNameEdit->setText(tr("mindforger-workspace"));
     repositoryNameEdit->selectAll();
     repositoryNameEdit->setFocus();
     dirEdit->setText(homeDirectory);
@@ -105,7 +122,9 @@ void NewRepositoryDialog::refreshPath()
     // dir
     QString directory{dirEdit->text()};
     if(directory.isEmpty()) {
-        directory = QStandardPaths::locate(QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory);
+        directory = QStandardPaths::locate(
+            QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory
+        );
     }
     if(!directory.endsWith(FILE_PATH_SEPARATOR)) {
         directory.append(FILE_PATH_SEPARATOR);
@@ -113,7 +132,7 @@ void NewRepositoryDialog::refreshPath()
     // name
     QString name{repositoryNameEdit->text()};
     if(name.isEmpty()) {
-        name = tr("mindforger-repository");
+        name = tr("mindforger-workspace");
     } else {
         name = QString::fromStdString(normalizeToNcName(name.toStdString(),'-'));
     }
@@ -126,7 +145,9 @@ void NewRepositoryDialog::refreshPath()
 void NewRepositoryDialog::handleFindDirectory()
 {
     QString homeDirectory
-        = QStandardPaths::locate(QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory);
+        = QStandardPaths::locate(
+            QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory
+        );
 
     QFileDialog fileDialog{this};
     fileDialog.setWindowTitle(tr("Choose Directory"));
diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp
index 02a2ce7e..c5fc3156 100644
--- a/app/src/qt/main_menu_presenter.cpp
+++ b/app/src/qt/main_menu_presenter.cpp
@@ -43,6 +43,10 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
         view->actionMindAutolink, SIGNAL(triggered()),
         mwp, SLOT(doActionMindToggleAutolink())
     );
+    QObject::connect(
+        view->actionMindLearnDirectory, SIGNAL(triggered()),
+        mwp, SLOT(doActionMindLearnRepository())
+    );
     QObject::connect(
         view->actionMindLearnRepository, SIGNAL(triggered()),
         mwp, SLOT(doActionMindLearnRepository())
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index 887cfd8f..cd9d6900 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -36,27 +36,46 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionMindHack->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_Z));
 #endif
 
-    // new/devise... new MD repository
+    // new/devise... new Workspaces (MD repository)
     submenuMindNew = menuMind->addMenu(QIcon(":/menu-icons/new.svg"), "&New");
-    actionMindNewRepository = new QAction(tr("MindForger &Repository"), mainWindow);
-    actionMindNewRepository->setStatusTip(tr("Create a brand new MindForger repository..."));
+    actionMindNewRepository = new QAction(tr("&Workspace"), mainWindow);
+    actionMindNewRepository->setStatusTip(
+        tr("Create a brand new MindForger workspace...")
+    );
     submenuMindNew->addAction(actionMindNewRepository);
     actionMindNewFile = new QAction(tr("Markdown &File"), mainWindow);
     actionMindNewFile->setStatusTip(tr("Create a brand new Markdown file..."));
     submenuMindNew->addAction(actionMindNewFile);
 
-    // learn... from a repository, Markdown or TXT file
+    // learn... from a workspace, Markdown or TXT file
     submenuMindLearn = menuMind->addMenu(QIcon(":/menu-icons/open.svg"), tr("&Learn"));
-    actionMindLearnRepository = new QAction(tr("&Directory with Markdowns or MindForger Repository"), mainWindow);
-    actionMindLearnRepository->setStatusTip(tr("Learn knowledge by loading a MindForger repository or a directory with Markdown files..."));
+    actionMindLearnRepository = new QAction(
+        tr("&Workspace"), mainWindow
+    );
+    actionMindLearnRepository->setStatusTip(
+        tr("Learn knowledge by loading a MindForger workspace...")
+    );
     submenuMindLearn->addAction(actionMindLearnRepository);
+    actionMindLearnDirectory = new QAction(
+        tr("&Directory with Markdowns"), mainWindow
+    );
+    actionMindLearnDirectory->setStatusTip(
+        tr("Learn knowledge by loading a directory with Markdown files...")
+    );
+    submenuMindLearn->addAction(actionMindLearnDirectory);
     actionMindLearnFile = new QAction(tr("Markdown &File"), mainWindow);
-    actionMindLearnFile->setStatusTip(tr("Learn knowledge by loading a Markdown or MindForger file..."));
+    actionMindLearnFile->setStatusTip(
+        tr("Learn knowledge by loading a Markdown file...")
+    );
     submenuMindLearn->addAction(actionMindLearnFile);
 
     // re-learn/remind ... recent repositories and files
     submenuMindRelearn = new RecentFilesMenu(tr("&Remind"), mainWindow);
-    submenuMindRelearn->setStatusTip(tr("Re-learn recently opened MindForger repositories, Markdown repositories or files"));
+    submenuMindRelearn->setStatusTip(
+        tr(
+            "Re-learn recently opened MindForger workspaces, "
+            "Markdown directories or files")
+        );
     submenuMindRelearn->setEnabled(false);
 
     // remember... by flushing caches, saving unsaved Ns, saving Os/Ns with changed read metadata, ...
@@ -99,7 +118,12 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     //actionMindDream->setStatusTip(tr("Tidy up, clean, re-infer, check and optimize Memory which is otherwise done on your inactivity"));
 
     actionMindSnapshot = new QAction(QIcon(":/menu-icons/pin.svg"), tr("Retain"), mainWindow);
-    actionMindSnapshot->setStatusTip(tr("Create backup archive of the current repository and store it in home directory"));
+    actionMindSnapshot->setStatusTip(
+        tr(
+            "Create backup archive of the current workspace and "
+            "store it in home directory"
+        )
+    );
     actionMindSnapshot->setEnabled(false);
 
     // TODO submenu: printer, HTML, PDF
@@ -244,8 +268,12 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionViewCli->setShortcut(QKeySequence(Qt::ALT+Qt::Key_X));
     actionViewCli->setStatusTip(tr("Activate command line interface..."));
 
-    actionViewTerminal = new QAction(QIcon(":/menu-icons/terminal.svg"), tr("Ter&minal"), mainWindow);
-    actionViewTerminal->setStatusTip(tr("Run simple command line from current MindForger repository..."));
+    actionViewTerminal = new QAction(
+        QIcon(":/menu-icons/terminal.svg"), tr("Ter&minal"), mainWindow
+    );
+    actionViewTerminal->setStatusTip(
+        tr("Run simple command line from current MindForger workspace...")
+    );
 
     actionViewRecentNotes = new QAction(
         QIcon(":/menu-icons/open-recent.svg"),
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index 9d1513ad..0544e298 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -74,6 +74,7 @@ class MainMenuView : public QObject
     QAction* actionMindNewRepository;
     QAction* actionMindNewFile;
     QMenu* submenuMindLearn;
+    QAction* actionMindLearnDirectory;
     QAction* actionMindLearnRepository;
     QAction* actionMindLearnFile;
     RecentFilesMenu* submenuMindRelearn;
diff --git a/app/src/qt/main_toolbar_view.cpp b/app/src/qt/main_toolbar_view.cpp
index 0ebb2130..bb1f4fff 100644
--- a/app/src/qt/main_toolbar_view.cpp
+++ b/app/src/qt/main_toolbar_view.cpp
@@ -43,7 +43,7 @@ MainToolbarView::MainToolbarView(MainWindowView* mainWindowView)
 
     actionOpenRepository = addAction(
         QIcon(":/icons/open-repository.svg"),
-        tr("Open a directory with Markdowns or MindForger repository"));
+        tr("Open directory with Markdowns or Workspace"));
     actionOpenFile = addAction(
         QIcon(":/icons/open-file.svg"),
         tr("Open Markdown file"));
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index 36779f27..b03d9131 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -133,8 +133,14 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
         this, SLOT(doActionEditPasteImageData(QImage))
     );
     // wire toolbar signals
-    QObject::connect(view.getToolBar()->actionNewOutlineOrNote, SIGNAL(triggered()), this, SLOT(doActionOutlineOrNoteNew()));
-    QObject::connect(view.getToolBar()->actionOpenRepository, SIGNAL(triggered()), this, SLOT(doActionMindLearnRepository()));
+    QObject::connect(
+        view.getToolBar()->actionNewOutlineOrNote, SIGNAL(triggered()),
+        this, SLOT(doActionOutlineOrNoteNew())
+    );
+    QObject::connect(
+        view.getToolBar()->actionOpenRepository, SIGNAL(triggered()),
+        this, SLOT(doActionMindLearnRepository())
+    );
     QObject::connect(view.getToolBar()->actionOpenFile, SIGNAL(triggered()), this, SLOT(doActionMindLearnFile()));
 #ifdef MF_DEPRECATED
     QObject::connect(view.getToolBar()->actionViewDashboard, SIGNAL(triggered()), this, SLOT(doActionViewDashboard()));
@@ -279,12 +285,18 @@ void MainWindowPresenter::showInitialView()
         orloj->showFacetOutlineList(mind->getOutlines());
     }
 
-    view.setFileOrDirectory(QString::fromStdString(config.getActiveRepository()->getPath()));
+    view.setFileOrDirectory(
+        QString::fromStdString(config.getActiveRepository()->getPath())
+    );
 
     // config > menu
     mainMenu->showFacetMindAutolink(config.isAutolinking());
     mainMenu->showFacetLiveNotePreview(config.isUiLiveNotePreview());
-    orloj->setAspect(config.isUiLiveNotePreview()?OrlojPresenterFacetAspect::ASPECT_LIVE_PREVIEW:OrlojPresenterFacetAspect::ASPECT_NONE);
+    orloj->setAspect(
+        config.isUiLiveNotePreview()
+        ?OrlojPresenterFacetAspect::ASPECT_LIVE_PREVIEW
+        :OrlojPresenterFacetAspect::ASPECT_NONE
+    );
 
     // move Mind to configured state
     if(config.getDesiredMindState()==Configuration::MindState::THINKING) {
@@ -293,7 +305,12 @@ void MainWindowPresenter::showInitialView()
         if(f.wait_for(chrono::microseconds(0)) == future_status::ready) {
             if(!f.get()) {
                 mainMenu->showFacetMindSleep();
-                statusBar->showError(tr("Cannot think - either Mind already dreaming or repository too big"));
+                statusBar->showError(
+                    tr(
+                        "Cannot think - either Mind already dreaming or "
+                        "workspace too big"
+                    )
+                );
             }
             statusBar->showMindStatistics();
         } else {
@@ -479,14 +496,26 @@ void MainWindowPresenter::doActionMindNewRepository()
 void MainWindowPresenter::handleMindNewRepository()
 {
     // if directory exists, then fail
-    if(isDirectoryOrFileExists(newRepositoryDialog->getRepositoryPath().toStdString().c_str())) {
-        QMessageBox::critical(&view, tr("New Repository Error"), tr("Specified repository path already exists!"));
+    if(isDirectoryOrFileExists(
+        newRepositoryDialog->getRepositoryPath().toStdString().c_str())
+    ) {
+        QMessageBox::critical(
+            &view,
+            tr("New Workspace Error"),
+            tr("Specified workspace path already exists!")
+        );
         return;
     }
 
     // create repository
-    if(!config.getInstaller()->createEmptyMindForgerRepository(newRepositoryDialog->getRepositoryPath().toStdString())) {
-        QMessageBox::critical(&view, tr("New Repository Error"), tr("Failed to create empty repository!"));
+    if(!config.getInstaller()->createEmptyMindForgerRepository(
+        newRepositoryDialog->getRepositoryPath().toStdString())
+    ) {
+        QMessageBox::critical(
+            &view,
+            tr("New Workspace Error"),
+            tr("Failed to create empty workspace!")
+        );
         return;
     }
 
@@ -496,7 +525,12 @@ void MainWindowPresenter::handleMindNewRepository()
         newRepositoryDialog->isCopyStencils(),
         newRepositoryDialog->getRepositoryPath().toStdString().c_str()
     )) {
-        statusBar->showError(tr("ERROR: repository created, but attempt to copy documentation and/or stencils failed"));
+        statusBar->showError(
+            tr(
+                "ERROR: workspace created, but attempt to copy documentation "
+                "and/or stencils failed"
+            )
+        );
     }
 
     // open new repository
@@ -648,13 +682,18 @@ void MainWindowPresenter::doActionToggleLiveNotePreview()
 void MainWindowPresenter::doActionMindLearnRepository()
 {
     QString homeDirectory
-        = QStandardPaths::locate(QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory);
+        = QStandardPaths::locate(
+            QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory
+        );
 
     QFileDialog learnDialog{&view};
-    learnDialog.setWindowTitle(tr("Learn Directory or MindForger Repository"));
-    // learnDialog.setFileMode(QFileDialog::Directory|QFileDialog::ExistingFiles); not supported, therefore
+    learnDialog.setWindowTitle(tr("Learn Directory or MindForger Workspace"));
+    // learnDialog.setFileMode(QFileDialog::Directory|QFileDialog::ExistingFiles);
+    //   not supported, therefore
+    // >
+    // ASK user: directory/repository or file (choice)
     // >
-    // ASK user: directory/repository or file (choice) > open dialog configured as required
+    // open dialog configured as required
     learnDialog.setFileMode(QFileDialog::Directory);
     learnDialog.setDirectory(homeDirectory);
     learnDialog.setViewMode(QFileDialog::Detail);
@@ -706,7 +745,7 @@ void MainWindowPresenter::doActionMindRelearn(QString path)
         QMessageBox::critical(
             &view,
             tr("Learn"),
-            tr("This is neither valid MindForger/Markdown repository nor file."));
+            tr("This is neither valid MindForger/Markdown workspace nor file."));
     }
 }
 
@@ -1769,7 +1808,9 @@ void MainWindowPresenter::copyLinkOrImageToRepository(const string& srcPath, QSt
         pathToDirectoryAndFile(path.toStdString(), d, f);
         path = QString::fromStdString(f);
 
-        statusBar->showInfo(tr("File copied to repository path '%1'").arg(path.toStdString().c_str()));
+        statusBar->showInfo(
+            tr("File copied to workspace path '%1'").arg(path.toStdString().c_str())
+        );
     } else {
         // fallback: create link, but don't copy
         path = insertLinkDialog->getPathText();
@@ -2914,7 +2955,7 @@ void MainWindowPresenter::handleNewLibrary()
             &view,
             tr("Add Library Error"),
             tr("Unable to index documents on library path - either memory directory "
-               "doesn't exist or not in MindForger repository mode."
+               "doesn't exist or not in MindForger workspace mode."
             )
         );
         return;
@@ -3282,9 +3323,7 @@ void MainWindowPresenter::doActionToolsChatGpt()
 
 void MainWindowPresenter::doActionHelpDocumentation()
 {
-    QDesktopServices::openUrl(
-        QUrl{"https://github.com/dvorka/mindforger-repository/blob/master/memory/mindforger/index.md"}
-    );
+    QDesktopServices::openUrl(QUrl{"https://github.com/dvorka/mindforger/wiki"});
 }
 
 void MainWindowPresenter::doActionHelpWeb()
diff --git a/app/src/qt/mindforger.cpp b/app/src/qt/mindforger.cpp
index e42ad6fb..0c301430 100644
--- a/app/src/qt/mindforger.cpp
+++ b/app/src/qt/mindforger.cpp
@@ -257,7 +257,7 @@ int main(int argc, char* argv[])
             "[|]",
             QCoreApplication::translate(
                  "main",
-                 "MindForger repository or directory/file with Markdown(s) to open"
+                 "MindForger workspace or directory/file with Markdown(s) to open"
             )
         );
         QCommandLineOption themeOption(QStringList() << "t" << "theme",
@@ -367,7 +367,9 @@ int main(int argc, char* argv[])
 
     m8r::MarkdownRepositoryConfigurationRepresentation mdRepositoryCfgRepresentation{};
     if(!useRepository.empty()) {
-        m8r::Repository* r = m8r::RepositoryIndexer::getRepositoryForPath(useRepository);
+        m8r::Repository* r = m8r::RepositoryIndexer::getRepositoryForPath(
+            useRepository
+        );
         if(r) {
             config.setActiveRepository(
                 config.addRepository(r), mdRepositoryCfgRepresentation
@@ -375,11 +377,13 @@ int main(int argc, char* argv[])
         } else {
             if(config.createEmptyMarkdownFile(useRepository)) {
                 r = m8r::RepositoryIndexer::getRepositoryForPath(useRepository);
-                config.setActiveRepository(config.addRepository(r), mdRepositoryCfgRepresentation);
+                config.setActiveRepository(
+                    config.addRepository(r), mdRepositoryCfgRepresentation
+                );
             } else {
                 cerr << QCoreApplication::translate(
                             "main",
-                            "Error: Unable to find given repository/file "
+                            "Error: Unable to find given workspace/file "
                             "to open - open MindForger without parameters "
                             "and create it from menu Mind/New: '"
                         ).toUtf8().constData()
diff --git a/build/debian/debian/control b/build/debian/debian/control
index a005a403..4fb01a25 100644
--- a/build/debian/debian/control
+++ b/build/debian/debian/control
@@ -13,5 +13,5 @@ Architecture: any
 Depends: ${shlibs:Depends}, ${misc:Depends}
 Description: Thinking notebook and Markdown IDE.
  Search, browse, view and edit your Markdown files. Get as much
- as possible from knowledge in your remarks.
+ as possible from the knowledge in your remarks.
 Tag: implemented-in::c++, interface::graphical, role::program
\ No newline at end of file
diff --git a/build/ubuntu/debian/control b/build/ubuntu/debian/control
index e4d0780e..6a7ce1cc 100644
--- a/build/ubuntu/debian/control
+++ b/build/ubuntu/debian/control
@@ -2,7 +2,7 @@ Source: mindforger
 Section: utils
 Priority: optional
 Maintainer: Martin Dvorak 
-Build-Depends: debhelper (>= 8.0.0), build-essential, ccache, qt5-qmake, zlib1g-dev, libhunspell-dev, qtbase5-dev, libqt5webkit5-dev
+Build-Depends: debhelper (>= 8.0.0), build-essential, ccache, qt5-qmake, zlib1g-dev, libhunspell-dev (>=1.6), qtbase5-dev, libqt5webkit5-dev
 Standards-Version: 3.9.5
 Homepage: https://github.com/dvorka/mindforger
 Vcs-Git: https://github.com/dvorka/mindforger.git
@@ -13,5 +13,5 @@ Architecture: any
 Depends: ${shlibs:Depends}, ${misc:Depends}
 Description: Thinking notebook and Markdown IDE.
  Search, browse, view and edit your Markdown files. Get as much
- as possible from knowledge in your remarks.
+ as possible from the knowledge in your remarks.
 Tag: implemented-in::c++, interface::graphical, role::program
\ No newline at end of file
diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
index c20bb7a1..9f14fee9 100755
--- a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
+++ b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
@@ -46,7 +46,13 @@
 #     (trusty) xenial bionic (cosmic disco eoan) focal (groovy) (hirsute) (impish) jammy kinetic
 # - command (Bash tuple of distro names):
 #     trusty xenial bionic focal jammy kinetic
-UBUNTU_VERSIONS=(focal)
+
+if [[ ${#} == 1 ]]
+then
+    export UBUNTU_VERSIONS=(${1})
+else
+    export UBUNTU_VERSIONS=(focal)
+fi
 
 # environment variables
 export MAJOR_VERSION=1
@@ -57,8 +63,16 @@ export RM_CMD="rm -vrf "
 export CP_CMD="cp -vrf "
 
 export OPT_VERBOSE="v"
-export OPT_DO_PUSH="false" # "true" to upload src to bazaar
-export OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+if [[ ${#} == 1 ]]
+then
+    export OPT_DO_PUSH="false" # "true" to upload src to bazaar
+    export OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+else
+    export OPT_DO_PUSH="false" # "true" to upload src to bazaar
+    export OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+    #export OPT_DO_PUSH="true" # "true" to upload src to bazaar
+    #export OPT_DO_RELEASE="true" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+fi
 
 # shell variables
 # ...

From fe3c672f6c56a8cd77c8f8b71641c8c4f3093871 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Tue, 17 Jan 2023 08:50:26 +0100
Subject: [PATCH 027/131] 1.55.0 release getting ready.

---
 Changelog | 5 +++--
 doc       | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/Changelog b/Changelog
index 21921ff5..61742d08 100644
--- a/Changelog
+++ b/Changelog
@@ -1,8 +1,9 @@
-2023-??-??  Martin Dvorak  
+2023-01-17  Martin Dvorak  
 
     * Released v1.55.0 - delete of a Note in the outline view keeps selected
       an adjacent Note, improved page up/page down navigation in table widgets,
-      Tools menu, charset added to HTML head.
+      Tools menu, charset added to HTML head, new Note templates, from Registry
+      to Workspace in UI (source code kept intact).
 
 2022-03-07  Martin Dvorak  
 
diff --git a/doc b/doc
index a10be29b..ec81a27e 160000
--- a/doc
+++ b/doc
@@ -1 +1 @@
-Subproject commit a10be29b243f8cc4f147230e4b34cfbba3168778
+Subproject commit ec81a27e5de6408bbcd3f6d7733a7c6f3b52e433

From 4d2f292f914df80368a01566e69b05e9830179cc Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Tue, 17 Jan 2023 08:53:27 +0100
Subject: [PATCH 028/131] Updating doc.

---
 doc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc b/doc
index ec81a27e..a10be29b 160000
--- a/doc
+++ b/doc
@@ -1 +1 @@
-Subproject commit ec81a27e5de6408bbcd3f6d7733a7c6f3b52e433
+Subproject commit a10be29b243f8cc4f147230e4b34cfbba3168778

From 91935680ea0616c6c91258a1c074e5e33acd89d7 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Tue, 17 Jan 2023 13:04:11 +0100
Subject: [PATCH 029/131] Adding make version find target.

---
 build/Makefile | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/build/Makefile b/build/Makefile
index 266d2dfa..14783e87 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -101,6 +101,10 @@ l10n:
 	cd make && ./l10n-update-strings.sh && ./l10n-edit-and-release.sh $(MF_LANG)
 
 
+.PHONY: ver-find
+ver-find:
+	cd .. && git grep "1\.55"
+
 test-lib: clean
 	cd make && ./test-lib-units.sh
 

From 3fcd4579bdbf8bd0ac11565c6109a7cb030623ff Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Tue, 17 Jan 2023 22:52:15 +0100
Subject: [PATCH 030/131] Fixing release script.

---
 .../ubuntu/ubuntu-launchpad-releases-from-mind.sh  | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
index 9f14fee9..049db7b9 100755
--- a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
+++ b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
@@ -57,7 +57,7 @@ fi
 # environment variables
 export MAJOR_VERSION=1
 export MINOR_VERSION=55
-export PATCH_VERSION=1 # patch version is incremented for every Ubuntu build @ Launchpad
+export PATCH_VERSION=2 # patch version is incremented for every Ubuntu build @ Launchpad
 export MF_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}" # semantic version
 export RM_CMD="rm -vrf "
 export CP_CMD="cp -vrf "
@@ -112,19 +112,19 @@ function checkoutMindforger {
     # delete OLD files from Bazaar directory
     cd mindforger
     mv .bzr ..
-    rm -rf$OPT_VERBOSE} app build deps lib man LICENSE *.md
+    rm -rf${OPT_VERBOSE} app build deps lib man LICENSE *.md
     mv ../.bzr .
 
     # copy NEW project files to Bazaar directory
     echo -e "\n# copy over new MindForger files ############################"
-    cp -rf$OPT_VERBOSE} ${MFSRC}/* ${MFSRC}/*.*  .
+    cp -rf${OPT_VERBOSE} ${MFSRC}/* ${MFSRC}/*.*  .
 
     # prune MindForger project files: tests, *.o/... build files, ...
     echo -e "\n# CLEANUP development and build artifacts ###################"
-    rm -rf$OPT_VERBOSE} ./.git ./.qmake.stash ./app/mindforger ./build ./app/test ./lib/test
-    rm -rf$OPT_VERBOSE} ./lib/.qmake.stash ./lib/lib.pro.user ./lib/src/mindforger-lib-unit-tests
-    rm -rf$OPT_VERBOSE} ./deps/cmark-gfm/.github
-    rm -rf$OPT_VERBOSE} ./deps/mitie
+    rm -rf${OPT_VERBOSE} ./.git ./.qmake.stash ./app/mindforger ./build ./app/test ./lib/test
+    rm -rf${OPT_VERBOSE} ./lib/.qmake.stash ./lib/lib.pro.user ./lib/src/mindforger-lib-unit-tests
+    rm -rf${OPT_VERBOSE} ./deps/cmark-gfm/.github
+    rm -rf${OPT_VERBOSE} ./deps/mitie
     # IMPROVE: static libraries lib*.a are NOT deleted to keep cmark-gfm dependency libs
     find . -type f \( -name "*moc_*.cpp" -or -name "*.o" -or -name "*.*~" -or -name ".gitignore" -or -name ".git" \) | while read F; do rm -vf $F; done
     

From 8941a47cfbce4361ef69311927e80f881c652095 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Wed, 18 Jan 2023 06:54:30 +0100
Subject: [PATCH 031/131] Adding help.

---
 .../ubuntu-launchpad-releases-from-mind.sh    | 56 ++++++++++++++++---
 1 file changed, 49 insertions(+), 7 deletions(-)

diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
index 049db7b9..cc0d5a0b 100755
--- a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
+++ b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
@@ -16,23 +16,61 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see .
-
-# This script builds: upstream tarball > source deb > binary deb
+#
+#########################################################################
+#
+# This script:
+#   > checkouts MF from LaunchPad's bazaar
+#     > copies latest sources to bazaar
+#   > builds upstream tarball
+#     ~ checks that local build is OK
+#   > builds source .deb
+#     ~ checks that .deb build for target Ubuntu distro is OK
+#     > signs its .dsc descriptor using PGP
+#   > builds binary .deb
+#     ~ checks that .deb build for target Ubuntu distro is OK
+#   > uploads signed .dsc to LaunchPad using dput
+# IMPORTANT: for ^ upload .deb builds are NOT needed, only signed .dsc 
+#
+# Tips:
+# - run the script from Emacs shell to easily review and analyze
+#   the script output
+# - make sure PGP and .ssh keys are trusted and registered
+#   on Launchpad
+# - set OPT_* for PUSH and RELEASE to false to get .deb for any Ubuntu
+#   version locally
+#
+# GPG key configuration (GNU Privacy Guard @ PGP pretty good privacy):
+# 1. generate
+#      OR
+#    copy the key from another machine
+# 2. LOCAL: trust the key
+#    ~/.gnupg
+#    gpg --list-keys
+#      ^ key is SUFFIX of pub key, last 16 characters
+#    gpg --edit-key 
+#    gpg --edit-key B72E4F7F24AF591D  # ...
+#      ^ starts a tool with shell, write command:
+#    > trust
+# 3. Launchpad: upload and register the key at
+#    https://launchpad.net/~ultradvorka/+editpgpkeys
+#
+# SSH key configuration:
+# 1. Launchpad: upload and register the key 
+#    https://launchpad.net/~ultradvorka/+editsshkeys
+#    ~/.ssh/id_rsa.pub
 #
 # See:
 #   Beginners guide:
 #     http://packaging.ubuntu.com/html/packaging-new-software.html
+#   PGP
+#     https://unix.stackexchange.com/questions/188668/how-does-gpg-agent-work
 #   Debian maintainers guide:
 #     https://www.debian.org/doc/manuals/maint-guide/index.en.html
 #     https://www.debian.org/doc/manuals/debmake-doc/index.en.html
 #   Debian formal doc:
 #     https://www.debian.org/doc/debian-policy/
 #
-# Tips:
-# - run the script from Emacs shell to easily analyze script output
-# - set OPT_* for PUSH and RELEASE to false to get .deb for any Ubuntu
-#   version locally
-#
 
 # ########################################################################
 # # Configuration
@@ -264,6 +302,10 @@ function releaseForParticularUbuntuVersion {
     createTarball
     
     # 8) start GPG agent if it's NOT running
+    #   gpg-agent is a program that runs in the background (a daemon) and stores
+    # GPG secret keys in memory. When a GPG process needs the key, it contacts
+    # the running gpg-agent program through a socket and requests the key.
+    #
     echoStep "Start GPG agent process (if it is NOT running)"
     if [ -e "${HOME}/.gnupg/S.gpg-agent" ]
     then

From a84d4d0d21b1715b55071bbac708b7e9f8ea6dd3 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Wed, 18 Jan 2023 07:17:20 +0100
Subject: [PATCH 032/131] Fixing mind script to release via Launchpad.

---
 .../ubuntu-launchpad-releases-from-mind.sh     | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
index cc0d5a0b..423c6ef7 100755
--- a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
+++ b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh
@@ -19,6 +19,10 @@
 #
 #########################################################################
 #
+# Goal - CREATE UBUNTU PACKAGE at:
+#
+# https://launchpad.net/~ultradvorka/+archive/ubuntu/productivity/+packages
+#
 # This script:
 #   > checkouts MF from LaunchPad's bazaar
 #     > copies latest sources to bazaar
@@ -40,7 +44,9 @@
 # - set OPT_* for PUSH and RELEASE to false to get .deb for any Ubuntu
 #   version locally
 #
-# GPG key configuration (GNU Privacy Guard @ PGP pretty good privacy):
+# GPG key configuration:
+#  - GNU Privacy Guard @ PGP pretty good privacy
+#  - identifies the person on LaunchPad
 # 1. generate
 #      OR
 #    copy the key from another machine
@@ -95,7 +101,7 @@ fi
 # environment variables
 export MAJOR_VERSION=1
 export MINOR_VERSION=55
-export PATCH_VERSION=2 # patch version is incremented for every Ubuntu build @ Launchpad
+export PATCH_VERSION=5 # patch version is incremented for every Ubuntu build @ Launchpad
 export MF_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}" # semantic version
 export RM_CMD="rm -vrf "
 export CP_CMD="cp -vrf "
@@ -106,10 +112,10 @@ then
     export OPT_DO_PUSH="false" # "true" to upload src to bazaar
     export OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
 else
-    export OPT_DO_PUSH="false" # "true" to upload src to bazaar
-    export OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
-    #export OPT_DO_PUSH="true" # "true" to upload src to bazaar
-    #export OPT_DO_RELEASE="true" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+    #export OPT_DO_PUSH="false" # "true" to upload src to bazaar
+    #export OPT_DO_RELEASE="false" # "true" to dpush binary .deb to Launchpad and TRIGGER release
+    export OPT_DO_PUSH="true" # "true" to upload src to bazaar
+    export OPT_DO_RELEASE="true" # "true" to dpush binary .deb to Launchpad and TRIGGER release
 fi
 
 # shell variables

From 5433e71605e5f9129f9e0ab4ab805afd3de6dd3a Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Wed, 18 Jan 2023 08:11:49 +0100
Subject: [PATCH 033/131] WIP snap.

---
 build/snap/README.md      | 19 --------------
 build/snap/make-snap.sh   |  5 ++++
 build/snap/snapcraft.yaml | 54 ++++++++++++++-------------------------
 3 files changed, 24 insertions(+), 54 deletions(-)
 delete mode 100644 build/snap/README.md
 create mode 100755 build/snap/make-snap.sh

diff --git a/build/snap/README.md b/build/snap/README.md
deleted file mode 100644
index cd533cc9..00000000
--- a/build/snap/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Snap
-Snap package to be implemented:
-
-* https://github.com/dvorka/mindforger/issues/100
-
-How to package:
-
-* https://ubuntu.com/blog/how-to-create-snap-packages-on-qt-applications
-* https://www.digitalocean.com/community/tutorials/how-to-package-and-publish-a-snap-application-on-ubuntu-18-04
-* https://wiki.freepascal.org/Create_snap_package
-
-Qt apps examples:
-
-* https://github.com/search?q=filename%3Asnapcraft.yaml+%22plugin%3A+qmake%22&type=Code
-* https://github.com/liu-xiao-guo/deepin-movie/blob/598d5c10bc1e3aa25e6214696c07376bdbbe2001/snap/snapcraft.yaml
-
-Resources:
-
-* https://snapcraft.io/store
diff --git a/build/snap/make-snap.sh b/build/snap/make-snap.sh
new file mode 100755
index 00000000..43820545
--- /dev/null
+++ b/build/snap/make-snap.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+cd ../.. && cp -vf build/snap/snapcraft.yaml . && snapcraft --debug
+
+# eof
diff --git a/build/snap/snapcraft.yaml b/build/snap/snapcraft.yaml
index 0002222a..675aa21e 100644
--- a/build/snap/snapcraft.yaml
+++ b/build/snap/snapcraft.yaml
@@ -1,42 +1,26 @@
-# snapcraft.yaml     snap builder configuration
-#
-# MindForger knowledge management tool
-#
-# Copyright (C) 2016-2023 Martin Dvorak 
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-# https://docs.snapcraft.io/build-snaps/your-first-snap
-#
-
 name: mindforger
-version: '0.55.0'
-base: core18 # build core on Ubuntu 18.04 LTS
-version: git
-grade: stable
-summary: Markdown Editor and Thinking Notebook
+base: core18 # the base snap is the execution environment for this snap: core18 (18.04), core20 (20.04)
+version: '1.55.0' # just for humans, typically '1.2+git' or '1.3.2'
+summary: Thinking notebook and Markdown editor
 description: |
-  MindForger is open, free, well performing Markdown editor which respects
-  your privacy and enables security. MindForger is actually more than
-  an editor or IDE - it's human mind inspired personal knowledge management tool.
-confinement: devmode
-# confinement: classic
+  Get as much as possible from your remarks.
+
+grade: devel # must be 'stable' to release into candidate/stable channels: devel, stable
+confinement: devmode # use 'strict' once you have the right plugs and slots: strict, devmode, classic
 
 apps:
   mindforger:
-    command: desktop-launch bin/mindforger
+    common-id: com.mindforger
+    command: mindforger
     plugs:
-    - home
+      home
+      network
 
-...
+parts:
+  application:
+    plugin: qmake  # see 'snapcraft plugins'
+    source: ../../..
+    build-packages:
+	- qtbase5-dev
+	- libqt5webkit5-dev
+	- libhunspell-dev

From 45859f6b38a51963d1534523aaf3ef02b649125b Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 22 Jan 2023 14:50:04 +0100
Subject: [PATCH 034/131] OOTB Eisenhower matrix added if missing (on boot)
 resolves 1489, limbo listing added to menu, shotrcut for "find Notes by Tag"
 changed to &A.

---
 CONTRIBUTING.md                               |   9 +-
 Changelog                                     |   9 +-
 PAD.xml                                       |   2 +-
 .../qt/translations/mindforger_cs.ts          | 720 +++++++++---------
 .../qt/translations/mindforger_en.qm          | Bin 2522 -> 2645 bytes
 .../qt/translations/mindforger_en.ts          | 720 +++++++++---------
 .../qt/translations/mindforger_nerd_cs.ts     | 720 +++++++++---------
 .../qt/translations/mindforger_nerd_en.ts     | 720 +++++++++---------
 .../qt/translations/mindforger_zh_cn.qm       | Bin 2515 -> 2413 bytes
 .../qt/translations/mindforger_zh_cn.ts       | 718 ++++++++---------
 app/src/qt/dialogs/configuration_dialog.cpp   |  35 +-
 app/src/qt/dialogs/configuration_dialog.h     |   1 +
 app/src/qt/main_menu_presenter.cpp            |   4 +
 app/src/qt/main_menu_view.cpp                 |  87 ++-
 app/src/qt/main_menu_view.h                   |   1 +
 app/src/qt/main_window_presenter.cpp          | 107 ++-
 app/src/qt/main_window_presenter.h            |   1 +
 build/Makefile                                |   3 +-
 build/debian/debian-aptly-add-deb.sh          |   2 +-
 lib/src/app_info.h                            |   6 +-
 lib/src/model/organizer.cpp                   |   2 +-
 ...epository_configuration_representation.cpp |  69 +-
 ..._repository_configuration_representation.h |  27 +-
 23 files changed, 2114 insertions(+), 1849 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a6437ab1..ac2a397c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -96,8 +96,7 @@ void MainWindowPresenter::doActionOrganizerMoveNoteToNextVisibleQuadrant(Note* n
         doActionKanbanMoveNoteCommon(
             note,
             orloj->getKanban()->moveToNextVisibleColumn(note),
-            orloj
-        );
+            orloj);
     } else {
         if(!EisenhowerMatrix::isEisenhowMatrixOrganizer(
                 orloj->getOrganizer()->getOrganizer()
@@ -108,13 +107,11 @@ void MainWindowPresenter::doActionOrganizerMoveNoteToNextVisibleQuadrant(Note* n
             doActionOrganizerMoveNoteCommon(
                 note,
                 orloj->getOrganizer()->moveToNextVisibleQuadrant(note),
-                orloj
-            );
+                orloj);
         } else {
             statusBar->showError(
                 "Notebooks/notes cannot be moved around quadrants of "
-                "Eisenhower Matrix"
-            );
+                "Eisenhower Matrix");
         }
     }
 }
diff --git a/Changelog b/Changelog
index 61742d08..b936bd00 100644
--- a/Changelog
+++ b/Changelog
@@ -1,4 +1,11 @@
-2023-01-17  Martin Dvorak  
+2023-01-22  Martin Dvorak  
+
+    * Released v1.55.1 - Limbo added to the application menu View/Limbo,
+      polished Preferences (Appearance refactored to Controls; restart requirement
+      highlighted), missing OOTB Eisenhower Matrix is automatically added back
+      to the list of Organizers.
+
+2023-01-15  Martin Dvorak  
 
     * Released v1.55.0 - delete of a Note in the outline view keeps selected
       an adjacent Note, improved page up/page down navigation in table widgets,
diff --git a/PAD.xml b/PAD.xml
index b04058a1..340ae0e9 100644
--- a/PAD.xml
+++ b/PAD.xml
@@ -34,7 +34,7 @@
 	
 	
 		MindForger
-		1.55.0
+		1.55.1
 		03
 		07
 		2023
diff --git a/app/resources/qt/translations/mindforger_cs.ts b/app/resources/qt/translations/mindforger_cs.ts
index 007f5651..4f1a945e 100644
--- a/app/resources/qt/translations/mindforger_cs.ts
+++ b/app/resources/qt/translations/mindforger_cs.ts
@@ -255,7 +255,7 @@
         
     
     
-        
+        
         Adapt
         
     
@@ -263,37 +263,47 @@
 
     m8r::ConfigurationDialog::AppTab
     
-        
+        
         UI theme (<font color='#ff0000'>requires restart</font>)
         
     
     
-        
+        
+        Menu (<font color='#ff0000'>requires restart</font>)
+        
+    
+    
+        
         Show the following view on application start
         
     
     
-        
+        
         show toolbar
         
     
     
-        
+        
         I don't need buttons - I know all keyboard shortcuts!
         
     
     
-        
-        nerd menu (requires restart)
+        
+        nerd terminology
         
     
     
-        
+        
+        Controls
+        
+    
+    
+        
         Startup
         
     
     
-        
+        
         Appearance
         
     
@@ -301,47 +311,47 @@
 
     m8r::ConfigurationDialog::EditorTab
     
-        
+        
         Editor key binding
         
     
     
-        
+        
         Editor font
         
     
     
-        
+        
         Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a>
         
     
     
-        
+        
         live spell check
         
     
     
-        
+        
         TABs as SPACEs
         
     
     
-        
+        
         autosave Note on editor close
         
     
     
-        
+        
         TAB width
         
     
     
-        
+        
         External editor command
         
     
     
-        
+        
         Editor
         
     
@@ -349,37 +359,37 @@
 
     m8r::ConfigurationDialog::MarkdownTab
     
-        
+        
         syntax highlighting
         
     
     
-        
+        
         autocomplete text
         
     
     
-        
+        
         autocomplete lists, blocks and {([`_ characters
         
     
     
-        
+        
         SPACE-based # in section escaping (HTML otherwise)
         
     
     
-        
+        
         Rendering
         
     
     
-        
+        
         Autocompletion
         
     
     
-        
+        
         Escaping
         
     
@@ -387,22 +397,22 @@
 
     m8r::ConfigurationDialog::MindTab
     
-        
+        
         save reads metadata
         
     
     
-        
+        
         Async refresh interval (1 - 10.000ms)
         
     
     
-        
+        
         Persistence
         
     
     
-        
+        
         Notifications
         
     
@@ -410,12 +420,12 @@
 
     m8r::ConfigurationDialog::NavigatorTab
     
-        
+        
         Max graph nodes (150 by default)
         
     
     
-        
+        
         Knowledge Graph Navigator
         
     
@@ -423,57 +433,57 @@
 
     m8r::ConfigurationDialog::ViewerTab
     
-        
+        
         HTML Viewer
         
     
     
-        
+        
         Viewer theme CSS
         
     
     
-        
+        
         HTML zoom (100 is 100%, Ctrl + mouse wheel)
         
     
     
-        
+        
         source code syntax highlighting support
         
     
     
-        
+        
         math support
         
     
     
-        
+        
         whole notebook preview
         
     
     
-        
+        
         double click HTML preview to edit
         
     
     
-        
+        
         Diagram support
         
     
     
-        
+        
         Find Custom CSS File
         
     
     
-        
+        
         HTML Viewer CSS
         
     
     
-        
+        
         Choose CSS File
         
     
@@ -1025,7 +1035,7 @@
     
     
         
-        
+        
         &Forget
         
     
@@ -1069,380 +1079,375 @@
         
     
     
-        
+        
         Recall Note&book by Name
         
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Recall &Note by Name
         
     
     
-        
+        
         Find Note by name
         
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
-        Recall Note by &Tags
-        
-    
-    
-        
+        
         Find Note by tags
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         &Recall
         
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
@@ -1452,588 +1457,593 @@
         
     
     
-        
+        
+        Recall Note by T&ags
+        
+    
+    
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         &Know
         
     
     
-        
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
@@ -2043,12 +2053,12 @@
         
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
@@ -2083,147 +2093,147 @@
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2264,342 +2274,352 @@
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         With&out tags
         
     
     
-        
+        
         Insert Notebook's table of contents without tags
         
     
     
-        
+        
         &With tags
         
     
     
-        
+        
         Insert Notebook's table of contents with tags
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Tools
         
     
     
-        
+        
         Open Wikipadia and find entry of the selected entity...
         
     
     
-        
+        
         Open arXiv and find papers related to the selected entity...
         
     
     
-        
+        
         &ChatGPT: Explain ... in simple terms.
         
     
     
-        
+        
         Let ChatGPT to explain the selected entry...
         
     
     
-        
+        
+        &Gramarly
+        
+    
+    
+        
+        Use Gramarly to check to grammar...
+        
+    
+    
+        
         &DuckDuckGo
         
     
     
-        
+        
         Open DuckDuckGo and search web for the selected entity...
         
     
     
-        
+        
         &Pandoc
         
     
     
-        
+        
         Use Pandoc to convert MindForger's Markdown documents...
         
     
     
-        
+        
         D&ocusaurus
         
     
     
-        
+        
         Build your web with MindForger's Markdown documents and Docusaurus...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
diff --git a/app/resources/qt/translations/mindforger_en.qm b/app/resources/qt/translations/mindforger_en.qm
index 18fcd04e6f90010bba4a4826dfd3163323f4eb8b..7683aa325b696d2e0f8ee066fc4eec40f29911ec 100644
GIT binary patch
delta 299
zcmca5d{tzEh~o
zwP*Q11_pK;wtHcl85r0mObj)&UovYl0|P4qkCt62P)R+6W-sHhv2_9(=)udT4isnU
zE+XBA)$VNjdAidCLD
RL@jah0yf#rFIhh_0|0k`NrM0Y

delta 255
zcmcaAa!YuEh~onWZ3hSkWXHkQd2>^#DL4EYQt45%3;_JMKXm{A

diff --git a/app/resources/qt/translations/mindforger_en.ts b/app/resources/qt/translations/mindforger_en.ts
index 05149b18..d26866b4 100644
--- a/app/resources/qt/translations/mindforger_en.ts
+++ b/app/resources/qt/translations/mindforger_en.ts
@@ -255,7 +255,7 @@
         
     
     
-        
+        
         Adapt
         Preferences
         Preferences
@@ -264,37 +264,47 @@
 
     m8r::ConfigurationDialog::AppTab
     
-        
+        
         UI theme (<font color='#ff0000'>requires restart</font>)
         
     
     
-        
+        
+        Menu (<font color='#ff0000'>requires restart</font>)
+        
+    
+    
+        
         Show the following view on application start
         
     
     
-        
+        
         show toolbar
         
     
     
-        
+        
         I don't need buttons - I know all keyboard shortcuts!
         
     
     
-        
-        nerd menu (requires restart)
+        
+        nerd terminology
         
     
     
-        
+        
+        Controls
+        
+    
+    
+        
         Startup
         
     
     
-        
+        
         Appearance
         
     
@@ -302,47 +312,47 @@
 
     m8r::ConfigurationDialog::EditorTab
     
-        
+        
         Editor key binding
         
     
     
-        
+        
         Editor font
         
     
     
-        
+        
         Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a>
         
     
     
-        
+        
         live spell check
         
     
     
-        
+        
         TABs as SPACEs
         
     
     
-        
+        
         autosave Note on editor close
         
     
     
-        
+        
         TAB width
         
     
     
-        
+        
         External editor command
         
     
     
-        
+        
         Editor
         
     
@@ -350,37 +360,37 @@
 
     m8r::ConfigurationDialog::MarkdownTab
     
-        
+        
         syntax highlighting
         
     
     
-        
+        
         autocomplete text
         
     
     
-        
+        
         autocomplete lists, blocks and {([`_ characters
         
     
     
-        
+        
         SPACE-based # in section escaping (HTML otherwise)
         
     
     
-        
+        
         Rendering
         
     
     
-        
+        
         Autocompletion
         
     
     
-        
+        
         Escaping
         
     
@@ -388,22 +398,22 @@
 
     m8r::ConfigurationDialog::MindTab
     
-        
+        
         save reads metadata
         
     
     
-        
+        
         Async refresh interval (1 - 10.000ms)
         
     
     
-        
+        
         Persistence
         
     
     
-        
+        
         Notifications
         
     
@@ -411,12 +421,12 @@
 
     m8r::ConfigurationDialog::NavigatorTab
     
-        
+        
         Max graph nodes (150 by default)
         
     
     
-        
+        
         Knowledge Graph Navigator
         
     
@@ -424,57 +434,57 @@
 
     m8r::ConfigurationDialog::ViewerTab
     
-        
+        
         HTML Viewer
         
     
     
-        
+        
         Viewer theme CSS
         
     
     
-        
+        
         HTML zoom (100 is 100%, Ctrl + mouse wheel)
         
     
     
-        
+        
         source code syntax highlighting support
         
     
     
-        
+        
         math support
         
     
     
-        
+        
         whole notebook preview
         
     
     
-        
+        
         double click HTML preview to edit
         
     
     
-        
+        
         Diagram support
         
     
     
-        
+        
         Find Custom CSS File
         
     
     
-        
+        
         HTML Viewer CSS
         
     
     
-        
+        
         Choose CSS File
         
     
@@ -1045,7 +1055,7 @@
     
     
         
-        
+        
         &Forget
         &Deprecate
     
@@ -1089,22 +1099,22 @@
         
     
     
-        
+        
         Recall Note&book by Name
         Find Note&book by Name
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Recall &Note by Name
         Find &Note by Name
     
     
-        
+        
         Find Note by name
         
     
@@ -1113,375 +1123,374 @@
         Find Notebook by T&ags
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
         Recall Note by &Tags
-        Find Note by &Tags
+        Find Note by &Tags
     
     
-        
+        
         Find Note by tags
         
     
     
-        
+        
         Recall Library &Doc by Name
-        
+        Find Library &Doc by Name
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         Find &Persons
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         Find &Locations
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         Find Organizations
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         Find Other Entities
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         &Recall
         F&ind
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
@@ -1491,608 +1500,613 @@
         
     
     
-        
+        
+        Recall Note by T&ags
+        Find Note by T&ags
+    
+    
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         &Know
         
     
     
-        
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         Delete Notebook and move it Limbo
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         Delete	Del
     
     
-        
+        
         Forget Note
         Delete Note
     
@@ -2102,12 +2116,12 @@
         &Open
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
@@ -2142,147 +2156,147 @@
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         Find Notebook by Ta&gs
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         Save	Ctrl+S
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2323,307 +2337,317 @@
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         With&out tags
         
     
     
-        
+        
         Insert Notebook's table of contents without tags
         
     
     
-        
+        
         &With tags
         
     
     
-        
+        
         Insert Notebook's table of contents with tags
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Tools
         
     
     
-        
+        
         Open Wikipadia and find entry of the selected entity...
         
     
     
-        
+        
         Open arXiv and find papers related to the selected entity...
         
     
     
-        
+        
         &ChatGPT: Explain ... in simple terms.
         
     
     
-        
+        
         Let ChatGPT to explain the selected entry...
         
     
     
-        
+        
+        &Gramarly
+        
+    
+    
+        
+        Use Gramarly to check to grammar...
+        
+    
+    
+        
         &DuckDuckGo
         
     
     
-        
+        
         Open DuckDuckGo and search web for the selected entity...
         
     
     
-        
+        
         &Pandoc
         
     
     
-        
+        
         Use Pandoc to convert MindForger's Markdown documents...
         
     
     
-        
+        
         D&ocusaurus
         
     
     
-        
+        
         Build your web with MindForger's Markdown documents and Docusaurus...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_cs.ts b/app/resources/qt/translations/mindforger_nerd_cs.ts
index 21a4c355..6c81a5ae 100644
--- a/app/resources/qt/translations/mindforger_nerd_cs.ts
+++ b/app/resources/qt/translations/mindforger_nerd_cs.ts
@@ -263,7 +263,7 @@
         
     
     
-        
+        
         Adapt
         
     
@@ -271,37 +271,47 @@
 
     m8r::ConfigurationDialog::AppTab
     
-        
+        
         UI theme (<font color='#ff0000'>requires restart</font>)
         
     
     
-        
+        
+        Menu (<font color='#ff0000'>requires restart</font>)
+        
+    
+    
+        
         Show the following view on application start
         
     
     
-        
+        
         show toolbar
         
     
     
-        
+        
         I don't need buttons - I know all keyboard shortcuts!
         
     
     
-        
-        nerd menu (requires restart)
+        
+        nerd terminology
         
     
     
-        
+        
+        Controls
+        
+    
+    
+        
         Startup
         
     
     
-        
+        
         Appearance
         
     
@@ -309,47 +319,47 @@
 
     m8r::ConfigurationDialog::EditorTab
     
-        
+        
         Editor key binding
         
     
     
-        
+        
         Editor font
         
     
     
-        
+        
         Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a>
         
     
     
-        
+        
         live spell check
         
     
     
-        
+        
         TABs as SPACEs
         
     
     
-        
+        
         autosave Note on editor close
         
     
     
-        
+        
         TAB width
         
     
     
-        
+        
         External editor command
         
     
     
-        
+        
         Editor
         
     
@@ -357,37 +367,37 @@
 
     m8r::ConfigurationDialog::MarkdownTab
     
-        
+        
         syntax highlighting
         
     
     
-        
+        
         autocomplete text
         
     
     
-        
+        
         autocomplete lists, blocks and {([`_ characters
         
     
     
-        
+        
         SPACE-based # in section escaping (HTML otherwise)
         
     
     
-        
+        
         Rendering
         
     
     
-        
+        
         Autocompletion
         
     
     
-        
+        
         Escaping
         
     
@@ -395,22 +405,22 @@
 
     m8r::ConfigurationDialog::MindTab
     
-        
+        
         save reads metadata
         
     
     
-        
+        
         Async refresh interval (1 - 10.000ms)
         
     
     
-        
+        
         Persistence
         
     
     
-        
+        
         Notifications
         
     
@@ -418,12 +428,12 @@
 
     m8r::ConfigurationDialog::NavigatorTab
     
-        
+        
         Max graph nodes (150 by default)
         
     
     
-        
+        
         Knowledge Graph Navigator
         
     
@@ -431,57 +441,57 @@
 
     m8r::ConfigurationDialog::ViewerTab
     
-        
+        
         HTML Viewer
         
     
     
-        
+        
         Viewer theme CSS
         
     
     
-        
+        
         HTML zoom (100 is 100%, Ctrl + mouse wheel)
         
     
     
-        
+        
         source code syntax highlighting support
         
     
     
-        
+        
         math support
         
     
     
-        
+        
         whole notebook preview
         
     
     
-        
+        
         double click HTML preview to edit
         
     
     
-        
+        
         Diagram support
         
     
     
-        
+        
         Find Custom CSS File
         
     
     
-        
+        
         HTML Viewer CSS
         
     
     
-        
+        
         Choose CSS File
         
     
@@ -986,10 +996,10 @@
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         &Nový
     
@@ -1004,7 +1014,7 @@
         
     
     
-        
+        
         &Recall
         
     
@@ -1019,7 +1029,7 @@
     
     
         
-        
+        
         &Forget
         Zapomeň
     
@@ -1059,22 +1069,17 @@
         
     
     
-        
+        
         Recall &Note by Name
         
     
     
-        
+        
         Find Note by name
         
     
     
-        
-        Recall Note by &Tags
-        
-    
-    
-        
+        
         Find Note by tags
         
     
@@ -1083,22 +1088,22 @@
         Domů
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         &Stencils
         
     
@@ -1113,586 +1118,601 @@
         
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
+        
+        Recall Note by T&ags
+        
+    
+    
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         &Know
         
     
     
-        
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         With&out tags
         
     
     
-        
+        
         Insert Notebook's table of contents without tags
         
     
     
-        
+        
         &With tags
         
     
     
-        
+        
         Insert Notebook's table of contents with tags
         
     
     
-        
+        
         &Tools
         
     
     
-        
+        
         Open Wikipadia and find entry of the selected entity...
         
     
     
-        
+        
         Open arXiv and find papers related to the selected entity...
         
     
     
-        
+        
         &ChatGPT: Explain ... in simple terms.
         
     
     
-        
+        
         Let ChatGPT to explain the selected entry...
         
     
     
-        
+        
+        &Gramarly
+        
+    
+    
+        
+        Use Gramarly to check to grammar...
+        
+    
+    
+        
         &DuckDuckGo
         
     
     
-        
+        
         Open DuckDuckGo and search web for the selected entity...
         
     
     
-        
+        
         &Pandoc
         
     
     
-        
+        
         Use Pandoc to convert MindForger's Markdown documents...
         
     
     
-        
+        
         D&ocusaurus
         
     
     
-        
+        
         Build your web with MindForger's Markdown documents and Docusaurus...
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         &Formát
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Make &Home
         
     
@@ -1728,154 +1748,154 @@
         
     
     
-        
+        
         Recall Note&book by Name
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         E&xport
         E&xport
     
     
-        
+        
         &Import
         
     
@@ -1910,227 +1930,227 @@
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2171,447 +2191,447 @@
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         O aplikaci MindForger
     
     
-        
+        
         &Help
         
     
     
-        
+        
         F1
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_en.ts b/app/resources/qt/translations/mindforger_nerd_en.ts
index c18cf0ef..87095af8 100644
--- a/app/resources/qt/translations/mindforger_nerd_en.ts
+++ b/app/resources/qt/translations/mindforger_nerd_en.ts
@@ -255,7 +255,7 @@
         
     
     
-        
+        
         Adapt
         
     
@@ -263,37 +263,47 @@
 
     m8r::ConfigurationDialog::AppTab
     
-        
+        
         UI theme (<font color='#ff0000'>requires restart</font>)
         
     
     
-        
+        
+        Menu (<font color='#ff0000'>requires restart</font>)
+        
+    
+    
+        
         Show the following view on application start
         
     
     
-        
+        
         show toolbar
         
     
     
-        
+        
         I don't need buttons - I know all keyboard shortcuts!
         
     
     
-        
-        nerd menu (requires restart)
+        
+        nerd terminology
         
     
     
-        
+        
+        Controls
+        
+    
+    
+        
         Startup
         
     
     
-        
+        
         Appearance
         
     
@@ -301,47 +311,47 @@
 
     m8r::ConfigurationDialog::EditorTab
     
-        
+        
         Editor key binding
         
     
     
-        
+        
         Editor font
         
     
     
-        
+        
         Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a>
         
     
     
-        
+        
         live spell check
         
     
     
-        
+        
         TABs as SPACEs
         
     
     
-        
+        
         autosave Note on editor close
         
     
     
-        
+        
         TAB width
         
     
     
-        
+        
         External editor command
         
     
     
-        
+        
         Editor
         
     
@@ -349,37 +359,37 @@
 
     m8r::ConfigurationDialog::MarkdownTab
     
-        
+        
         syntax highlighting
         
     
     
-        
+        
         autocomplete text
         
     
     
-        
+        
         autocomplete lists, blocks and {([`_ characters
         
     
     
-        
+        
         SPACE-based # in section escaping (HTML otherwise)
         
     
     
-        
+        
         Rendering
         
     
     
-        
+        
         Autocompletion
         
     
     
-        
+        
         Escaping
         
     
@@ -387,22 +397,22 @@
 
     m8r::ConfigurationDialog::MindTab
     
-        
+        
         save reads metadata
         
     
     
-        
+        
         Async refresh interval (1 - 10.000ms)
         
     
     
-        
+        
         Persistence
         
     
     
-        
+        
         Notifications
         
     
@@ -410,12 +420,12 @@
 
     m8r::ConfigurationDialog::NavigatorTab
     
-        
+        
         Max graph nodes (150 by default)
         
     
     
-        
+        
         Knowledge Graph Navigator
         
     
@@ -423,57 +433,57 @@
 
     m8r::ConfigurationDialog::ViewerTab
     
-        
+        
         HTML Viewer
         
     
     
-        
+        
         Viewer theme CSS
         
     
     
-        
+        
         HTML zoom (100 is 100%, Ctrl + mouse wheel)
         
     
     
-        
+        
         source code syntax highlighting support
         
     
     
-        
+        
         math support
         
     
     
-        
+        
         whole notebook preview
         
     
     
-        
+        
         double click HTML preview to edit
         
     
     
-        
+        
         Diagram support
         
     
     
-        
+        
         Find Custom CSS File
         
     
     
-        
+        
         HTML Viewer CSS
         
     
     
-        
+        
         Choose CSS File
         
     
@@ -978,10 +988,10 @@
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
@@ -996,7 +1006,7 @@
         
     
     
-        
+        
         &Recall
         
     
@@ -1007,7 +1017,7 @@
     
     
         
-        
+        
         &Forget
         
     
@@ -1047,42 +1057,37 @@
         
     
     
-        
+        
         Recall &Note by Name
         
     
     
-        
+        
         Find Note by name
         
     
     
-        
-        Recall Note by &Tags
-        
-    
-    
-        
+        
         Find Note by tags
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         &Stencils
         
     
@@ -1097,586 +1102,601 @@
         
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
+        
+        Recall Note by T&ags
+        
+    
+    
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         &Know
         
     
     
-        
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         With&out tags
         
     
     
-        
+        
         Insert Notebook's table of contents without tags
         
     
     
-        
+        
         &With tags
         
     
     
-        
+        
         Insert Notebook's table of contents with tags
         
     
     
-        
+        
         &Tools
         
     
     
-        
+        
         Open Wikipadia and find entry of the selected entity...
         
     
     
-        
+        
         Open arXiv and find papers related to the selected entity...
         
     
     
-        
+        
         &ChatGPT: Explain ... in simple terms.
         
     
     
-        
+        
         Let ChatGPT to explain the selected entry...
         
     
     
-        
+        
+        &Gramarly
+        
+    
+    
+        
+        Use Gramarly to check to grammar...
+        
+    
+    
+        
         &DuckDuckGo
         
     
     
-        
+        
         Open DuckDuckGo and search web for the selected entity...
         
     
     
-        
+        
         &Pandoc
         
     
     
-        
+        
         Use Pandoc to convert MindForger's Markdown documents...
         
     
     
-        
+        
         D&ocusaurus
         
     
     
-        
+        
         Build your web with MindForger's Markdown documents and Docusaurus...
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Make &Home
         
     
@@ -1712,154 +1732,154 @@
         
     
     
-        
+        
         Recall Note&book by Name
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Import
         
     
@@ -1894,227 +1914,227 @@
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2155,447 +2175,447 @@
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
diff --git a/app/resources/qt/translations/mindforger_zh_cn.qm b/app/resources/qt/translations/mindforger_zh_cn.qm
index c1abd06588388bc986dd3ea26a1b6092c4d81006..131e67a0fb002deb90735f6b403794ac1f449e65 100644
GIT binary patch
delta 175
zcmcaC{8ng!h~o_gZ3hFyq->?|}42rcEF|V;qYONS?`>
zwP*Q11_rilwtHcl85mgiPYg9M;L)-x1vv9Wamn&`o6>Y55P
z^EIzc!X^d=<{;kr(|~$e_w&Bvu>qPb$(KBtAE@sbUqI3->zhniP
z`BG3JiV>`3xlt
zsX$f|LnV+@V+dhLWJqTy<^Xw+4Twd8Qj-&NauodXOHvh*Dizd164Q$(FJzXU{FYT@
J^K{m0%m7CUM)3du

diff --git a/app/resources/qt/translations/mindforger_zh_cn.ts b/app/resources/qt/translations/mindforger_zh_cn.ts
index 625f46e1..0beffa92 100644
--- a/app/resources/qt/translations/mindforger_zh_cn.ts
+++ b/app/resources/qt/translations/mindforger_zh_cn.ts
@@ -255,7 +255,7 @@
         
     
     
-        
+        
         Adapt
         Preferences
         Preferences
@@ -264,37 +264,47 @@
 
     m8r::ConfigurationDialog::AppTab
     
-        
+        
         UI theme (<font color='#ff0000'>requires restart</font>)
         
     
     
-        
+        
+        Menu (<font color='#ff0000'>requires restart</font>)
+        
+    
+    
+        
         Show the following view on application start
         
     
     
-        
+        
         show toolbar
         
     
     
-        
+        
         I don't need buttons - I know all keyboard shortcuts!
         
     
     
-        
-        nerd menu (requires restart)
+        
+        nerd terminology
         
     
     
-        
+        
+        Controls
+        
+    
+    
+        
         Startup
         
     
     
-        
+        
         Appearance
         
     
@@ -302,47 +312,47 @@
 
     m8r::ConfigurationDialog::EditorTab
     
-        
+        
         Editor key binding
         
     
     
-        
+        
         Editor font
         
     
     
-        
+        
         Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a>
         
     
     
-        
+        
         live spell check
         
     
     
-        
+        
         TABs as SPACEs
         
     
     
-        
+        
         autosave Note on editor close
         
     
     
-        
+        
         TAB width
         
     
     
-        
+        
         External editor command
         
     
     
-        
+        
         Editor
         
     
@@ -350,37 +360,37 @@
 
     m8r::ConfigurationDialog::MarkdownTab
     
-        
+        
         syntax highlighting
         
     
     
-        
+        
         autocomplete text
         
     
     
-        
+        
         autocomplete lists, blocks and {([`_ characters
         
     
     
-        
+        
         SPACE-based # in section escaping (HTML otherwise)
         
     
     
-        
+        
         Rendering
         
     
     
-        
+        
         Autocompletion
         
     
     
-        
+        
         Escaping
         
     
@@ -388,22 +398,22 @@
 
     m8r::ConfigurationDialog::MindTab
     
-        
+        
         save reads metadata
         
     
     
-        
+        
         Async refresh interval (1 - 10.000ms)
         
     
     
-        
+        
         Persistence
         
     
     
-        
+        
         Notifications
         
     
@@ -411,12 +421,12 @@
 
     m8r::ConfigurationDialog::NavigatorTab
     
-        
+        
         Max graph nodes (150 by default)
         
     
     
-        
+        
         Knowledge Graph Navigator
         
     
@@ -424,57 +434,57 @@
 
     m8r::ConfigurationDialog::ViewerTab
     
-        
+        
         HTML Viewer
         
     
     
-        
+        
         Viewer theme CSS
         
     
     
-        
+        
         HTML zoom (100 is 100%, Ctrl + mouse wheel)
         
     
     
-        
+        
         source code syntax highlighting support
         
     
     
-        
+        
         math support
         
     
     
-        
+        
         whole notebook preview
         
     
     
-        
+        
         double click HTML preview to edit
         
     
     
-        
+        
         Diagram support
         
     
     
-        
+        
         Find Custom CSS File
         
     
     
-        
+        
         HTML Viewer CSS
         
     
     
-        
+        
         Choose CSS File
         
     
@@ -1045,7 +1055,7 @@
     
     
         
-        
+        
         &Forget
         &Deprecate
     
@@ -1089,22 +1099,22 @@
         
     
     
-        
+        
         Recall Note&book by Name
         Find Note&book by Name
     
     
-        
+        
         Find Notebook by name
         
     
     
-        
+        
         Recall &Note by Name
         Find &Note by Name
     
     
-        
+        
         Find Note by name
         
     
@@ -1113,375 +1123,374 @@
         Find Notebook by T&ags
     
     
-        
+        
         Find Notebook by tags
         
     
     
-        
         Recall Note by &Tags
-        Find Note by &Tags
+        Find Note by &Tags
     
     
-        
+        
         Find Note by tags
         
     
     
-        
+        
         Recall Library &Doc by Name
         
     
     
-        
+        
         Find Document by name
         
     
     
-        
+        
         Recall &Persons
         Find &Persons
     
     
-        
+        
         Find persons using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall &Locations
         Find &Locations
     
     
-        
+        
         Find locations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Organizations
         Find Organizations
     
     
-        
+        
         Find organizations using Named-entity recognition (NER)
         
     
     
-        
+        
         Recall Other Entities
         Find Other Entities
     
     
-        
+        
         Find miscellaneous entities using Named-entity recognition (NER)
         
     
     
-        
+        
         &Recall
         F&ind
     
     
-        
+        
         Dashboard
         
     
     
-        
+        
         Open Home Notebook...
         
     
     
-        
+        
         N&otebooks
         
     
     
-        
+        
         Show list of Notebooks...
         
     
     
-        
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Refactor	Ctrl+R
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
@@ -1491,608 +1500,613 @@
         
     
     
-        
+        
+        Recall Note by T&ags
+        
+    
+    
+        
         Flashcard &Decks
         
     
     
-        
+        
         Show list of flashcard decks...
         
     
     
-        
+        
         Organiz&ers
         
     
     
-        
+        
         Open Eisenhower matrix and Kanban organizers...
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         &Know
         
     
     
-        
-        
+        
+        
         &Wikipedia
         
     
     
-        
+        
         Find marked text on Wikipedia or open Wikipedia search
         
     
     
-        
-        
+        
+        
         &arXiv
         
     
     
-        
+        
         Find marked text on arXiv or get article by ID
         
     
     
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
+        
         Libr&ary
         
     
     
-        
+        
         &Add library
         
     
     
-        
+        
         Add directory with documents, URL or other resource to library...
         
     
     
-        
+        
         &Deprecate library
         
     
     
-        
+        
         Move a library resource with documents to limbo...
         
     
     
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         Delete Notebook and move it Limbo
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         Delete	Del
     
     
-        
+        
         Forget Note
         Delete Note
     
@@ -2102,12 +2116,12 @@
         &Open
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
@@ -2142,147 +2156,147 @@
         
     
     
-        
+        
         Recall Notebook by Ta&gs
         Find Notebook by Ta&gs
     
     
-        
+        
         Open Dashboard...
         
     
     
-        
+        
         &Home Notebook
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         Save	Ctrl+S
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         F&irst	Ctrl+Shift+Up
         
     
     
-        
+        
         Move Note to be the first child of its parent
         
     
     
-        
+        
         &Up	Ctrl+Up
         
     
     
-        
+        
         Move Note up
         
     
     
-        
+        
         Do&wn	Ctrl+Down
         
     
     
-        
+        
         Move Note down
         
     
     
-        
+        
         &Last	Ctrl+Shift+Down
         
     
     
-        
+        
         Move Note to be the last child of its parent
         
     
     
-        
+        
         &Refactor
         
     
     
-        
+        
         Refactor Note to another Notebook...
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2323,307 +2337,317 @@
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         Complete Link	Ctrl+/
         
     
     
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         With&out tags
         
     
     
-        
+        
         Insert Notebook's table of contents without tags
         
     
     
-        
+        
         &With tags
         
     
     
-        
+        
         Insert Notebook's table of contents with tags
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Tools
         
     
     
-        
+        
         Open Wikipadia and find entry of the selected entity...
         
     
     
-        
+        
         Open arXiv and find papers related to the selected entity...
         
     
     
-        
+        
         &ChatGPT: Explain ... in simple terms.
         
     
     
-        
+        
         Let ChatGPT to explain the selected entry...
         
     
     
-        
+        
+        &Gramarly
+        
+    
+    
+        
+        Use Gramarly to check to grammar...
+        
+    
+    
+        
         &DuckDuckGo
         
     
     
-        
+        
         Open DuckDuckGo and search web for the selected entity...
         
     
     
-        
+        
         &Pandoc
         
     
     
-        
+        
         Use Pandoc to convert MindForger's Markdown documents...
         
     
     
-        
+        
         D&ocusaurus
         
     
     
-        
+        
         Build your web with MindForger's Markdown documents and Docusaurus...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
diff --git a/app/src/qt/dialogs/configuration_dialog.cpp b/app/src/qt/dialogs/configuration_dialog.cpp
index 4235109c..3b8a1b6a 100644
--- a/app/src/qt/dialogs/configuration_dialog.cpp
+++ b/app/src/qt/dialogs/configuration_dialog.cpp
@@ -44,9 +44,12 @@ ConfigurationDialog::ConfigurationDialog(QWidget* parent)
     buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
 
     // signals
-    QObject::connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
-    QObject::connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
-    QObject::connect(buttonBox, &QDialogButtonBox::accepted, this, &ConfigurationDialog::saveSlot);
+    QObject::connect(
+        buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
+    QObject::connect(
+        buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
+    QObject::connect(
+        buttonBox, &QDialogButtonBox::accepted, this, &ConfigurationDialog::saveSlot);
 
     QVBoxLayout* mainLayout = new QVBoxLayout{this};
     mainLayout->addWidget(tabWidget);
@@ -95,7 +98,10 @@ void ConfigurationDialog::saveSlot()
 ConfigurationDialog::AppTab::AppTab(QWidget *parent)
     : QWidget(parent), config(Configuration::getInstance())
 {
-    themeLabel = new QLabel(tr("UI theme (requires restart)")+":", this);
+    themeLabel = new QLabel(
+        tr("UI theme (requires restart)")+":", this);
+    menuLabel = new QLabel(
+        tr("Menu (requires restart)")+":", this);
     themeCombo = new QComboBox{this};
     themeCombo->addItem(QString{UI_THEME_LIGHT});
 #ifndef __APPLE__
@@ -127,8 +133,9 @@ ConfigurationDialog::AppTab::AppTab(QWidget *parent)
 
     showToolbarCheck = new QCheckBox(tr("show toolbar"), this);
     showToolbarCheck->setChecked(true);
-    uiExpertModeCheck = new QCheckBox(tr("I don't need buttons - I know all keyboard shortcuts!"), this);
-    nerdMenuCheck = new QCheckBox(tr("nerd menu (requires restart)"), this);
+    uiExpertModeCheck = new QCheckBox(
+        tr("I don't need buttons - I know all keyboard shortcuts!"), this);
+    nerdMenuCheck = new QCheckBox(tr("nerd terminology"), this);
 
     // assembly
     QVBoxLayout* startupLayout = new QVBoxLayout{this};
@@ -140,15 +147,21 @@ ConfigurationDialog::AppTab::AppTab(QWidget *parent)
     QVBoxLayout* appearanceLayout = new QVBoxLayout{this};
     appearanceLayout->addWidget(themeLabel);
     appearanceLayout->addWidget(themeCombo);
-    appearanceLayout->addWidget(showToolbarCheck);
-    appearanceLayout->addWidget(uiExpertModeCheck);
+    appearanceLayout->addWidget(menuLabel);
     appearanceLayout->addWidget(nerdMenuCheck);
     QGroupBox* appearanceGroup = new QGroupBox{tr("Appearance"), this};
     appearanceGroup->setLayout(appearanceLayout);
 
+    QVBoxLayout* controlsLayout = new QVBoxLayout{this};
+    controlsLayout->addWidget(showToolbarCheck);
+    controlsLayout->addWidget(uiExpertModeCheck);
+    QGroupBox* controlsGroup = new QGroupBox{tr("Controls"), this};
+    controlsGroup->setLayout(controlsLayout);
+
     QVBoxLayout* boxesLayout = new QVBoxLayout{this};
     boxesLayout->addWidget(startupGroup);
     boxesLayout->addWidget(appearanceGroup);
+    boxesLayout->addWidget(controlsGroup);
     boxesLayout->addStretch();
     setLayout(boxesLayout);
 }
@@ -198,11 +211,13 @@ ConfigurationDialog::ViewerTab::ViewerTab(QWidget *parent)
     zoomSpin->setMinimum(25);
     zoomSpin->setMaximum(500);
 
-    srcCodeHighlightSupportCheck = new QCheckBox{tr("source code syntax highlighting support"), this};
+    srcCodeHighlightSupportCheck = new QCheckBox{
+        tr("source code syntax highlighting support"), this};
 
     mathSupportCheck = new QCheckBox{tr("math support"), this};
     fullOPreviewCheck = new QCheckBox{tr("whole notebook preview"), this};
-    doubleClickViewerToEditCheck = new QCheckBox{tr("double click HTML preview to edit"), this};
+    doubleClickViewerToEditCheck = new QCheckBox{
+        tr("double click HTML preview to edit"), this};
 
     diagramSupportLabel = new QLabel(tr("Diagram support")+":", this);
     diagramSupportCombo = new QComboBox{this};
diff --git a/app/src/qt/dialogs/configuration_dialog.h b/app/src/qt/dialogs/configuration_dialog.h
index a753d8a8..2eb4ac87 100644
--- a/app/src/qt/dialogs/configuration_dialog.h
+++ b/app/src/qt/dialogs/configuration_dialog.h
@@ -103,6 +103,7 @@ class ConfigurationDialog::AppTab : public QWidget
     Configuration& config;
 
     QLabel* themeLabel;
+    QLabel* menuLabel;
     QComboBox* themeCombo;
 
     QLabel* startupLabel;
diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp
index c5fc3156..1753e6f9 100644
--- a/app/src/qt/main_menu_presenter.cpp
+++ b/app/src/qt/main_menu_presenter.cpp
@@ -78,6 +78,10 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
         view->actionViewTerminal, SIGNAL(triggered()),
         mwp, SLOT(doActionViewTerminal())
     );
+    QObject::connect(
+        view->actionViewLimbo, SIGNAL(triggered()),
+        mwp, SLOT(doActionViewLimbo())
+    );
     QObject::connect(
         view->actionMindSnapshot, SIGNAL(triggered()),
         mwp, SLOT(doActionMindSnapshot())
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index cd9d6900..ba78b78e 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -174,24 +174,29 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
 #endif
     actionFindFts->setStatusTip(tr("Note full-text search"));
 
-    actionFindOutlineByName = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall Note&book by Name"), mainWindow);
+    actionFindOutlineByName = new QAction(
+        QIcon(":/menu-icons/find.svg"), tr("Recall Note&book by Name"), mainWindow);
     actionFindOutlineByName->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_B));
     actionFindOutlineByName->setStatusTip(tr("Find Notebook by name"));
 
-    actionFindNoteByName = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall &Note by Name"), mainWindow);
+    actionFindNoteByName = new QAction(
+        QIcon(":/menu-icons/find.svg"), tr("Recall &Note by Name"), mainWindow);
     actionFindNoteByName->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_N));
     actionFindNoteByName->setStatusTip(tr("Find Note by name"));
 
-    actionFindOutlineByTag = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall Notebook by Ta&gs"), mainWindow);
+    actionFindOutlineByTag = new QAction(
+        QIcon(":/menu-icons/find.svg"), tr("Recall Notebook by Ta&gs"), mainWindow);
     actionFindOutlineByTag->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_X));
     actionFindOutlineByTag->setStatusTip(tr("Find Notebook by tags"));
 
-    actionFindNoteByTag = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall Note by &Tags"), mainWindow);
-    actionFindNoteByTag->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_T));
+    actionFindNoteByTag = new QAction(
+        QIcon(":/menu-icons/find.svg"), tr("Recall Note by T&ags"), mainWindow);
+    actionFindNoteByTag->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_A));
     actionFindNoteByTag->setStatusTip(tr("Find Note by tags"));
 
 #ifdef MF_WIP
-    actionFindDocByName = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall Library &Doc by Name"), mainWindow);
+    actionFindDocByName = new QAction(
+        QIcon(":/menu-icons/find.svg"), tr("Recall Library &Doc by Name"), mainWindow);
     actionFindDocByName->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_D));
     actionFindDocByName->setStatusTip(tr("Find Document by name"));
 #endif
@@ -283,30 +288,35 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionViewRecentNotes->setStatusTip(tr("View recently modified Notes..."));
     actionViewRecentNotes->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_R));
 
-    actionViewStencils = new QAction(QIcon(":/menu-icons/stencil.svg"), tr("&Stencils"), mainWindow);
+    actionViewStencils = new QAction(
+        QIcon(":/menu-icons/stencil.svg"), tr("&Stencils"), mainWindow);
     // Outline/Note marked w/ tag stencil is MOVED among stencils (NOT indexed/searched/...)
     //  + Stencil view allows making a stencil outline again
     //  + Note stencils are notes in a given Outline
     actionViewStencils->setStatusTip(tr("List Notebook and Note stencils..."));
     actionViewStencils->setEnabled(false);
 
-    actionViewLimbo = new QAction(QIcon(":/menu-icons/limbo.svg"), tr("Li&mbo"), mainWindow);
+    actionViewLimbo = new QAction(
+        QIcon(":/menu-icons/limbo.svg"), tr("Li&mbo"), mainWindow);
     actionViewLimbo->setStatusTip(tr("List forgotten Notebooks and Notes..."));
-    actionViewLimbo->setEnabled(false);
-    // TODO same handler as Help/Documentation - open dir w/ limbo files
+    actionViewLimbo->setEnabled(true);
 
-    actionViewHoist = new QAction(QIcon(":/menu-icons/hoisting.svg"), tr("Ho&isting"), mainWindow);
+    actionViewHoist = new QAction(
+        QIcon(":/menu-icons/hoisting.svg"), tr("Ho&isting"), mainWindow);
     actionViewHoist->setCheckable(true);
     actionViewHoist->setChecked(false);
     actionViewHoist->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_I));
-    actionViewHoist->setStatusTip(tr("Hoist/de-hoist Note to focus on Note being viewed or edited"));
+    actionViewHoist->setStatusTip(
+        tr("Hoist/de-hoist Note to focus on Note being viewed or edited"));
 
-    actionViewDistractionFree = new QAction(QIcon(":/menu-icons/off.svg"), tr("D&istraction Free"), mainWindow);
+    actionViewDistractionFree = new QAction(
+        QIcon(":/menu-icons/off.svg"), tr("D&istraction Free"), mainWindow);
     actionViewDistractionFree->setShortcut(QKeySequence(Qt::Key_F5));
     actionViewDistractionFree->setStatusTip(tr("Toggle distraction free mode"));
     actionViewDistractionFree->setEnabled(false);
 
-    actionViewFullscreen = new QAction(QIcon(":/menu-icons/fullscreen.svg"), tr("&Fullscreen"), mainWindow);
+    actionViewFullscreen = new QAction(
+        QIcon(":/menu-icons/fullscreen.svg"), tr("&Fullscreen"), mainWindow);
     actionViewFullscreen->setShortcut(QKeySequence(Qt::Key_F11));
     actionViewFullscreen->setStatusTip(tr("Toggle fullscreen"));
 
@@ -330,8 +340,8 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
 #ifdef MF_WIP
     menuView->addAction(actionViewStencils);
     menuView->addAction(actionViewDwell);
-    menuView->addAction(actionViewLimbo);
 #endif
+    menuView->addAction(actionViewLimbo);
     menuView->addSeparator();
     menuView->addAction(actionViewRecentNotes);
     menuView->addSeparator();
@@ -940,34 +950,55 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
 #ifdef MF_WIP
     menuTools = qMenuBar->addMenu(tr("&Tools"));
 
-    actionToolsWikipedia = new QAction(QIcon(":/menu-icons/link.svg"), tr("&Wikipedia"), mainWindow);
-    actionToolsWikipedia->setStatusTip(tr("Open Wikipadia and find entry of the selected entity..."));
+    actionToolsWikipedia = new QAction(
+        QIcon(":/menu-icons/link.svg"), tr("&Wikipedia"), mainWindow);
+    actionToolsWikipedia->setStatusTip(
+        tr("Open Wikipadia and find entry of the selected entity..."));
     menuTools->addAction(actionToolsWikipedia);
 
-    actionToolsArxiv = new QAction(QIcon(":/menu-icons/link.svg"), tr("&arXiv"), mainWindow);
-    actionToolsArxiv->setStatusTip(tr("Open arXiv and find papers related to the selected entity..."));
+    actionToolsArxiv = new QAction(
+        QIcon(":/menu-icons/link.svg"), tr("&arXiv"), mainWindow);
+    actionToolsArxiv->setStatusTip(tr(
+        "Open arXiv and find papers related to the selected entity..."));
     menuTools->addAction(actionToolsArxiv);
 
-    actionToolsChatGpt = new QAction(QIcon(":/menu-icons/link.svg"), tr("&ChatGPT: Explain ... in simple terms."), mainWindow);
-    actionToolsChatGpt->setStatusTip(tr("Let ChatGPT to explain the selected entry..."));
+    actionToolsChatGpt = new QAction(
+        QIcon(":/menu-icons/link.svg"),
+        tr("&ChatGPT: Explain ... in simple terms."),
+        mainWindow);
+    actionToolsChatGpt->setStatusTip(
+        tr("Let ChatGPT to explain the selected entry..."));
     menuTools->addAction(actionToolsChatGpt);
 
-    actionToolsDuckDuckGo = new QAction(QIcon(":/menu-icons/link.svg"), tr("&DuckDuckGo"), mainWindow);
-    actionToolsDuckDuckGo->setStatusTip(tr("Open DuckDuckGo and search web for the selected entity..."));
+    actionToolsGramarly= new QAction(
+        QIcon(":/menu-icons/link.svg"), tr("&Gramarly"), mainWindow);
+    actionToolsGramarly->setStatusTip(tr(
+        "Use Gramarly to check to grammar..."));
+    menuTools->addAction(actionToolsGramarly);
+
+    actionToolsDuckDuckGo = new QAction(
+        QIcon(":/menu-icons/link.svg"), tr("&DuckDuckGo"), mainWindow);
+    actionToolsDuckDuckGo->setStatusTip(
+        tr("Open DuckDuckGo and search web for the selected entity..."));
     menuTools->addAction(actionToolsDuckDuckGo);
 
-    actionToolsPandoc = new QAction(QIcon(":/menu-icons/link.svg"), tr("&Pandoc"), mainWindow);
-    actionToolsPandoc ->setStatusTip(tr("Use Pandoc to convert MindForger's Markdown documents..."));
+    actionToolsPandoc = new QAction(
+        QIcon(":/menu-icons/link.svg"), tr("&Pandoc"), mainWindow);
+    actionToolsPandoc ->setStatusTip(
+        tr("Use Pandoc to convert MindForger's Markdown documents..."));
     menuTools->addAction(actionToolsPandoc);
 
-    actionToolsDocusaurus = new QAction(QIcon(":/menu-icons/link.svg"), tr("D&ocusaurus"), mainWindow);
-    actionToolsDocusaurus->setStatusTip(tr("Build your web with MindForger's Markdown documents and Docusaurus..."));
+    actionToolsDocusaurus = new QAction(
+        QIcon(":/menu-icons/link.svg"), tr("D&ocusaurus"), mainWindow);
+    actionToolsDocusaurus->setStatusTip(
+        tr("Build your web with MindForger's Markdown documents and Docusaurus..."));
     menuTools->addAction(actionToolsDocusaurus);
 #endif
 
     // menu: help
 
-    actionHelpDocumentation = new QAction(QIcon(":/menu-icons/help.svg"), tr("&Documentation"), mainWindow);
+    actionHelpDocumentation = new QAction(
+        QIcon(":/menu-icons/help.svg"), tr("&Documentation"), mainWindow);
     actionHelpDocumentation->setShortcut(tr("F1"));
     actionHelpDocumentation->setStatusTip(tr("Open MindForger documentation"));
 
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index 0544e298..9952cb51 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -254,6 +254,7 @@ class MainMenuView : public QObject
     QAction* actionToolsWikipedia;
     QAction* actionToolsArxiv;
     QAction* actionToolsChatGpt;
+    QAction* actionToolsGramarly;
     QAction* actionToolsDuckDuckGo;
     QAction* actionToolsPandoc;
     QAction* actionToolsDocusaurus;
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index b03d9131..4d92fbae 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -45,7 +45,8 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
 
     // assemble presenters w/ UI
     statusBar = new StatusBarPresenter{view.getStatusBar(), mind};
-    mainMenu = new MainMenuPresenter{this}; view.getOrloj()->setMainMenu(mainMenu->getView());
+    mainMenu = new MainMenuPresenter{
+        this}; view.getOrloj()->setMainMenu(mainMenu->getView());
     cli = new CliAndBreadcrumbsPresenter{this, view.getCli(), mind};
     orloj = new OrlojPresenter{this, view.getOrloj(), mind};
 
@@ -53,14 +54,16 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
     newLibraryDialog = new AddLibraryDialog{&view};
     scopeDialog = new ScopeDialog{mind->getOntology(), &view};
     newOrganizerDialog = new OrganizerNewDialog{mind->getOntology(), &view};
-    newOutlineDialog = new OutlineNewDialog{QString::fromStdString(config.getMemoryPath()), mind->getOntology(), &view};
+    newOutlineDialog = new OutlineNewDialog{
+        QString::fromStdString(config.getMemoryPath()), mind->getOntology(), &view};
     newNoteDialog = new NoteNewDialog{mind->remind().getOntology(), &view};
     ftsDialog = new FtsDialog{&view};
     ftsDialogPresenter = new FtsDialogPresenter(ftsDialog, mind, orloj);
     findOutlineByNameDialog = new FindOutlineByNameDialog{&view};
     findThingByNameDialog = new FindOutlineByNameDialog{&view};
     findNoteByNameDialog = new FindNoteByNameDialog{&view};
-    findOutlineByTagDialog = new FindOutlineByTagDialog{mind->remind().getOntology(), &view};
+    findOutlineByTagDialog = new FindOutlineByTagDialog{
+        mind->remind().getOntology(), &view};
     findNoteByTagDialog = new FindNoteByTagDialog{mind->remind().getOntology(), &view};
     refactorNoteToOutlineDialog = new RefactorNoteToOutlineDialog{&view};
     configDialog = new ConfigurationDialog{&view};
@@ -92,26 +95,46 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
     handleMindPreferences();
 
     // wire signals
-    QObject::connect(newLibraryDialog->getCreateButton(), SIGNAL(clicked()), this, SLOT(handleNewLibrary()));
-    QObject::connect(scopeDialog->getSetButton(), SIGNAL(clicked()), this, SLOT(handleMindScope()));
-    QObject::connect(newOutlineDialog, SIGNAL(accepted()), this, SLOT(handleOutlineNew()));
-    QObject::connect(newNoteDialog, SIGNAL(accepted()), this, SLOT(handleNoteNew()));
-    QObject::connect(findOutlineByNameDialog, SIGNAL(searchFinished()), this, SLOT(handleFindOutlineByName()));
-    QObject::connect(findThingByNameDialog, SIGNAL(searchFinished()), this, SLOT(handleFindThingByName()));
-    QObject::connect(findNoteByNameDialog, SIGNAL(searchFinished()), this, SLOT(handleFindNoteByName()));
-    QObject::connect(findOutlineByTagDialog, SIGNAL(searchFinished()), this, SLOT(handleFindOutlineByTag()));
-    QObject::connect(findOutlineByTagDialog, SIGNAL(switchDialogs(bool)), this, SLOT(doSwitchFindByTagDialog(bool)));
-    QObject::connect(findNoteByTagDialog, SIGNAL(searchFinished()), this, SLOT(handleFindNoteByTag()));
-    QObject::connect(findNoteByTagDialog, SIGNAL(switchDialogs(bool)), this, SLOT(doSwitchFindByTagDialog(bool)));
-    QObject::connect(newOrganizerDialog, SIGNAL(createFinished()), this, SLOT(handleCreateOrganizer()));
-    QObject::connect(refactorNoteToOutlineDialog, SIGNAL(searchFinished()), this, SLOT(handleRefactorNoteToOutline()));
-    QObject::connect(insertImageDialog->getInsertButton(), SIGNAL(clicked()), this, SLOT(handleFormatImage()));
-    QObject::connect(insertLinkDialog->getInsertButton(), SIGNAL(clicked()), this, SLOT(handleFormatLink()));
-    QObject::connect(rowsAndDepthDialog->getGenerateButton(), SIGNAL(clicked()), this, SLOT(handleRowsAndDepth()));
-    QObject::connect(newRepositoryDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleMindNewRepository()));
-    QObject::connect(newFileDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleMindNewFile()));
-    QObject::connect(exportOutlineToHtmlDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleOutlineHtmlExport()));
-    QObject::connect(exportMemoryToCsvDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleMindCsvExport()));
+    QObject::connect(
+        newLibraryDialog->getCreateButton(), SIGNAL(clicked()), this, SLOT(handleNewLibrary()));
+    QObject::connect(
+        scopeDialog->getSetButton(), SIGNAL(clicked()), this, SLOT(handleMindScope()));
+    QObject::connect(
+        newOutlineDialog, SIGNAL(accepted()), this, SLOT(handleOutlineNew()));
+    QObject::connect(
+        newNoteDialog, SIGNAL(accepted()), this, SLOT(handleNoteNew()));
+    QObject::connect(
+        findOutlineByNameDialog, SIGNAL(searchFinished()), this, SLOT(handleFindOutlineByName()));
+    QObject::connect(
+        findThingByNameDialog, SIGNAL(searchFinished()), this, SLOT(handleFindThingByName()));
+    QObject::connect(
+        findNoteByNameDialog, SIGNAL(searchFinished()), this, SLOT(handleFindNoteByName()));
+    QObject::connect(
+        findOutlineByTagDialog, SIGNAL(searchFinished()), this, SLOT(handleFindOutlineByTag()));
+    QObject::connect(
+        findOutlineByTagDialog, SIGNAL(switchDialogs(bool)), this, SLOT(doSwitchFindByTagDialog(bool)));
+    QObject::connect(
+        findNoteByTagDialog, SIGNAL(searchFinished()), this, SLOT(handleFindNoteByTag()));
+    QObject::connect(
+        findNoteByTagDialog, SIGNAL(switchDialogs(bool)), this, SLOT(doSwitchFindByTagDialog(bool)));
+    QObject::connect(
+        newOrganizerDialog, SIGNAL(createFinished()), this, SLOT(handleCreateOrganizer()));
+    QObject::connect(
+        refactorNoteToOutlineDialog, SIGNAL(searchFinished()), this, SLOT(handleRefactorNoteToOutline()));
+    QObject::connect(
+        insertImageDialog->getInsertButton(), SIGNAL(clicked()), this, SLOT(handleFormatImage()));
+    QObject::connect(
+        insertLinkDialog->getInsertButton(), SIGNAL(clicked()), this, SLOT(handleFormatLink()));
+    QObject::connect(
+        rowsAndDepthDialog->getGenerateButton(), SIGNAL(clicked()), this, SLOT(handleRowsAndDepth()));
+    QObject::connect(
+        newRepositoryDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleMindNewRepository()));
+    QObject::connect(
+        newFileDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleMindNewFile()));
+    QObject::connect(
+        exportOutlineToHtmlDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleOutlineHtmlExport()));
+    QObject::connect(
+        exportMemoryToCsvDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleMindCsvExport()));
     QObject::connect(
         orloj->getDashboard()->getView()->getNavigatorDashboardlet(), SIGNAL(clickToSwitchFacet()),
         this, SLOT(doActionViewKnowledgeGraphNavigator())
@@ -3263,22 +3286,50 @@ void MainWindowPresenter::doActionOrganizerForget()
         choice = QMessageBox::question(
             &view,
             tr("Forget Organizer"),
-            tr("Do you really want to forget '") + QString::fromStdString(o->getName()) + tr("' Organizer?")
+            tr("Do you really want to forget '")
+                + QString::fromStdString(o->getName()) + tr("' Organizer?")
         );
         if (choice == QMessageBox::Yes) {
             config.getRepositoryConfiguration().removeOrganizer(o);
             getConfigRepresentation()->save(config);
-            orloj->showFacetOrganizerList(config.getRepositoryConfiguration().getOrganizers());
+            orloj->showFacetOrganizerList(
+                config.getRepositoryConfiguration().getOrganizers());
         } // else do nothing
     } else {
         QMessageBox::critical(
             &view,
             tr("Delete Organizer"),
-            tr("Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.")
+            tr(
+                "Eisenhower Matrix is built-in and cannot be deleted - only custom "
+                "organizers can.")
+        );
+    }
+}
+
+
+void MainWindowPresenter::doActionViewLimbo()
+{
+    if(config.getActiveRepository()->getMode()
+           ==Repository::RepositoryMode::REPOSITORY
+       && config.getActiveRepository()->getType()
+           ==Repository::RepositoryType::MINDFORGER
+    ) {
+        QString path{"file://"};
+        path.append(config.getLimboPath().c_str());
+        QDesktopServices::openUrl(QUrl{path});
+    } else {
+        QMessageBox::information(
+            &view,
+            tr("View Limbo"),
+            tr(
+                "Limbo directory with deleted Notebooks is available in "
+                "the MindForger workspace, not if a Markdown is edited or a directory "
+                "with markdowns is opened.")
         );
     }
 }
 
+
 void MainWindowPresenter::doActionToolsWikipedia()
 {
     QDesktopServices::openUrl(
@@ -3357,7 +3408,9 @@ void MainWindowPresenter::doActionHelpMathLivePreview()
 void MainWindowPresenter::doActionHelpMathQuickReference()
 {
     QDesktopServices::openUrl(
-        QUrl{"https://math.meta.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference"}
+        QUrl{
+            "https://math.meta.stackexchange.com/questions/5020"
+            "/mathjax-basic-tutorial-and-quick-reference"}
     );
 }
 
diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h
index b7e18c48..54f1857b 100644
--- a/app/src/qt/main_window_presenter.h
+++ b/app/src/qt/main_window_presenter.h
@@ -245,6 +245,7 @@ public slots:
     void doActionViewKnowledgeGraphNavigator();
     void doActionCli();
     void doActionViewTerminal();
+    void doActionViewLimbo();
     void doActionViewDistractionFree();
     void doActionViewFullscreen();
     // knowledge
diff --git a/build/Makefile b/build/Makefile
index 14783e87..6f4a4475 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -18,7 +18,7 @@
 
 .DEFAULT_GOAL := help
 
-MINDFORGER_VERSION := 1.55.0
+MINDFORGER_VERSION := 1.55.1
 MINDFORGER_RELEASE_BASE_DIR := /home/dvorka/p/mindforger/release
 MINDFORGER_RELEASE_DIR := $(MINDFORGER_RELEASE_BASE_DIR)/$(MINDFORGER_VERSION)-maker
 
@@ -105,6 +105,7 @@ l10n:
 ver-find:
 	cd .. && git grep "1\.55"
 
+
 test-lib: clean
 	cd make && ./test-lib-units.sh
 
diff --git a/build/debian/debian-aptly-add-deb.sh b/build/debian/debian-aptly-add-deb.sh
index c0ca3ca5..857777ad 100755
--- a/build/debian/debian-aptly-add-deb.sh
+++ b/build/debian/debian-aptly-add-deb.sh
@@ -32,7 +32,7 @@
 # See 'MindForger Release Guide#Debian and my PPA' notebook for detailed steps description...
 
 # .deb package to be added
-export NEW_VERSION_NAME="1.55.0"
+export NEW_VERSION_NAME="1.55.1"
 export NEW_RELEASE_NAME="mindforger_${NEW_VERSION_NAME}"
 export NEW_DEB_NAME="${NEW_RELEASE_NAME}-1_amd64.deb"
 # Debian release ~ aptly publish
diff --git a/lib/src/app_info.h b/lib/src/app_info.h
index 3c2697a0..cff0e94d 100644
--- a/lib/src/app_info.h
+++ b/lib/src/app_info.h
@@ -1,8 +1,8 @@
 #define MINDFORGER_VERSION_MAJOR "1"
 #define MINDFORGER_VERSION_MINOR "55"
-#define MINDFORGER_VERSION_REVISION "0"
-#define MINDFORGER_VERSION_STRING "1.55.0"
-#define MINDFORGER_VERSION_DWORD 1,55,0,2
+#define MINDFORGER_VERSION_REVISION "1"
+#define MINDFORGER_VERSION_STRING "1.55.1"
+#define MINDFORGER_VERSION_DWORD 1,55,1,2
 #define MINDFORGER_APP_NAME   "MindForger"
 #define MINDFORGER_APP_DESCRIPTION  "MindForger Thinking Notebook"
 #define MINDFORGER_APP_AUTHOR "Martin Dvorak"
diff --git a/lib/src/model/organizer.cpp b/lib/src/model/organizer.cpp
index bdca18bd..ddc104b0 100644
--- a/lib/src/model/organizer.cpp
+++ b/lib/src/model/organizer.cpp
@@ -23,7 +23,7 @@ using namespace std;
 namespace m8r {
 
 const string Organizer::TYPE_STR_KANBAN = string{"Kanban"};
-const string Organizer::TYPE_STR_EISENHOWER_MATRIX= string{"Eisenhower Matrix"};
+const string Organizer::TYPE_STR_EISENHOWER_MATRIX = string{"Eisenhower Matrix"};
 
 std::string Organizer::createOrganizerKey(
     const set& keys,
diff --git a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
index 9d084d77..74fa2113 100644
--- a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
+++ b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
@@ -40,11 +40,13 @@ constexpr const auto CONFIG_SETTING_ORG_SCOPE = "* Outline scope: ";
 
 using namespace std;
 
-MarkdownRepositoryConfigurationRepresentation::MarkdownRepositoryConfigurationRepresentation()
+MarkdownRepositoryConfigurationRepresentation
+    ::MarkdownRepositoryConfigurationRepresentation()
 {    
 }
 
-MarkdownRepositoryConfigurationRepresentation::~MarkdownRepositoryConfigurationRepresentation()
+MarkdownRepositoryConfigurationRepresentation
+    ::~MarkdownRepositoryConfigurationRepresentation()
 {
 }
 
@@ -72,7 +74,8 @@ void MarkdownRepositoryConfigurationRepresentation::repositoryConfiguration(
                 }
             }
 
-            // 1st section contains just description (post declared/trailing hashes are ignored as they are not needed on save)
+            // 1st section contains just description (post declared/trailing hashes
+            // are ignored as they are not needed on save)
         }
 
         // parse remaining sections as configuration
@@ -144,8 +147,9 @@ void MarkdownRepositoryConfigurationRepresentation::repositoryConfigurationSecti
  *
  * MD section is split using organizer name row(s).
  */
-void MarkdownRepositoryConfigurationRepresentation::repositoryConfigurationSectionOrganizers(
-    vector* body, Configuration& c
+void MarkdownRepositoryConfigurationRepresentation
+    ::repositoryConfigurationSectionOrganizers(
+        vector* body, Configuration& c
 ) {
     set keys{};
     if(body) {
@@ -165,7 +169,9 @@ void MarkdownRepositoryConfigurationRepresentation::repositoryConfigurationSecti
 
                     key.clear();
                 } else if(o && line->find(CONFIG_SETTING_ORG_TYPE) != std::string::npos) {
-                    if(Organizer::TYPE_STR_KANBAN == line->substr(strlen(CONFIG_SETTING_ORG_TYPE))) {
+                    if(Organizer::TYPE_STR_KANBAN
+                       == line->substr(strlen(CONFIG_SETTING_ORG_TYPE))
+                    ) {
                         delete o;
                         o = new Kanban(name);
                     }
@@ -221,10 +227,11 @@ void MarkdownRepositoryConfigurationRepresentation::repositoryConfigurationSecti
     }
 }
 
-Organizer* MarkdownRepositoryConfigurationRepresentation::repositoryConfigurationSectionOrganizerAdd(
-    Organizer* o,
-    set& keys,
-    Configuration& c
+Organizer* MarkdownRepositoryConfigurationRepresentation
+    ::repositoryConfigurationSectionOrganizerAdd(
+        Organizer* o,
+        set& keys,
+        Configuration& c
 ) {
     if(o) {
         // validate organizer integrity
@@ -321,32 +328,62 @@ string& MarkdownRepositoryConfigurationRepresentation::to(Configuration* c, stri
 
 bool MarkdownRepositoryConfigurationRepresentation::load(Configuration& c)
 {
-    MF_DEBUG("Loading repository configuration from: '" << c.getRepositoryConfigFilePath() << "'" << endl);
+    MF_DEBUG(
+        "Loading repository configuration from: '"
+        << c.getRepositoryConfigFilePath() << "'"
+        << endl);
     string file{c.getRepositoryConfigFilePath().c_str()};
     if(isFile(file.c_str())) {
         MarkdownDocument md{&file};
         md.from();
         vector* ast = md.moveAst();
         repositoryConfiguration(ast, c);
-        MF_DEBUG("  Loaded " << c.getRepositoryConfiguration().getOrganizers().size() << " Organizer(s)" << endl);
+        MF_DEBUG(
+            "  Loaded " << c.getRepositoryConfiguration().getOrganizers().size()
+            << " Organizer(s)"
+            << endl);
+        // validation: add built-in Eisenhower if it is missing
+        bool isOotbEm = false;
+        for(auto o:c.getRepositoryConfiguration().getOrganizers()) {
+            MF_DEBUG(
+                "    " << o->getName() <<
+                " (" << o->getOrganizerTypeAsStr() << ")" << endl
+            );
+            if(EisenhowerMatrix::isEisenhowMatrixOrganizer(o)) {
+                isOotbEm = true;
+            }
+        }
+        if(!isOotbEm) {
+            MF_DEBUG(
+                "Organizers: ADDING missing "
+                << Organizer::TYPE_STR_EISENHOWER_MATRIX << endl);
+            c.getRepositoryConfiguration().addOrganizer(
+                EisenhowerMatrix::createEisenhowMatrixOrganizer());
+            this->save(c);
+        }
+
         return true;
     } else {
         return false;
     }
 }
 
-void MarkdownRepositoryConfigurationRepresentation::save(const File* file, Configuration* c)
-{
+void MarkdownRepositoryConfigurationRepresentation::save(
+    const File* file, Configuration* c
+) {
     string md{};
     to(c,md);
 
     if(c) {
-        MF_DEBUG("Saving repository configuration to file " << c->getRepositoryConfigFilePath() << endl);
+        MF_DEBUG(
+            "Saving repository configuration to file "
+            << c->getRepositoryConfigFilePath() << endl);
         std::ofstream out(c->getRepositoryConfigFilePath());
         out << md;
         out.close();
     } else {
-        MF_DEBUG("Saving repository configuration to File " << file->getName() << endl);
+        MF_DEBUG(
+            "Saving repository configuration to File " << file->getName() << endl);
         std::ofstream out(file->getName());
         out << md;
         out.close();
diff --git a/lib/src/representations/markdown/markdown_repository_configuration_representation.h b/lib/src/representations/markdown/markdown_repository_configuration_representation.h
index a3415982..9caba46a 100644
--- a/lib/src/representations/markdown/markdown_repository_configuration_representation.h
+++ b/lib/src/representations/markdown/markdown_repository_configuration_representation.h
@@ -58,16 +58,21 @@ class MarkdownRepositoryConfigurationRepresentation : public RepositoryConfigura
 
 public:
     explicit MarkdownRepositoryConfigurationRepresentation();
-    MarkdownRepositoryConfigurationRepresentation(const MarkdownRepositoryConfigurationRepresentation&) = delete;
-    MarkdownRepositoryConfigurationRepresentation(const MarkdownRepositoryConfigurationRepresentation&&) = delete;
-    MarkdownRepositoryConfigurationRepresentation& operator =(const MarkdownRepositoryConfigurationRepresentation&) = delete;
-    MarkdownRepositoryConfigurationRepresentation& operator =(const MarkdownRepositoryConfigurationRepresentation&&) = delete;
+    MarkdownRepositoryConfigurationRepresentation(
+        const MarkdownRepositoryConfigurationRepresentation&) = delete;
+    MarkdownRepositoryConfigurationRepresentation(
+        const MarkdownRepositoryConfigurationRepresentation&&) = delete;
+    MarkdownRepositoryConfigurationRepresentation& operator =(
+        const MarkdownRepositoryConfigurationRepresentation&) = delete;
+    MarkdownRepositoryConfigurationRepresentation& operator =(
+        const MarkdownRepositoryConfigurationRepresentation&&) = delete;
     virtual ~MarkdownRepositoryConfigurationRepresentation();
 
     std::string* to(Configuration& c);
 
     /**
-     * @brief Load repository configuration from file and return true on success (file exists), otherwise return false.
+     * @brief Load repository configuration from file and return true on success
+     *        (file exists), otherwise return false.
      */
     virtual bool load(Configuration& c);
     /**
@@ -80,10 +85,14 @@ class MarkdownRepositoryConfigurationRepresentation : public RepositoryConfigura
     void save(const filesystem::File& file) { save(&file, nullptr); }
 
 private:
-    void repositoryConfiguration(std::vector* ast, Configuration& c);
-    void repositoryConfigurationSection(std::string* title, std::vector* body, Configuration& c);
-    void repositoryConfigurationSectionOrganizers(std::vector* body, Configuration& c);
-    Organizer* repositoryConfigurationSectionOrganizerAdd(Organizer* o, std::set& keys, Configuration& c);
+    void repositoryConfiguration(
+        std::vector* ast, Configuration& c);
+    void repositoryConfigurationSection(
+        std::string* title, std::vector* body, Configuration& c);
+    void repositoryConfigurationSectionOrganizers(
+        std::vector* body, Configuration& c);
+    Organizer* repositoryConfigurationSectionOrganizerAdd(
+        Organizer* o, std::set& keys, Configuration& c);
     std::string& to(Configuration* c, std::string& md);
     void save(const filesystem::File* file, Configuration* c);
 };

From 56bda86027beb6024c172c71b95dcacc2d187619 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 22 Jan 2023 17:58:17 +0100
Subject: [PATCH 035/131] Adding buttons for the presentation mode.

---
 app/src/qt/orloj_presenter.cpp                | 75 ++++++++++++++-----
 app/src/qt/outline_header_view_presenter.cpp  |  5 +-
 app/src/qt/outline_tree_presenter.cpp         |  5 +-
 app/src/qt/outline_tree_view.h                |  4 +-
 .../qt/widgets/view_to_edit_buttons_panel.cpp | 14 +++-
 .../qt/widgets/view_to_edit_buttons_panel.h   |  4 +
 6 files changed, 81 insertions(+), 26 deletions(-)

diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp
index 88dd09af..aa934f98 100644
--- a/app/src/qt/orloj_presenter.cpp
+++ b/app/src/qt/orloj_presenter.cpp
@@ -124,35 +124,74 @@ OrlojPresenter::OrlojPresenter(
 #endif
     // editor getting data from the backend
     QObject::connect(
-        view->getNoteEdit()->getNoteEditor(), SIGNAL(signalGetLinksForPattern(QString)),
-        this, SLOT(slotGetLinksForPattern(QString)));
+        view->getNoteEdit()->getNoteEditor(),
+            SIGNAL(signalGetLinksForPattern(QString)),
+        this,
+            SLOT(slotGetLinksForPattern(QString)));
     QObject::connect(
-        this, SIGNAL(signalLinksForPattern(QString, std::vector*)),
-        view->getNoteEdit()->getNoteEditor(), SLOT(slotPerformLinkCompletion(QString, std::vector*)));
+        this,
+            SIGNAL(signalLinksForPattern(QString, std::vector*)),
+        view->getNoteEdit()->getNoteEditor(),
+            SLOT(slotPerformLinkCompletion(QString, std::vector*)));
     QObject::connect(
-        view->getOutlineHeaderEdit()->getHeaderEditor(), SIGNAL(signalGetLinksForPattern(QString)),
-        this, SLOT(slotGetLinksForPattern(QString)));
+        view->getOutlineHeaderEdit()->getHeaderEditor(),
+            SIGNAL(signalGetLinksForPattern(QString)),
+        this,
+            SLOT(slotGetLinksForPattern(QString)));
     QObject::connect(
-        this, SIGNAL(signalLinksForHeaderPattern(QString, std::vector*)),
-        view->getOutlineHeaderEdit()->getHeaderEditor(), SLOT(slotPerformLinkCompletion(QString, std::vector*)));
+        this,
+            SIGNAL(signalLinksForHeaderPattern(QString, std::vector*)),
+        view->getOutlineHeaderEdit()->getHeaderEditor(),
+            SLOT(slotPerformLinkCompletion(QString, std::vector*)));
     QObject::connect(
-        outlineHeaderEditPresenter->getView()->getButtonsPanel(), SIGNAL(signalShowLivePreview()),
-        mainPresenter, SLOT(doActionToggleLiveNotePreview()));
+        outlineHeaderEditPresenter->getView()->getButtonsPanel(),
+            SIGNAL(signalShowLivePreview()),
+        mainPresenter,
+            SLOT(doActionToggleLiveNotePreview()));
     QObject::connect(
-        noteEditPresenter->getView()->getButtonsPanel(), SIGNAL(signalShowLivePreview()),
-        mainPresenter, SLOT(doActionToggleLiveNotePreview()));
+        noteEditPresenter->getView()->getButtonsPanel(),
+            SIGNAL(signalShowLivePreview()),
+        mainPresenter,
+            SLOT(doActionToggleLiveNotePreview()));
     // intercept Os table column sorting
     QObject::connect(
-        view->getOutlinesTable()->horizontalHeader(), SIGNAL(sectionClicked(int)),
-        this, SLOT(slotOutlinesTableSorted(int)));
+        view->getOutlinesTable()->horizontalHeader(),
+            SIGNAL(sectionClicked(int)),
+        this,
+            SLOT(slotOutlinesTableSorted(int)));
     // toggle full O HTML preview
     QObject::connect(
-        view->getOutlineHeaderView()->getEditPanel()->getFullOPreviewButton(), SIGNAL(clicked()),
-        this, SLOT(slotToggleFullOutlinePreview()));
+        view->getOutlineHeaderView()->getEditPanel()->getFullOPreviewButton(),
+            SIGNAL(clicked()),
+        this,
+            SLOT(slotToggleFullOutlinePreview()));
+    // ^ and v @ O header/N view panel
+    QObject::connect(
+        view->getOutlineHeaderView()->getEditPanel()->getNextNoteButton(),
+            SIGNAL(clicked()),
+        outlineViewPresenter->getOutlineTree(),
+            SLOT(slotSelectPreviousRow()));
+    QObject::connect(
+        view->getOutlineHeaderView()->getEditPanel()->getLastNoteButton(),
+            SIGNAL(clicked()),
+        outlineViewPresenter->getOutlineTree(),
+            SLOT(slotSelectNextRow()));
+    QObject::connect(
+        view->getNoteView()->getButtonsPanel()->getNextNoteButton(),
+            SIGNAL(clicked()),
+        outlineViewPresenter->getOutlineTree(),
+            SLOT(slotSelectPreviousRow()));
+    QObject::connect(
+        view->getNoteView()->getButtonsPanel()->getLastNoteButton(),
+            SIGNAL(clicked()),
+        outlineViewPresenter->getOutlineTree(),
+            SLOT(slotSelectNextRow()));
     // show O header @ N
     QObject::connect(
-        view->getNoteView()->getButtonsPanel()->getShowOutlineHeaderButton(), SIGNAL(clicked()),
-        this, SLOT(slotShowOutlineHeader()));
+        view->getNoteView()->getButtonsPanel()->getShowOutlineHeaderButton(),
+            SIGNAL(clicked()),
+        this,
+            SLOT(slotShowOutlineHeader()));
 }
 
 int dialogSaveOrCancel()
diff --git a/app/src/qt/outline_header_view_presenter.cpp b/app/src/qt/outline_header_view_presenter.cpp
index 948c2670..d12f8ea2 100644
--- a/app/src/qt/outline_header_view_presenter.cpp
+++ b/app/src/qt/outline_header_view_presenter.cpp
@@ -156,8 +156,9 @@ void OutlineHeaderViewPresenter::slotEditOutlineHeaderDoubleClick()
     }
 }
 
-void OutlineHeaderViewPresenter::slotRefreshHeaderLeaderboardByValue(AssociatedNotes* associations)
-{
+void OutlineHeaderViewPresenter::slotRefreshHeaderLeaderboardByValue(
+    AssociatedNotes* associations
+) {
     if(orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE_HEADER)
          ||
        orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE)
diff --git a/app/src/qt/outline_tree_presenter.cpp b/app/src/qt/outline_tree_presenter.cpp
index 239d7ad5..8db88e91 100644
--- a/app/src/qt/outline_tree_presenter.cpp
+++ b/app/src/qt/outline_tree_presenter.cpp
@@ -22,8 +22,9 @@ namespace m8r {
 
 using namespace std;
 
-OutlineTreePresenter::OutlineTreePresenter(OutlineTreeView* view, MainWindowPresenter* mwp, QObject* parent)
-    : QObject(parent)
+OutlineTreePresenter::OutlineTreePresenter(
+    OutlineTreeView* view, MainWindowPresenter* mwp, QObject* parent
+) : QObject(parent)
 {
     this->view = view;
     this->model = new OutlineTreeModel{view, mwp->getHtmlRepresentation()};
diff --git a/app/src/qt/outline_tree_view.h b/app/src/qt/outline_tree_view.h
index 18dcdec6..3af50fc4 100644
--- a/app/src/qt/outline_tree_view.h
+++ b/app/src/qt/outline_tree_view.h
@@ -84,7 +84,9 @@ class OutlineTreeView : public QTableView
     virtual void keyPressEvent(QKeyEvent* event) override;
     virtual void mouseDoubleClickEvent(QMouseEvent* event) override;
     virtual void resizeEvent(QResizeEvent* event) override;
-    void refreshNotes(const QModelIndex& from, const QModelIndex& to) { dataChanged(from, to); }
+    void refreshNotes(const QModelIndex& from, const QModelIndex& to) {
+        dataChanged(from, to);
+    }
 
 signals:
     void signalOutlineShow();
diff --git a/app/src/qt/widgets/view_to_edit_buttons_panel.cpp b/app/src/qt/widgets/view_to_edit_buttons_panel.cpp
index ad5765fa..38e2ffc8 100644
--- a/app/src/qt/widgets/view_to_edit_buttons_panel.cpp
+++ b/app/src/qt/widgets/view_to_edit_buttons_panel.cpp
@@ -22,8 +22,9 @@ namespace m8r {
 
 using namespace std;
 
-ViewToEditEditButtonsPanel::ViewToEditEditButtonsPanel(MfWidgetMode mode, QWidget* parent)
-    : QWidget(parent),
+ViewToEditEditButtonsPanel::ViewToEditEditButtonsPanel(
+    MfWidgetMode mode, QWidget* parent
+) : QWidget(parent),
       mode(mode)
 {
     layout = new QHBoxLayout{this};
@@ -51,7 +52,8 @@ ViewToEditEditButtonsPanel::ViewToEditEditButtonsPanel(MfWidgetMode mode, QWidge
 
     if(MfWidgetMode::OUTLINE_MODE == mode) {
 #ifdef __APPLE__
-        toggleFullOPreviewButton = new QPushButton{tr("Full / Header Notebook Preview"), this};
+        toggleFullOPreviewButton = new QPushButton{
+            tr("Full / Header Notebook Preview"), this};
         // IMPROVE editButton->setToolTip("⌘+P");
 #else
         toggleFullOPreviewButton = new QPushButton{tr("Whole Notebook &Preview"), this};
@@ -62,6 +64,12 @@ ViewToEditEditButtonsPanel::ViewToEditEditButtonsPanel(MfWidgetMode mode, QWidge
 
         layout->addWidget(toggleFullOPreviewButton);
     }
+
+    lastNoteButton = new QPushButton{"↓", this};
+    layout->addWidget(lastNoteButton);
+    nextNoteButton = new QPushButton{"↑", this};
+    layout->addWidget(nextNoteButton);
+
     layout->addWidget(editButton);
 
     setLayout(layout);
diff --git a/app/src/qt/widgets/view_to_edit_buttons_panel.h b/app/src/qt/widgets/view_to_edit_buttons_panel.h
index 360efc37..6577be28 100644
--- a/app/src/qt/widgets/view_to_edit_buttons_panel.h
+++ b/app/src/qt/widgets/view_to_edit_buttons_panel.h
@@ -36,6 +36,8 @@ class ViewToEditEditButtonsPanel : public QWidget
     QPushButton* showOutlineHeaderButton;
     QPushButton* editButton;
     QPushButton* toggleFullOPreviewButton;
+    QPushButton* nextNoteButton;
+    QPushButton* lastNoteButton;
 
     // expert mode (no buttons) setting @ frontend
     bool expertMode;
@@ -55,6 +57,8 @@ class ViewToEditEditButtonsPanel : public QWidget
     QPushButton* getShowOutlineHeaderButton() const { return showOutlineHeaderButton; }
     QPushButton* getEditButton() const { return editButton; }
     QPushButton* getFullOPreviewButton() const { return toggleFullOPreviewButton; }
+    QPushButton* getNextNoteButton() const { return nextNoteButton; }
+    QPushButton* getLastNoteButton() const { return lastNoteButton; }
 };
 
 }

From 8fa79c9edc0594d54f0b4ff4a3cbd02faeefd077 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 22 Jan 2023 17:58:35 +0100
Subject: [PATCH 036/131] Adding buttons for the presentation mode.

---
 lib/src/config/configuration.cpp                                | 2 +-
 lib/src/model/eisenhower_matrix.cpp                             | 2 +-
 lib/src/model/eisenhower_matrix.h                               | 2 +-
 .../markdown_repository_configuration_representation.cpp        | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/src/config/configuration.cpp b/lib/src/config/configuration.cpp
index f1b99d54..b341a268 100644
--- a/lib/src/config/configuration.cpp
+++ b/lib/src/config/configuration.cpp
@@ -286,7 +286,7 @@ void Configuration::setActiveRepository(
                 limboPath+=DIRNAME_LIMBO;
 
                 // setting ACTIVE repository means that repository SPECIFIC configuration must be loaded
-                this->initRepositoryConfiguration(EisenhowerMatrix::createEisenhowMatrixOrganizer());
+                this->initRepositoryConfiguration(EisenhowerMatrix::createEisenhowerMatrixOrganizer());
                 persistence.load(*this);
             } else {
                 this->clearRepositoryConfiguration();
diff --git a/lib/src/model/eisenhower_matrix.cpp b/lib/src/model/eisenhower_matrix.cpp
index 5cae4569..25835e21 100644
--- a/lib/src/model/eisenhower_matrix.cpp
+++ b/lib/src/model/eisenhower_matrix.cpp
@@ -63,7 +63,7 @@ const string EisenhowerMatrix::getSortByAsStr() {
     }
 }
 
-EisenhowerMatrix* EisenhowerMatrix::createEisenhowMatrixOrganizer() {
+EisenhowerMatrix* EisenhowerMatrix::createEisenhowerMatrixOrganizer() {
     EisenhowerMatrix* eisenhowerMatrixOrganizer = new EisenhowerMatrix(
         "Eisenhower Matrix"
     );
diff --git a/lib/src/model/eisenhower_matrix.h b/lib/src/model/eisenhower_matrix.h
index c9370037..86562988 100644
--- a/lib/src/model/eisenhower_matrix.h
+++ b/lib/src/model/eisenhower_matrix.h
@@ -42,7 +42,7 @@ class EisenhowerMatrix : public Organizer
 
     static std::string createEisenhowerMatrixKey();
 
-    static EisenhowerMatrix* createEisenhowMatrixOrganizer();
+    static EisenhowerMatrix* createEisenhowerMatrixOrganizer();
     static bool isEisenhowMatrixOrganizer(Organizer* o);
 
 public:
diff --git a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
index 74fa2113..b41dd6c3 100644
--- a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
+++ b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp
@@ -358,7 +358,7 @@ bool MarkdownRepositoryConfigurationRepresentation::load(Configuration& c)
                 "Organizers: ADDING missing "
                 << Organizer::TYPE_STR_EISENHOWER_MATRIX << endl);
             c.getRepositoryConfiguration().addOrganizer(
-                EisenhowerMatrix::createEisenhowMatrixOrganizer());
+                EisenhowerMatrix::createEisenhowerMatrixOrganizer());
             this->save(c);
         }
 

From 1cff1032f6a50064e3529e29e26359e53bfe6fe6 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 22 Jan 2023 18:00:04 +0100
Subject: [PATCH 037/131] Updating changelog.

---
 Changelog | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/Changelog b/Changelog
index b936bd00..2bb7e328 100644
--- a/Changelog
+++ b/Changelog
@@ -1,9 +1,10 @@
-2023-01-22  Martin Dvorak  
+2023-01-??  Martin Dvorak  
 
     * Released v1.55.1 - Limbo added to the application menu View/Limbo,
       polished Preferences (Appearance refactored to Controls; restart requirement
       highlighted), missing OOTB Eisenhower Matrix is automatically added back
-      to the list of Organizers.
+      to the list of Organizers, up/down button in O/N preview mode to move around
+      O's Ns while presenting a N.
 
 2023-01-15  Martin Dvorak  
 

From 06328dde7b78c23f5b64dc325a014b71de162e62 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 22 Jan 2023 23:45:36 +0100
Subject: [PATCH 038/131] WIP snap.

---
 .gitignore                |  1 +
 build/Makefile            |  9 +++++
 build/snap/snapcraft.yaml | 80 +++++++++++++++++++++++++++++++--------
 3 files changed, 74 insertions(+), 16 deletions(-)

diff --git a/.gitignore b/.gitignore
index 49833601..2652feae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,4 @@ compile_commands.json
 deps/cmark-gfm
 deps/mitie
 deps/cmark-gfm
+snapcraft.yaml
diff --git a/build/Makefile b/build/Makefile
index 6f4a4475..856dc464 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -49,6 +49,7 @@ help:
 	@echo "dist-dmg          build macOS Disk iMaGe .dmg package"
 	@echo "dist-debian-ppa   add .deb to aptly PPA"
 	@echo "dist-ubuntu-deb   locally build .deb for any Ubuntu version:"
+	@echo "dist-snap         build snap distro for snapcraft.io"
 	@echo "                  DISTRO=focal"
 	@echo "statistic         show source code statistic"
 	@echo "doc-to-wiki       mindforger-documentation to mindforger.wiki"
@@ -166,6 +167,14 @@ dist-ubuntu-deb:
 	false
 
 
+.PHONY: dist-snap
+dist-snap:
+	@echo "Building Snap ..."
+	echo "cd .. && make clean && cd build"
+	echo "cp -vf snap/snapcraft.yaml .. && cd .. && snapcraft clean && snapcraft --debug"
+	cp -vf snap/snapcraft.yaml .. && cd .. && snapcraft --debug
+
+
 .PHONY: dist-all-clean
 dist-all-clean:
 	rm -rvf $(MINDFORGER_RELEASE_DIR)
diff --git a/build/snap/snapcraft.yaml b/build/snap/snapcraft.yaml
index 675aa21e..726989a7 100644
--- a/build/snap/snapcraft.yaml
+++ b/build/snap/snapcraft.yaml
@@ -1,26 +1,74 @@
 name: mindforger
 base: core18 # the base snap is the execution environment for this snap: core18 (18.04), core20 (20.04)
-version: '1.55.0' # just for humans, typically '1.2+git' or '1.3.2'
+version: '1.55.1' # just for humans, typically '1.2+git' or '1.3.2'
 summary: Thinking notebook and Markdown editor
 description: |
-  Get as much as possible from your remarks.
+   Search, browse, view and edit your Markdown files. Get as much
+   as possible from the knowledge in your remarks.
 
 grade: devel # must be 'stable' to release into candidate/stable channels: devel, stable
 confinement: devmode # use 'strict' once you have the right plugs and slots: strict, devmode, classic
-
-apps:
-  mindforger:
-    common-id: com.mindforger
-    command: mindforger
-    plugs:
-      home
-      network
+architectures:
+  - build-on: amd64
 
 parts:
-  application:
-    plugin: qmake  # see 'snapcraft plugins'
-    source: ../../..
+  mindforger:
+    plugin: qmake
+    source: .  # snapcraft.yaml is copied to project root to simplify the build // might be GH .git URL
+    qt-version: qt5
     build-packages:
-	- qtbase5-dev
-	- libqt5webkit5-dev
-	- libhunspell-dev
+      - libx11-xcb1  # fixes could not find or load the Qt platform plugin "xcb" in ""
+      - zlib1g-dev
+      - ccache
+      - libhunspell-dev
+      - build-essential
+      - qtbase5-dev
+      - qt5-qmake
+      - libqt5webkit5-dev  # WebKit is used @ Linux, WebEngine @ macOS/Win
+    stage-packages:  # suggested by snapcraft --v
+      - libx11-xcb1  # TODO fixes could not find or load the Qt platform plugin "xcb" in ""
+      - libbrotli1  
+      - libdouble-conversion1
+      - libfreetype6
+      - libgl1
+      - libglvnd0
+      - libglx0
+      - libgraphite2-3
+      - libgstreamer-plugins-base1.0-0
+      - libgstreamer1.0-0
+      - libharfbuzz0b
+      - libhunspell-1.6-0
+      - libhyphen0
+      - libicu60
+      - libjpeg-turbo8
+      - liborc-0.4-0
+      - libpng16-16
+      - libqt5core5a
+      - libqt5gui5
+      - libqt5network5
+      - libqt5positioning5
+      - libqt5printsupport5
+      - libqt5qml5
+      - libqt5quick5
+      - libqt5sensors5
+      - libqt5webchannel5
+      - libqt5webkit5
+      - libqt5widgets5
+      - libwebp6
+      - libwoff1
+      - libx11-6
+      - libxau6
+      - libxcb1
+      - libxdmcp6
+      - libxml2
+      - libxslt1.1
+    options:
+      - -r
+      - "CONFIG+=mfdebug"
+
+apps:
+  mindforger:
+    command: bin/mindforger
+    environment:
+      QT_QPA_PLATFORM_PLUGIN_PATH: /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms  # fixes xcb failure
+    plugs: [home, network]

From 2b19eb4d18a5c0414bb8e176297f5323f51417d8 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Mon, 23 Jan 2023 09:04:53 +0100
Subject: [PATCH 039/131] Snap WIP: MF starts, but there are no fonts/empty
 menus #100

---
 .gitignore                |  1 +
 build/Makefile            | 12 ++++++++++--
 build/snap/snapcraft.yaml | 14 +++++++++-----
 3 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/.gitignore b/.gitignore
index 2652feae..0cf7c6da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,4 @@ deps/cmark-gfm
 deps/mitie
 deps/cmark-gfm
 snapcraft.yaml
+*.snap
diff --git a/build/Makefile b/build/Makefile
index 856dc464..0ecdeb51 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -97,6 +97,9 @@ build-ci: clean
 	ls -al ../app/mindforger
 
 
+# TODO build-cmark-gfm
+
+
 .PHONY: l10n
 l10n:
 	cd make && ./l10n-update-strings.sh && ./l10n-edit-and-release.sh $(MF_LANG)
@@ -170,8 +173,13 @@ dist-ubuntu-deb:
 .PHONY: dist-snap
 dist-snap:
 	@echo "Building Snap ..."
-	echo "cd .. && make clean && cd build"
-	echo "cp -vf snap/snapcraft.yaml .. && cd .. && snapcraft clean && snapcraft --debug"
+	cd .. && make clean && cd build
+	cp -vf snap/snapcraft.yaml .. && cd .. && snapcraft clean && snapcraft --debug
+
+
+.PHONY: dist-wip
+dist-snap-wip:  # debug Snap build w/o clean up, but w/ incremental build
+	@echo "Building Snap ..."
 	cp -vf snap/snapcraft.yaml .. && cd .. && snapcraft --debug
 
 
diff --git a/build/snap/snapcraft.yaml b/build/snap/snapcraft.yaml
index 726989a7..bbe3af57 100644
--- a/build/snap/snapcraft.yaml
+++ b/build/snap/snapcraft.yaml
@@ -4,7 +4,8 @@ version: '1.55.1' # just for humans, typically '1.2+git' or '1.3.2'
 summary: Thinking notebook and Markdown editor
 description: |
    Search, browse, view and edit your Markdown files. Get as much
-   as possible from the knowledge in your remarks.
+   as possible from the knowledge in your remarks with associations,
+   auto linking and powerful search options.
 
 grade: devel # must be 'stable' to release into candidate/stable channels: devel, stable
 confinement: devmode # use 'strict' once you have the right plugs and slots: strict, devmode, classic
@@ -14,7 +15,7 @@ architectures:
 parts:
   mindforger:
     plugin: qmake
-    source: .  # snapcraft.yaml is copied to project root to simplify the build // might be GH .git URL
+    source: .  # . or git@github.com:dvorka/mindforger.git
     qt-version: qt5
     build-packages:
       - libx11-xcb1  # fixes could not find or load the Qt platform plugin "xcb" in ""
@@ -25,9 +26,9 @@ parts:
       - qtbase5-dev
       - qt5-qmake
       - libqt5webkit5-dev  # WebKit is used @ Linux, WebEngine @ macOS/Win
-    stage-packages:  # suggested by snapcraft --v
+    stage-packages:  # suggested by snapcraft build
       - libx11-xcb1  # TODO fixes could not find or load the Qt platform plugin "xcb" in ""
-      - libbrotli1  
+      - libbrotli1
       - libdouble-conversion1
       - libfreetype6
       - libgl1
@@ -70,5 +71,8 @@ apps:
   mindforger:
     command: bin/mindforger
     environment:
-      QT_QPA_PLATFORM_PLUGIN_PATH: /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms  # fixes xcb failure
+      LD_LIBRARY_PATH: /usr/lib/x86_64-linux-gnu:${SNAP}/usr/lib/${SNAPCRAFT_ARCH_TRIPLET}/qt5/plugins/platforms  # add path to dir w/ libqxcb.so
+      QT_DEBUG_PLUGINS: 1
+      QT_PLUGIN_PATH: ${SNAP}/usr/lib/${SNAPCRAFT_ARCH_TRIPLET}/qt5/plugins
+      QT_QPA_PLATFORM_PLUGIN_PATH: ${SNAP}/usr/lib/${SNAPCRAFT_ARCH_TRIPLET}/qt5/plugins  # Qt's plugins dir to fix xcb failure
     plugs: [home, network]

From 3e6a1a36c5af704d63107db73110fd05d59c2edb Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Mon, 23 Jan 2023 21:28:23 +0100
Subject: [PATCH 040/131] WIP snap font configuration #100

---
 build/snap/snapcraft.yaml | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/build/snap/snapcraft.yaml b/build/snap/snapcraft.yaml
index bbe3af57..6063b7e6 100644
--- a/build/snap/snapcraft.yaml
+++ b/build/snap/snapcraft.yaml
@@ -26,8 +26,9 @@ parts:
       - qtbase5-dev
       - qt5-qmake
       - libqt5webkit5-dev  # WebKit is used @ Linux, WebEngine @ macOS/Win
+      - ttf-ubuntu-font-family  # w/o fonts there are no menus/text in UI
+      - libvoikko-dev  # reported as missing in the start-up log
     stage-packages:  # suggested by snapcraft build
-      - libx11-xcb1  # TODO fixes could not find or load the Qt platform plugin "xcb" in ""
       - libbrotli1
       - libdouble-conversion1
       - libfreetype6
@@ -71,8 +72,12 @@ apps:
   mindforger:
     command: bin/mindforger
     environment:
-      LD_LIBRARY_PATH: /usr/lib/x86_64-linux-gnu:${SNAP}/usr/lib/${SNAPCRAFT_ARCH_TRIPLET}/qt5/plugins/platforms  # add path to dir w/ libqxcb.so
       QT_DEBUG_PLUGINS: 1
+      # # Qt's xcb plugin (X11 vs. Wayland) configuration
+      LD_LIBRARY_PATH: /usr/lib/x86_64-linux-gnu:${SNAP}/usr/lib/${SNAPCRAFT_ARCH_TRIPLET}/qt5/plugins/platforms  # add path to dir w/ libqxcb.so
       QT_PLUGIN_PATH: ${SNAP}/usr/lib/${SNAPCRAFT_ARCH_TRIPLET}/qt5/plugins
-      QT_QPA_PLATFORM_PLUGIN_PATH: ${SNAP}/usr/lib/${SNAPCRAFT_ARCH_TRIPLET}/qt5/plugins  # Qt's plugins dir to fix xcb failure
+      QT_QPA_PLATFORM_PLUGIN_PATH: ${SNAP}/usr/lib/${SNAPCRAFT_ARCH_TRIPLET}/qt5/plugins
+      # font configuration
+      FONTCONFIG_PATH: ${SNAP}/etc/fonts/conf.d
+      FONTCONFIG_FILE: ${SNAP}/etc/fonts/fonts.conf
     plugs: [home, network]

From d29618577920cb430bfc5ffa4976422ea27454a6 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Mon, 23 Jan 2023 21:56:29 +0100
Subject: [PATCH 041/131] Removing .sh script.

---
 build/snap/make-snap.sh | 5 -----
 1 file changed, 5 deletions(-)
 delete mode 100755 build/snap/make-snap.sh

diff --git a/build/snap/make-snap.sh b/build/snap/make-snap.sh
deleted file mode 100755
index 43820545..00000000
--- a/build/snap/make-snap.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-
-cd ../.. && cp -vf build/snap/snapcraft.yaml . && snapcraft --debug
-
-# eof

From 2bffff14183766f2c54e87325e0f17ea9ef4ea63 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Mon, 27 Feb 2023 08:33:41 +0100
Subject: [PATCH 042/131] WIP library indexation.

---
 app/src/qt/dialogs/add_library_dialog.cpp     | 22 +++++--
 app/src/qt/dialogs/insert_image_dialog.cpp    | 11 ++--
 .../refactor_note_to_outline_dialog.cpp       |  2 +-
 app/src/qt/main_menu_view.cpp                 | 61 +++++++++++++------
 app/src/qt/main_menu_view.h                   |  1 +
 app/src/qt/main_window_presenter.cpp          |  3 +-
 build/Makefile                                |  8 +--
 lib/src/mind/dikw/filesystem_information.cpp  | 28 ++++++---
 .../markdown_document_representation.cpp      | 10 +--
 .../repository-configuration.md               | 11 ++++
 .../repository-configuration.md               | 11 ++++
 .../repository-configuration.md               | 11 ++++
 .../repository-configuration.md               | 11 ++++
 13 files changed, 142 insertions(+), 48 deletions(-)

diff --git a/app/src/qt/dialogs/add_library_dialog.cpp b/app/src/qt/dialogs/add_library_dialog.cpp
index 4b126253..0076db5f 100644
--- a/app/src/qt/dialogs/add_library_dialog.cpp
+++ b/app/src/qt/dialogs/add_library_dialog.cpp
@@ -26,7 +26,14 @@ AddLibraryDialog::AddLibraryDialog(QWidget* parent)
     : QDialog(parent)
 {
     // widgets
-    findLibrarySourceLabel = new QLabel{tr("Choose and find library source:"), parent};
+    findLibrarySourceLabel = new QLabel{
+        tr(
+            "Choose a directory (library) of PDF files to be indexed. MindForger\n"
+            "will create new notebook for every library file. Such notebook can be\n"
+            "used to easily open the library file and create library file related\n"
+            "notes and annotatioons.\n\n"
+            "Choose new library source:"),
+        parent};
     findDirectoryButton = new QPushButton{tr("Directory")};
 
     libraryNameLabel = new QLabel{tr("Library name:"), parent};
@@ -44,8 +51,12 @@ AddLibraryDialog::AddLibraryDialog(QWidget* parent)
     closeButton = new QPushButton{tr("&Cancel")};
 
     // signals
-    QObject::connect(findDirectoryButton, SIGNAL(clicked()), this, SLOT(handleFindDirectory()));
-    QObject::connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
+    QObject::connect(
+        findDirectoryButton, SIGNAL(clicked()),
+        this, SLOT(handleFindDirectory()));
+    QObject::connect(
+        closeButton, SIGNAL(clicked()),
+        this, SLOT(close()));
 
     // assembly
     QVBoxLayout* mainLayout = new QVBoxLayout{};
@@ -87,7 +98,10 @@ void AddLibraryDialog::show()
 void AddLibraryDialog::handleFindDirectory()
 {
     QString homeDirectory
-        = QStandardPaths::locate(QStandardPaths::HomeLocation, QString(), QStandardPaths::LocateDirectory);
+        = QStandardPaths::locate(
+            QStandardPaths::HomeLocation,
+            QString(),
+            QStandardPaths::LocateDirectory);
 
     QFileDialog fileDialog{this};
     fileDialog.setWindowTitle(tr("Choose Directory"));
diff --git a/app/src/qt/dialogs/insert_image_dialog.cpp b/app/src/qt/dialogs/insert_image_dialog.cpp
index 124ea21d..70e9033d 100644
--- a/app/src/qt/dialogs/insert_image_dialog.cpp
+++ b/app/src/qt/dialogs/insert_image_dialog.cpp
@@ -45,14 +45,14 @@ InsertImageDialog::InsertImageDialog(QWidget* parent)
 
     // assembly
     QVBoxLayout* mainLayout = new QVBoxLayout{};
-    mainLayout->addWidget(alternateTextLabel);
-    mainLayout->addWidget(alternateTextEdit);
-    mainLayout->addWidget(pathLabel);
-    mainLayout->addWidget(pathEdit);
     QHBoxLayout* srcButtonLayout = new QHBoxLayout{};
     srcButtonLayout->addWidget(findFileButton);
     srcButtonLayout->addStretch();
     mainLayout->addLayout(srcButtonLayout);
+    mainLayout->addWidget(alternateTextLabel);
+    mainLayout->addWidget(alternateTextEdit);
+    mainLayout->addWidget(pathLabel);
+    mainLayout->addWidget(pathEdit);
     mainLayout->addWidget(copyToRepoCheckBox);
 
     QHBoxLayout* buttonLayout = new QHBoxLayout{};
@@ -77,8 +77,7 @@ InsertImageDialog::~InsertImageDialog()
 void InsertImageDialog::show()
 {
     alternateTextEdit->setText(tr("Image"));
-    alternateTextEdit->selectAll();
-    alternateTextEdit->setFocus();
+    findFileButton->setFocus();
     pathEdit->clear();
 
     QDialog::show();
diff --git a/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp b/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp
index 531279cb..eec1c092 100644
--- a/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp
+++ b/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp
@@ -26,7 +26,7 @@ RefactorNoteToOutlineDialog::RefactorNoteToOutlineDialog(QWidget *parent)
     findButton->setText(tr("Refactor"));
 
     // dialog
-    setWindowTitle(tr("Refactor Note to Notebook"));
+    setWindowTitle(tr("Move Note to Notebook"));
 }
 
 RefactorNoteToOutlineDialog::~RefactorNoteToOutlineDialog()
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index ba78b78e..00441e73 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -401,17 +401,33 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
 
     // menu: library
 #ifdef MF_WIP
-    menuLibrary = qMenuBar->addMenu(tr("Libr&ary"));
-
-    actionLibraryAdd = new QAction(QIcon(":/menu-icons/new.svg"), tr("&Add library"), mainWindow);
-    actionLibraryAdd->setStatusTip(tr("Add directory with documents, URL or other resource to library..."));
+    menuLibrary = qMenuBar->addMenu(tr("Lib&rary"));
+
+    actionLibraryAdd = new QAction(
+        QIcon(":/menu-icons/new.svg"), tr("&New library"), mainWindow);
+    actionLibraryAdd->setStatusTip(
+        tr("Add directory with documents, URL or other library resource..."));
+
+    // choose library > determine library src directory > re-index src directory
+    // show side-by-side comparison: ONLY in src / ACTION <.del> / ONLY in MF
+    // - includes synchronization in one on another direction
+    // - decisions executed AFTER user clicks DO IT button (not while editing dialog)
+    actionLibrarySync= new QAction(
+        QIcon(":/menu-icons/new.svg"), tr("&Synchronize library"), mainWindow);
+    actionLibrarySync->setStatusTip(
+        tr(
+            "Synchronize library source with MindForger notebook(s) which represent"
+            "library resources..."));
 
-    actionLibraryDeprecate = new QAction(QIcon(":/menu-icons/delete.svg"), tr("&Deprecate library"), mainWindow);
-    actionLibraryDeprecate->setStatusTip(tr("Move a library resource with documents to limbo..."));
+    actionLibraryDeprecate = new QAction(
+        QIcon(":/menu-icons/delete.svg"), tr("&Deprecate library"), mainWindow);
+    actionLibraryDeprecate->setStatusTip(tr(
+        "Move a library resource with documents to limbo..."));
     actionLibraryDeprecate->setDisabled(true);
 
     menuLibrary->addAction(actionLibraryAdd);
-    // menuLibrary->addAction(actionLibraryDeprecate);
+    menuLibrary->addAction(actionLibrarySync);
+    menuLibrary->addAction(actionLibraryDeprecate);
 #endif
 
     // menu: flashcards
@@ -610,28 +626,35 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionNoteDemote = new QAction(QIcon(":/menu-icons/right.svg"), tr("&Demote\tCtrl+Right"), mainWindow);
     actionNoteDemote->setStatusTip(tr("Demote Note"));
 
-    actionNoteFirst = new QAction(QIcon(":/menu-icons/top.svg"), tr("F&irst\tCtrl+Shift+Up"), mainWindow);
-    actionNoteFirst->setStatusTip(tr("Move Note to be the first child of its parent"));
+    actionNoteFirst = new QAction(
+        QIcon(":/menu-icons/top.svg"), tr("Move to F&irst\tCtrl+Shift+Up"),
+        mainWindow);
+    actionNoteFirst->setStatusTip(tr("Move the Note to be the first child of its parent"));
 
-    actionNoteUp = new QAction(QIcon(":/menu-icons/up.svg"), tr("&Up\tCtrl+Up"), mainWindow);
-    actionNoteUp->setStatusTip(tr("Move Note up"));
+    actionNoteUp = new QAction(
+        QIcon(":/menu-icons/up.svg"), tr("Move &Up\tCtrl+Up"), mainWindow);
+    actionNoteUp->setStatusTip(tr("Move the Note up"));
 
-    actionNoteDown = new QAction(QIcon(":/menu-icons/down.svg"), tr("Do&wn\tCtrl+Down"), mainWindow);
-    actionNoteDown->setStatusTip(tr("Move Note down"));
+    actionNoteDown = new QAction(
+        QIcon(":/menu-icons/down.svg"), tr("Move Do&wn\tCtrl+Down"), mainWindow);
+    actionNoteDown->setStatusTip(tr("Move the Note down"));
 
-    actionNoteLast = new QAction(QIcon(":/menu-icons/bottom.svg"), tr("&Last\tCtrl+Shift+Down"), mainWindow);
-    actionNoteLast->setStatusTip(tr("Move Note to be the last child of its parent"));
+    actionNoteLast = new QAction(
+        QIcon(":/menu-icons/bottom.svg"),
+        tr("Move to &Last\tCtrl+Shift+Down"),
+        mainWindow);
+    actionNoteLast->setStatusTip(tr("Move the Note to be the last child of its parent"));
 
     actionNoteRefactor = new QAction(
         QIcon(":/menu-icons/refactor.svg"),
 #ifdef __APPLE__
-        tr("Refactor\tCtrl+R"),
+        tr("Move to Notebook\tCtrl+R"),
 #else
-        tr("&Refactor"),
+        tr("&Move to Notebook"),
 #endif
         mainWindow
     );
-    actionNoteRefactor->setStatusTip(tr("Refactor Note to another Notebook..."));
+    actionNoteRefactor->setStatusTip(tr("Move the current Note to another Notebook..."));
 
     actionNoteStencil = new QAction(
         QIcon(":/menu-icons/stencil.svg"),
@@ -668,11 +691,11 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuNote->addAction(actionNoteDown);
     menuNote->addAction(actionNoteLast);
     menuNote->addSeparator();
+    menuNote->addAction(actionNoteClone);
     menuNote->addAction(actionNoteRefactor);
 #ifdef MF_WIP
     menuNote->addAction(actionNoteStencil);
 #endif
-    menuNote->addAction(actionNoteClone);
 #ifdef MF_WIP
     menuNote->addSeparator();
     menuNote->addAction(actionNoteExport);
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index 9952cb51..47f60420 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -129,6 +129,7 @@ class MainMenuView : public QObject
 
     // menu: Library
     QAction* actionLibraryAdd;
+    QAction* actionLibrarySync;
     QAction* actionLibraryDeprecate;
 
     // menu: Organizer
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index 4d92fbae..4c06161b 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -96,7 +96,8 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
 
     // wire signals
     QObject::connect(
-        newLibraryDialog->getCreateButton(), SIGNAL(clicked()), this, SLOT(handleNewLibrary()));
+        newLibraryDialog->getCreateButton(), SIGNAL(clicked()),
+        this, SLOT(handleNewLibrary()));
     QObject::connect(
         scopeDialog->getSetButton(), SIGNAL(clicked()), this, SLOT(handleMindScope()));
     QObject::connect(
diff --git a/build/Makefile b/build/Makefile
index 0ecdeb51..60972fb0 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -34,12 +34,11 @@ DISTRO := "bionic"
 .PHONY: help
 help:
 	@echo "MindForger Swiss knife help:"
-	@echo "git-subs-update   update git submodules"
-	@echo "gen-lib-class     generate lib C++ class skeleton: CLASS_NAME=My_Class"
-	@echo "gen-ui-class      generate UI C++ class skeleton: CLASS_NAME=My_Class"
 	@echo "clean             clean build artifacts"
 	@echo "build             build MindForger application binary"
 	@echo "l10n              update and release localization strings: MF_LANG=en"
+	@echo "gen-lib-class     generate lib C++ class skeleton: CLASS_NAME=My_Class"
+	@echo "gen-ui-class      generate UI C++ class skeleton: CLASS_NAME=My_Class"
 	@echo "test-lib          compile and run lib/ unit tests"
 	@echo "test-app          compile and run app/ integration tests"
 	@echo "dist-all          build all distributions"
@@ -51,9 +50,10 @@ help:
 	@echo "dist-ubuntu-deb   locally build .deb for any Ubuntu version:"
 	@echo "dist-snap         build snap distro for snapcraft.io"
 	@echo "                  DISTRO=focal"
-	@echo "statistic         show source code statistic"
 	@echo "doc-to-wiki       mindforger-documentation to mindforger.wiki"
 	@echo "api-reference     generate Doxygen documentation"
+	@echo "statistic         show source code statistic"
+	@echo "git-subs-update   update git submodules"
 	@echo "dev-install-local compile and install binary to ~/bin as MIND"
 
 
diff --git a/lib/src/mind/dikw/filesystem_information.cpp b/lib/src/mind/dikw/filesystem_information.cpp
index 3c4ee220..914c07c0 100644
--- a/lib/src/mind/dikw/filesystem_information.cpp
+++ b/lib/src/mind/dikw/filesystem_information.cpp
@@ -67,25 +67,32 @@ FilesystemInformationSource::~FilesystemInformationSource()
     }
 }
 
-FilesystemInformationSource::ErrorCode FilesystemInformationSource::indexToMemory(Repository& repository)
-{
+FilesystemInformationSource::ErrorCode FilesystemInformationSource::indexToMemory(
+    Repository& repository
+) {
     MF_DEBUG("Indexing LIBRARY documents to memory:" << endl);
 
     if(!isDirectory(locator.c_str())) {
-        MF_DEBUG("Error: filesystem information resource cannot be indexed to memory as its locator path '" << locator << "' does not exist");
+        MF_DEBUG(
+            "Error: filesystem information resource cannot be indexed to memory "
+            "as its locator path '" << locator << "' does not exist");
         return FilesystemInformationSource::ErrorCode::INVALID_LOCATOR;
     }
 
     if(repository.getType() != Repository::RepositoryType::MINDFORGER
        || repository.getMode() != Repository::RepositoryMode::REPOSITORY
     ) {
-        MF_DEBUG("Error: filesystem information resource cannot be indexed as active directory is not of MINDFORGER/REPOSITORY type");
+        MF_DEBUG(
+            "Error: filesystem information resource cannot be indexed as "
+            "active directory is not of MINDFORGER/REPOSITORY type");
         return FilesystemInformationSource::ErrorCode::NOT_MINDFORGER_REPOSITORY;
     }
 
     string memoryPath{repository.getDir()+FILE_PATH_SEPARATOR+DIRNAME_MEMORY};
     if(!isDirectory(memoryPath.c_str())) {
-        MF_DEBUG("Error: filesystem information resource cannot be indexed to memory path '" << memoryPath << "' as this directory does not exist");
+        MF_DEBUG(
+            "Error: filesystem information resource cannot be indexed to "
+            "memory path '" << memoryPath << "' as this directory does not exist");
         return FilesystemInformationSource::ErrorCode::INVALID_MEMORY_PATH;
     }
 
@@ -142,7 +149,10 @@ void FilesystemInformationSource::indexDirectoryToMemory(
     const string& directory,
     const string& memoryPath
 ) {
-    MF_DEBUG(endl << "INDEXING information source DIR: '" << directory << "' to memory DIR: '" << memoryPath << "'");
+    MF_DEBUG(
+        endl <<
+        "INDEXING information source DIR: '" <<
+        directory << "' to memory DIR: '" << memoryPath << "'");
     DIR* dir;
     if((dir = opendir(directory.c_str()))) {
         const struct dirent *entry;
@@ -154,14 +164,16 @@ void FilesystemInformationSource::indexDirectoryToMemory(
                     if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
                         continue;
                     }
-                    MF_DEBUG(endl << "DIVE> " << directory.c_str() << "//" << entry->d_name);
+                    MF_DEBUG(
+                        endl << "DIVE> " << directory.c_str() << "//" << entry->d_name);
                     path.assign(directory);
                     path += FILE_PATH_SEPARATOR;
                     path += entry->d_name;
 
                     indexDirectoryToMemory(path, memoryPath);
                 } else {
-                    MF_DEBUG(endl << "  FILE: " << directory.c_str() << "//" << entry->d_name);
+                    MF_DEBUG(
+                        endl << "  FILE: " << directory.c_str() << "//" << entry->d_name);
                     ppath = new string{directory};
                     ppath->append(FILE_PATH_SEPARATOR);
                     ppath->append(entry->d_name);
diff --git a/lib/src/representations/markdown/markdown_document_representation.cpp b/lib/src/representations/markdown/markdown_document_representation.cpp
index e0609d57..13a2f407 100644
--- a/lib/src/representations/markdown/markdown_document_representation.cpp
+++ b/lib/src/representations/markdown/markdown_document_representation.cpp
@@ -53,15 +53,15 @@ Outline* MarkdownDocumentRepresentation::to(
     o->addTag(ontology.findOrCreateTag("pdf"));
     o->addTag(ontology.findOrCreateTag("library-document"));
 
-    o->addDescriptionLine(new string{
-        "Notebook for document: [" + documentPath + "](" + documentPath + ")"
-        }
-    );
+    o->addDescriptionLine(
+        new string{
+            "This is a notebook for the document: "
+            "[" + documentPath + "](" + documentPath + ")"});
     o->addDescriptionLine(new string{""});
     o->addDescriptionLine(new string{"---"});
     o->addDescriptionLine(new string{""});
     o->addDescriptionLine(new string{
-        "This notebook represents document from above in MindForger. "
+        "This notebook represents the document from above in MindForger. "
         "Notebook was created automatically on indexation of a library "
         "and may contain document text (if available) to enable full-text "
         "search, associations and content mining. You can add notes with "
diff --git a/lib/test/resources/amnesia-repository/repository-configuration.md b/lib/test/resources/amnesia-repository/repository-configuration.md
index 5d331eeb..7a1241ac 100644
--- a/lib/test/resources/amnesia-repository/repository-configuration.md
+++ b/lib/test/resources/amnesia-repository/repository-configuration.md
@@ -15,4 +15,15 @@ Organizer name: Eisenhower Matrix
 * Filter by: notebooks and notes
 * Outline scope: 
 
+Organizer name: Eisenhower Matrix
+* Key: /m1ndf0rg3r/organizers/eisenhower-matrix
+* Type: Eisenhower Matrix
+* Upper right tag: important & urgent
+* Lower right tag: important
+* Lower left tag: .
+* Upper left tag: urgent
+* Sort by: importance
+* Filter by: notebooks and notes
+* Outline scope: 
+
 
diff --git a/lib/test/resources/autolinking-micro-repository/repository-configuration.md b/lib/test/resources/autolinking-micro-repository/repository-configuration.md
index 85ce1958..396ff4f8 100644
--- a/lib/test/resources/autolinking-micro-repository/repository-configuration.md
+++ b/lib/test/resources/autolinking-micro-repository/repository-configuration.md
@@ -15,4 +15,15 @@ Organizer name: Eisenhower Matrix
 * Filter by: notebooks and notes
 * Outline scope: 
 
+Organizer name: Eisenhower Matrix
+* Key: /m1ndf0rg3r/organizers/eisenhower-matrix
+* Type: Eisenhower Matrix
+* Upper right tag: important & urgent
+* Lower right tag: important
+* Lower left tag: .
+* Upper left tag: urgent
+* Sort by: importance
+* Filter by: notebooks and notes
+* Outline scope: 
+
 
diff --git a/lib/test/resources/autolinking-nano-repository/repository-configuration.md b/lib/test/resources/autolinking-nano-repository/repository-configuration.md
index 6fd45c21..9291576d 100644
--- a/lib/test/resources/autolinking-nano-repository/repository-configuration.md
+++ b/lib/test/resources/autolinking-nano-repository/repository-configuration.md
@@ -15,4 +15,15 @@ Organizer name: Eisenhower Matrix
 * Filter by: notebooks and notes
 * Outline scope: 
 
+Organizer name: Eisenhower Matrix
+* Key: /m1ndf0rg3r/organizers/eisenhower-matrix
+* Type: Eisenhower Matrix
+* Upper right tag: important & urgent
+* Lower right tag: important
+* Lower left tag: .
+* Upper left tag: urgent
+* Sort by: importance
+* Filter by: notebooks and notes
+* Outline scope: 
+
 
diff --git a/lib/test/resources/basic-repository/repository-configuration.md b/lib/test/resources/basic-repository/repository-configuration.md
index 41895cb9..e08a0b6d 100644
--- a/lib/test/resources/basic-repository/repository-configuration.md
+++ b/lib/test/resources/basic-repository/repository-configuration.md
@@ -15,4 +15,15 @@ Organizer name: Eisenhower Matrix
 * Filter by: notebooks and notes
 * Outline scope: 
 
+Organizer name: Eisenhower Matrix
+* Key: /m1ndf0rg3r/organizers/eisenhower-matrix
+* Type: Eisenhower Matrix
+* Upper right tag: important & urgent
+* Lower right tag: important
+* Lower left tag: .
+* Upper left tag: urgent
+* Sort by: importance
+* Filter by: notebooks and notes
+* Outline scope: 
+
 

From 5b5b2c8f39163b3633ead727d671437e728f66ca Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 29 Oct 2023 14:01:12 +0100
Subject: [PATCH 043/131] Adding tool (GPT) support.

---
 app/app.pro                                |   2 +
 app/src/qt/cli_n_breadcrumbs_presenter.cpp |  16 +-
 app/src/qt/cli_n_breadcrumbs_view.cpp      |  17 ++-
 app/src/qt/cli_n_breadcrumbs_view.h        |   2 +
 app/src/qt/dialogs/run_tool_dialog.cpp     | 168 +++++++++++++++++++++
 app/src/qt/dialogs/run_tool_dialog.h       |  80 ++++++++++
 app/src/qt/main_menu_presenter.cpp         |   6 -
 app/src/qt/main_menu_view.cpp              |  31 ++--
 app/src/qt/main_menu_view.h                |   1 +
 app/src/qt/main_window_presenter.cpp       |  71 +++++++--
 app/src/qt/main_window_presenter.h         |   7 +-
 app/src/qt/mindforger.cpp                  |  12 +-
 app/src/qt/note_editor_view.cpp            |  39 +++++
 app/src/qt/note_editor_view.h              |   2 +
 app/src/qt/orloj_presenter.cpp             |  16 ++
 app/src/qt/orloj_presenter.h               |   1 +
 lib/src/config/configuration.h             |  15 +-
 17 files changed, 430 insertions(+), 56 deletions(-)
 create mode 100644 app/src/qt/dialogs/run_tool_dialog.cpp
 create mode 100644 app/src/qt/dialogs/run_tool_dialog.h

diff --git a/app/app.pro b/app/app.pro
index 4e6636cb..741fb557 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -276,6 +276,7 @@ HEADERS += \
     src/qt/dialogs/add_library_dialog.h \
     src/qt/dialogs/export_csv_file_dialog.h \
     src/qt/dialogs/organizer_new_dialog.h \
+    src/qt/dialogs/run_tool_dialog.h \
     src/qt/dialogs/terminal_dialog.h \
     src/qt/kanban_column_model.h \
     src/qt/kanban_column_presenter.h \
@@ -400,6 +401,7 @@ SOURCES += \
     src/qt/dialogs/add_library_dialog.cpp \
     src/qt/dialogs/export_csv_file_dialog.cpp \
     src/qt/dialogs/organizer_new_dialog.cpp \
+    src/qt/dialogs/run_tool_dialog.cpp \
     src/qt/dialogs/terminal_dialog.cpp \
     src/qt/kanban_column_model.cpp \
     src/qt/kanban_column_presenter.cpp \
diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.cpp b/app/src/qt/cli_n_breadcrumbs_presenter.cpp
index d3712a03..5a0a7703 100644
--- a/app/src/qt/cli_n_breadcrumbs_presenter.cpp
+++ b/app/src/qt/cli_n_breadcrumbs_presenter.cpp
@@ -47,9 +47,19 @@ void CliAndBreadcrumbsPresenter::handleCliTextChanged(const QString& text)
 
     QString command = view->getCommand();
     if(command.size()) {
-        if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME)) {
-            QString prefix(QString::fromStdString(
-                 command.toStdString().substr(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME.size()-1)));
+        if(command.startsWith(CliAndBreadcrumbsView::CMD_TOOL)) {
+            QString prefix(
+                QString::fromStdString(
+                    command.toStdString().substr(
+                        CliAndBreadcrumbsView::CMD_TOOL.size()-1)));
+            QString phrase{"PHRASE"};
+            mainPresenter->doActionOpenRunToolDialog(phrase);
+            view->setCommand("");
+        } else if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME)) {
+            QString prefix(
+                QString::fromStdString(
+                    command.toStdString().substr(
+                        CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME.size()-1)));
             if(prefix.size()) {
                 mainPresenter->getStatusBar()->showInfo(prefix);
                 if(prefix.size()==1) {
diff --git a/app/src/qt/cli_n_breadcrumbs_view.cpp b/app/src/qt/cli_n_breadcrumbs_view.cpp
index d9f3db1f..843c8521 100644
--- a/app/src/qt/cli_n_breadcrumbs_view.cpp
+++ b/app/src/qt/cli_n_breadcrumbs_view.cpp
@@ -55,6 +55,8 @@ const QString CliAndBreadcrumbsView::CMD_FTS = ".fts ";
 const QString CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME = ".find outline by name ";
 const QString CliAndBreadcrumbsView::CMD_LIST_OUTLINES = ".list outlines";
 
+const QString CliAndBreadcrumbsView::CMD_TOOL= ".tool";
+
 // TODO migrate all commands to constants
 const QStringList CliAndBreadcrumbsView::DEFAULT_CMDS = QStringList()
         /*
@@ -90,6 +92,8 @@ const QStringList CliAndBreadcrumbsView::DEFAULT_CMDS = QStringList()
         << CMD_FTS
         << CMD_LIST_OUTLINES
         << CMD_FIND_OUTLINE_BY_NAME
+
+        << CMD_TOOL
         ;
 
 
@@ -124,11 +128,14 @@ CliAndBreadcrumbsView::CliAndBreadcrumbsView(QWidget* parent, bool zenMode)
 void appendToStandardModel(const QStringList& list, QStandardItemModel* completerModel) {
     for(const auto& i:list) {
         QStandardItem* item = new QStandardItem(i);
-        if(i.startsWith(".")) {
-            item->setIcon(QIcon(":/menu-icons/cli.svg"));
-        } else {
-            item->setIcon(QIcon(":/menu-icons/find.svg"));
-        }
+
+        // TODO icons are not shown on certain platforms (Linux/x86)
+//        if(i.startsWith(".")) {
+//            item->setIcon(QIcon(":/menu-icons/cli.svg"));
+//        } else {
+//            item->setIcon(QIcon(":/menu-icons/find.svg"));
+//        }
+
         // IMPROVE item->setToolTip("tool tip");
         completerModel->appendRow(item);
     }
diff --git a/app/src/qt/cli_n_breadcrumbs_view.h b/app/src/qt/cli_n_breadcrumbs_view.h
index a02b6026..9f7b82f9 100644
--- a/app/src/qt/cli_n_breadcrumbs_view.h
+++ b/app/src/qt/cli_n_breadcrumbs_view.h
@@ -64,6 +64,8 @@ class CliAndBreadcrumbsView : public QWidget
     static const QString CMD_FIND_OUTLINE_BY_NAME;
     static const QString CMD_LIST_OUTLINES;
 
+    static const QString CMD_TOOL;
+
 public:
     explicit CliAndBreadcrumbsView(QWidget* parent, bool zenMode=true);
 
diff --git a/app/src/qt/dialogs/run_tool_dialog.cpp b/app/src/qt/dialogs/run_tool_dialog.cpp
new file mode 100644
index 00000000..fc07b829
--- /dev/null
+++ b/app/src/qt/dialogs/run_tool_dialog.cpp
@@ -0,0 +1,168 @@
+/*
+ run_tool_dialog.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "run_tool_dialog.h"
+
+namespace m8r {
+
+using namespace std;
+
+RunToolDialog::RunToolDialog(QWidget* parent)
+    : QDialog(parent)
+{
+    vector toolNames  = {
+        QString{TOOL_ARXIV},
+        QString{TOOL_CHAT_GPT_WEB},
+        QString{TOOL_DEEPL},
+        QString{TOOL_DUCKDUCKGO},
+        QString{TOOL_GOOGLE_BARD},
+        QString{TOOL_GOOGLE_SEARCH},
+        QString{TOOL_GH_PROJECTS},
+        QString{TOOL_GH_TOPICS},
+        QString{TOOL_H2O_GPT_WEB},
+        QString{TOOL_H2O_GPT_API},
+        QString{TOOL_WIKIPEDIA}
+    };
+
+
+    // UI
+
+    phraseLabel = new QLabel{tr("Phrase:"), parent};
+    phraseEdit = new QLineEdit{parent};
+
+    toolLabel = new QLabel{tr("Knowledge source:"), parent};
+    toolCombo = new QComboBox{this};
+    for(QString toolName:toolNames) {
+        toolCombo->addItem(toolName);
+    }
+
+    // TODO change of the tool changes the template
+
+    templateLabel = new QLabel{tr("Template:"), parent};
+    templateEdit = new QLineEdit{parent};
+
+    // IMPROVE disable/enable find button if text/path is valid: freedom vs validation
+    runButton = new QPushButton{tr("&Get")};
+    runButton->setDefault(true);
+    closeButton = new QPushButton{tr("&Cancel")};
+
+    // signals
+    QObject::connect(
+        closeButton, SIGNAL(clicked()),
+        this, SLOT(close()));
+
+    // assembly
+    QVBoxLayout* mainLayout = new QVBoxLayout{};
+    mainLayout->addWidget(phraseLabel);
+    mainLayout->addWidget(phraseEdit);
+    mainLayout->addWidget(toolLabel);
+    mainLayout->addWidget(toolCombo);
+    mainLayout->addWidget(templateLabel);
+    mainLayout->addWidget(templateEdit);
+
+    QHBoxLayout* buttonLayout = new QHBoxLayout{};
+    buttonLayout->addStretch(1);
+    buttonLayout->addWidget(closeButton);
+    buttonLayout->addWidget(runButton);
+    buttonLayout->addStretch();
+
+    mainLayout->addLayout(buttonLayout);
+    setLayout(mainLayout);
+
+    // signals
+    QObject::connect(
+        toolCombo, SIGNAL(currentIndexChanged(QString)),
+        this, SLOT(handleChangeToolCombo(QString))
+    );
+
+    // dialog
+    setWindowTitle(tr("Get Knowledge"));
+    resize(fontMetrics().averageCharWidth()*55, height());
+    setModal(true);
+}
+
+RunToolDialog::~RunToolDialog()
+{
+}
+
+void RunToolDialog::show()
+{
+    QDialog::show();
+}
+
+QString RunToolDialog::getTemplateTextForToolName(QString selectedTool) const
+{
+    if(selectedTool == TOOL_ARXIV) {
+        QString templateText{"https://arxiv.org/search/?query="};
+        templateText.append(TOOL_PHRASE);
+        return templateText;
+    } else if(selectedTool == TOOL_DEEPL) {
+        return QString{"https://www.deepl.com/en/translator"};
+    } else if(selectedTool == TOOL_DUCKDUCKGO) {
+        QString templateText{"https://www.duckduckgo.com/q="};
+        templateText.append(TOOL_PHRASE);
+        return templateText;
+    } else if(selectedTool == TOOL_GH_TOPICS) {
+        // TODO fix search URL
+        QString templateText{"https://www.github.com/q="};
+        templateText.append(TOOL_PHRASE);
+        return templateText;
+    } else if(selectedTool == TOOL_GH_PROJECTS) {
+        // TODO fix search URL
+        QString templateText{"https://www.github.com/q="};
+        templateText.append(TOOL_PHRASE);
+        return templateText;
+    } else if(selectedTool == TOOL_CHAT_GPT_WEB) {
+        return QString{"https://chat.openai.com/"};
+    } else if(selectedTool == TOOL_GOOGLE_BARD) {
+        return QString{"https://bard.google.com/"};
+    } else if(selectedTool == TOOL_GOOGLE_SEARCH) {
+        QString temlateText{"https://www.google.com/q="};
+        temlateText.append(TOOL_PHRASE);
+        return temlateText;
+    } else if(selectedTool == TOOL_H2O_GPT_API) {
+        // TODO: sniff HTTP traffic and use HTTP client/JSon to talk to the service
+        MF_DEBUG("H2O GPT API not implemented yet");
+    } else if(selectedTool == TOOL_H2O_GPT_WEB) {
+        return QString{"https://gpt.h2o.ai/"};
+    } else if(selectedTool == TOOL_WIKIPEDIA) {
+        // TODO: URL
+        QString temlateText{"https://www.wikipedia.org/q="};
+        temlateText.append(TOOL_PHRASE);
+        return temlateText;
+    }
+
+    string msg{
+        "Tool '" + selectedTool.toStdString() + "' to search/explain/process "
+        "the phrase is not supported."};
+    QMessageBox msgBox{
+        QMessageBox::Critical,
+        QObject::tr("Unsupported Knowledge Tool"),
+        QObject::tr(msg.c_str()),
+    };
+
+    return QString{};
+}
+
+void RunToolDialog::handleChangeToolCombo(const QString& text) {
+    MF_DEBUG("Tool changed: " << text.toStdString() << endl);
+
+    this->templateEdit->setText(getTemplateTextForToolName(text));
+}
+
+} // m8r namespace
diff --git a/app/src/qt/dialogs/run_tool_dialog.h b/app/src/qt/dialogs/run_tool_dialog.h
new file mode 100644
index 00000000..3f685612
--- /dev/null
+++ b/app/src/qt/dialogs/run_tool_dialog.h
@@ -0,0 +1,80 @@
+/*
+ run_tool_dialog.h     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8RUI_RUN_TOOL_DIALOG_H
+#define M8RUI_RUN_TOOL_DIALOG_H
+
+#include 
+
+#include "../../lib/src/config/configuration.h"
+
+namespace m8r {
+
+class RunToolDialog : public QDialog
+{
+    Q_OBJECT
+
+private:
+
+    QLabel* phraseLabel;
+    QLineEdit* phraseEdit;
+
+    QLabel* toolLabel;
+    QComboBox* toolCombo;
+
+    QLabel* templateLabel;
+    QLineEdit* templateEdit;
+
+    QPushButton* runButton;
+    QPushButton* closeButton;
+
+public:
+    explicit RunToolDialog(QWidget* parent);
+    RunToolDialog(const RunToolDialog&) = delete;
+    RunToolDialog(const RunToolDialog&&) = delete;
+    RunToolDialog& operator =(const RunToolDialog&) = delete;
+    RunToolDialog& operator =(const RunToolDialog&&) = delete;
+    ~RunToolDialog();
+
+    void show();
+
+    QString getTemplateTextForToolName(QString selectedTool) const;
+
+    QPushButton* getRunButton() const { return runButton; }
+    QString getSelectedTool() const {
+        return this->toolCombo->itemText(
+            this->toolCombo->currentIndex()
+        );
+    }
+    QString getTemplateText() const {
+        return this->templateEdit->text();
+    }
+    QString getPhraseText() const { return phraseEdit->text(); }
+    void setPhraseText(QString phrase) {
+        this->phraseEdit->setText(phrase);
+    }
+    void setTemplateText(QString templateText) {
+        this->templateEdit->setText(templateText);
+    }
+
+private slots:
+    void handleChangeToolCombo(const QString& text);
+};
+
+}
+#endif // M8RUI_RUN_TOOL_DIALOG_H
diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp
index 1753e6f9..1f1b7e27 100644
--- a/app/src/qt/main_menu_presenter.cpp
+++ b/app/src/qt/main_menu_presenter.cpp
@@ -128,12 +128,6 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
     // IMPROVE complete edge shrinking & zooming (skipped as shortcut/mouse wheel is the much more reasonable)
     QObject::connect(view->actionNavigatorShuffle, SIGNAL(triggered()), mwp, SLOT(doActionNavigatorShuffle()));
 
-    // menu: Knowledge
-#ifdef MF_WIP_KNOW
-    QObject::connect(view->actionKnowledgeWikipedia, SIGNAL(triggered()), mwp, SLOT(doActionKnowledgeWikipedia()));
-    QObject::connect(view->actionKnowledgeArxiv, SIGNAL(triggered()), mwp, SLOT(doActionKnowledgeArxiv()));
-#endif
-
     // menu: Library
 #ifdef MF_WIP
     QObject::connect(view->actionLibraryAdd, SIGNAL(triggered()), mwp, SLOT(doActionLibraryNew()));
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index 00441e73..ed763978 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -351,20 +351,6 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
 #endif
     menuView->addAction(actionViewFullscreen);
 
-    // menu: knowledge
-#ifdef MF_WIP_KNOW
-    menuKnowledge = qMenuBar->addMenu(tr("&Know"));
-
-    actionKnowledgeWikipedia = new QAction(QIcon(":/menu-icons/link.svg"), tr("&Wikipedia"), mainWindow);
-    actionKnowledgeWikipedia->setStatusTip(tr("Find marked text on Wikipedia or open Wikipedia search"));
-
-    actionKnowledgeArxiv = new QAction(QIcon(":/menu-icons/link.svg"), tr("&arXiv"), mainWindow);
-    actionKnowledgeArxiv->setStatusTip(tr("Find marked text on arXiv or get article by ID"));
-
-    menuKnowledge->addAction(actionKnowledgeWikipedia);
-    menuKnowledge->addAction(actionKnowledgeArxiv);
-#endif
-
     // menu: navigator
 #ifdef __APPLE__
     actionNavigatorEdgesStretch = new QAction(tr("Str&etch edges"), mainWindow);
@@ -740,7 +726,10 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionEditExtract = new QAction(QIcon(":/menu-icons/cut.svg"), tr("E&xtract"), mainWindow);
     actionEditExtract->setStatusTip(tr("Create new Note from the text selected in the current Note..."));
 
-    actionEditComplete = new QAction(QIcon(":/menu-icons/on.svg"), tr("Complete Link\tCtrl+/"), mainWindow);
+    actionEditRunTool = new QAction(QIcon(":/menu-icons/on.svg"), tr("Find Knowledge\tCtrl+/"), mainWindow);
+    actionEditRunTool->setStatusTip(tr("Run an external tool to find, explain, process text under the cursor"));
+
+    actionEditComplete = new QAction(QIcon(":/menu-icons/link.svg"), tr("Complete Link\tCtrl+L"), mainWindow);
     actionEditComplete->setStatusTip(tr("Complete word being written by finding link to Notebook or Note"));
 
     actionEditSpellCheck = new QAction(QIcon(":/menu-icons/paste.svg"), tr("Sp&ell Check"), mainWindow);
@@ -761,6 +750,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuEdit->addAction(actionEditWordWrap);
     menuEdit->addAction(actionEditNameDescFocusSwap);
     menuEdit->addSeparator();
+    menuEdit->addAction(actionEditRunTool);
     menuEdit->addAction(actionEditComplete);
     menuEdit->addAction(actionEditExtract);
     menuEdit->addSeparator();
@@ -968,9 +958,11 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuFormat->addAction(actionFormatImage);
     menuFormat->setEnabled(false);
 
-    // menu: tools
 
 #ifdef MF_WIP
+    // menu: tools
+
+    /*
     menuTools = qMenuBar->addMenu(tr("&Tools"));
 
     actionToolsWikipedia = new QAction(
@@ -1016,6 +1008,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionToolsDocusaurus->setStatusTip(
         tr("Build your web with MindForger's Markdown documents and Docusaurus..."));
     menuTools->addAction(actionToolsDocusaurus);
+    */
 #endif
 
     // menu: help
@@ -1166,9 +1159,6 @@ void MainMenuView::showFacetOrganizerList(bool repositoryMode)
     actionOrganizerMovePrevious->setEnabled(false);
     actionOrganizerMoveNext->setEnabled(false);
 
-#ifdef MF_WIP_KNOW
-    menuKnowledge->setEnabled(false);
-#endif
     menuNavigator->setEnabled(false);
 #ifdef MF_WIP
     menuLibrary->setEnabled(false);
@@ -1192,9 +1182,6 @@ void MainMenuView::showFacetOrganizerView(bool repositoryMode)
 {
     showAllMenuItems();
 
-#ifdef MF_WIP_KNOW
-    menuKnowledge->setEnabled(false);
-#endif
     menuNavigator->setEnabled(false);
 #ifdef MF_WIP
     menuLibrary->setEnabled(false);
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index 47f60420..69f6e2bb 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -194,6 +194,7 @@ class MainMenuView : public QObject
     QAction* actionEditWordWrap;
     QAction* actionEditNameDescFocusSwap;
     QAction* actionEditExtract;
+    QAction* actionEditRunTool;
     QAction* actionEditComplete;
     QAction* actionEditSpellCheck;
 
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index 4c06161b..137305fc 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -52,6 +52,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
 
     // initialize components
     newLibraryDialog = new AddLibraryDialog{&view};
+    runToolDialog = new RunToolDialog{&view};
     scopeDialog = new ScopeDialog{mind->getOntology(), &view};
     newOrganizerDialog = new OrganizerNewDialog{mind->getOntology(), &view};
     newOutlineDialog = new OutlineNewDialog{
@@ -95,6 +96,9 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
     handleMindPreferences();
 
     // wire signals
+    QObject::connect(
+        runToolDialog->getRunButton(), SIGNAL(clicked()),
+        this, SLOT(handleRunTool()));
     QObject::connect(
         newLibraryDialog->getCreateButton(), SIGNAL(clicked()),
         this, SLOT(handleNewLibrary()));
@@ -1874,9 +1878,64 @@ void MainWindowPresenter::doActionEditPasteImageData(QImage image)
     injectImageLinkToEditor(path, QString{"image"});
 }
 
+void MainWindowPresenter::doActionOpenRunToolDialog(QString& phrase)
+{
+    MF_DEBUG("SIGNAL handled: open run tool dialog...");
+    this->runToolDialog->setPhraseText(phrase);
+    QString templateText = this->runToolDialog->getTemplateTextForToolName(
+        this->runToolDialog->getSelectedTool());
+    if(templateText.length() == 0) {
+        return;
+    }
+    this->runToolDialog->setTemplateText(templateText);
+
+    this->runToolDialog->show();
+}
+
+void MainWindowPresenter::handleRunTool()
+{
+    this->runToolDialog->hide();
+
+    string selectedTool{
+        this->runToolDialog->getSelectedTool().toStdString()
+    };
+
+    QString phrase=this->runToolDialog->getPhraseText();
+    if(phrase.length() == 0) {
+        QMessageBox msgBox{
+            QMessageBox::Critical,
+            QObject::tr("Empty Phrase"),
+            QObject::tr("Phrase to search/explain/process is empty.")
+        };
+        msgBox.exec();
+        return;
+    }
+
+    // get & check template text validity
+    QString templateText = this->runToolDialog->getTemplateText();
+
+    // phrase replace @ template > get command, if invalid, then fallback
+    QString command = templateText.replace(
+        QString{TOOL_PHRASE}, phrase
+    );
+
+    // RUN tool
+    if(selectedTool == TOOL_H2O_GPT_API) {
+        // TODO: sniff HTTP traffic and use HTTP client/JSon to talk to the service
+        MF_DEBUG("H2O GPT API not implemented yet");
+        return;
+    }
+
+    QDesktopServices::openUrl(QUrl{command});
+}
+
 void MainWindowPresenter::statusInfoPreviewFlickering()
 {
-    statusBar->showInfo(QString(tr("HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu")));
+    statusBar->showInfo(
+        QString(
+            tr(
+                "HTML Note preview flickering can be eliminated by disabling math "
+                "and diagrams in Preferences menu")));
 }
 
 /*
@@ -2922,16 +2981,6 @@ void MainWindowPresenter::doActionViewTerminal()
     terminalDialog->show();
 }
 
-void MainWindowPresenter::doActionKnowledgeWikipedia()
-{
-    QDesktopServices::openUrl(QUrl{"https://en.wikipedia.org/"});
-}
-
-void MainWindowPresenter::doActionKnowledgeArxiv()
-{
-    QDesktopServices::openUrl(QUrl{"https://arxiv.org/search/cs"});
-}
-
 void MainWindowPresenter::doActionLibraryNew()
 {
     newLibraryDialog->show();
diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h
index 54f1857b..664b0042 100644
--- a/app/src/qt/main_window_presenter.h
+++ b/app/src/qt/main_window_presenter.h
@@ -38,6 +38,7 @@
 #include "status_bar_presenter.h"
 
 #include "dialogs/add_library_dialog.h"
+#include "dialogs/run_tool_dialog.h"
 #include "dialogs/organizer_new_dialog.h"
 #include "dialogs/outline_new_dialog.h"
 #include "dialogs/note_new_dialog.h"
@@ -120,6 +121,7 @@ class MainWindowPresenter : public QObject
     StatusBarPresenter* statusBar;
 
     AddLibraryDialog* newLibraryDialog;
+    RunToolDialog* runToolDialog;
     ScopeDialog* scopeDialog;
     OrganizerNewDialog* newOrganizerDialog;
     OutlineNewDialog* newOutlineDialog;
@@ -248,9 +250,6 @@ public slots:
     void doActionViewLimbo();
     void doActionViewDistractionFree();
     void doActionViewFullscreen();
-    // knowledge
-    void doActionKnowledgeArxiv();
-    void doActionKnowledgeWikipedia();
     // library
     void doActionLibraryNew();
     void handleNewLibrary();
@@ -357,6 +356,8 @@ public slots:
     void doActionEditFindAgain();
     void doActionEditWordWrapToggle();
     void doActionEditPasteImageData(QImage image);
+    void doActionOpenRunToolDialog(QString& phrase);
+    void handleRunTool();
     void doActionToggleLiveNotePreview();
     void doActionNameDescFocusSwap();
     void doActionSpellCheck();
diff --git a/app/src/qt/mindforger.cpp b/app/src/qt/mindforger.cpp
index 0c301430..bb1df7d0 100644
--- a/app/src/qt/mindforger.cpp
+++ b/app/src/qt/mindforger.cpp
@@ -41,13 +41,15 @@ using namespace m8r::filesystem;
  *
  * ```
  * $ mindforger
- *   ... lookup repository as follows
- *     1. configured in ~/.mindforger,
+ *   ... looks up repository as follows
+ *     1. repository configured in ~/.mindforger,
  *     2. specified by environment variable MINDFORGER_REPOSITORY,
- *     3. check existence of MindForger repository in default location i.e. ~/mindforger-repository
- *     4. create new MindForger repository in default location i.e. ~/mindforger-repository
+ *     3. checks existence of MindForger repository in default location
+ *        i.e. ~/mindforger-repository
+ *     4. creates new MindForger repository in default location
+ *        i.e. ~/mindforger-repository
  * $ mindforger ~/my-mf-repository
- *   ... MindForger repository
+ *   ... start MindForger with given repository
  * $ mindforger ~/books/marathon-training
  *   ... directory structure w/ Markdowns
  * $ mindforger ~/my-mf-repository/memory/plans.md
diff --git a/app/src/qt/note_editor_view.cpp b/app/src/qt/note_editor_view.cpp
index 7cf3c2e4..c0e1f895 100644
--- a/app/src/qt/note_editor_view.cpp
+++ b/app/src/qt/note_editor_view.cpp
@@ -103,6 +103,10 @@ NoteEditorView::NoteEditorView(QWidget* parent)
     // shortcut signals
     new QShortcut(
         QKeySequence(QKeySequence(Qt::CTRL+Qt::Key_Slash)),
+        this, SLOT(slotStartRunTool())
+    );
+    new QShortcut(
+        QKeySequence(QKeySequence(Qt::CTRL+Qt::Key_L)),
         this, SLOT(slotStartLinkCompletion())
     );
 
@@ -558,6 +562,41 @@ void NoteEditorView::performTextCompletion(const QString& completionPrefix)
     completer->complete(rect);
 }
 
+void NoteEditorView::slotStartRunTool()
+{
+    QString phrase{};
+
+    // get PHRASE: selection > the word under the cursor
+    QString selection{textCursor().selectedText()};
+    if(selection.size()) {
+        phrase = selection;
+    } else {
+        // TODO get word under cursor OR get selected text
+        MF_DEBUG(
+            "Run tool: getting the phrase under the cursor..." << endl);
+        phrase = getCompletionPrefix();
+        MF_DEBUG(
+            "Run tool: phrase under the cursor '" << phrase.toStdString()
+            << "'" << endl);
+    }
+
+    if(!phrase.isEmpty()) {
+    MF_DEBUG(
+        "Run tool: sending signal to open the dialog..." << endl);
+        emit signalOpenRunToolDialog(phrase);
+    } else {
+        QMessageBox msgBox{
+            QMessageBox::Critical,
+            QObject::tr("Empty Phrase"),
+            QObject::tr(
+                "Phrase to search/explain/process is empty - either make a text "
+                "selection or move cursor to a word/phrase."
+            )
+        };
+        msgBox.exec();
+    }
+}
+
 void NoteEditorView::slotStartLinkCompletion()
 {
     const QString completionPrefix = getCompletionPrefix();
diff --git a/app/src/qt/note_editor_view.h b/app/src/qt/note_editor_view.h
index 3042f552..5609f009 100644
--- a/app/src/qt/note_editor_view.h
+++ b/app/src/qt/note_editor_view.h
@@ -141,6 +141,7 @@ private slots:
     void insertTab() { smartEditor.insertTab(); }
     void insertCompletion(const QString& completion, bool singleWord=false);
 public slots:
+    void slotStartRunTool();
     void slotStartLinkCompletion();
     void slotPerformLinkCompletion(const QString& completionPrefix, std::vector* links);
 
@@ -168,6 +169,7 @@ protected slots:
 
     void signalDnDropUrl(QString url);
     void signalPasteImageData(QImage image);
+    void signalOpenRunToolDialog(QString& phrase);
     void signalGetLinksForPattern(const QString& pattern);
 };
 
diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp
index aa934f98..097f10c1 100644
--- a/app/src/qt/orloj_presenter.cpp
+++ b/app/src/qt/orloj_presenter.cpp
@@ -123,6 +123,11 @@ OrlojPresenter::OrlojPresenter(
         this, SLOT(slotEditStartLinkCompletion()));
 #endif
     // editor getting data from the backend
+    QObject::connect(
+        view->getNoteEdit()->getNoteEditor(),
+            SIGNAL(signalOpenRunToolDialog(QString&)),
+        mainPresenter,
+            SLOT(doActionOpenRunToolDialog(QString&)));
     QObject::connect(
         view->getNoteEdit()->getNoteEditor(),
             SIGNAL(signalGetLinksForPattern(QString)),
@@ -133,6 +138,11 @@ OrlojPresenter::OrlojPresenter(
             SIGNAL(signalLinksForPattern(QString, std::vector*)),
         view->getNoteEdit()->getNoteEditor(),
             SLOT(slotPerformLinkCompletion(QString, std::vector*)));
+    QObject::connect(
+        view->getOutlineHeaderEdit()->getHeaderEditor(),
+            SIGNAL(signalOpenRunToolDialog(QString&)),
+        mainPresenter,
+            SLOT(doActionOpenRunToolDialog(QString&)));
     QObject::connect(
         view->getOutlineHeaderEdit()->getHeaderEditor(),
             SIGNAL(signalGetLinksForPattern(QString)),
@@ -898,6 +908,12 @@ void OrlojPresenter::slotShowOutlineNavigator(Outline* outline)
     }
 }
 
+void OrlojPresenter::slotOpenRunToolDialog(const QString& pattern)
+{
+    MF_DEBUG("Slot to RUN TOOL: " << pattern.toStdString() << endl);
+    // TODO this->mainPresenter->getInsertLinkDialog()->show();
+}
+
 /**
  * @brief Return MD links for given O/N name prefix (pattern).
  *
diff --git a/app/src/qt/orloj_presenter.h b/app/src/qt/orloj_presenter.h
index ce1bc6cc..eaa7cb3d 100644
--- a/app/src/qt/orloj_presenter.h
+++ b/app/src/qt/orloj_presenter.h
@@ -232,6 +232,7 @@ public slots:
     void slotShowNavigator();
     void slotShowNoteNavigator(Note* note);
     void slotShowOutlineNavigator(Outline* outline);
+    void slotOpenRunToolDialog(const QString& pattern);
     void slotGetLinksForPattern(const QString& pattern);
     void slotRefreshCurrentNotePreview();
     void slotOutlinesTableSorted(int column);
diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h
index 0d766cc3..9f7d2cb0 100644
--- a/lib/src/config/configuration.h
+++ b/lib/src/config/configuration.h
@@ -23,7 +23,6 @@
 #include 
 #include 
 #include 
-#include 
 
 #include "repository.h"
 #include "time_scope.h"
@@ -100,6 +99,20 @@ constexpr const auto UI_DEFAULT_HTML_CSS_THEME = UI_HTML_THEME_CSS_LIGHT;
 constexpr const auto UI_DEFAULT_EDITOR_FONT = "Monospace,10";
 constexpr const auto UI_DEFAULT_FONT_POINT_SIZE = 10;
 
+constexpr const auto TOOL_PHRASE = "<>";
+
+constexpr const auto TOOL_ARXIV = "arXiv";
+constexpr const auto TOOL_DUCKDUCKGO = "DuckDuckGo";
+constexpr const auto TOOL_DEEPL = "DeepL web";
+constexpr const auto TOOL_GH_PROJECTS = "GitHub projects";
+constexpr const auto TOOL_GH_TOPICS = "GitHub topics";
+constexpr const auto TOOL_GOOGLE_BARD = "Google Bard";
+constexpr const auto TOOL_GOOGLE_SEARCH = "Google Search";
+constexpr const auto TOOL_H2O_GPT_WEB = "h2oGPT web";
+constexpr const auto TOOL_H2O_GPT_API = "h2oGPT API";
+constexpr const auto TOOL_CHAT_GPT_WEB = "OpenAI chatGPT web";
+constexpr const auto TOOL_WIKIPEDIA = "Wikipedia";
+
 // improve platform/language specific
 constexpr const auto DEFAULT_NEW_OUTLINE = "# New Markdown File\n\nThis is a new Markdown file created by MindForger.\n\n#Section 1\nThe first section.\n\n";
 

From 9c24013d1ca2fd0daaa781f7a069203d8bb28379 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sat, 4 Nov 2023 17:32:44 +0100
Subject: [PATCH 044/131] Fixing tools URLs.

---
 app/src/qt/dialogs/run_tool_dialog.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/app/src/qt/dialogs/run_tool_dialog.cpp b/app/src/qt/dialogs/run_tool_dialog.cpp
index fc07b829..92efaa29 100644
--- a/app/src/qt/dialogs/run_tool_dialog.cpp
+++ b/app/src/qt/dialogs/run_tool_dialog.cpp
@@ -114,25 +114,25 @@ QString RunToolDialog::getTemplateTextForToolName(QString selectedTool) const
     } else if(selectedTool == TOOL_DEEPL) {
         return QString{"https://www.deepl.com/en/translator"};
     } else if(selectedTool == TOOL_DUCKDUCKGO) {
-        QString templateText{"https://www.duckduckgo.com/q="};
+        QString templateText{"https://www.duckduckgo.com/?q="};
         templateText.append(TOOL_PHRASE);
         return templateText;
     } else if(selectedTool == TOOL_GH_TOPICS) {
         // TODO fix search URL
-        QString templateText{"https://www.github.com/q="};
+        QString templateText{"https://www.github.com/search?q="};
         templateText.append(TOOL_PHRASE);
         return templateText;
     } else if(selectedTool == TOOL_GH_PROJECTS) {
         // TODO fix search URL
-        QString templateText{"https://www.github.com/q="};
+        QString templateText{"https://www.github.com/search?q="};
         templateText.append(TOOL_PHRASE);
         return templateText;
     } else if(selectedTool == TOOL_CHAT_GPT_WEB) {
         return QString{"https://chat.openai.com/"};
     } else if(selectedTool == TOOL_GOOGLE_BARD) {
-        return QString{"https://bard.google.com/"};
+        return QString{"https://bard.google.com/chat"};
     } else if(selectedTool == TOOL_GOOGLE_SEARCH) {
-        QString temlateText{"https://www.google.com/q="};
+        QString temlateText{"https://www.google.com/search?q="};
         temlateText.append(TOOL_PHRASE);
         return temlateText;
     } else if(selectedTool == TOOL_H2O_GPT_API) {
@@ -142,7 +142,7 @@ QString RunToolDialog::getTemplateTextForToolName(QString selectedTool) const
         return QString{"https://gpt.h2o.ai/"};
     } else if(selectedTool == TOOL_WIKIPEDIA) {
         // TODO: URL
-        QString temlateText{"https://www.wikipedia.org/q="};
+        QString temlateText{"https://en.wikipedia.org/w/index.php?search="};
         temlateText.append(TOOL_PHRASE);
         return temlateText;
     }

From ed19f7aa1d4f9cca7abc706b1b9782e470e763ee Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sat, 4 Nov 2023 19:31:54 +0100
Subject: [PATCH 045/131] Updating changelog.

---
 Changelog  | 3 ++-
 FIX-IT.txt | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 FIX-IT.txt

diff --git a/Changelog b/Changelog
index 2bb7e328..79e4efb2 100644
--- a/Changelog
+++ b/Changelog
@@ -4,7 +4,8 @@
       polished Preferences (Appearance refactored to Controls; restart requirement
       highlighted), missing OOTB Eisenhower Matrix is automatically added back
       to the list of Organizers, up/down button in O/N preview mode to move around
-      O's Ns while presenting a N.
+      O's Ns while presenting a N. Tools allowing to get more information about
+      the word under cursor from Wikipedia, arXiv, LLM chats or web search engines.
 
 2023-01-15  Martin Dvorak  
 
diff --git a/FIX-IT.txt b/FIX-IT.txt
new file mode 100644
index 00000000..c164d809
--- /dev/null
+++ b/FIX-IT.txt
@@ -0,0 +1 @@
+    $ mind
    libpng warning: iCCP: known incorrect sRGB profile
    libpng warning: iCCP: known incorrect sRGB profile
    QObject::connect: Cannot connect (null)::triggered() to m8r::MainWindowPresenter::doActionToolsArxiv()
    QObject::connect: Cannot connect (null)::triggered() to m8r::MainWindowPresenter::doActionToolsPandoc()
    QObject::connect: Cannot connect (null)::triggered() to m8r::MainWindowPresenter::doActionToolsChatGpt()
    QObject::connect: Cannot connect (null)::triggered() to m8r::MainWindowPresenter::doActionToolsWikipedia()
    QObject::connect: Cannot connect (null)::triggered() to m8r::MainWindowPresenter::doActionToolsDocusaurus()
    QObject::connect: Cannot connect (null)::triggered() to m8r::MainWindowPresenter::doActionToolsDucDuckGo()


From d0832c21a25d7ab939edd86ca9be4cf482878d8b Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Thu, 16 Nov 2023 07:57:46 +0100
Subject: [PATCH 046/131] Wingman brainstorm WIP.

---
 lib/lib.pro                          |  4 ++
 lib/src/mind/ai/llm/mock_wingman.cpp | 31 ++++++++++
 lib/src/mind/ai/llm/mock_wingman.h   | 36 ++++++++++++
 lib/src/mind/ai/llm/wingman.cpp      | 31 ++++++++++
 lib/src/mind/ai/llm/wingman.h        | 87 ++++++++++++++++++++++++++++
 5 files changed, 189 insertions(+)
 create mode 100644 lib/src/mind/ai/llm/mock_wingman.cpp
 create mode 100644 lib/src/mind/ai/llm/mock_wingman.h
 create mode 100644 lib/src/mind/ai/llm/wingman.cpp
 create mode 100644 lib/src/mind/ai/llm/wingman.h

diff --git a/lib/lib.pro b/lib/lib.pro
index c0c8b3dd..01c39494 100644
--- a/lib/lib.pro
+++ b/lib/lib.pro
@@ -111,6 +111,8 @@ SOURCES += \
     src/config/repository_configuration.cpp \
     src/gear/async_utils.cpp \
     src/gear/math_utils.cpp \
+    src/mind/ai/llm/mock_wingman.cpp \
+    src/mind/ai/llm/wingman.cpp \
     src/mind/dikw/dikw_pyramid.cpp \
     src/mind/dikw/filesystem_information.cpp \
     src/mind/dikw/information.cpp \
@@ -225,6 +227,8 @@ HEADERS += \
     ./src/gear/math_utils.h \
     ./src/mind/dikw/dikw_pyramid.h \
     ./src/mind/dikw/filesystem_information.h \
+    src/mind/ai/llm/mock_wingman.h \
+    src/mind/ai/llm/wingman.h \
     src/mind/dikw/information.h \
     src/model/eisenhower_matrix.h \
     src/model/kanban.h \
diff --git a/lib/src/mind/ai/llm/mock_wingman.cpp b/lib/src/mind/ai/llm/mock_wingman.cpp
new file mode 100644
index 00000000..bccc1b5a
--- /dev/null
+++ b/lib/src/mind/ai/llm/mock_wingman.cpp
@@ -0,0 +1,31 @@
+/*
+ mock_wingman.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "mock_wingman.h"
+
+namespace m8r {
+
+MockWingman::MockWingman()
+{
+}
+
+MockWingman::~MockWingman()
+{
+}
+
+} // m8r namespace
diff --git a/lib/src/mind/ai/llm/mock_wingman.h b/lib/src/mind/ai/llm/mock_wingman.h
new file mode 100644
index 00000000..b6a69bb5
--- /dev/null
+++ b/lib/src/mind/ai/llm/mock_wingman.h
@@ -0,0 +1,36 @@
+/*
+ mock_wingman.h     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8R_MOCK_WINGMAN_H
+#define M8R_MOCK_WINGMAN_H
+
+namespace m8r {
+
+class MockWingman
+{
+public:
+    explicit MockWingman();
+    MockWingman(const MockWingman&) = delete;
+    MockWingman(const MockWingman&&) = delete;
+    MockWingman& operator =(const MockWingman&) = delete;
+    MockWingman& operator =(const MockWingman&&) = delete;
+    ~MockWingman();
+};
+
+}
+#endif // M8R_MOCK_WINGMAN_H
diff --git a/lib/src/mind/ai/llm/wingman.cpp b/lib/src/mind/ai/llm/wingman.cpp
new file mode 100644
index 00000000..fdab1c66
--- /dev/null
+++ b/lib/src/mind/ai/llm/wingman.cpp
@@ -0,0 +1,31 @@
+/*
+ wingman.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "wingman.h"
+
+namespace m8r {
+
+Wingman::Wingman()
+{
+}
+
+Wingman::~Wingman()
+{
+}
+
+} // m8r namespace
diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h
new file mode 100644
index 00000000..45f78376
--- /dev/null
+++ b/lib/src/mind/ai/llm/wingman.h
@@ -0,0 +1,87 @@
+/*
+ wingman.h     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8R_WINGMAN_H
+#define M8R_WINGMAN_H
+
+#include 
+
+namespace m8r {
+
+class Wingman
+{
+public:
+    explicit Wingman();
+    Wingman(const Wingman&) = delete;
+    Wingman(const Wingman&&) = delete;
+    Wingman& operator =(const Wingman&) = delete;
+    Wingman& operator =(const Wingman&&) = delete;
+    ~Wingman();
+
+    // Set LLM provider: chatGPT, h2oGPT(e), HF, ... - arg w/ interface > implementation
+    void setLlmProvider();
+
+    // use cases
+    void ask(std::string question);
+    void ask(std::string question, std::string context);
+    void ask(std::string question, std::string context, std::string style);
+    void ask(std::string question, std::string context, std::string style, std::string domain);
+    // ...
+
+    void explain(std::string term);
+
+    void fix_grammar(std::string grammar);
+    void fix_spelling(std::string spelling);
+    void fix_style(std::string style);
+    
+    void translate(std::string text);
+
+    void summarize(std::string text);
+
+    void beautify(std::string text);
+    void beautify(std::string text, std::string style);
+    void beautify(std::string text, std::string style, std::string domain);
+    void beautify(std::string text, std::string style, std::string domain, std::string topic);
+    // ...
+
+    void simplify(std::string text);
+    void simplify(std::string text, std::string style);
+    void simplify(std::string text, std::string style, std::string domain);
+    // ...
+
+    void generate(std::string text);
+    void generate(std::string text, std::string context);
+    void generate(std::string text, std::string context, std::string style);
+    void generate(std::string text, std::string context, std::string style, std::string domain);
+    void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic);
+    void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author);
+    void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author, std::string emotion);
+    void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author, std::string emotion, std::string intent);
+    void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author, std::string emotion, std::string intent, std::string audience);
+    void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author, std::string emotion, std::string intent, std::string audience, std::string purpose);
+
+    // other use cases
+    void fix_source(std::string source);
+    void fix_bug(std::string bug);
+    void create_plan(std::string plan);
+    
+
+};
+
+}
+#endif // M8R_WINGMAN_H

From ada001a9137bfe6b3eddf981ebac2ffcfba80be5 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sat, 18 Nov 2023 22:19:35 +0100
Subject: [PATCH 047/131] Adding initial version of the library synchronization
 and removal #923

---
 .gitignore                                    |   1 +
 app/app.pro                                   |   4 +
 app/resources/qt/images/mindforger-icon.png   | Bin 8835 -> 7079 bytes
 app/src/qt/dialogs/add_library_dialog.cpp     |  13 +-
 app/src/qt/dialogs/add_library_dialog.h       |   3 -
 app/src/qt/dialogs/rm_library_dialog.cpp      | 111 +++++++++++++++
 app/src/qt/dialogs/rm_library_dialog.h        |  69 +++++++++
 app/src/qt/dialogs/sync_library_dialog.cpp    |  88 ++++++++++++
 app/src/qt/dialogs/sync_library_dialog.h      |  69 +++++++++
 app/src/qt/main_menu_presenter.cpp            |   4 +-
 app/src/qt/main_menu_view.cpp                 |  19 ++-
 app/src/qt/main_window_presenter.cpp          | 131 +++++++++++++++++-
 app/src/qt/main_window_presenter.h            |   8 ++
 lib/src/config/configuration.h                |   4 +-
 lib/src/config/repository.h                   |   6 +-
 lib/src/gear/file_utils.cpp                   |  43 +++++-
 lib/src/gear/file_utils.h                     |   6 +
 lib/src/mind/dikw/filesystem_information.cpp  | 127 +++++++++++++++--
 lib/src/mind/dikw/filesystem_information.h    |  37 ++++-
 lib/src/mind/dikw/information.cpp             |   5 +-
 lib/src/mind/dikw/information.h               |   1 +
 .../markdown_document_representation.cpp      |  15 +-
 22 files changed, 707 insertions(+), 57 deletions(-)
 create mode 100644 app/src/qt/dialogs/rm_library_dialog.cpp
 create mode 100644 app/src/qt/dialogs/rm_library_dialog.h
 create mode 100644 app/src/qt/dialogs/sync_library_dialog.cpp
 create mode 100644 app/src/qt/dialogs/sync_library_dialog.h

diff --git a/.gitignore b/.gitignore
index 0cf7c6da..b1a564c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@ Release/
 Debug/
 .vs/
 .idea/
+.vscode/
 .venv/
 *.o
 *.a
diff --git a/app/app.pro b/app/app.pro
index 741fb557..7076e7e7 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -276,7 +276,9 @@ HEADERS += \
     src/qt/dialogs/add_library_dialog.h \
     src/qt/dialogs/export_csv_file_dialog.h \
     src/qt/dialogs/organizer_new_dialog.h \
+    src/qt/dialogs/rm_library_dialog.h \
     src/qt/dialogs/run_tool_dialog.h \
+    src/qt/dialogs/sync_library_dialog.h \
     src/qt/dialogs/terminal_dialog.h \
     src/qt/kanban_column_model.h \
     src/qt/kanban_column_presenter.h \
@@ -401,7 +403,9 @@ SOURCES += \
     src/qt/dialogs/add_library_dialog.cpp \
     src/qt/dialogs/export_csv_file_dialog.cpp \
     src/qt/dialogs/organizer_new_dialog.cpp \
+    src/qt/dialogs/rm_library_dialog.cpp \
     src/qt/dialogs/run_tool_dialog.cpp \
+    src/qt/dialogs/sync_library_dialog.cpp \
     src/qt/dialogs/terminal_dialog.cpp \
     src/qt/kanban_column_model.cpp \
     src/qt/kanban_column_presenter.cpp \
diff --git a/app/resources/qt/images/mindforger-icon.png b/app/resources/qt/images/mindforger-icon.png
index 61d797e7198aef2ddfe3aa6a20604638e535e493..43f7b7589dd897d0444ec1705733dce1a52bba4f 100644
GIT binary patch
literal 7079
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
Re1ZS~002ovPDHLkV1oHBh$;X8

literal 8835
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
FV1gjKxl#ZC

diff --git a/app/src/qt/dialogs/add_library_dialog.cpp b/app/src/qt/dialogs/add_library_dialog.cpp
index 0076db5f..b06671c2 100644
--- a/app/src/qt/dialogs/add_library_dialog.cpp
+++ b/app/src/qt/dialogs/add_library_dialog.cpp
@@ -31,13 +31,11 @@ AddLibraryDialog::AddLibraryDialog(QWidget* parent)
             "Choose a directory (library) of PDF files to be indexed. MindForger\n"
             "will create new notebook for every library file. Such notebook can be\n"
             "used to easily open the library file and create library file related\n"
-            "notes and annotatioons.\n\n"
+            "notes.\n\n"
             "Choose new library source:"),
         parent};
     findDirectoryButton = new QPushButton{tr("Directory")};
 
-    libraryNameLabel = new QLabel{tr("Library name:"), parent};
-    libraryNameEdit = new QLineEdit{parent};
     uriLabel = new QLabel{tr("Library source path:"), parent};
     uriEdit = new QLineEdit{parent};
 
@@ -65,8 +63,6 @@ AddLibraryDialog::AddLibraryDialog(QWidget* parent)
     srcButtonLayout->addWidget(findDirectoryButton);
     srcButtonLayout->addStretch();
     mainLayout->addLayout(srcButtonLayout);
-    mainLayout->addWidget(libraryNameLabel);
-    mainLayout->addWidget(libraryNameEdit);
     mainLayout->addWidget(uriLabel);
     mainLayout->addWidget(uriEdit);
     mainLayout->addWidget(pdfCheckBox);
@@ -88,6 +84,13 @@ AddLibraryDialog::AddLibraryDialog(QWidget* parent)
 
 AddLibraryDialog::~AddLibraryDialog()
 {
+    delete findLibrarySourceLabel;
+    delete uriLabel;
+    delete uriEdit;
+    delete findDirectoryButton;
+    delete pdfCheckBox;
+    delete createButton;
+    delete closeButton;
 }
 
 void AddLibraryDialog::show()
diff --git a/app/src/qt/dialogs/add_library_dialog.h b/app/src/qt/dialogs/add_library_dialog.h
index ec15beac..089f1847 100644
--- a/app/src/qt/dialogs/add_library_dialog.h
+++ b/app/src/qt/dialogs/add_library_dialog.h
@@ -44,8 +44,6 @@ class AddLibraryDialog : public QDialog
     std::vector notes;
 
     QLabel* findLibrarySourceLabel;
-    QLabel* libraryNameLabel;
-    QLineEdit* libraryNameEdit;
     QLabel* uriLabel;
     QLineEdit* uriEdit;
 
@@ -68,7 +66,6 @@ class AddLibraryDialog : public QDialog
     void show();
 
     QPushButton* getCreateButton() const { return createButton; }
-    QString getLibraryNameText() const { return libraryNameEdit->text(); }
     QString getLibraryUriText() const { return uriEdit->text(); }
     bool isIndexPdf() const { return pdfCheckBox->isChecked(); }
 
diff --git a/app/src/qt/dialogs/rm_library_dialog.cpp b/app/src/qt/dialogs/rm_library_dialog.cpp
new file mode 100644
index 00000000..ee3a6706
--- /dev/null
+++ b/app/src/qt/dialogs/rm_library_dialog.cpp
@@ -0,0 +1,111 @@
+/*
+ sync_library_dialog.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "rm_library_dialog.h"
+
+using namespace std;
+
+namespace m8r {
+
+RemoveLibraryDialog::RemoveLibraryDialog(QWidget* parent)
+    : QDialog(parent),
+      libsToRemove()
+{
+    // widgets
+    findLibrarySourceLabel = new QLabel{
+        tr(
+            "Choose a library to be removed - this action will delete\n"
+            "Notebooks which represent documents from the library\n"
+            "directory.\n"
+            "Referenced documents will NOT be deleted.\n"
+        ),
+        parent};
+
+    librariesLabel = new QLabel{tr("Choose library to delete: ")};
+    libraryPathsCombo = new QComboBox{this};
+
+    // IMPROVE disable/enable find button if text/path is valid: freedom vs validation
+    rmButton = new QPushButton{tr("&Delete")};
+    rmButton->setDefault(true);
+    closeButton = new QPushButton{tr("&Cancel")};
+
+    // signals
+    QObject::connect(
+        closeButton, SIGNAL(clicked()),
+        this, SLOT(close()));
+
+    // assembly
+    QVBoxLayout* mainLayout = new QVBoxLayout{};
+    mainLayout->addWidget(findLibrarySourceLabel);
+    mainLayout->addWidget(librariesLabel);
+    mainLayout->addWidget(libraryPathsCombo);
+
+    QHBoxLayout* buttonLayout = new QHBoxLayout{};
+    buttonLayout->addStretch(1);
+    buttonLayout->addWidget(closeButton);
+    buttonLayout->addWidget(rmButton);
+    buttonLayout->addStretch();
+
+    mainLayout->addLayout(buttonLayout);
+    setLayout(mainLayout);
+
+    // dialog
+    setWindowTitle(tr("Delete Document Library"));
+    resize(fontMetrics().averageCharWidth()*55, height());
+    setModal(true);
+}
+
+void RemoveLibraryDialog::addLibraryToRemove(FilesystemInformationSource* libSrc)
+{
+    libsToRemove.push_back(libSrc);
+    libraryPathsCombo->addItem(QString::fromStdString(libSrc->getPath()));
+}
+
+RemoveLibraryDialog::~RemoveLibraryDialog()
+{
+    delete findLibrarySourceLabel;
+    delete librariesLabel;
+    delete libraryPathsCombo;
+    delete rmButton;
+    delete closeButton;
+}
+
+void RemoveLibraryDialog::reset() {
+    libraryPathsCombo->clear();
+    for(FilesystemInformationSource* libToRemove:libsToRemove) {
+        delete libToRemove;
+    }
+    libsToRemove.clear();
+}
+
+string RemoveLibraryDialog::getLibraryMfPathForLocator(string& locator) {
+    for(FilesystemInformationSource* libToRemove:libsToRemove) {
+        if(locator == libToRemove->getPath()) {
+            return libToRemove->getMfPath();
+        }
+    }
+
+    return string{};
+}
+
+void RemoveLibraryDialog::show()
+{
+    QDialog::show();
+}
+
+} // m8r namespace
diff --git a/app/src/qt/dialogs/rm_library_dialog.h b/app/src/qt/dialogs/rm_library_dialog.h
new file mode 100644
index 00000000..35e84b1e
--- /dev/null
+++ b/app/src/qt/dialogs/rm_library_dialog.h
@@ -0,0 +1,69 @@
+/*
+rm_library_dialog.h     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8RUI_RM_LIBRARY_DIALOG_H
+#define M8RUI_RM_LIBRARY_DIALOG_H
+
+#include 
+
+#include "../../lib/src/model/outline.h"
+#include "../../lib/src/config/repository.h"
+#include "../../lib/src/mind/dikw/filesystem_information.h"
+
+#include 
+
+namespace m8r {
+
+/**
+ * @brief Synchronize document library dialog.
+ *
+ * The dialog is instantiated in main window presenter.
+ */
+class RemoveLibraryDialog : public QDialog
+{
+    Q_OBJECT
+
+private:
+    QLabel* findLibrarySourceLabel;
+    QLabel* librariesLabel;
+    QComboBox* libraryPathsCombo;
+
+    QPushButton* rmButton;
+    QPushButton* closeButton;
+
+    std::vector libsToRemove;
+
+public:
+    explicit RemoveLibraryDialog(QWidget* parent);
+    RemoveLibraryDialog(const RemoveLibraryDialog&) = delete;
+    RemoveLibraryDialog(const RemoveLibraryDialog&&) = delete;
+    RemoveLibraryDialog& operator=(const RemoveLibraryDialog&) = delete;
+    RemoveLibraryDialog& operator=(const RemoveLibraryDialog&&) = delete;
+    ~RemoveLibraryDialog();
+
+    void reset();
+    std::string getLibraryMfPathForLocator(std::string& locator);
+    void show();
+
+    QPushButton* getRemoveButton() const { return rmButton; }
+    QComboBox* getLibraryPathsCombo() const { return libraryPathsCombo; }
+    void addLibraryToRemove(FilesystemInformationSource* libSrc);
+};
+
+}
+#endif // M8RUI_RM_LIBRARY_DIALOG_H
diff --git a/app/src/qt/dialogs/sync_library_dialog.cpp b/app/src/qt/dialogs/sync_library_dialog.cpp
new file mode 100644
index 00000000..a3cd24ed
--- /dev/null
+++ b/app/src/qt/dialogs/sync_library_dialog.cpp
@@ -0,0 +1,88 @@
+/*
+ sync_library_dialog.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "sync_library_dialog.h"
+
+using namespace std;
+
+namespace m8r {
+
+SyncLibraryDialog::SyncLibraryDialog(QWidget* parent)
+    : QDialog(parent)
+{
+    // widgets
+    findLibrarySourceLabel = new QLabel{
+        tr(
+            "Choose a library directory to be synchronized - new notebook\n"
+            "will be created for every new document found in the library.\n"
+            "Existing MindForger notebooks for library documents which were\n"
+            "deleted, renamed or moved (i.e. their link to library document\n"
+            "is broken) will not be deprecated to protect your document-related\n"
+            "notes. Feel free to deprecate such notebook(s) yourself.\n"
+        ),
+        parent};
+
+    librariesLabel = new QLabel{tr("Choose library to update: ")};
+    libraryPathsCombo = new QComboBox{this};
+
+    // IMPROVE disable/enable find button if text/path is valid: freedom vs validation
+    syncButton = new QPushButton{tr("&Update")};
+    syncButton->setDefault(true);
+    closeButton = new QPushButton{tr("&Cancel")};
+
+    // signals
+    QObject::connect(
+        closeButton, SIGNAL(clicked()),
+        this, SLOT(close()));
+
+    // assembly
+    QVBoxLayout* mainLayout = new QVBoxLayout{};
+    mainLayout->addWidget(findLibrarySourceLabel);
+    mainLayout->addWidget(librariesLabel);
+    mainLayout->addWidget(libraryPathsCombo);
+
+    QHBoxLayout* buttonLayout = new QHBoxLayout{};
+    buttonLayout->addStretch(1);
+    buttonLayout->addWidget(closeButton);
+    buttonLayout->addWidget(syncButton);
+    buttonLayout->addStretch();
+
+    mainLayout->addLayout(buttonLayout);
+    setLayout(mainLayout);
+
+    // dialog
+    setWindowTitle(tr("Update Document Library"));
+    resize(fontMetrics().averageCharWidth()*55, height());
+    setModal(true);
+}
+
+SyncLibraryDialog::~SyncLibraryDialog()
+{
+    delete findLibrarySourceLabel;
+    delete librariesLabel;
+    delete libraryPathsCombo;
+    delete syncButton;
+    delete closeButton;
+}
+
+void SyncLibraryDialog::show()
+{
+    QDialog::show();
+}
+
+} // m8r namespace
diff --git a/app/src/qt/dialogs/sync_library_dialog.h b/app/src/qt/dialogs/sync_library_dialog.h
new file mode 100644
index 00000000..fc7d74c4
--- /dev/null
+++ b/app/src/qt/dialogs/sync_library_dialog.h
@@ -0,0 +1,69 @@
+/*
+sync_library_dialog.h     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8RUI_SYNC_LIBRARY_DIALOG_H
+#define M8RUI_SYNC_LIBRARY_DIALOG_H
+
+#include 
+
+#include "../../lib/src/model/outline.h"
+#include "../../lib/src/config/repository.h"
+
+#include 
+
+namespace m8r {
+
+/**
+ * @brief Synchronize document library dialog.
+ *
+ * The dialog is instantiated in main window presenter.
+ */
+class SyncLibraryDialog : public QDialog
+{
+    Q_OBJECT
+
+private:
+    QLabel* findLibrarySourceLabel;
+    QLabel* librariesLabel;
+    QComboBox* libraryPathsCombo;
+
+    QPushButton* syncButton;
+    QPushButton* closeButton;
+
+public:
+    explicit SyncLibraryDialog(QWidget* parent);
+    SyncLibraryDialog(const SyncLibraryDialog&) = delete;
+    SyncLibraryDialog(const SyncLibraryDialog&&) = delete;
+    SyncLibraryDialog& operator=(const SyncLibraryDialog&) = delete;
+    SyncLibraryDialog& operator=(const SyncLibraryDialog&&) = delete;
+    ~SyncLibraryDialog();
+
+    void reset() {
+        libraryPathsCombo->clear();
+    }
+    void show();
+
+    QPushButton* getSyncButton() const { return syncButton; }
+    QComboBox* getLibraryPathsCombo() const { return libraryPathsCombo; }
+    void addLibraryToSync(std::string libraryPath) {
+        libraryPathsCombo->addItem(QString::fromStdString(libraryPath));
+    }
+};
+
+}
+#endif // M8RUI_SYNC_LIBRARY_DIALOG_H
diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp
index 1f1b7e27..59a88dbb 100644
--- a/app/src/qt/main_menu_presenter.cpp
+++ b/app/src/qt/main_menu_presenter.cpp
@@ -129,9 +129,9 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
     QObject::connect(view->actionNavigatorShuffle, SIGNAL(triggered()), mwp, SLOT(doActionNavigatorShuffle()));
 
     // menu: Library
-#ifdef MF_WIP
     QObject::connect(view->actionLibraryAdd, SIGNAL(triggered()), mwp, SLOT(doActionLibraryNew()));
-#endif
+    QObject::connect(view->actionLibrarySync, SIGNAL(triggered()), mwp, SLOT(doActionLibrarySync()));
+    QObject::connect(view->actionLibraryDeprecate, SIGNAL(triggered()), mwp, SLOT(doActionLibraryRm()));
 
     // menu: Organizer
     QObject::connect(
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index ed763978..2188e788 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -386,35 +386,34 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuNavigator->setEnabled(false);
 
     // menu: library
-#ifdef MF_WIP
     menuLibrary = qMenuBar->addMenu(tr("Lib&rary"));
 
     actionLibraryAdd = new QAction(
         QIcon(":/menu-icons/new.svg"), tr("&New library"), mainWindow);
     actionLibraryAdd->setStatusTip(
-        tr("Add directory with documents, URL or other library resource..."));
+        tr("Add path to the directory with documents (PDF, txt, HTML)..."));
 
     // choose library > determine library src directory > re-index src directory
     // show side-by-side comparison: ONLY in src / ACTION <.del> / ONLY in MF
     // - includes synchronization in one on another direction
     // - decisions executed AFTER user clicks DO IT button (not while editing dialog)
     actionLibrarySync= new QAction(
-        QIcon(":/menu-icons/new.svg"), tr("&Synchronize library"), mainWindow);
+        QIcon(":/menu-icons/new.svg"),
+        tr("&Update library"),
+        mainWindow);
     actionLibrarySync->setStatusTip(
         tr(
-            "Synchronize library source with MindForger notebook(s) which represent"
+            "Synchronize library source directory with MindForger notebook(s) which represent"
             "library resources..."));
 
     actionLibraryDeprecate = new QAction(
-        QIcon(":/menu-icons/delete.svg"), tr("&Deprecate library"), mainWindow);
+        QIcon(":/menu-icons/delete.svg"), tr("&Delete library"), mainWindow);
     actionLibraryDeprecate->setStatusTip(tr(
-        "Move a library resource with documents to limbo..."));
-    actionLibraryDeprecate->setDisabled(true);
+        "Delete all Notebooks representing the library resources..."));
 
     menuLibrary->addAction(actionLibraryAdd);
     menuLibrary->addAction(actionLibrarySync);
     menuLibrary->addAction(actionLibraryDeprecate);
-#endif
 
     // menu: flashcards
 #ifdef MF_WIP
@@ -1099,10 +1098,8 @@ void MainMenuView::showAllMenuItems()
 
 #ifdef MF_WIP
     menuLibrary->setEnabled(true);
-
     actionLibraryAdd->setEnabled(true);
-    // TODO to be implemented
-    actionLibraryDeprecate->setEnabled(false);
+    actionLibraryDeprecate->setEnabled(true);
 #endif
 
 #ifdef MF_WIP
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index 137305fc..ea7ac589 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -52,6 +52,8 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
 
     // initialize components
     newLibraryDialog = new AddLibraryDialog{&view};
+    syncLibraryDialog = new SyncLibraryDialog{&view};
+    rmLibraryDialog = new RemoveLibraryDialog(&view);
     runToolDialog = new RunToolDialog{&view};
     scopeDialog = new ScopeDialog{mind->getOntology(), &view};
     newOrganizerDialog = new OrganizerNewDialog{mind->getOntology(), &view};
@@ -102,6 +104,12 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
     QObject::connect(
         newLibraryDialog->getCreateButton(), SIGNAL(clicked()),
         this, SLOT(handleNewLibrary()));
+    QObject::connect(
+        syncLibraryDialog->getSyncButton(), SIGNAL(clicked()),
+        this, SLOT(handleSyncLibrary()));
+    QObject::connect(
+        rmLibraryDialog->getRemoveButton(), SIGNAL(clicked()),
+        this, SLOT(handleRmLibrary()));
     QObject::connect(
         scopeDialog->getSetButton(), SIGNAL(clicked()), this, SLOT(handleMindScope()));
     QObject::connect(
@@ -2999,13 +3007,9 @@ void MainWindowPresenter::handleNewLibrary()
         return;
     }
 
-    // TODO check that it's new path (SAFE library update is different operation)
-
     newLibraryDialog->hide();
 
-    // TODO add library to repository configuration
-
-    // TODO index library documents
+    // index library documents
     FilesystemInformationSource informationSource{
         uri,
         *orloj->getMind(),
@@ -3019,7 +3023,7 @@ void MainWindowPresenter::handleNewLibrary()
         QMessageBox::critical(
             &view,
             tr("Add Library Error"),
-            tr("Library already indexed - use update action to reindex documents.")
+            tr("Library already indexed - use 'Update library' action to synchronize documents.")
         );
         return;
     }
@@ -3042,6 +3046,121 @@ void MainWindowPresenter::handleNewLibrary()
     orloj->showFacetOutlineList(mind->getOutlines());
 }
 
+void MainWindowPresenter::doActionLibrarySync()
+{
+    syncLibraryDialog->reset();
+
+    // determine existing library dirs
+    vector srcs
+        = FilesystemInformationSource::findInformationSources(
+            config,
+            *orloj->getMind(),
+            *mdDocumentRepresentation);
+
+    if(srcs.size()) {
+        for(FilesystemInformationSource* src:srcs) {
+            syncLibraryDialog->addLibraryToSync(src->getPath());
+
+            delete src;
+        }
+
+        syncLibraryDialog->show();
+    } else {
+        QMessageBox::information(
+            &view,
+            tr("Library synchronization"),
+            tr("There are no libraries - nothing to synchronize.")
+        );
+    }
+}
+
+void MainWindowPresenter::handleSyncLibrary()
+{
+    syncLibraryDialog->hide();
+
+    string librarySrcDir
+        = syncLibraryDialog->getLibraryPathsCombo()->currentText().toStdString();
+
+    FilesystemInformationSource informationSource{
+        librarySrcDir,
+        *orloj->getMind(),
+        *mdDocumentRepresentation,
+    };
+
+    informationSource.indexToMemory(*config.getActiveRepository(), true);
+
+    rmLibraryDialog->reset();
+}
+
+
+void MainWindowPresenter::doActionLibraryRm()
+{
+    rmLibraryDialog->reset();
+
+    // determine existing library dirs
+    vector srcs
+        = FilesystemInformationSource::findInformationSources(
+            config,
+            *orloj->getMind(),
+            *mdDocumentRepresentation);
+
+    if(srcs.size()) {
+        for(FilesystemInformationSource* src:srcs) {
+            rmLibraryDialog->addLibraryToRemove(src);
+        }
+
+        rmLibraryDialog->show();
+    } else {
+        QMessageBox::information(
+            &view,
+            tr("Library deletion"),
+            tr("There are no libraries - nothing to delete.")
+        );
+    }
+}
+
+void MainWindowPresenter::handleRmLibrary()
+{
+    rmLibraryDialog->hide();
+
+    string librarySrcDir
+        = rmLibraryDialog->getLibraryPathsCombo()->currentText().toStdString();
+
+    // confirm removal of MF directory
+    QMessageBox msgBox{
+        QMessageBox::Question,
+        tr("Delete Library"),
+        tr("Do you really want to delete Notebooks which represent the library documents?")
+    };
+    QPushButton* yes = msgBox.addButton("&Yes", QMessageBox::YesRole);
+#ifdef __APPLE__
+    yes->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_Y));
+    yes->setToolTip("⌘Y");
+
+    QPushButton* no =
+#endif
+    msgBox.addButton("&No", QMessageBox::NoRole);
+#ifdef __APPLE__
+    no->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_N));
+    no->setToolTip("⌘N");
+#endif
+    msgBox.exec();
+
+    QAbstractButton* choosen = msgBox.clickedButton();
+    if(yes == choosen) {
+        // purge library directory
+        string mfLibraryPath{rmLibraryDialog->getLibraryMfPathForLocator(librarySrcDir)};
+        removeDirectoryRecursively(mfLibraryPath.c_str());
+
+        // reload the whole workspace
+        doActionMindRelearn(
+            QString::fromStdString(config.getActiveRepository()->getPath())
+        );
+    }
+
+    rmLibraryDialog->reset();
+}
+
 void MainWindowPresenter::doActionOrganizerNew()
 {
     newOrganizerDialog->show(mind->getOutlines());
diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h
index 664b0042..709dfcc2 100644
--- a/app/src/qt/main_window_presenter.h
+++ b/app/src/qt/main_window_presenter.h
@@ -38,6 +38,8 @@
 #include "status_bar_presenter.h"
 
 #include "dialogs/add_library_dialog.h"
+#include "dialogs/sync_library_dialog.h"
+#include "dialogs/rm_library_dialog.h"
 #include "dialogs/run_tool_dialog.h"
 #include "dialogs/organizer_new_dialog.h"
 #include "dialogs/outline_new_dialog.h"
@@ -121,6 +123,8 @@ class MainWindowPresenter : public QObject
     StatusBarPresenter* statusBar;
 
     AddLibraryDialog* newLibraryDialog;
+    SyncLibraryDialog* syncLibraryDialog;
+    RemoveLibraryDialog* rmLibraryDialog;
     RunToolDialog* runToolDialog;
     ScopeDialog* scopeDialog;
     OrganizerNewDialog* newOrganizerDialog;
@@ -253,6 +257,10 @@ public slots:
     // library
     void doActionLibraryNew();
     void handleNewLibrary();
+    void doActionLibrarySync();
+    void handleSyncLibrary();
+    void doActionLibraryRm();
+    void handleRmLibrary();
     // organizer
     void doActionOrganizerNew();
     void handleCreateOrganizer();
diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h
index 9f7d2cb0..f58253ad 100644
--- a/lib/src/config/configuration.h
+++ b/lib/src/config/configuration.h
@@ -123,8 +123,8 @@ class RepositoryConfigurationPersistence;
  * @brief MindForger configuration.
  *
  * Configuration file (Markdown-based DSL) maintained by this class contains
- * location of repositories, active repository and user preferences (for GUI
- * and library).
+ * location of repositories, active repository and user preferences
+ * (for GUIand library).
  *
  * MindForger configuration file is stored in ~/.mindforger.md by default.
  *
diff --git a/lib/src/config/repository.h b/lib/src/config/repository.h
index 380f848e..80992692 100644
--- a/lib/src/config/repository.h
+++ b/lib/src/config/repository.h
@@ -35,9 +35,9 @@ class Repository
     /**
      * @brief Repository type.
      *
-     * MindForger repository is a directory with sub-directories enabling advanced
-     * knowledge organization and memory/ directory with Outlines written in Markdown-based
-     * DSL (metadata enriched) format.
+     * MindForger repository is a directory with sub-directories enabling
+     * knowledge organization and memory/ directory with Outlines written
+     * in Markdown-based DSL (metadata enriched) format.
      *
      * Markdown repository is any directory structure containing Markdown files.
      */
diff --git a/lib/src/gear/file_utils.cpp b/lib/src/gear/file_utils.cpp
index b73b71e2..f43fdf22 100644
--- a/lib/src/gear/file_utils.cpp
+++ b/lib/src/gear/file_utils.cpp
@@ -451,7 +451,8 @@ bool isPathRelative(const string& path)
     }
 }
 
-bool createDirectory(const string& path) {
+bool createDirectory(const string& path)
+{
 #ifdef _WIN32
     int e = _mkdir(path.c_str());
 #else
@@ -466,6 +467,46 @@ bool createDirectory(const string& path) {
     }
 }
 
+bool createDirectories(const string& path)
+{
+#if defined(_WIN32)
+    int ret = _mkdir(path.c_str());
+#else
+    mode_t mode = 0755;
+    int ret = mkdir(path.c_str(), mode);
+#endif
+    if (ret == 0)
+        return true;
+
+    switch (errno) {
+    case ENOENT:
+        // parent didn't exist, try to create it
+        {
+            size_t pos = path.find_last_of('/');
+            if (pos == std::string::npos)
+#if defined(_WIN32)
+                pos = path.find_last_of('\\');
+            if (pos == std::string::npos)
+#endif
+                return false;
+            if (!createDirectories( path.substr(0, pos) ))
+                return false;
+        }
+        // now, try to create again
+#if defined(_WIN32)
+        return 0 == _mkdir(path.c_str());
+#else
+        return 0 == mkdir(path.c_str(), mode);
+#endif
+
+    case EEXIST:
+        return isDirectory(path.c_str());
+
+    default:
+        return false;
+    }
+}
+
 char* makeTempDirectory(char* dirNamePrefix)
 {
 #ifdef _WIN32
diff --git a/lib/src/gear/file_utils.h b/lib/src/gear/file_utils.h
index bcd21761..836ba870 100644
--- a/lib/src/gear/file_utils.h
+++ b/lib/src/gear/file_utils.h
@@ -246,12 +246,18 @@ int removeDirectoryRecursively(const char* path);
 int copyDirectoryRecursively(const char* srcPath, const char* dstPath, bool extractGz=false);
 bool createDirectory(const std::string& path);
 
+/**
+ * @brief Create directory including (non-existent) parent directories.
+ */
+bool createDirectories(const std::string& path);
+
 /**
  * @brief Get path to the the executable on macOS or windows. Othewise returns nullptr.
  *
  * Method is not reentrant - it returns pointer to the static buffer.
  */
 char* getExecutablePath();
+
 } // m8r namespace
 
 #endif /* M8R_FILE_UTILS_H_ */
diff --git a/lib/src/mind/dikw/filesystem_information.cpp b/lib/src/mind/dikw/filesystem_information.cpp
index 914c07c0..0fcd774a 100644
--- a/lib/src/mind/dikw/filesystem_information.cpp
+++ b/lib/src/mind/dikw/filesystem_information.cpp
@@ -23,6 +23,93 @@ using namespace m8r::filesystem;
 
 namespace m8r {
 
+constexpr const auto META_SRC_PATH_PREFIX = "Source directory: ";
+
+std::vector FilesystemInformationSource::findInformationSources(
+    Configuration &config,
+    Mind& mind,
+    MarkdownDocumentRepresentation& mdDocumentRepresentation
+) {
+    vector infoSrc;
+
+    if(config.getActiveRepository()->getType() != Repository::RepositoryType::MINDFORGER
+       || config.getActiveRepository()->getMode() != Repository::RepositoryMode::REPOSITORY
+    ) {
+        MF_DEBUG(
+            "Error: filesystem information resource cannot be indexed as "
+            "active directory is not of MINDFORGER/REPOSITORY type");
+        return infoSrc;
+    }
+
+    string libraryPath{
+        config.getMemoryPath()+FILE_PATH_SEPARATOR+DIR_MEMORY_M1ndF0rg3rL1br8ry
+    };
+    if(!isDirectory(libraryPath.c_str())) {
+        MF_DEBUG(
+            "Error: memory's library path '" << libraryPath << "' does not exist");
+        return infoSrc;
+    }
+
+    MF_DEBUG(
+        endl <<
+        "SEARCHING existing information sources in memory's library path: '" <<
+        libraryPath << "'");
+    DIR* dir;
+    if((dir = opendir(libraryPath.c_str()))) {
+        const struct dirent *entry;
+        if((entry = readdir(dir))) {
+            string path;
+            do {
+                if(entry->d_type == DT_DIR) {
+                    if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
+                        continue;
+                    }
+                    MF_DEBUG(
+                        endl << "LIBRARY SOURCE> " << libraryPath.c_str() << "/" << entry->d_name);
+                    path.assign(libraryPath);
+                    path += FILE_PATH_SEPARATOR;
+                    path += entry->d_name;
+
+                    string metaPath{
+                        path+FILE_PATH_SEPARATOR+FILE_META_M1ndF0rg3rL1br8ryM3t8
+                    };
+                    MF_DEBUG(endl << "  Metadata file path: '" << metaPath << "'");
+                    if(!isFile(metaPath.c_str())) {
+                        continue;
+                    }
+
+                    vector metaLines{};
+                    size_t fileSize{};
+                    fileToLines(&metaPath, metaLines, fileSize);
+
+                    if(metaLines.size() >= 2 && metaLines[2]) {
+                        string* line=metaLines[2];
+                        string libSrcPath = line->substr(strlen(META_SRC_PATH_PREFIX));
+                        MF_DEBUG(
+                            endl << "    Library source dir: '" << libSrcPath << "'");
+
+                        if(!isDirectory(libSrcPath.c_str())) {
+                            continue;
+                        }
+
+                        MF_DEBUG(endl << "      VALID");
+                        FilesystemInformationSource* src = new FilesystemInformationSource{
+                            libSrcPath,
+                            mind,
+                            mdDocumentRepresentation,
+                        };
+                        src->setMfPath(path);
+                        infoSrc.push_back(src);
+                    }
+                }
+            } while ((entry = readdir(dir)) != 0);
+            closedir(dir);
+        }
+    }
+
+    return infoSrc;
+}
+
 FilesystemInformationSource::FilesystemInformationSource(
     string& sourcePath,
     Mind& mind,
@@ -30,7 +117,8 @@ FilesystemInformationSource::FilesystemInformationSource(
 )
     : InformationSource{SourceType::FILESYSTEM, sourcePath},
       mind{mind},
-      mdDocumentRepresentation{mdDocumentRepresentation}
+      mdDocumentRepresentation{mdDocumentRepresentation},
+      mfPath{}
 {
 }
 
@@ -68,7 +156,7 @@ FilesystemInformationSource::~FilesystemInformationSource()
 }
 
 FilesystemInformationSource::ErrorCode FilesystemInformationSource::indexToMemory(
-    Repository& repository
+    Repository& repository, bool synchronize
 ) {
     MF_DEBUG("Indexing LIBRARY documents to memory:" << endl);
 
@@ -107,7 +195,7 @@ FilesystemInformationSource::ErrorCode FilesystemInformationSource::indexToMemor
     memoryInformationSourceIndexPath += FILE_PATH_SEPARATOR;
     memoryInformationSourceIndexPath += normalizeToNcName(this->locator, '_');
     MF_DEBUG("  Library path in memory: " << memoryInformationSourceIndexPath << endl);
-    if(isDirectory(memoryInformationSourceIndexPath.c_str())) {
+    if(!synchronize && isDirectory(memoryInformationSourceIndexPath.c_str())) {
         return ErrorCode::LIBRARY_ALREADY_EXISTS;
     } else {
         createDirectory(memoryInformationSourceIndexPath);
@@ -132,16 +220,25 @@ FilesystemInformationSource::ErrorCode FilesystemInformationSource::indexToMemor
 
         pathToDirectoryAndFile(outlinePathInMemory, outlineDir, outlineFilename);
         if(outlineDir.size() && !isDirectory(outlineDir.c_str())) {
-            // TODO create directory including parent directories
-            MF_DEBUG("      TO BE IMPLEMENTED - create directory including parent directories: " << outlinePathInMemory << endl);
-            createDirectory(outlineDir);
+            MF_DEBUG("      creating dir including parent dirs: " << outlinePathInMemory << endl);
+            createDirectories(outlineDir);
         }
 
-        Outline* o=mdDocumentRepresentation.to(*pdf_path, outlinePathInMemory);
-
-        mind.outlineNew(o);
+        if(!isFile(outlinePathInMemory.c_str())) {
+            Outline* o=mdDocumentRepresentation.to(*pdf_path, outlinePathInMemory);
+            mind.outlineNew(o);
+        } else {
+            MF_DEBUG("      SKIPPING creation of O as it already EXISTS");
+        }
     }
 
+    string metaPath{
+        memoryInformationSourceIndexPath
+        + FILE_PATH_SEPARATOR
+        + FILE_META_M1ndF0rg3rL1br8ryM3t8
+    };
+    saveMetadata(metaPath, locator);
+
     return ErrorCode::SUCCESS;
 }
 
@@ -191,4 +288,16 @@ void FilesystemInformationSource::indexDirectoryToMemory(
     }
 }
 
+void FilesystemInformationSource::saveMetadata(
+    string& metaPath,
+    string& librarySrcPath
+) {
+    std::ofstream out(metaPath);
+    out << "# MindForger Library Metadata" << endl
+    << "Library name: My library" << endl
+    << META_SRC_PATH_PREFIX << librarySrcPath << endl;
+    out.close();
+
+}
+
 } // m8r namespace
diff --git a/lib/src/mind/dikw/filesystem_information.h b/lib/src/mind/dikw/filesystem_information.h
index 772fcbee..37ec3323 100644
--- a/lib/src/mind/dikw/filesystem_information.h
+++ b/lib/src/mind/dikw/filesystem_information.h
@@ -64,7 +64,23 @@ class FilesystemInformationSource : InformationSource
     Mind& mind;
     MarkdownDocumentRepresentation& mdDocumentRepresentation;
 
+    std::string mfPath;
+
 public:
+    /**
+     * @brief Find information sources in given directory.
+     *
+     * List sub-directories of given directory and check whether the sub-directory
+     * has metadata file describing ainformation source (library). For every such
+     * directory create FilesystemInformationSource instance and return vector
+     * of such instances.
+     */
+    static std::vector findInformationSources(
+        Configuration &config,
+        Mind& mind,
+        MarkdownDocumentRepresentation& mdDocumentRepresentation
+    );
+
     explicit FilesystemInformationSource(
        std::string& sourcePath,
        Mind& mind,
@@ -79,15 +95,16 @@ class FilesystemInformationSource : InformationSource
     /**
      * @brief Index this information source to memory.
      *
-     * Scan given filesystem directory, find know files
-     * and convert them to Os/Ns/Ts/... in memory so that
-     * the information might be used.
+     * Scan given filesystem directory, find documents with known extensions
+     * and convert them to Os/Ns/Ts/... in memory so that the information
+     * might be used.
      *
      * For instance index given filesystem information by creating Markdown
-     * descriptor in $MINDFORGER_REPOSITORY/memory for each file
-     * found in given information source.
+     * descriptor in $MINDFORGER_REPOSITORY/memory for each document found in given
+     * information source.
      *
      * Orphan detection and management:
+     *
      * - list of library's Os in memory is scanned before documents indexation
      * - if a document does NOT have valid path to document, then it is TAGGED
      *   with `orphan` tag
@@ -96,12 +113,18 @@ class FilesystemInformationSource : InformationSource
      *
      * @return true if source was successfully indexed, false otherwise.
      */
-    ErrorCode indexToMemory(Repository& repository);
+    ErrorCode indexToMemory(Repository& repository, bool synchronize = false);
 
     std::set getPdfs() const { return this->pdfs_paths; }
+    std::string getPath() const {return this->locator; }
+    void setMfPath(std::string mfPath) { this->mfPath = mfPath; }
+    std::string getMfPath() {return mfPath; }
+
+    void saveMetadata(std::string& metaPath, std::string& librarySrcPath);
 
 private:
-    void indexDirectoryToMemory(const std::string& directory, const std::string& memoryPath);
+    void indexDirectoryToMemory(
+        const std::string& directory, const std::string& memoryPath);
 };
 
 }
diff --git a/lib/src/mind/dikw/information.cpp b/lib/src/mind/dikw/information.cpp
index 82969e11..77b3b656 100644
--- a/lib/src/mind/dikw/information.cpp
+++ b/lib/src/mind/dikw/information.cpp
@@ -22,7 +22,10 @@ using namespace std;
 
 namespace m8r {
 
-const std::string InformationSource::DIR_MEMORY_M1ndF0rg3rL1br8ry = string{"M1ndF0rg3r-L1br8ry"};
+const std::string InformationSource::DIR_MEMORY_M1ndF0rg3rL1br8ry
+    = string{"M1ndF0rg3r-L1br8ry"};
+const std::string InformationSource::FILE_META_M1ndF0rg3rL1br8ryM3t8
+    = string{"M1ndF0rg3r-L1br8ry-M3t8"};
 
 InformationSource::InformationSource(SourceType type, std::string locator)
     : type{type},
diff --git a/lib/src/mind/dikw/information.h b/lib/src/mind/dikw/information.h
index e6474f51..f0af23b1 100644
--- a/lib/src/mind/dikw/information.h
+++ b/lib/src/mind/dikw/information.h
@@ -27,6 +27,7 @@ class InformationSource
 {
 public:
     static const std::string DIR_MEMORY_M1ndF0rg3rL1br8ry;
+    static const std::string FILE_META_M1ndF0rg3rL1br8ryM3t8;
 
     enum SourceType {
         FILESYSTEM,
diff --git a/lib/src/representations/markdown/markdown_document_representation.cpp b/lib/src/representations/markdown/markdown_document_representation.cpp
index 13a2f407..97d57ab3 100644
--- a/lib/src/representations/markdown/markdown_document_representation.cpp
+++ b/lib/src/representations/markdown/markdown_document_representation.cpp
@@ -61,18 +61,19 @@ Outline* MarkdownDocumentRepresentation::to(
     o->addDescriptionLine(new string{"---"});
     o->addDescriptionLine(new string{""});
     o->addDescriptionLine(new string{
-        "This notebook represents the document from above in MindForger. "
-        "Notebook was created automatically on indexation of a library "
+        "This notebook represents above document in MindForger. This Notebook "
+        "was created automatically on indexation of a library "
         "and may contain document text (if available) to enable full-text "
-        "search, associations and content mining. You can add notes with "
-        "your remarks, thoughts and ideas to this notebook as usually."
+        "search, associations and content mining."});
+    o->addDescriptionLine(new string{""});
+    o->addDescriptionLine(new string{
+        "Add notes with your remarks, thoughts and ideas to this notebook."
         }
     );
     o->addDescriptionLine(new string{""});
     o->addDescriptionLine(new string{
-        "Please do not edit the first row of this description with "
-        "document path to ensure that the notebook stays interlinked "
-        "with the document."
+        "Please **DO NOT EDIT** the first row of this description with "
+        "the document path - notebook must stay interlinked with the document."
         }
     );
     o->addDescriptionLine(new string{""});

From af6551efaeabf0924f1f9f0250849e867ef68ed2 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sat, 18 Nov 2023 22:30:58 +0100
Subject: [PATCH 048/131] Removing dead slot (tools) and updating changelog
 (libraries).

---
 Changelog                      | 3 +++
 app/src/qt/main_menu_view.h    | 2 +-
 app/src/qt/orloj_presenter.cpp | 6 ------
 app/src/qt/orloj_presenter.h   | 1 -
 4 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/Changelog b/Changelog
index 79e4efb2..b0b21eee 100644
--- a/Changelog
+++ b/Changelog
@@ -6,6 +6,9 @@
       to the list of Organizers, up/down button in O/N preview mode to move around
       O's Ns while presenting a N. Tools allowing to get more information about
       the word under cursor from Wikipedia, arXiv, LLM chats or web search engines.
+      Libraries - ability to index external PDF files and generate Notebooks
+      which represent them in MindForger (update and removal of the library
+      supported as well.
 
 2023-01-15  Martin Dvorak  
 
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index 69f6e2bb..e60166df 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -52,8 +52,8 @@ class MainMenuView : public QObject
     QMenu* menuKnowledge;
 #endif
     QMenu* menuNavigator;
-#ifdef MF_WIP
     QMenu* menuLibrary;
+#ifdef MF_WIP
     QMenu* menuFlashcards;
 #endif
     QMenu* menuOrganizer;
diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp
index 097f10c1..5341e1f0 100644
--- a/app/src/qt/orloj_presenter.cpp
+++ b/app/src/qt/orloj_presenter.cpp
@@ -908,12 +908,6 @@ void OrlojPresenter::slotShowOutlineNavigator(Outline* outline)
     }
 }
 
-void OrlojPresenter::slotOpenRunToolDialog(const QString& pattern)
-{
-    MF_DEBUG("Slot to RUN TOOL: " << pattern.toStdString() << endl);
-    // TODO this->mainPresenter->getInsertLinkDialog()->show();
-}
-
 /**
  * @brief Return MD links for given O/N name prefix (pattern).
  *
diff --git a/app/src/qt/orloj_presenter.h b/app/src/qt/orloj_presenter.h
index eaa7cb3d..ce1bc6cc 100644
--- a/app/src/qt/orloj_presenter.h
+++ b/app/src/qt/orloj_presenter.h
@@ -232,7 +232,6 @@ public slots:
     void slotShowNavigator();
     void slotShowNoteNavigator(Note* note);
     void slotShowOutlineNavigator(Outline* outline);
-    void slotOpenRunToolDialog(const QString& pattern);
     void slotGetLinksForPattern(const QString& pattern);
     void slotRefreshCurrentNotePreview();
     void slotOutlinesTableSorted(int column);

From 934d2299aa6b25026f4daed3e4e9f698cf7be74a Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 19 Nov 2023 09:41:37 +0100
Subject: [PATCH 049/131] WIP left menu bar wit tools & short cuts.

---
 app/app.pro                            |   2 +
 app/mf-resources.qrc                   |   5 +
 app/resources/icons/arxiv.png          | Bin 0 -> 3103 bytes
 app/resources/icons/duckduckgo.png     | Bin 0 -> 6027 bytes
 app/resources/icons/h2oai.png          | Bin 0 -> 1839 bytes
 app/resources/icons/stackoverflow.png  | Bin 0 -> 3152 bytes
 app/resources/icons/wikipedia.png      | Bin 0 -> 3163 bytes
 app/src/qt/dialogs/run_tool_dialog.cpp |  10 +-
 app/src/qt/dialogs/run_tool_dialog.h   |   2 +-
 app/src/qt/left_toolbar_view.cpp       |  60 ++++++++
 app/src/qt/left_toolbar_view.h         |  72 ++++++++++
 app/src/qt/main_menu_presenter.cpp     |   8 --
 app/src/qt/main_menu_view.cpp          |  53 -------
 app/src/qt/main_menu_view.h            |   9 --
 app/src/qt/main_window_presenter.cpp   | 185 +++++++++++++++++++------
 app/src/qt/main_window_presenter.h     |  14 +-
 app/src/qt/main_window_view.cpp        |   3 +
 app/src/qt/main_window_view.h          |   4 +
 app/src/qt/note_edit_view.cpp          |   4 +
 app/src/qt/note_editor_view.cpp        |  18 ++-
 app/src/qt/note_editor_view.h          |   3 +
 lib/src/config/configuration.h         |   1 +
 22 files changed, 325 insertions(+), 128 deletions(-)
 create mode 100644 app/resources/icons/arxiv.png
 create mode 100644 app/resources/icons/duckduckgo.png
 create mode 100644 app/resources/icons/h2oai.png
 create mode 100644 app/resources/icons/stackoverflow.png
 create mode 100644 app/resources/icons/wikipedia.png
 create mode 100644 app/src/qt/left_toolbar_view.cpp
 create mode 100644 app/src/qt/left_toolbar_view.h

diff --git a/app/app.pro b/app/app.pro
index 7076e7e7..bc06ec1f 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -285,6 +285,7 @@ HEADERS += \
     src/qt/kanban_column_view.h \
     src/qt/kanban_presenter.h \
     src/qt/kanban_view.h \
+    src/qt/left_toolbar_view.h \
     src/qt/note_smart_editor.h \
     src/qt/organizer_view.h \
     src/qt/organizer_presenter.h \
@@ -412,6 +413,7 @@ SOURCES += \
     src/qt/kanban_column_view.cpp \
     src/qt/kanban_presenter.cpp \
     src/qt/kanban_view.cpp \
+    src/qt/left_toolbar_view.cpp \
     src/qt/note_smart_editor.cpp \
     src/qt/organizer_view.cpp \
     src/qt/organizer_presenter.cpp \
diff --git a/app/mf-resources.qrc b/app/mf-resources.qrc
index 36bc6a29..75907a22 100644
--- a/app/mf-resources.qrc
+++ b/app/mf-resources.qrc
@@ -18,6 +18,11 @@
         resources/icons/flat-think.svg
         resources/icons/flat-adapt.svg
         resources/icons/flat-help.svg
+        resources/icons/arxiv.png
+        resources/icons/wikipedia.png
+        resources/icons/stackoverflow.png
+        resources/icons/duckduckgo.png
+        resources/icons/h2oai.png
     
     
         resources/qt/translations/mindforger_cs.qm
diff --git a/app/resources/icons/arxiv.png b/app/resources/icons/arxiv.png
new file mode 100644
index 0000000000000000000000000000000000000000..08e504b67479150d310b44750ce0f7efecb050b3
GIT binary patch
literal 3103
zcmV+)4B+#LP)RA@u(S_yDf)fxWo+p_3O$R74BKqw#x(rRVYK`OM>szU{I
zMA32Tv{SLxDKc7>sWC6zRRlrDAqg~)Kp;T!!j?UG%YFU+
zbKjnq+?SUZgpOx`ci%n#Ip_cW^*e9S-WWC3kG_V?YJEzaQ}h-nlba6Bs{6574VM81zF6ZjU@01b!l6Yxr$nKz*n-hjI<_5{wVa@Q
zZ|x{07E0|V3AZIb!AG`H^&EJoRN`}NJB?LU%?BeVrri!=>y1()VZcFW_tjF(+Gk(w
z)@*I6{M<8#`^qtyi~SqaB=|nalzP+9Z2wdt>t&yw9`4K3W^RZV27T3qSf$MNPk}L_
zJvRIpTMA7xvqICIBVbv_CTX7#etu3%gBya<(7>4U?Y5W|3XM<{6mt^Ox
zio_sRSI*K|Ca9F;k-?i8ZV`gvs1C>n=8W9qAFh?q>^yc9K0Xh<{Bn9yhjZ*$v>vEM
z^OqGWPwmCUxahg3kx6eJd}|Y`f3q4^uG6hNkLy}%YH{p?_i^N{chOQ&3Ao)x=u32P
zXp-B)=_4&2P|kQS`h`iq7W`dW!05~qy_>n@u)*p)A6iBRU+VC+cEH!(3Y(2ZBQpQE
zMnH&SvZqC}F?8MZoE2#V;Aa^7TAJbKK6C#0Dhe*VP}SO&+8TU#-9mI9ZNLRjt--{l
zOVQEjLixf)=&q@O=3vNDP?U9dbtEoG?v^A6`Iv%|T3Fc`x#2&BCFLn^3jt5oj%^QMG0*F8%Y1u-a|N9ycE2
zZeNDR&vs$_k|oLrl~1ihSM^?4(lY}Q;)7*K4rV{Q78!Z@@N~Pe`=N)?S$hEKBS&G{
zV~@a|nMobGv70&Hxo3}IC}kRewnpg#E0K5MOw?`IfFrN|jm6J_Fko(&_s!XuasNuC
zK-cjm_-Ngz2YcDY<|3~{3HTNf+&Q&oGh_gA|K#sKW|xREiT1QTyt1{;l1_2k;n
zz9HfvZuhjcVBbrBLD}^;plsd(Y`tvTjMi@SKF0y9L;D%mWQDrv#e3s#-
zf+aUDK^AlL$kuXN^))nC>}H!0NsZyIp?cjjXm4y#p_iVOO+yYvN0SSC9)AL$k{XLv
z^kBP^oaNBP$SPJDtQ{RV_>T=C(UISs4=bZn(oe~HJs7rNz5?so@hMt%?g~}*kcTY{
zhf|+yM^jljG={f|D}J=U_a0myZG&^s4XR2yi-+ShHx87H(4jKt@9x4Ucijiqrgx&5bNzU&4`jo?*CP0g8bh`PE8YU1eL*eyjnR
zLyMVy<4|zvC208fM%Wm(RvL5Uwb!U6^>1v1hb_%6^@t;6QdNbSuNo6w%W}fW@GZD<
zE{fSQGKz~r=ZQjL))37=s$cpmTpQkGm1WVBb|P&gAR>=aNxP1pP|=`Lf;$bp;xeR<
z7{MNGM2f1mCPTB?(0$}6j+JduhLdwfQBR3dovE2KdlrUFo{Y{D$64Xa6oCnja37}E
z-1NfeWw)@9+yLjKQrKy&{tP#Z8yhGUh@x7C=NS490-L(xUKUQn&N_h)DVczYKfV){
z53W*%N^}U&dPc|C#fxFFT2VM>4l+wh&`LHo;@ThZ3@aKK1zjXE)(9NN$voJ{FrISX
zFEIPpk0N*41?Y4&pyriVv3uRqI9XYhkREb~LHoiTTS&j)_vv1g{(L#I$B#$L;X2fB
zDOY(drWv>NW(=8q5qy%Ti42CBO2M6<<7AbgTUu5YioY`t4n||~ytzzg9fujta&{zx
zP$m_w>nxpwl4ZB5#itG&z_y!iM#uhIhDbLuSZ#Bsd?OK6!ZJopQ-`^k+lBM5!Wgz7
zdAWD(GiWIP5P9!xLV8i5YA>ZL?!oq@cL-xifGg98nic-$W*lSdD_{qaF>L+X42}kHF2B5yi`ZAl7K
z){&owscd(WB8NA>kNSVT4)>wMs9OK~V68_n+t09t*TGBUm|hKn#EC`m=)0TI)k<UCB
z#lnvMF2=Ojt*rd}aQx$KN?Hn~P*itY8yenz8x~=OF+;(Z+eh>63N(E5v09jsosHS+
z)?(f}Z(-c6OVPON^U$)%WJuFiJxqo}3L01&oHS@>_^K{FH2!
z4o%NUf7W>;s(50JVsmnC)|fGvbkE)Ji2;PNO8@4iL7gL?v6lz=PCX8>ctwt;ZQIaN
zT}>L?vj`fO2U*B+?)vys(m5x2v=iR8b~J6@fiE6-5H-)g09#%z9N9y7lWE2AouA><
zN1q6JM#k9DQjySBcL%4;Wg?u56cjm*oA%yFa8?P@}E^*%Ii-V9%Jt1?z_SeSNQoOcW@QgUr|b=d!>
zm(WE$6a|h6l+fit-Ebt7NEfX+IV$!&r%#cD(E3(~x+J8N+e#pN7%~>2j8c6i4FX-r
zD9|cE4Sghs{UrOkhgFmN@&@E*C6~1_>6a2J5fLEyYI7RVB65^hR{*(n1)8~)YYiR{
z9%>7@LZBEc8$L_
zY#d`g`raP9X5hbCniuQd^!!TR4;*l~27M&}`g`cW0UK#^&WzLmK4;+e^*{0Y0pc8T
za3BBmupfZqw7aO)Ng2d!(|+g|DSAdidXRKa3i25NoRnrsg@yS^XD?uL-IJ0?3E)9;
zMpA&x7NrDmkoTG$7MvFYMH(sAU=egX(Jd2}O9^15U_ab!Tp7Y6wy3G^{n#&Iv=kgT
z;6YNXKOp)eJ8-~XbLsxr`^?J@+{0&H=K-CV62RwD8m9!X8Ffs`AZD8;>F1OHHamNe
tbT>OT?!2u}>xX}=N^0`~EgGb={|7?vEdO45sdWGV002ovPDHLkV1fi#_9FlQ

literal 0
HcmV?d00001

diff --git a/app/resources/icons/duckduckgo.png b/app/resources/icons/duckduckgo.png
new file mode 100644
index 0000000000000000000000000000000000000000..66e630a6de88fe8f5b0cbf80eee4daeaf95cee3e
GIT binary patch
literal 6027
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
FV1fDW@om$+Y7e`QnXl)3SOvD;~6gkC=oP~
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
+    this->templateEdit->setText(getTemplateTextForToolName(text.toStdString()));
 }
 
 } // m8r namespace
diff --git a/app/src/qt/dialogs/run_tool_dialog.h b/app/src/qt/dialogs/run_tool_dialog.h
index 3f685612..1834e4b9 100644
--- a/app/src/qt/dialogs/run_tool_dialog.h
+++ b/app/src/qt/dialogs/run_tool_dialog.h
@@ -53,7 +53,7 @@ class RunToolDialog : public QDialog
 
     void show();
 
-    QString getTemplateTextForToolName(QString selectedTool) const;
+    QString getTemplateTextForToolName(std::string selectedTool) const;
 
     QPushButton* getRunButton() const { return runButton; }
     QString getSelectedTool() const {
diff --git a/app/src/qt/left_toolbar_view.cpp b/app/src/qt/left_toolbar_view.cpp
new file mode 100644
index 00000000..5a56fbeb
--- /dev/null
+++ b/app/src/qt/left_toolbar_view.cpp
@@ -0,0 +1,60 @@
+/*
+ left_toolbar_view.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "left_toolbar_view.h"
+
+namespace m8r {
+
+LeftToolbarView::LeftToolbarView(MainWindowView* mainWindowView)
+    : QToolBar{tr("Tool Bar"), mainWindowView},
+      mainWindow{mainWindowView}
+{
+    actionLeftToolbarArxiv = addAction(
+        QIcon(":/icons/arxiv.png"),
+        "Open arXiv and find papers related to the current context... (Alt-1)");
+
+    actionLeftToolbarWikipedia = addAction(
+        QIcon(":/icons/wikipedia.png"),
+        "Open Wikipedia and find entry related to the current context... (Alt-2)");
+
+    actionLeftToolbarStackOverflow = addAction(
+        QIcon(":/icons/stackoverflow.png"),
+        "Open StackOverflow and find entry related to the current context... (Alt-3)");
+
+    actionLeftToolbarH2oGpt= addAction(
+        QIcon(":/icons/h2oai.png"),
+        "Open h2oGPT and chat about entry related to the current context... (Alt-4)");
+
+    actionLeftToolbarDuckDuckGo = addAction(
+        QIcon(":/icons/duckduckgo.png"),
+        "Open DuckDuckGo and find entry related to the current context... (Alt-5)");
+
+    // TODO "Open DuckDuckGo and search web for the selected entity..."
+
+    // TODO "Let chatGPT to explaine in simple terms..."
+    // TODO "Use Gramarly to check to grammar..."
+    // TODO "Use Pandoc to convert MindForger's Markdown documents..."
+    // TODO "Build your web with MindForger's Markdown documents and Docusaurus..."
+
+}
+
+LeftToolbarView::~LeftToolbarView()
+{
+}
+
+} // m8r namespace
diff --git a/app/src/qt/left_toolbar_view.h b/app/src/qt/left_toolbar_view.h
new file mode 100644
index 00000000..82a44445
--- /dev/null
+++ b/app/src/qt/left_toolbar_view.h
@@ -0,0 +1,72 @@
+/*
+ left_toolbar_view.h     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8RUI_LEFT_TOOLBAR_VIEW_H
+#define M8RUI_LEFT_TOOLBAR_VIEW_H
+
+#include 
+
+#include "main_window_view.h"
+
+namespace m8r {
+
+class MainWindowView;
+
+class LeftToolbarView : public QToolBar
+{
+    Q_OBJECT
+
+    MainWindowView* mainWindow;
+
+public:
+    QAction* actionLeftToolbarArxiv;
+    QAction* actionLeftToolbarWikipedia;
+    QAction* actionLeftToolbarStackOverflow;
+    QAction* actionLeftToolbarH2oGpt;
+    QAction* actionLeftToolbarDuckDuckGo;
+
+    // IMPORTANT: hide event hidden as it was causing undesired configuration
+    // changes and toolbar hiding on Qt's spontaneous hide/show events. Citation
+    // from Qt doc:
+    //
+    // "Note: A widget receives spontaneous show and hide events when its mapping
+    // status is changed by the window system, e.g. a spontaneous hide event when
+    // the user minimizes the window, and a spontaneous show event when the window
+    // is restored again. After receiving a spontaneous hide event, a widget is
+    // still considered visible in the sense of isVisible()."
+    //
+    // Even use of this->isVisible() within the event didn't fixed the problem.
+    //
+    // @see https://github.com/dvorka/mindforger/issues/1437
+    //
+    // void hideEvent(QHideEvent *) override;
+
+public:
+    explicit LeftToolbarView(MainWindowView* mainWindowView);
+    LeftToolbarView(const LeftToolbarView&) = delete;
+    LeftToolbarView(const LeftToolbarView&&) = delete;
+    LeftToolbarView &operator=(const LeftToolbarView&) = delete;
+    LeftToolbarView &operator=(const LeftToolbarView&&) = delete;
+    ~LeftToolbarView();
+
+signals:
+    void signalLeftToolbarVisibilityChanged(bool visibility);
+};
+
+}
+#endif // M8RUI_LEFT_TOOLBAR_VIEW_H
diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp
index 59a88dbb..53012866 100644
--- a/app/src/qt/main_menu_presenter.cpp
+++ b/app/src/qt/main_menu_presenter.cpp
@@ -290,14 +290,6 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
     QObject::connect(view->actionFormatTable, SIGNAL(triggered()), mwp, SLOT(doActionFormatTable()));
     QObject::connect(view->actionFormatHr, SIGNAL(triggered()), mwp, SLOT(doActionFormatHr()));
 
-    // menu: tools
-    QObject::connect(view->actionToolsArxiv, SIGNAL(triggered()), mwp, SLOT(doActionToolsArxiv()));
-    QObject::connect(view->actionToolsPandoc, SIGNAL(triggered()), mwp, SLOT(doActionToolsPandoc()));
-    QObject::connect(view->actionToolsChatGpt, SIGNAL(triggered()), mwp, SLOT(doActionToolsChatGpt()));
-    QObject::connect(view->actionToolsWikipedia, SIGNAL(triggered()), mwp, SLOT(doActionToolsWikipedia()));
-    QObject::connect(view->actionToolsDocusaurus, SIGNAL(triggered()), mwp, SLOT(doActionToolsDocusaurus()));
-    QObject::connect(view->actionToolsDuckDuckGo, SIGNAL(triggered()), mwp, SLOT(doActionToolsDucDuckGo()));
-
     // menu: help
     QObject::connect(view->actionHelpDocumentation, SIGNAL(triggered()), mwp, SLOT(doActionHelpDocumentation()));
     QObject::connect(view->actionHelpWeb, SIGNAL(triggered()), mwp, SLOT(doActionHelpWeb()));
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index 2188e788..c8e2b43b 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -957,59 +957,6 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuFormat->addAction(actionFormatImage);
     menuFormat->setEnabled(false);
 
-
-#ifdef MF_WIP
-    // menu: tools
-
-    /*
-    menuTools = qMenuBar->addMenu(tr("&Tools"));
-
-    actionToolsWikipedia = new QAction(
-        QIcon(":/menu-icons/link.svg"), tr("&Wikipedia"), mainWindow);
-    actionToolsWikipedia->setStatusTip(
-        tr("Open Wikipadia and find entry of the selected entity..."));
-    menuTools->addAction(actionToolsWikipedia);
-
-    actionToolsArxiv = new QAction(
-        QIcon(":/menu-icons/link.svg"), tr("&arXiv"), mainWindow);
-    actionToolsArxiv->setStatusTip(tr(
-        "Open arXiv and find papers related to the selected entity..."));
-    menuTools->addAction(actionToolsArxiv);
-
-    actionToolsChatGpt = new QAction(
-        QIcon(":/menu-icons/link.svg"),
-        tr("&ChatGPT: Explain ... in simple terms."),
-        mainWindow);
-    actionToolsChatGpt->setStatusTip(
-        tr("Let ChatGPT to explain the selected entry..."));
-    menuTools->addAction(actionToolsChatGpt);
-
-    actionToolsGramarly= new QAction(
-        QIcon(":/menu-icons/link.svg"), tr("&Gramarly"), mainWindow);
-    actionToolsGramarly->setStatusTip(tr(
-        "Use Gramarly to check to grammar..."));
-    menuTools->addAction(actionToolsGramarly);
-
-    actionToolsDuckDuckGo = new QAction(
-        QIcon(":/menu-icons/link.svg"), tr("&DuckDuckGo"), mainWindow);
-    actionToolsDuckDuckGo->setStatusTip(
-        tr("Open DuckDuckGo and search web for the selected entity..."));
-    menuTools->addAction(actionToolsDuckDuckGo);
-
-    actionToolsPandoc = new QAction(
-        QIcon(":/menu-icons/link.svg"), tr("&Pandoc"), mainWindow);
-    actionToolsPandoc ->setStatusTip(
-        tr("Use Pandoc to convert MindForger's Markdown documents..."));
-    menuTools->addAction(actionToolsPandoc);
-
-    actionToolsDocusaurus = new QAction(
-        QIcon(":/menu-icons/link.svg"), tr("D&ocusaurus"), mainWindow);
-    actionToolsDocusaurus->setStatusTip(
-        tr("Build your web with MindForger's Markdown documents and Docusaurus..."));
-    menuTools->addAction(actionToolsDocusaurus);
-    */
-#endif
-
     // menu: help
 
     actionHelpDocumentation = new QAction(
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index e60166df..d6ce0921 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -252,15 +252,6 @@ class MainMenuView : public QObject
     QAction* actionFormatHr;
     QAction* actionFormatTimestamp;
 
-    // menu: Tools
-    QAction* actionToolsWikipedia;
-    QAction* actionToolsArxiv;
-    QAction* actionToolsChatGpt;
-    QAction* actionToolsGramarly;
-    QAction* actionToolsDuckDuckGo;
-    QAction* actionToolsPandoc;
-    QAction* actionToolsDocusaurus;
-
     // menu: Help
     QAction* actionHelpDocumentation;
     QAction* actionHelpWeb;
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index ea7ac589..09cbe135 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -18,6 +18,8 @@
 */
 #include "main_window_presenter.h"
 
+#include 
+
 #include "kanban_column_presenter.h"
 
 using namespace std;
@@ -168,7 +170,48 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
         orloj->getOutlineHeaderEdit()->getView()->getHeaderEditor(), SIGNAL(signalPasteImageData(QImage)),
         this, SLOT(doActionEditPasteImageData(QImage))
     );
-    // wire toolbar signals
+    // wire LEFT toolbar signals
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+1"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionArxivToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarArxiv, SIGNAL(triggered()),
+        this, SLOT(doActionArxivToolbar())
+    );
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+2"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionWikipediaToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarWikipedia, SIGNAL(triggered()),
+        this, SLOT(doActionWikipediaToolbar())
+    );
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+3"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionStackOverflowToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarStackOverflow, SIGNAL(triggered()),
+        this, SLOT(doActionStackOverflowToolbar())
+    );
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+4"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionH2oGptToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarH2oGpt, SIGNAL(triggered()),
+        this, SLOT(doActionH2oGptToolbar())
+    );
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+5"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionDuckDuckGoToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarDuckDuckGo, SIGNAL(triggered()),
+        this, SLOT(doActionDuckDuckGoToolbar())
+    );
+    // wire TOP toolbar signals
     QObject::connect(
         view.getToolBar()->actionNewOutlineOrNote, SIGNAL(triggered()),
         this, SLOT(doActionOutlineOrNoteNew())
@@ -1891,7 +1934,7 @@ void MainWindowPresenter::doActionOpenRunToolDialog(QString& phrase)
     MF_DEBUG("SIGNAL handled: open run tool dialog...");
     this->runToolDialog->setPhraseText(phrase);
     QString templateText = this->runToolDialog->getTemplateTextForToolName(
-        this->runToolDialog->getSelectedTool());
+        this->runToolDialog->getSelectedTool().toStdString());
     if(templateText.length() == 0) {
         return;
     }
@@ -2052,6 +2095,101 @@ void MainWindowPresenter::doActionOutlineNew()
     );
 }
 
+void MainWindowPresenter::doActionArxivToolbar()
+{
+    handleLeftToolbarAction(TOOL_ARXIV);
+}
+
+void MainWindowPresenter::doActionWikipediaToolbar()
+{
+    handleLeftToolbarAction(TOOL_WIKIPEDIA);
+}
+
+void MainWindowPresenter::doActionStackOverflowToolbar()
+{
+    handleLeftToolbarAction(TOOL_STACK_OVERFLOW);
+}
+
+void MainWindowPresenter::doActionH2oGptToolbar()
+{
+    handleLeftToolbarAction(TOOL_H2O_GPT_WEB);
+}
+
+void MainWindowPresenter::doActionDuckDuckGoToolbar()
+{
+    handleLeftToolbarAction(TOOL_DUCKDUCKGO);
+}
+
+void MainWindowPresenter::handleLeftToolbarAction(string selectedTool)
+{
+    // get PHRASE from the active context:
+    // - N editor: get word under cursor OR selected text
+    // - N tree: get N name
+    // - O tree: get O name
+    // - ...
+    QString phrase;
+    if(orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_NOTE)) {
+        phrase = orloj->getNoteEdit()->getView()->getNoteEditor()->getToolPhrase();
+    } else if(
+        orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE)
+        || orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE_HEADER)
+    ) {
+        Outline* o = orloj->getOutlineView()->getCurrentOutline();
+        if(o) {
+              phrase = QString::fromStdString(o->getName());
+        }
+    } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_NOTE)) {
+        Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+        if(note) {
+            phrase = QString::fromStdString(note->getName());
+        }
+    } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_OUTLINE_HEADER)) {
+        phrase = orloj->getOutlineHeaderEdit()->getView()->getHeaderEditor()->getToolPhrase();
+    }
+    else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_LIST_OUTLINES)) {
+        int row = orloj->getOutlinesTable()->getCurrentRow();
+        if(row != OutlinesTablePresenter::NO_ROW) {
+            QStandardItem* item
+                = orloj->getOutlinesTable()->getModel()->item(row);
+            if(item) {
+                Outline* outline = item->data(Qt::UserRole + 1).value();
+                phrase = QString::fromStdString(outline->getName());
+            }
+        }
+    }
+
+    if(phrase.length() == 0) {
+        QMessageBox msgBox{
+            QMessageBox::Critical,
+            QObject::tr("Empty Phrase"),
+            QObject::tr("Phrase to search/explain/process is empty.")
+        };
+        msgBox.exec();
+        return;
+    }
+
+    // use phrase to RUN the tool
+    QString templateText
+        = this->runToolDialog->getTemplateTextForToolName(selectedTool);
+    MF_DEBUG(
+        "Run tool: "
+        << phrase.toStdString() << " -> "
+        << templateText.toStdString() << " -> "
+        << selectedTool << endl
+    );
+
+    // phrase replace @ template > get command, if invalid, then fallback
+    QString command = templateText.replace(QString{TOOL_PHRASE}, phrase);
+    MF_DEBUG("Run tool: command '" << command.toStdString() << "'" << endl);
+    if(selectedTool == TOOL_H2O_GPT_API) {
+        // TODO: sniff HTTP traffic and use HTTP client/JSon to talk to the service
+        MF_DEBUG("H2O GPT API not implemented yet");
+        return;
+    }
+
+    QDesktopServices::openUrl(QUrl{command});
+}
+
 void MainWindowPresenter::doActionOutlineOrNoteNew()
 {
     if(orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE_HEADER)
@@ -3498,49 +3636,6 @@ void MainWindowPresenter::doActionViewLimbo()
     }
 }
 
-
-void MainWindowPresenter::doActionToolsWikipedia()
-{
-    QDesktopServices::openUrl(
-        QUrl{"https://wikipedia.org"}
-    );
-}
-
-void MainWindowPresenter::doActionToolsArxiv()
-{
-    QDesktopServices::openUrl(
-        QUrl{"https://arxiv.org/multi?group=grp_math&%2Ffind=Search"}
-    );
-}
-
-void MainWindowPresenter::doActionToolsDuckDuckGo()
-{
-    QDesktopServices::openUrl(
-        QUrl{"https://duckduckgo.com/"}
-    );
-}
-
-void MainWindowPresenter::doActionToolsDocusaurus()
-{
-    QDesktopServices::openUrl(
-        QUrl{"https://docusaurus.io/docs/installation"}
-    );
-}
-
-void MainWindowPresenter::doActionToolsPandoc()
-{
-    QDesktopServices::openUrl(
-        QUrl{"https://pandoc.org/installing.html"}
-    );
-}
-
-void MainWindowPresenter::doActionToolsChatGpt()
-{
-    QDesktopServices::openUrl(
-        QUrl{"https://chat.openai.com/chat"}
-    );
-}
-
 void MainWindowPresenter::doActionHelpDocumentation()
 {
     QDesktopServices::openUrl(QUrl{"https://github.com/dvorka/mindforger/wiki"});
diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h
index 709dfcc2..5efd84c1 100644
--- a/app/src/qt/main_window_presenter.h
+++ b/app/src/qt/main_window_presenter.h
@@ -369,13 +369,13 @@ public slots:
     void doActionToggleLiveNotePreview();
     void doActionNameDescFocusSwap();
     void doActionSpellCheck();
-    // tools
-    void doActionToolsWikipedia();
-    void doActionToolsArxiv();
-    void doActionToolsChatGpt();
-    void doActionToolsDuckDuckGo();
-    void doActionToolsPandoc();
-    void doActionToolsDocusaurus();
+    // tools toolbar
+    void handleLeftToolbarAction(std::string selectedTool);
+    void doActionArxivToolbar();
+    void doActionWikipediaToolbar();
+    void doActionStackOverflowToolbar();
+    void doActionH2oGptToolbar();
+    void doActionDuckDuckGoToolbar();
     // help
     void doActionHelpDocumentation();
     void doActionHelpWeb();
diff --git a/app/src/qt/main_window_view.cpp b/app/src/qt/main_window_view.cpp
index 49505d65..12569b3d 100644
--- a/app/src/qt/main_window_view.cpp
+++ b/app/src/qt/main_window_view.cpp
@@ -31,6 +31,9 @@ MainWindowView::MainWindowView(LookAndFeels& lookAndFeel)
     // IMPROVE toolbar position to be configurable
     addToolBar(Qt::TopToolBarArea, toolBarView);
 
+    leftToolBarView = new LeftToolbarView{this};
+    addToolBar(Qt::LeftToolBarArea, leftToolBarView);
+
     centralWidget = new QWidget(this);
 
     centralLayout = new QVBoxLayout{centralWidget};
diff --git a/app/src/qt/main_window_view.h b/app/src/qt/main_window_view.h
index 34dd4d8c..9643517c 100644
--- a/app/src/qt/main_window_view.h
+++ b/app/src/qt/main_window_view.h
@@ -26,6 +26,7 @@
 
 #include "main_window_presenter.h"
 #include "main_toolbar_view.h"
+#include "left_toolbar_view.h"
 #include "main_menu_presenter.h"
 #include "cli_n_breadcrumbs_view.h"
 #include "orloj_view.h"
@@ -36,6 +37,7 @@ namespace m8r {
 class OrlojView;
 class MainWindowPresenter;
 class MainToolbarView;
+class LeftToolbarView;
 class CliAndBreadcrumbsView;
 
 /**
@@ -59,6 +61,7 @@ class MainWindowView: public QMainWindow
 
     OrlojView* orlojView;
     MainToolbarView* toolBarView;
+    LeftToolbarView* leftToolBarView;
     StatusBarView* statusBarView;
 
 public:
@@ -71,6 +74,7 @@ class MainWindowView: public QMainWindow
 
     QMenuBar* getMenuBar() const { return menuBar(); }
     MainToolbarView* getToolBar() const { return toolBarView; }
+    LeftToolbarView* getLeftToolBar() const { return leftToolBarView; }
     CliAndBreadcrumbsView* getCli() const;
     OrlojView* getOrloj() const { return orlojView; }
     StatusBarView* getStatusBar() const { return statusBarView; }
diff --git a/app/src/qt/note_edit_view.cpp b/app/src/qt/note_edit_view.cpp
index af523da7..c1b4d53c 100644
--- a/app/src/qt/note_edit_view.cpp
+++ b/app/src/qt/note_edit_view.cpp
@@ -45,13 +45,16 @@ NoteEditView::NoteEditView(QWidget* parent)
         QKeySequence(Qt::CTRL+Qt::Key_L),
         this, SLOT(slotSaveAndCloseEditor()));
 #else
+    // TODO leak?
     new QShortcut(
         QKeySequence(Qt::ALT+Qt::Key_Left),
         this, SLOT(slotSaveAndCloseEditor()));
 #endif
+    // TODO leak?
     new QShortcut(
         QKeySequence(Qt::CTRL+Qt::Key_G),
         this, SLOT(slotCloseEditor()));
+    // TODO leak?
     new QShortcut(
 #if __APPLE__
         QKeySequence(Qt::CTRL+Qt::Key_Return),
@@ -59,6 +62,7 @@ NoteEditView::NoteEditView(QWidget* parent)
         QKeySequence(Qt::ALT+Qt::Key_Return),
 #endif
         this, SLOT(slotOpenNotePropertiesEditor()));
+    // TODO leak?
     new QShortcut(
         QKeySequence(Qt::CTRL+Qt::Key_S),
         this, SLOT(slotSaveNote()));
diff --git a/app/src/qt/note_editor_view.cpp b/app/src/qt/note_editor_view.cpp
index c0e1f895..5fd415f0 100644
--- a/app/src/qt/note_editor_view.cpp
+++ b/app/src/qt/note_editor_view.cpp
@@ -562,7 +562,14 @@ void NoteEditorView::performTextCompletion(const QString& completionPrefix)
     completer->complete(rect);
 }
 
-void NoteEditorView::slotStartRunTool()
+/**
+ * @brief Get phrase to be used by a tool (arXiv, GPT, Wikipedia, ...)
+ *
+ * Either return selected text or word under the cursor.
+ *
+ * @return phrase text
+ */
+QString NoteEditorView::getToolPhrase()
 {
     QString phrase{};
 
@@ -571,7 +578,6 @@ void NoteEditorView::slotStartRunTool()
     if(selection.size()) {
         phrase = selection;
     } else {
-        // TODO get word under cursor OR get selected text
         MF_DEBUG(
             "Run tool: getting the phrase under the cursor..." << endl);
         phrase = getCompletionPrefix();
@@ -580,6 +586,14 @@ void NoteEditorView::slotStartRunTool()
             << "'" << endl);
     }
 
+    return phrase;
+}
+
+
+void NoteEditorView::slotStartRunTool()
+{
+    QString phrase = getToolPhrase();
+
     if(!phrase.isEmpty()) {
     MF_DEBUG(
         "Run tool: sending signal to open the dialog..." << endl);
diff --git a/app/src/qt/note_editor_view.h b/app/src/qt/note_editor_view.h
index 5609f009..be2be9c3 100644
--- a/app/src/qt/note_editor_view.h
+++ b/app/src/qt/note_editor_view.h
@@ -122,6 +122,9 @@ class NoteEditorView : public QPlainTextEdit
     void clearHitCounter() { hitCounter=0; }
     int getHitCounter() const { return hitCounter; }
 
+    // tools
+    QString getToolPhrase();
+
     // autocomplete
 protected:
     virtual void mousePressEvent(QMouseEvent* event) override;
diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h
index f58253ad..5f3ed689 100644
--- a/lib/src/config/configuration.h
+++ b/lib/src/config/configuration.h
@@ -104,6 +104,7 @@ constexpr const auto TOOL_PHRASE = "<>";
 constexpr const auto TOOL_ARXIV = "arXiv";
 constexpr const auto TOOL_DUCKDUCKGO = "DuckDuckGo";
 constexpr const auto TOOL_DEEPL = "DeepL web";
+constexpr const auto TOOL_STACK_OVERFLOW = "StackOverflow";
 constexpr const auto TOOL_GH_PROJECTS = "GitHub projects";
 constexpr const auto TOOL_GH_TOPICS = "GitHub topics";
 constexpr const auto TOOL_GOOGLE_BARD = "Google Bard";

From 5344b171164e2973e82720144599cc548f9b179a Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 19 Nov 2023 16:54:52 +0100
Subject: [PATCH 050/131] Adding more left-bart tools: bard, github, Python
 doc, C++ doc, ...

---
 app/mf-resources.qrc                   |   4 ++
 app/resources/icons/bard.png           | Bin 0 -> 3800 bytes
 app/resources/icons/cpp.png            | Bin 0 -> 3820 bytes
 app/resources/icons/github.png         | Bin 0 -> 4503 bytes
 app/resources/icons/python.png         | Bin 0 -> 6194 bytes
 app/src/qt/dialogs/run_tool_dialog.cpp |  12 +++++-
 app/src/qt/left_toolbar_view.cpp       |  29 +++++++++-----
 app/src/qt/left_toolbar_view.h         |   4 ++
 app/src/qt/main_window_presenter.cpp   |  52 +++++++++++++++++++++++++
 app/src/qt/main_window_presenter.h     |   4 ++
 lib/src/config/configuration.h         |   4 +-
 11 files changed, 97 insertions(+), 12 deletions(-)
 create mode 100644 app/resources/icons/bard.png
 create mode 100644 app/resources/icons/cpp.png
 create mode 100644 app/resources/icons/github.png
 create mode 100644 app/resources/icons/python.png

diff --git a/app/mf-resources.qrc b/app/mf-resources.qrc
index 75907a22..2358eb23 100644
--- a/app/mf-resources.qrc
+++ b/app/mf-resources.qrc
@@ -23,6 +23,10 @@
         resources/icons/stackoverflow.png
         resources/icons/duckduckgo.png
         resources/icons/h2oai.png
+        resources/icons/github.png
+        resources/icons/bard.png
+        resources/icons/python.png
+        resources/icons/cpp.png
     
     
         resources/qt/translations/mindforger_cs.qm
diff --git a/app/resources/icons/bard.png b/app/resources/icons/bard.png
new file mode 100644
index 0000000000000000000000000000000000000000..e9250331b652919c26fbe5ae711a7b276351cfb6
GIT binary patch
literal 3800
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�pjlW$kbX!A
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

literal 0
HcmV?d00001

diff --git a/app/resources/icons/python.png b/app/resources/icons/python.png
new file mode 100644
index 0000000000000000000000000000000000000000..c48d3af7561e1bc07ac9fedae0cfb7db852dbad5
GIT binary patch
literal 6194
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
Qi~s-t07*qoM6N<$g25&WjsO4v

literal 0
HcmV?d00001

diff --git a/app/src/qt/dialogs/run_tool_dialog.cpp b/app/src/qt/dialogs/run_tool_dialog.cpp
index 729b1b1f..7d44a308 100644
--- a/app/src/qt/dialogs/run_tool_dialog.cpp
+++ b/app/src/qt/dialogs/run_tool_dialog.cpp
@@ -32,7 +32,7 @@ RunToolDialog::RunToolDialog(QWidget* parent)
         QString{TOOL_DUCKDUCKGO},
         QString{TOOL_GOOGLE_BARD},
         QString{TOOL_GOOGLE_SEARCH},
-        QString{TOOL_GH_PROJECTS},
+        QString{TOOL_GH_REPOS},
         QString{TOOL_GH_TOPICS},
         QString{TOOL_H2O_GPT_WEB},
         QString{TOOL_H2O_GPT_API},
@@ -113,6 +113,14 @@ QString RunToolDialog::getTemplateTextForToolName(string selectedTool) const
         return templateText;
     } else if(selectedTool == TOOL_DEEPL) {
         return QString{"https://www.deepl.com/en/translator"};
+    } else if(selectedTool == TOOL_DOC_PYTHON) {
+        QString templateText{"https://docs.python.org/3.10/search.html?q="};
+        templateText.append(TOOL_PHRASE);
+        return templateText;
+    } else if(selectedTool == TOOL_DOC_CPP) {
+        QString templateText{"https://duckduckgo.com/?sites=cppreference.com&ia=web&q="};
+        templateText.append(TOOL_PHRASE);
+        return templateText;
     } else if(selectedTool == TOOL_STACK_OVERFLOW) {
         QString templateText{"https://stackoverflow.com/search?q="};
         templateText.append(TOOL_PHRASE);
@@ -126,7 +134,7 @@ QString RunToolDialog::getTemplateTextForToolName(string selectedTool) const
         QString templateText{"https://www.github.com/search?q="};
         templateText.append(TOOL_PHRASE);
         return templateText;
-    } else if(selectedTool == TOOL_GH_PROJECTS) {
+    } else if(selectedTool == TOOL_GH_REPOS) {
         // TODO fix search URL
         QString templateText{"https://www.github.com/search?q="};
         templateText.append(TOOL_PHRASE);
diff --git a/app/src/qt/left_toolbar_view.cpp b/app/src/qt/left_toolbar_view.cpp
index 5a56fbeb..5f693407 100644
--- a/app/src/qt/left_toolbar_view.cpp
+++ b/app/src/qt/left_toolbar_view.cpp
@@ -30,27 +30,38 @@ LeftToolbarView::LeftToolbarView(MainWindowView* mainWindowView)
 
     actionLeftToolbarWikipedia = addAction(
         QIcon(":/icons/wikipedia.png"),
-        "Open Wikipedia and find entry related to the current context... (Alt-2)");
+        "Open Wikipedia and find entries related to the current context... (Alt-2)");
 
     actionLeftToolbarStackOverflow = addAction(
         QIcon(":/icons/stackoverflow.png"),
-        "Open StackOverflow and find entry related to the current context... (Alt-3)");
+        "Open StackOverflow and find entries related to the current context... (Alt-3)");
 
     actionLeftToolbarH2oGpt= addAction(
         QIcon(":/icons/h2oai.png"),
-        "Open h2oGPT and chat about entry related to the current context... (Alt-4)");
+        "Open h2oGPT and chat about the current context... (Alt-4)");
 
     actionLeftToolbarDuckDuckGo = addAction(
         QIcon(":/icons/duckduckgo.png"),
-        "Open DuckDuckGo and find entry related to the current context... (Alt-5)");
+        "Open DuckDuckGo and find entries related to the current context... (Alt-5)");
 
-    // TODO "Open DuckDuckGo and search web for the selected entity..."
+    actionLeftToolbarGitHub = addAction(
+        QIcon(":/icons/github.png"),
+        "Open GitHub and find entries related to the current context... (Alt-6)");
 
-    // TODO "Let chatGPT to explaine in simple terms..."
-    // TODO "Use Gramarly to check to grammar..."
-    // TODO "Use Pandoc to convert MindForger's Markdown documents..."
-    // TODO "Build your web with MindForger's Markdown documents and Docusaurus..."
+    actionLeftToolbarBard = addAction(
+        QIcon(":/icons/bard.png"),
+        "Open Bard and chat about the current context... (Alt-7)");
+
+    actionLeftToolbarPython = addAction(
+        QIcon(":/icons/python.png"),
+        "Open Python documentation and find entries related to the current context... (Alt-8)");
 
+    actionLeftToolbarCpp = addAction(
+        QIcon(":/icons/cpp.png"),
+        "Open C++ documentation and find entries related to the current context... (Alt-9)");
+
+    // TODO "Let chatGPT to explaine in simple terms..."
+    // TODO "Use Gramarly to check to grammar..." > bard/chatGPT can check grammar
 }
 
 LeftToolbarView::~LeftToolbarView()
diff --git a/app/src/qt/left_toolbar_view.h b/app/src/qt/left_toolbar_view.h
index 82a44445..e1d69d86 100644
--- a/app/src/qt/left_toolbar_view.h
+++ b/app/src/qt/left_toolbar_view.h
@@ -39,6 +39,10 @@ class LeftToolbarView : public QToolBar
     QAction* actionLeftToolbarStackOverflow;
     QAction* actionLeftToolbarH2oGpt;
     QAction* actionLeftToolbarDuckDuckGo;
+    QAction* actionLeftToolbarGitHub;
+    QAction* actionLeftToolbarBard;
+    QAction* actionLeftToolbarPython;
+    QAction* actionLeftToolbarCpp;
 
     // IMPORTANT: hide event hidden as it was causing undesired configuration
     // changes and toolbar hiding on Qt's spontaneous hide/show events. Citation
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index 09cbe135..523a22bc 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -211,6 +211,38 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
         view.getLeftToolBar()->actionLeftToolbarDuckDuckGo, SIGNAL(triggered()),
         this, SLOT(doActionDuckDuckGoToolbar())
     );
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+6"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionGitHubToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarGitHub, SIGNAL(triggered()),
+        this, SLOT(doActionGitHubToolbar())
+    );
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+7"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionBardToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarBard, SIGNAL(triggered()),
+        this, SLOT(doActionBardToolbar())
+    );
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+8"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionPythonToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarPython, SIGNAL(triggered()),
+        this, SLOT(doActionPythonToolbar())
+    );
+    QObject::connect(
+        new QShortcut(QKeySequence("Alt+9"), view.getOrloj()), SIGNAL(activated()),
+        this, SLOT(doActionCppToolbar())
+    );
+    QObject::connect(
+        view.getLeftToolBar()->actionLeftToolbarCpp, SIGNAL(triggered()),
+        this, SLOT(doActionCppToolbar())
+    );
     // wire TOP toolbar signals
     QObject::connect(
         view.getToolBar()->actionNewOutlineOrNote, SIGNAL(triggered()),
@@ -2120,6 +2152,26 @@ void MainWindowPresenter::doActionDuckDuckGoToolbar()
     handleLeftToolbarAction(TOOL_DUCKDUCKGO);
 }
 
+void MainWindowPresenter::doActionGitHubToolbar()
+{
+    handleLeftToolbarAction(TOOL_GH_REPOS);
+}
+
+void MainWindowPresenter::doActionBardToolbar()
+{
+    handleLeftToolbarAction(TOOL_GOOGLE_BARD);
+}
+
+void MainWindowPresenter::doActionPythonToolbar()
+{
+    handleLeftToolbarAction(TOOL_DOC_PYTHON);
+}
+
+void MainWindowPresenter::doActionCppToolbar()
+{
+    handleLeftToolbarAction(TOOL_DOC_CPP);
+}
+
 void MainWindowPresenter::handleLeftToolbarAction(string selectedTool)
 {
     // get PHRASE from the active context:
diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h
index 5efd84c1..b798eeea 100644
--- a/app/src/qt/main_window_presenter.h
+++ b/app/src/qt/main_window_presenter.h
@@ -376,6 +376,10 @@ public slots:
     void doActionStackOverflowToolbar();
     void doActionH2oGptToolbar();
     void doActionDuckDuckGoToolbar();
+    void doActionGitHubToolbar();
+    void doActionBardToolbar();
+    void doActionPythonToolbar();
+    void doActionCppToolbar();
     // help
     void doActionHelpDocumentation();
     void doActionHelpWeb();
diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h
index 5f3ed689..35bbdd58 100644
--- a/lib/src/config/configuration.h
+++ b/lib/src/config/configuration.h
@@ -105,7 +105,7 @@ constexpr const auto TOOL_ARXIV = "arXiv";
 constexpr const auto TOOL_DUCKDUCKGO = "DuckDuckGo";
 constexpr const auto TOOL_DEEPL = "DeepL web";
 constexpr const auto TOOL_STACK_OVERFLOW = "StackOverflow";
-constexpr const auto TOOL_GH_PROJECTS = "GitHub projects";
+constexpr const auto TOOL_GH_REPOS = "GitHub repositories";
 constexpr const auto TOOL_GH_TOPICS = "GitHub topics";
 constexpr const auto TOOL_GOOGLE_BARD = "Google Bard";
 constexpr const auto TOOL_GOOGLE_SEARCH = "Google Search";
@@ -113,6 +113,8 @@ constexpr const auto TOOL_H2O_GPT_WEB = "h2oGPT web";
 constexpr const auto TOOL_H2O_GPT_API = "h2oGPT API";
 constexpr const auto TOOL_CHAT_GPT_WEB = "OpenAI chatGPT web";
 constexpr const auto TOOL_WIKIPEDIA = "Wikipedia";
+constexpr const auto TOOL_DOC_PYTHON = "Python documentation";
+constexpr const auto TOOL_DOC_CPP = "C++ documentation";
 
 // improve platform/language specific
 constexpr const auto DEFAULT_NEW_OUTLINE = "# New Markdown File\n\nThis is a new Markdown file created by MindForger.\n\n#Section 1\nThe first section.\n\n";

From 3720c50c34ed3dd06632ec9052b7e107f94aa756 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sun, 19 Nov 2023 22:56:56 +0100
Subject: [PATCH 051/131] Updating changelog.

---
 Changelog | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/Changelog b/Changelog
index b0b21eee..ace9c172 100644
--- a/Changelog
+++ b/Changelog
@@ -1,4 +1,4 @@
-2023-01-??  Martin Dvorak  
+2023-12-??  Martin Dvorak  
 
     * Released v1.55.1 - Limbo added to the application menu View/Limbo,
       polished Preferences (Appearance refactored to Controls; restart requirement
@@ -8,7 +8,9 @@
       the word under cursor from Wikipedia, arXiv, LLM chats or web search engines.
       Libraries - ability to index external PDF files and generate Notebooks
       which represent them in MindForger (update and removal of the library
-      supported as well.
+      supported as well. New left side toolbar which runs various tools
+      (like Wikipedia, arXiv, StackOverflow, ...) on phrase which is the current
+      context (Notebook or Note name, selected text or text under the cursor, ...).
 
 2023-01-15  Martin Dvorak  
 

From 5933862c3c36ab99ded67b81bd4717829940f6e1 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Sat, 23 Dec 2023 21:44:31 +0100
Subject: [PATCH 052/131] WIP O tree: added O tree view new/load/save TBD:
 outline operations #1200

---
 CONTRIBUTING.md                               |    2 +-
 CREDITS.md                                    |    1 +
 Changelog                                     |   10 +-
 app/app.pro                                   |   20 +-
 .../qt/translations/mindforger_cs.ts          | 1462 ++++++++--------
 .../qt/translations/mindforger_en.ts          | 1468 +++++++++--------
 .../qt/translations/mindforger_nerd_cs.ts     | 1414 +++++++++-------
 .../qt/translations/mindforger_nerd_en.ts     | 1414 +++++++++-------
 .../qt/translations/mindforger_zh_cn.ts       | 1468 +++++++++--------
 app/src/qt/cli_n_breadcrumbs_view.cpp         |   40 +-
 app/src/qt/cli_n_breadcrumbs_view.h           |    2 +
 app/src/qt/main_menu_presenter.cpp            |    1 +
 app/src/qt/main_menu_view.cpp                 |   13 +-
 app/src/qt/main_menu_view.h                   |    3 +
 app/src/qt/main_window_presenter.cpp          |   25 +-
 app/src/qt/main_window_presenter.h            |    1 +
 app/src/qt/main_window_view.cpp               |   13 +-
 app/src/qt/orloj_presenter.cpp                |   10 +
 app/src/qt/orloj_presenter.h                  |    8 +-
 app/src/qt/orloj_view.cpp                     |    9 +
 app/src/qt/orloj_view.h                       |    8 +
 app/src/qt/outline_tree_model.cpp             |    2 +-
 app/src/qt/outlines_map_model.cpp             |  175 ++
 app/src/qt/outlines_map_model.h               |   64 +
 app/src/qt/outlines_map_presenter.cpp         |  242 +++
 app/src/qt/outlines_map_presenter.h           |  107 ++
 app/src/qt/outlines_map_view.cpp              |  217 +++
 app/src/qt/outlines_map_view.h                |  114 ++
 build/Makefile                                |   72 +-
 build/make/test-lib-units.sh                  |  109 +-
 lib/lib.pro                                   |    6 +-
 lib/src/config/configuration.cpp              |   14 +-
 lib/src/config/configuration.h                |    5 +
 lib/src/mind/ai/llm/wingman.h                 |   24 +-
 lib/src/mind/memory.cpp                       |    5 +
 lib/src/mind/memory.h                         |    5 +
 lib/src/mind/mind.cpp                         |  233 ++-
 lib/src/mind/mind.h                           |   37 +-
 lib/src/model/note.h                          |    4 +
 lib/src/model/outline.cpp                     |    7 +-
 lib/src/model/outline.h                       |    1 +
 lib/test/src/gear/string_utils_test.cpp       |   14 +
 lib/test/src/markdown/markdown_test.cpp       |   57 +
 licenses/llama-cpp-license.txt                |   21 +
 mindforger.pro                                |    5 +
 45 files changed, 5550 insertions(+), 3382 deletions(-)
 create mode 100644 app/src/qt/outlines_map_model.cpp
 create mode 100644 app/src/qt/outlines_map_model.h
 create mode 100644 app/src/qt/outlines_map_presenter.cpp
 create mode 100644 app/src/qt/outlines_map_presenter.h
 create mode 100644 app/src/qt/outlines_map_view.cpp
 create mode 100644 app/src/qt/outlines_map_view.h
 create mode 100644 licenses/llama-cpp-license.txt

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ac2a397c..ece8b9f6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -39,7 +39,7 @@ Code style:
   
 * Use `.h` extension for header files.
 * Use `.cpp` extension for class files.
-* Use `lower_case_with_unserscores` source code file names.
+* Use `lower_case_with_underscores` source code file names.
 * Spaces, no tabs.
 * No trailing whitespaces.
 * Use `{}` with constructor having 0/1 parameter, () otherwise.
diff --git a/CREDITS.md b/CREDITS.md
index a91314b5..200594ad 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -12,6 +12,7 @@ Big thanks to 3rd party FOSS content authors:
 * Qt Company ([Qt](https://www.qt.io/) - lib and code)
 * GitHub ([CMark GFM](https://github.com/github/cmark-gfm) - Markdown rendering - lib)
 * Kevin Hendricks, Bjoern Jacke, Lázsló Németh ([Hunspell](https://github.com/hunspell/hunspell) - spellcheck - lib)
+* Georgi Gerganov ([llama.cpp](https://github.com/ggerganov/llama.cpp) - C/C++ port of Facebook's LLaMA model)
 * NetBSD Foundation (strptime - Windows port - lib)
 * Toni Ronkko (dirent - Windows port - lib)
 * Microsoft (getopt - Windows port - lib)
diff --git a/Changelog b/Changelog
index ace9c172..939903af 100644
--- a/Changelog
+++ b/Changelog
@@ -1,16 +1,16 @@
-2023-12-??  Martin Dvorak  
+2024-01-??  Martin Dvorak  
 
-    * Released v1.55.1 - Limbo added to the application menu View/Limbo,
+    * Released v2.0.0 - Limbo added to the application menu View/Limbo,
       polished Preferences (Appearance refactored to Controls; restart requirement
       highlighted), missing OOTB Eisenhower Matrix is automatically added back
       to the list of Organizers, up/down button in O/N preview mode to move around
-      O's Ns while presenting a N. Tools allowing to get more information about
-      the word under cursor from Wikipedia, arXiv, LLM chats or web search engines.
+      O's Ns while presenting a N.
       Libraries - ability to index external PDF files and generate Notebooks
       which represent them in MindForger (update and removal of the library
       supported as well. New left side toolbar which runs various tools
       (like Wikipedia, arXiv, StackOverflow, ...) on phrase which is the current
-      context (Notebook or Note name, selected text or text under the cursor, ...).
+      context (Notebook or Note name, selected text or text under the cursor, ...)
+      in order to get more information about the phrase.
 
 2023-01-15  Martin Dvorak  
 
diff --git a/app/app.pro b/app/app.pro
index bc06ec1f..08d50e9a 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -54,13 +54,17 @@ mfoldhunspell | equals(OS_DISTRO_VERSION, "Windows") | equals(OS_DISTRO_VERSION,
   message("Hunspell: configuring use of NEW API on OS: $$OS_DISTRO_VERSION")
 }
 
+mfllamacpp {
+    DEFINES += MF_LLAMA_CPP
+}
+
 # Named Entity Recognition
 mfner {
   DEFINES += MF_NER
 }
 
 # webkit is supposed to be OBSOLETED by webengine, but webengine is disabled
-# on Linux since Qt 5.9 due to its tragic performance > conditional compilation
+# on Linux since Qt 5.9 due to its tragic performance -> conditional compilation
 # seems to be the only way:
 # - webkit on Linux
 # - webengine on Windows and macOS
@@ -68,7 +72,6 @@ win32|macx|mfwebengine {
     DEFINES += MF_QT_WEB_ENGINE
     QT += webengine
     QT += webenginewidgets
-
 } else {
     QT += webkit
     QT += webkitwidgets
@@ -187,7 +190,12 @@ INCLUDEPATH += ./src/qt/spelling
 #
 # - GCC: -std=c++0x ~ -std=c++11
 #
-# compiler options (qmake CONFIG+=mfnoccache ...)
+# compiler and compiler options:
+#   - https://doc.qt.io/qt-6/qmake-variable-reference.html#qmake-cxx
+#   - QMAKE_CXX       ... compiler
+#   - QMAKE_CXXFLAGS  ... compiler options
+#   - compilation options ~ DEFINEs (qmake CONFIG+=mfnoccache ...)
+#
 win32{
     QMAKE_CXXFLAGS += /MP
 } else {
@@ -295,6 +303,9 @@ HEADERS += \
     src/qt/organizers_table_model.h \
     src/qt/organizers_table_presenter.h \
     src/qt/organizers_table_view.h \
+    src/qt/outlines_map_model.h \
+    src/qt/outlines_map_presenter.h \
+    src/qt/outlines_map_view.h \
     src/qt/qt_commons.h \
     src/qt/spelling/abstract_dictionary.h \
     src/qt/spelling/abstract_dictionary_provider.h \
@@ -423,6 +434,9 @@ SOURCES += \
     src/qt/organizers_table_model.cpp \
     src/qt/organizers_table_presenter.cpp \
     src/qt/organizers_table_view.cpp \
+    src/qt/outlines_map_model.cpp \
+    src/qt/outlines_map_presenter.cpp \
+    src/qt/outlines_map_view.cpp \
     src/qt/spelling/dictionary_manager.cpp \
     src/qt/spelling/spell_checker.cpp \
     src/qt/tags_table_model.cpp \
diff --git a/app/resources/qt/translations/mindforger_cs.ts b/app/resources/qt/translations/mindforger_cs.ts
index 4f1a945e..681feb9d 100644
--- a/app/resources/qt/translations/mindforger_cs.ts
+++ b/app/resources/qt/translations/mindforger_cs.ts
@@ -4,56 +4,79 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
+    
+        
+        Unsupported Knowledge Tool
+        
+    
+    
+        
+        
+        
+        Empty Phrase
+        
+    
+    
+        
+        
+        Phrase to search/explain/process is empty.
+        
+    
+    
+        
+        Phrase to search/explain/process is empty - either make a text selection or move cursor to a word/phrase.
+        
+    
 
 
     SpellChecker
@@ -126,47 +149,47 @@
 
     m8r::AddLibraryDialog
     
-        
-        Choose and find library source:
-        
-    
-    
-        
+        
         Directory
         
     
     
-        
-        Library name:
+        
+        Choose a directory (library) of PDF files to be indexed. MindForger
+will create new notebook for every library file. Such notebook can be
+used to easily open the library file and create library file related
+notes.
+
+Choose new library source:
         
     
     
-        
+        
         Library source path:
         
     
     
-        
+        
         index PDF
         
     
     
-        
+        
         &Create Library and Index Documents
         
     
     
-        
+        
         &Cancel
         
     
     
-        
+        
         Add Document Library
         
     
     
-        
+        
         Choose Directory
         
     
@@ -207,17 +230,17 @@
 
     m8r::CliAndBreadcrumbsPresenter
     
-        
+        
         Notebook 
         
     
     
-        
+        
         Notebook not found: 
         
     
     
-        
+        
         No command!
         
     
@@ -879,7 +902,7 @@
         
     
     
-        
+        
         Choose File with Image
         
     
@@ -975,6 +998,14 @@
         
     
 
+
+    m8r::LeftToolbarView
+    
+        
+        Tool Bar
+        
+    
+
 
     m8r::MainMenuView
     
@@ -1035,7 +1066,7 @@
     
     
         
-        
+        
         &Forget
         
     
@@ -1184,270 +1215,310 @@
         
     
     
-        
+        
+        Note&books Tree
+        
+    
+    
+        
+        Show tree of Notebooks...
+        
+    
+    
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
+        Lib&rary
+        
+    
+    
+        
+        &New library
+        
+    
+    
+        
+        Add path to the directory with documents (PDF, txt, HTML)...
+        
+    
+    
+        
+        &Update library
+        
+    
+    
+        
+        Synchronize library source directory with MindForger notebook(s) which representlibrary resources...
+        
+    
+    
+        
+        &Delete library
+        
+    
+    
+        
+        Delete all Notebooks representing the library resources...
+        
+    
+    
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
-        Refactor	Ctrl+R
-        
-    
-    
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
@@ -1482,568 +1553,586 @@
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
-        &Know
+        
+        Str&etch edges
         
     
     
-        
-        
-        &Wikipedia
+        
+        &Sh&rink edge
         
     
     
-        
-        Find marked text on Wikipedia or open Wikipedia search
+        
+        Flash&cards
         
     
     
-        
-        
-        &arXiv
+        
+        &Organizer
         
     
     
-        
-        Find marked text on arXiv or get article by ID
+        
+        Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
-        Str&etch edges
+        
+        Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
-        &Sh&rink edge
+        
+        Make copy of the current Organizer
         
     
     
-        
-        Libr&ary
+        
+        &Delete
         
     
     
-        
-        &Add library
+        
+        Delete Organizer without undo
         
     
     
-        
-        Add directory with documents, URL or other resource to library...
+        
+        
+        Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
-        &Deprecate library
+        
+        Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        Move a library resource with documents to limbo...
+        
+        
+        Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
-        Flash&cards
+        
+        Move Notebook/Note to next column or quadrant...
         
     
     
-        
-        &Organizer
+        
+        Move focus to previous column or quandrant...
         
     
     
-        
-        Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
+        
+        Move focus to next column or quandrant...
         
     
     
-        
-        Edit current Organizer - you can also double click view to open the editor
+        
+        Note&book
         
     
     
-        
-        Make copy of the current Organizer
+        
+        E&xamine
         
     
     
-        
-        &Delete
+        
+        Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
-        Delete Organizer without undo
+        
+        E&xternal Editor Edit	Ctrl+X
         
     
     
-        
-        
-        Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
+        
+        Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
-        Move Notebook/Note to previous column or quadrant...
+        
+        &Forget	Ctrl+D
         
     
     
-        
-        
-        Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
+        
+        Save and Leave	Ctrl+L
         
     
     
-        
-        Move Notebook/Note to next column or quadrant...
+        
+        Move to F&irst	Ctrl+Shift+Up
         
     
     
-        
-        Move focus to previous column or quandrant...
+        
+        Move the Note to be the first child of its parent
         
     
     
-        
-        Move focus to next column or quandrant...
+        
+        Move &Up	Ctrl+Up
         
     
     
-        
-        Note&book
+        
+        Move the Note up
         
     
     
-        
-        E&xamine
+        
+        Move Do&wn	Ctrl+Down
         
     
     
-        
-        Turn Notebook to deck of flashcard and start active recall testing...
+        
+        Move the Note down
         
     
     
-        
-        E&xternal Editor Edit	Ctrl+X
+        
+        Move to &Last	Ctrl+Shift+Down
         
     
     
-        
-        Edit current Note in an external editor - use Preferences to configure the editor
+        
+        Move the Note to be the last child of its parent
         
     
     
-        
-        &Forget	Ctrl+D
+        
+        Move to Notebook	Ctrl+R
         
     
     
-        
-        Save and Leave	Ctrl+L
+        
+        &Move to Notebook
+        
+    
+    
+        
+        Move the current Note to another Notebook...
         
     
     
-        
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
+        Find Knowledge	Ctrl+/
+        
+    
+    
+        
+        Run an external tool to find, explain, process text under the cursor
+        
+    
+    
+        
+        Complete Link	Ctrl+L
+        
+    
+    
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
@@ -2053,12 +2142,12 @@
         
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
@@ -2108,132 +2197,82 @@
         
     
     
-        
-        Activate command line interface...
-        
-    
-    
-        
-        Create new Note to form new ideas, principles, combinations and applications
-        
-    
-    
-        
-        Hoist/de-hoist Note to focus on Note being viewed or edited
-        
-    
-    
-        
-        &Edit	Ctrl+E
-        
-    
-    
-        
-        Edit current Note - you can also double click view to open the editor
-        
-    
-    
-        
-        Remember	Ctrl+S
-        
-    
-    
-        
-        Save Note being edited
-        
-    
-    
-        
-        Leave	Alt+Left
-        
-    
-    
-        
-        Save leave editor of Note being changed
-        
-    
-    
-        
-        &Promote	Ctrl+Left
+        
+        Activate command line interface...
         
     
     
-        
-        Promote Note
+        
+        Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
-        &Demote	Ctrl+Right
+        
+        Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
-        Demote Note
+        
+        &Edit	Ctrl+E
         
     
     
-        
-        F&irst	Ctrl+Shift+Up
+        
+        Edit current Note - you can also double click view to open the editor
         
     
     
-        
-        Move Note to be the first child of its parent
+        
+        Remember	Ctrl+S
         
     
     
-        
-        &Up	Ctrl+Up
+        
+        Save Note being edited
         
     
     
-        
-        Move Note up
+        
+        Leave	Alt+Left
         
     
     
-        
-        Do&wn	Ctrl+Down
+        
+        Save leave editor of Note being changed
         
     
     
         
-        Move Note down
+        &Promote	Ctrl+Left
         
     
     
-        
-        &Last	Ctrl+Shift+Down
+        
+        Promote Note
         
     
     
         
-        Move Note to be the last child of its parent
-        
-    
-    
-        
-        &Refactor
+        &Demote	Ctrl+Right
         
     
     
-        
-        Refactor Note to another Notebook...
+        
+        Demote Note
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2274,352 +2313,282 @@
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
-        Complete Link	Ctrl+/
-        
-    
-    
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         With&out tags
         
     
     
-        
+        
         Insert Notebook's table of contents without tags
         
     
     
-        
+        
         &With tags
         
     
     
-        
+        
         Insert Notebook's table of contents with tags
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
-    
-        
-        &Tools
-        
-    
-    
-        
-        Open Wikipadia and find entry of the selected entity...
-        
-    
-    
-        
-        Open arXiv and find papers related to the selected entity...
-        
-    
-    
-        
-        &ChatGPT: Explain ... in simple terms.
-        
-    
-    
-        
-        Let ChatGPT to explain the selected entry...
-        
-    
-    
-        
-        &Gramarly
-        
-    
     
         
-        Use Gramarly to check to grammar...
-        
-    
-    
-        
-        &DuckDuckGo
-        
-    
-    
-        
-        Open DuckDuckGo and search web for the selected entity...
-        
-    
-    
-        
-        &Pandoc
-        
-    
-    
-        
-        Use Pandoc to convert MindForger's Markdown documents...
-        
-    
-    
-        
-        D&ocusaurus
-        
-    
-    
-        
-        Build your web with MindForger's Markdown documents and Docusaurus...
-        
-    
-    
-        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
@@ -2685,635 +2654,675 @@
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Learn
         
     
     
-        
+        
         Export Notebook to HTML
         
     
     
-        
-        
+        
+        
         Export
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
+        
         Export Memory to CSV
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
-        Home Notebook is not defined!
-        
-    
-    
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
+        Library already indexed - use 'Update library' action to synchronize documents.
+        
+    
+    
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
+        Library synchronization
+        
+    
+    
+        
+        There are no libraries - nothing to synchronize.
+        
+    
+    
+        
+        Library deletion
+        
+    
+    
+        
+        There are no libraries - nothing to delete.
+        
+    
+    
+        
+        Delete Library
+        
+    
+    
+        
+        Do you really want to delete Notebooks which represent the library documents?
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
+        Home Notebook not set - use menu 'Notebooks/Make Home'
+        
+    
+    
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
-        Library already indexed - use update action to reindex documents.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
+        View Limbo
+        
+    
+    
+        
+        Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
+        
+    
+    
+        
         About MindForger
         
     
@@ -3321,7 +3330,7 @@
 
     m8r::MainWindowView
     
-        
+        
         Thinking Notebook
         
     
@@ -3673,27 +3682,27 @@
         
     
     
-        
+        
         Exit Editor
         
     
     
-        
+        
         Do you really want to exit editor without saving?
         
     
     
-        
+        
         Full-text Search Result
         
     
     
-        
+        
         No matching text found.
         
     
     
-        
+        
         No spelling suggestions found
         
     
@@ -3935,71 +3944,71 @@
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
@@ -4220,7 +4229,7 @@
     m8r::OutlineTreeModel
     
         
-        Outline
+        Notebook Outline
         
     
     
@@ -4252,6 +4261,34 @@
         
     
 
+
+    m8r::OutlinesMapModel
+    
+        
+        Notebooks Tree
+        
+    
+    
+        
+        Done
+        
+    
+    
+        
+        Rs
+        
+    
+    
+        
+        Ws
+        
+    
+    
+        
+        Modified
+        
+    
+
 
     m8r::OutlinesTableModel
     
@@ -4345,7 +4382,39 @@
     
     
         
-        Refactor Note to Notebook
+        Move Note to Notebook
+        
+    
+
+
+    m8r::RemoveLibraryDialog
+    
+        
+        Choose a library to be removed - this action will delete
+Notebooks which represent documents from the library
+directory.
+Referenced documents will NOT be deleted.
+
+        
+    
+    
+        
+        Choose library to delete: 
+        
+    
+    
+        
+        &Delete
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Delete Document Library
         
     
 
@@ -4402,6 +4471,39 @@
         
     
 
+
+    m8r::RunToolDialog
+    
+        
+        Phrase:
+        
+    
+    
+        
+        Knowledge source:
+        
+    
+    
+        
+        Template:
+        
+    
+    
+        
+        &Get
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Get Knowledge
+        
+    
+
 
     m8r::ScopeDialog
     
@@ -4455,6 +4557,40 @@
         
     
 
+
+    m8r::SyncLibraryDialog
+    
+        
+        Choose a library directory to be synchronized - new notebook
+will be created for every new document found in the library.
+Existing MindForger notebooks for library documents which were
+deleted, renamed or moved (i.e. their link to library document
+is broken) will not be deprecated to protect your document-related
+notes. Feel free to deprecate such notebook(s) yourself.
+
+        
+    
+    
+        
+        Choose library to update: 
+        
+    
+    
+        
+        &Update
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Update Document Library
+        
+    
+
 
     m8r::TagsTableModel
     
@@ -4479,37 +4615,37 @@
 
     m8r::ViewToEditEditButtonsPanel
     
-        
+        
         View Notebook Header
         
     
     
-        
+        
         View Notebook
         
     
     
-        
+        
         Show preview of Notebook name and its description
         
     
     
-        
+        
         &Edit
         
     
     
-        
+        
         Full / Header Notebook Preview
         
     
     
-        
+        
         Whole Notebook &Preview
         
     
     
-        
+        
         Show whole Notebook preview or Notebook header preview
         
     
@@ -4517,73 +4653,73 @@
 
     main
     
-        
+        
         MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI.
         
     
     
-        
+        
         MindForger workspace or directory/file with Markdown(s) to open
         
     
     
-        
+        
         Use 'dark', 'light' or other GUI <theme>.
         
     
     
-        
+        
         theme
         
     
     
-        
+        
         Load configuration from given <file>.
         
     
     
-        
-        
+        
+        
         file
         
     
     
-        
+        
         Disable WebEngine security to allow loading of images on macOS.
         
     
     
-        
+        
         Disable WebEngine security by running single process on macOS.
         
     
     
-        
+        
         Disable WebEngine security by disabling sandbox on macOS.
         
     
     
-        
+        
         Disable WebEngine security by user data dir specification on macOS.
         
     
     
-        
+        
         Disable WebEngine security via site isolation trials on macOS.
         
     
     
-        
+        
         Disable WebEngine security via acess file from file on macOS.
         
     
     
-        
+        
         Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/resources/qt/translations/mindforger_en.ts b/app/resources/qt/translations/mindforger_en.ts
index d26866b4..1acd7889 100644
--- a/app/resources/qt/translations/mindforger_en.ts
+++ b/app/resources/qt/translations/mindforger_en.ts
@@ -4,56 +4,79 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
+    
+        
+        Unsupported Knowledge Tool
+        
+    
+    
+        
+        
+        
+        Empty Phrase
+        
+    
+    
+        
+        
+        Phrase to search/explain/process is empty.
+        
+    
+    
+        
+        Phrase to search/explain/process is empty - either make a text selection or move cursor to a word/phrase.
+        
+    
 
 
     SpellChecker
@@ -126,47 +149,47 @@
 
     m8r::AddLibraryDialog
     
-        
-        Choose and find library source:
-        
-    
-    
-        
+        
         Directory
         
     
     
-        
-        Library name:
+        
+        Choose a directory (library) of PDF files to be indexed. MindForger
+will create new notebook for every library file. Such notebook can be
+used to easily open the library file and create library file related
+notes.
+
+Choose new library source:
         
     
     
-        
+        
         Library source path:
         
     
     
-        
+        
         index PDF
         
     
     
-        
+        
         &Create Library and Index Documents
         
     
     
-        
+        
         &Cancel
         
     
     
-        
+        
         Add Document Library
         
     
     
-        
+        
         Choose Directory
         
     
@@ -207,17 +230,17 @@
 
     m8r::CliAndBreadcrumbsPresenter
     
-        
+        
         Notebook 
         
     
     
-        
+        
         Notebook not found: 
         
     
     
-        
+        
         No command!
         
     
@@ -887,7 +910,7 @@
         
     
     
-        
+        
         Choose File with Image
         
     
@@ -983,6 +1006,14 @@
         
     
 
+
+    m8r::LeftToolbarView
+    
+        
+        Tool Bar
+        
+    
+
 
     m8r::MainMenuView
     
@@ -1055,7 +1086,7 @@
     
     
         
-        
+        
         &Forget
         &Deprecate
     
@@ -1212,285 +1243,325 @@
         
     
     
-        
+        
+        Note&books Tree
+        
+    
+    
+        
+        Show tree of Notebooks...
+        
+    
+    
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
+        Lib&rary
+        
+    
+    
+        
+        &New library
+        
+    
+    
+        
+        Add path to the directory with documents (PDF, txt, HTML)...
+        
+    
+    
+        
+        &Update library
+        
+    
+    
+        
+        Synchronize library source directory with MindForger notebook(s) which representlibrary resources...
+        
+    
+    
+        
+        &Delete library
+        
+    
+    
+        
+        Delete all Notebooks representing the library resources...
+        
+    
+    
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
-        Refactor	Ctrl+R
-        
-    
-    
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
@@ -1525,588 +1596,606 @@
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
-        &Know
+        
+        Str&etch edges
         
     
     
-        
-        
-        &Wikipedia
+        
+        &Sh&rink edge
         
     
     
-        
-        Find marked text on Wikipedia or open Wikipedia search
+        
+        Flash&cards
         
     
     
-        
-        
-        &arXiv
+        
+        &Organizer
         
     
     
-        
-        Find marked text on arXiv or get article by ID
+        
+        Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
-        Str&etch edges
+        
+        Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
-        &Sh&rink edge
+        
+        Make copy of the current Organizer
         
     
     
-        
-        Libr&ary
+        
+        &Delete
         
     
     
-        
-        &Add library
+        
+        Delete Organizer without undo
         
     
     
-        
-        Add directory with documents, URL or other resource to library...
+        
+        
+        Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
-        &Deprecate library
+        
+        Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        Move a library resource with documents to limbo...
+        
+        
+        Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
-        Flash&cards
+        
+        Move Notebook/Note to next column or quadrant...
         
     
     
-        
-        &Organizer
+        
+        Move focus to previous column or quandrant...
         
     
     
-        
-        Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
+        
+        Move focus to next column or quandrant...
         
     
     
-        
-        Edit current Organizer - you can also double click view to open the editor
+        
+        Note&book
         
     
     
-        
-        Make copy of the current Organizer
+        
+        E&xamine
         
     
     
-        
-        &Delete
+        
+        Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
-        Delete Organizer without undo
+        
+        E&xternal Editor Edit	Ctrl+X
         
     
     
-        
-        
-        Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
+        
+        Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
-        Move Notebook/Note to previous column or quadrant...
+        
+        &Forget	Ctrl+D
         
     
     
-        
-        
-        Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
+        
+        Save and Leave	Ctrl+L
         
     
     
-        
-        Move Notebook/Note to next column or quadrant...
+        
+        Move to F&irst	Ctrl+Shift+Up
         
     
     
-        
-        Move focus to previous column or quandrant...
+        
+        Move the Note to be the first child of its parent
         
     
     
-        
-        Move focus to next column or quandrant...
+        
+        Move &Up	Ctrl+Up
         
     
     
-        
-        Note&book
+        
+        Move the Note up
         
     
     
-        
-        E&xamine
+        
+        Move Do&wn	Ctrl+Down
         
     
     
-        
-        Turn Notebook to deck of flashcard and start active recall testing...
+        
+        Move the Note down
         
     
     
-        
-        E&xternal Editor Edit	Ctrl+X
+        
+        Move to &Last	Ctrl+Shift+Down
         
     
     
-        
-        Edit current Note in an external editor - use Preferences to configure the editor
+        
+        Move the Note to be the last child of its parent
         
     
     
-        
-        &Forget	Ctrl+D
+        
+        Move to Notebook	Ctrl+R
         
     
     
-        
-        Save and Leave	Ctrl+L
+        
+        &Move to Notebook
         
     
     
-        
+        
+        Move the current Note to another Notebook...
+        
+    
+    
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
+        Find Knowledge	Ctrl+/
+        
+    
+    
+        
+        Run an external tool to find, explain, process text under the cursor
+        
+    
+    
+        
+        Complete Link	Ctrl+L
+        
+    
+    
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         Delete Notebook and move it Limbo
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         Delete	Del
     
     
-        
+        
         Forget Note
         Delete Note
     
@@ -2116,12 +2205,12 @@
         &Open
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
@@ -2166,137 +2255,87 @@
         
     
     
-        
-        &Home Notebook
-        
-    
-    
-        
-        Activate command line interface...
-        
-    
-    
-        
-        Create new Note to form new ideas, principles, combinations and applications
-        
-    
-    
-        
-        Hoist/de-hoist Note to focus on Note being viewed or edited
-        
-    
-    
-        
-        &Edit	Ctrl+E
-        
-    
-    
-        
-        Edit current Note - you can also double click view to open the editor
-        
-    
-    
-        
-        Remember	Ctrl+S
-        Save	Ctrl+S
-    
-    
-        
-        Save Note being edited
-        
-    
-    
-        
-        Leave	Alt+Left
-        
-    
-    
-        
-        Save leave editor of Note being changed
+        
+        &Home Notebook
         
     
     
-        
-        &Promote	Ctrl+Left
+        
+        Activate command line interface...
         
     
     
-        
-        Promote Note
+        
+        Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
-        &Demote	Ctrl+Right
+        
+        Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
-        Demote Note
+        
+        &Edit	Ctrl+E
         
     
     
-        
-        F&irst	Ctrl+Shift+Up
+        
+        Edit current Note - you can also double click view to open the editor
         
     
     
-        
-        Move Note to be the first child of its parent
-        
+        
+        Remember	Ctrl+S
+        Save	Ctrl+S
     
     
-        
-        &Up	Ctrl+Up
+        
+        Save Note being edited
         
     
     
-        
-        Move Note up
+        
+        Leave	Alt+Left
         
     
     
-        
-        Do&wn	Ctrl+Down
+        
+        Save leave editor of Note being changed
         
     
     
         
-        Move Note down
+        &Promote	Ctrl+Left
         
     
     
-        
-        &Last	Ctrl+Shift+Down
+        
+        Promote Note
         
     
     
         
-        Move Note to be the last child of its parent
-        
-    
-    
-        
-        &Refactor
+        &Demote	Ctrl+Right
         
     
     
-        
-        Refactor Note to another Notebook...
+        
+        Demote Note
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2337,317 +2376,247 @@
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
-        Complete Link	Ctrl+/
-        
-    
-    
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         With&out tags
         
     
     
-        
+        
         Insert Notebook's table of contents without tags
         
     
     
-        
+        
         &With tags
         
     
     
-        
+        
         Insert Notebook's table of contents with tags
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
-    
-        
-        &Tools
-        
-    
-    
-        
-        Open Wikipadia and find entry of the selected entity...
-        
-    
-    
-        
-        Open arXiv and find papers related to the selected entity...
-        
-    
-    
-        
-        &ChatGPT: Explain ... in simple terms.
-        
-    
-    
-        
-        Let ChatGPT to explain the selected entry...
-        
-    
-    
-        
-        &Gramarly
-        
-    
     
         
-        Use Gramarly to check to grammar...
-        
-    
-    
-        
-        &DuckDuckGo
-        
-    
-    
-        
-        Open DuckDuckGo and search web for the selected entity...
-        
-    
-    
-        
-        &Pandoc
-        
-    
-    
-        
-        Use Pandoc to convert MindForger's Markdown documents...
-        
-    
-    
-        
-        D&ocusaurus
-        
-    
-    
-        
-        Build your web with MindForger's Markdown documents and Docusaurus...
-        
-    
-    
-        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
@@ -2713,34 +2682,34 @@
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
@@ -2749,603 +2718,643 @@
         Open Directory or MindForger Repository
     
     
-        
+        
         Learn Markdown File
         Open Markdown File
     
     
-        
+        
         Learn
         Open
     
     
-        
+        
         Export Notebook to HTML
         
     
     
-        
-        
+        
+        
         Export
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
+        
         Export Memory to CSV
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
-        Home Notebook is not defined!
-        
-    
-    
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         Deprecate Notebook
     
     
-        
+        
+        Library already indexed - use 'Update library' action to synchronize documents.
+        
+    
+    
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
+        Library synchronization
+        
+    
+    
+        
+        There are no libraries - nothing to synchronize.
+        
+    
+    
+        
+        Library deletion
+        
+    
+    
+        
+        There are no libraries - nothing to delete.
+        
+    
+    
+        
+        Delete Library
+        
+    
+    
+        
+        Do you really want to delete Notebooks which represent the library documents?
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
+        Home Notebook not set - use menu 'Notebooks/Make Home'
+        
+    
+    
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         Please select a Note to forget.
         Please select a Note to delete.
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
-        Library already indexed - use update action to reindex documents.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
+        View Limbo
+        
+    
+    
+        
+        Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
+        
+    
+    
+        
         About MindForger
         
     
@@ -3353,7 +3362,7 @@
 
     m8r::MainWindowView
     
-        
+        
         Thinking Notebook
         
     
@@ -3705,27 +3714,27 @@
         
     
     
-        
+        
         Exit Editor
         
     
     
-        
+        
         Do you really want to exit editor without saving?
         
     
     
-        
+        
         Full-text Search Result
         
     
     
-        
+        
         No matching text found.
         
     
     
-        
+        
         No spelling suggestions found
         
     
@@ -3967,71 +3976,71 @@
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
@@ -4252,7 +4261,7 @@
     m8r::OutlineTreeModel
     
         
-        Outline
+        Notebook Outline
         
     
     
@@ -4284,6 +4293,34 @@
         
     
 
+
+    m8r::OutlinesMapModel
+    
+        
+        Notebooks Tree
+        
+    
+    
+        
+        Done
+        
+    
+    
+        
+        Rs
+        
+    
+    
+        
+        Ws
+        
+    
+    
+        
+        Modified
+        
+    
+
 
     m8r::OutlinesTableModel
     
@@ -4377,7 +4414,39 @@
     
     
         
-        Refactor Note to Notebook
+        Move Note to Notebook
+        
+    
+
+
+    m8r::RemoveLibraryDialog
+    
+        
+        Choose a library to be removed - this action will delete
+Notebooks which represent documents from the library
+directory.
+Referenced documents will NOT be deleted.
+
+        
+    
+    
+        
+        Choose library to delete: 
+        
+    
+    
+        
+        &Delete
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Delete Document Library
         
     
 
@@ -4434,6 +4503,39 @@
         
     
 
+
+    m8r::RunToolDialog
+    
+        
+        Phrase:
+        
+    
+    
+        
+        Knowledge source:
+        
+    
+    
+        
+        Template:
+        
+    
+    
+        
+        &Get
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Get Knowledge
+        
+    
+
 
     m8r::ScopeDialog
     
@@ -4487,6 +4589,40 @@
         
     
 
+
+    m8r::SyncLibraryDialog
+    
+        
+        Choose a library directory to be synchronized - new notebook
+will be created for every new document found in the library.
+Existing MindForger notebooks for library documents which were
+deleted, renamed or moved (i.e. their link to library document
+is broken) will not be deprecated to protect your document-related
+notes. Feel free to deprecate such notebook(s) yourself.
+
+        
+    
+    
+        
+        Choose library to update: 
+        
+    
+    
+        
+        &Update
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Update Document Library
+        
+    
+
 
     m8r::TagsTableModel
     
@@ -4511,37 +4647,37 @@
 
     m8r::ViewToEditEditButtonsPanel
     
-        
+        
         View Notebook Header
         
     
     
-        
+        
         View Notebook
         
     
     
-        
+        
         Show preview of Notebook name and its description
         
     
     
-        
+        
         &Edit
         
     
     
-        
+        
         Full / Header Notebook Preview
         
     
     
-        
+        
         Whole Notebook &Preview
         
     
     
-        
+        
         Show whole Notebook preview or Notebook header preview
         
     
@@ -4549,73 +4685,73 @@
 
     main
     
-        
+        
         MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI.
         
     
     
-        
+        
         MindForger workspace or directory/file with Markdown(s) to open
         
     
     
-        
+        
         Use 'dark', 'light' or other GUI <theme>.
         
     
     
-        
+        
         theme
         
     
     
-        
+        
         Load configuration from given <file>.
         
     
     
-        
-        
+        
+        
         file
         
     
     
-        
+        
         Disable WebEngine security to allow loading of images on macOS.
         
     
     
-        
+        
         Disable WebEngine security by running single process on macOS.
         
     
     
-        
+        
         Disable WebEngine security by disabling sandbox on macOS.
         
     
     
-        
+        
         Disable WebEngine security by user data dir specification on macOS.
         
     
     
-        
+        
         Disable WebEngine security via site isolation trials on macOS.
         
     
     
-        
+        
         Disable WebEngine security via acess file from file on macOS.
         
     
     
-        
+        
         Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_cs.ts b/app/resources/qt/translations/mindforger_nerd_cs.ts
index 6c81a5ae..52e18d32 100644
--- a/app/resources/qt/translations/mindforger_nerd_cs.ts
+++ b/app/resources/qt/translations/mindforger_nerd_cs.ts
@@ -4,56 +4,79 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
+    
+        
+        Unsupported Knowledge Tool
+        
+    
+    
+        
+        
+        
+        Empty Phrase
+        
+    
+    
+        
+        
+        Phrase to search/explain/process is empty.
+        
+    
+    
+        
+        Phrase to search/explain/process is empty - either make a text selection or move cursor to a word/phrase.
+        
+    
 
 
     SpellChecker
@@ -126,47 +149,47 @@
 
     m8r::AddLibraryDialog
     
-        
-        Choose and find library source:
-        
-    
-    
-        
+        
         Directory
         
     
     
-        
-        Library name:
+        
+        Choose a directory (library) of PDF files to be indexed. MindForger
+will create new notebook for every library file. Such notebook can be
+used to easily open the library file and create library file related
+notes.
+
+Choose new library source:
         
     
     
-        
+        
         Library source path:
         
     
     
-        
+        
         index PDF
         
     
     
-        
+        
         &Create Library and Index Documents
         
     
     
-        
+        
         &Cancel
         
     
     
-        
+        
         Add Document Library
         
     
     
-        
+        
         Choose Directory
         
     
@@ -207,17 +230,17 @@
 
     m8r::CliAndBreadcrumbsPresenter
     
-        
+        
         Notebook 
         
     
     
-        
+        
         Notebook not found: 
         
     
     
-        
+        
         No command!
         
     
@@ -887,7 +910,7 @@
         
     
     
-        
+        
         Choose File with Image
         
     
@@ -983,6 +1006,14 @@
         
     
 
+
+    m8r::LeftToolbarView
+    
+        
+        Tool Bar
+        
+    
+
 
     m8r::MainMenuView
     
@@ -996,10 +1027,10 @@
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         &Nový
     
@@ -1029,7 +1060,7 @@
     
     
         
-        
+        
         &Forget
         Zapomeň
     
@@ -1088,22 +1119,22 @@
         Domů
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         &Stencils
         
     
@@ -1158,561 +1189,509 @@
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
-        &Know
-        
-    
-    
-        
-        
-        &Wikipedia
-        
-    
-    
-        
-        Find marked text on Wikipedia or open Wikipedia search
-        
-    
-    
-        
-        
-        &arXiv
-        
-    
-    
-        
-        Find marked text on arXiv or get article by ID
-        
-    
-    
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
-        Libr&ary
-        
-    
-    
-        
-        &Add library
-        
-    
-    
-        
-        Add directory with documents, URL or other resource to library...
-        
-    
-    
-        
-        &Deprecate library
-        
-    
-    
-        
-        Move a library resource with documents to limbo...
-        
-    
-    
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
-        &Find	Ctrl+Shift+F
+        
+        Move to F&irst	Ctrl+Shift+Up
         
     
     
-        
-        &Undo	Ctrl+Z
+        
+        Move the Note to be the first child of its parent
         
     
     
-        
-        Undo
+        
+        Move &Up	Ctrl+Up
         
     
     
-        
-        &Redo	Ctrl+Shift+Z
+        
+        Move the Note up
         
     
     
-        
-        Redo
+        
+        Move Do&wn	Ctrl+Down
         
     
     
-        
-        Cu&t	Ctrl+X
+        
+        Move the Note down
         
     
     
-        
-        Cut
+        
+        Move to &Last	Ctrl+Shift+Down
         
     
     
-        
-        &Copy	Ctrl+C
+        
+        Move the Note to be the last child of its parent
         
     
     
-        
-        Copy
+        
+        Move to Notebook	Ctrl+R
         
     
     
-        
-        &Paste	Ctrl+V
+        
+        &Move to Notebook
         
     
     
-        
-        Paste
+        
+        Move the current Note to another Notebook...
         
     
     
-        
-        Sp&ell Check
+        
+        &Find	Ctrl+Shift+F
         
     
     
-        
-        Spell check Notebook or Note description
+        
+        &Undo	Ctrl+Z
         
     
     
-        
-        With&out tags
+        
+        Undo
         
     
     
-        
-        Insert Notebook's table of contents without tags
+        
+        &Redo	Ctrl+Shift+Z
         
     
     
-        
-        &With tags
+        
+        Redo
         
     
     
-        
-        Insert Notebook's table of contents with tags
+        
+        Cu&t	Ctrl+X
+        
+    
+    
+        
+        Cut
         
     
     
-        
-        &Tools
+        
+        &Copy	Ctrl+C
         
     
     
-        
-        Open Wikipadia and find entry of the selected entity...
+        
+        Copy
         
     
     
-        
-        Open arXiv and find papers related to the selected entity...
+        
+        &Paste	Ctrl+V
         
     
     
-        
-        &ChatGPT: Explain ... in simple terms.
+        
+        Paste
         
     
     
-        
-        Let ChatGPT to explain the selected entry...
+        
+        Find Knowledge	Ctrl+/
         
     
     
-        
-        &Gramarly
+        
+        Run an external tool to find, explain, process text under the cursor
         
     
     
-        
-        Use Gramarly to check to grammar...
+        
+        Complete Link	Ctrl+L
         
     
     
-        
-        &DuckDuckGo
+        
+        Sp&ell Check
         
     
     
-        
-        Open DuckDuckGo and search web for the selected entity...
+        
+        Spell check Notebook or Note description
         
     
     
-        
-        &Pandoc
+        
+        With&out tags
         
     
     
-        
-        Use Pandoc to convert MindForger's Markdown documents...
+        
+        Insert Notebook's table of contents without tags
         
     
     
-        
-        D&ocusaurus
+        
+        &With tags
         
     
     
-        
-        Build your web with MindForger's Markdown documents and Docusaurus...
+        
+        Insert Notebook's table of contents with tags
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         &Formát
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
     
-        
-        Refactor Note to another Notebook...
-        
-    
-    
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Make &Home
         
     
@@ -1818,84 +1797,129 @@
         
     
     
-        
+        
+        Note&books Tree
+        
+    
+    
+        
+        Show tree of Notebooks...
+        
+    
+    
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
+        Lib&rary
+        
+    
+    
+        
+        &New library
+        
+    
+    
+        
+        Add path to the directory with documents (PDF, txt, HTML)...
+        
+    
+    
+        
+        &Update library
+        
+    
+    
+        
+        Synchronize library source directory with MindForger notebook(s) which representlibrary resources...
+        
+    
+    
+        
+        &Delete library
+        
+    
+    
+        
+        Delete all Notebooks representing the library resources...
+        
+    
+    
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         E&xport
         E&xport
     
     
-        
+        
         &Import
         
     
@@ -1945,212 +1969,167 @@
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
-        F&irst	Ctrl+Shift+Up
-        
-    
-    
-        
-        Move Note to be the first child of its parent
-        
-    
-    
-        
-        &Up	Ctrl+Up
-        
-    
-    
-        
-        Move Note up
-        
-    
-    
-        
-        Do&wn	Ctrl+Down
-        
-    
-    
-        
-        Move Note down
-        
-    
-    
-        
-        &Last	Ctrl+Shift+Down
-        
-    
-    
-        
-        Move Note to be the last child of its parent
-        
-    
-    
-        
-        &Refactor
-        
-    
-    
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2191,447 +2170,437 @@
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
-        Refactor	Ctrl+R
-        
-    
-    
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
-        Complete Link	Ctrl+/
-        
-    
-    
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         O aplikaci MindForger
     
     
-        
+        
         &Help
         
     
     
-        
+        
         F1
         
     
@@ -2697,635 +2666,675 @@
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
+        
         Learn
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Export Memory to CSV
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
+        Home Notebook not set - use menu 'Notebooks/Make Home'
+        
+    
+    
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
+        
+        Library already indexed - use 'Update library' action to synchronize documents.
+        
+    
+    
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
+        Library synchronization
+        
+    
+    
+        
+        There are no libraries - nothing to synchronize.
+        
+    
+    
+        
+        Library deletion
+        
+    
+    
+        
+        There are no libraries - nothing to delete.
+        
+    
+    
+        
+        Delete Library
+        
+    
+    
+        
+        Do you really want to delete Notebooks which represent the library documents?
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
+        
         Export Notebook to HTML
         
     
     
-        
-        
+        
+        
         Export
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
-        Home Notebook is not defined!
-        
-    
-    
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
-        Library already indexed - use update action to reindex documents.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
+        View Limbo
+        
+    
+    
+        
+        Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
+        
+    
+    
+        
         About MindForger
         
     
@@ -3333,7 +3342,7 @@
 
     m8r::MainWindowView
     
-        
+        
         Thinking Notebook
         
     
@@ -3685,27 +3694,27 @@
         
     
     
-        
+        
         Exit Editor
         
     
     
-        
+        
         Do you really want to exit editor without saving?
         
     
     
-        
+        
         Full-text Search Result
         
     
     
-        
+        
         No matching text found.
         
     
     
-        
+        
         No spelling suggestions found
         
     
@@ -3947,71 +3956,71 @@
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
@@ -4232,7 +4241,7 @@
     m8r::OutlineTreeModel
     
         
-        Outline
+        Notebook Outline
         
     
     
@@ -4264,6 +4273,34 @@
         
     
 
+
+    m8r::OutlinesMapModel
+    
+        
+        Notebooks Tree
+        
+    
+    
+        
+        Done
+        
+    
+    
+        
+        Rs
+        
+    
+    
+        
+        Ws
+        
+    
+    
+        
+        Modified
+        
+    
+
 
     m8r::OutlinesTableModel
     
@@ -4357,7 +4394,39 @@
     
     
         
-        Refactor Note to Notebook
+        Move Note to Notebook
+        
+    
+
+
+    m8r::RemoveLibraryDialog
+    
+        
+        Choose a library to be removed - this action will delete
+Notebooks which represent documents from the library
+directory.
+Referenced documents will NOT be deleted.
+
+        
+    
+    
+        
+        Choose library to delete: 
+        
+    
+    
+        
+        &Delete
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Delete Document Library
         
     
 
@@ -4414,6 +4483,39 @@
         
     
 
+
+    m8r::RunToolDialog
+    
+        
+        Phrase:
+        
+    
+    
+        
+        Knowledge source:
+        
+    
+    
+        
+        Template:
+        
+    
+    
+        
+        &Get
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Get Knowledge
+        
+    
+
 
     m8r::ScopeDialog
     
@@ -4467,6 +4569,40 @@
         
     
 
+
+    m8r::SyncLibraryDialog
+    
+        
+        Choose a library directory to be synchronized - new notebook
+will be created for every new document found in the library.
+Existing MindForger notebooks for library documents which were
+deleted, renamed or moved (i.e. their link to library document
+is broken) will not be deprecated to protect your document-related
+notes. Feel free to deprecate such notebook(s) yourself.
+
+        
+    
+    
+        
+        Choose library to update: 
+        
+    
+    
+        
+        &Update
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Update Document Library
+        
+    
+
 
     m8r::TagsTableModel
     
@@ -4491,37 +4627,37 @@
 
     m8r::ViewToEditEditButtonsPanel
     
-        
+        
         View Notebook Header
         
     
     
-        
+        
         View Notebook
         
     
     
-        
+        
         Show preview of Notebook name and its description
         
     
     
-        
+        
         &Edit
         
     
     
-        
+        
         Full / Header Notebook Preview
         
     
     
-        
+        
         Whole Notebook &Preview
         
     
     
-        
+        
         Show whole Notebook preview or Notebook header preview
         
     
@@ -4529,73 +4665,73 @@
 
     main
     
-        
+        
         MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI.
         
     
     
-        
+        
         MindForger workspace or directory/file with Markdown(s) to open
         
     
     
-        
+        
         Use 'dark', 'light' or other GUI <theme>.
         
     
     
-        
+        
         theme
         
     
     
-        
+        
         Load configuration from given <file>.
         
     
     
-        
-        
+        
+        
         file
         
     
     
-        
+        
         Disable WebEngine security to allow loading of images on macOS.
         
     
     
-        
+        
         Disable WebEngine security by running single process on macOS.
         
     
     
-        
+        
         Disable WebEngine security by disabling sandbox on macOS.
         
     
     
-        
+        
         Disable WebEngine security by user data dir specification on macOS.
         
     
     
-        
+        
         Disable WebEngine security via site isolation trials on macOS.
         
     
     
-        
+        
         Disable WebEngine security via acess file from file on macOS.
         
     
     
-        
+        
         Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_en.ts b/app/resources/qt/translations/mindforger_nerd_en.ts
index 87095af8..7567abc6 100644
--- a/app/resources/qt/translations/mindforger_nerd_en.ts
+++ b/app/resources/qt/translations/mindforger_nerd_en.ts
@@ -4,56 +4,79 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
+    
+        
+        Unsupported Knowledge Tool
+        
+    
+    
+        
+        
+        
+        Empty Phrase
+        
+    
+    
+        
+        
+        Phrase to search/explain/process is empty.
+        
+    
+    
+        
+        Phrase to search/explain/process is empty - either make a text selection or move cursor to a word/phrase.
+        
+    
 
 
     SpellChecker
@@ -126,47 +149,47 @@
 
     m8r::AddLibraryDialog
     
-        
-        Choose and find library source:
-        
-    
-    
-        
+        
         Directory
         
     
     
-        
-        Library name:
+        
+        Choose a directory (library) of PDF files to be indexed. MindForger
+will create new notebook for every library file. Such notebook can be
+used to easily open the library file and create library file related
+notes.
+
+Choose new library source:
         
     
     
-        
+        
         Library source path:
         
     
     
-        
+        
         index PDF
         
     
     
-        
+        
         &Create Library and Index Documents
         
     
     
-        
+        
         &Cancel
         
     
     
-        
+        
         Add Document Library
         
     
     
-        
+        
         Choose Directory
         
     
@@ -207,17 +230,17 @@
 
     m8r::CliAndBreadcrumbsPresenter
     
-        
+        
         Notebook 
         
     
     
-        
+        
         Notebook not found: 
         
     
     
-        
+        
         No command!
         
     
@@ -879,7 +902,7 @@
         
     
     
-        
+        
         Choose File with Image
         
     
@@ -975,6 +998,14 @@
         
     
 
+
+    m8r::LeftToolbarView
+    
+        
+        Tool Bar
+        
+    
+
 
     m8r::MainMenuView
     
@@ -988,10 +1019,10 @@
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
@@ -1017,7 +1048,7 @@
     
     
         
-        
+        
         &Forget
         
     
@@ -1072,22 +1103,22 @@
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         &Stencils
         
     
@@ -1142,561 +1173,509 @@
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
-        &Know
-        
-    
-    
-        
-        
-        &Wikipedia
-        
-    
-    
-        
-        Find marked text on Wikipedia or open Wikipedia search
-        
-    
-    
-        
-        
-        &arXiv
-        
-    
-    
-        
-        Find marked text on arXiv or get article by ID
-        
-    
-    
-        
+        
         Str&etch edges
         
     
     
-        
+        
         &Sh&rink edge
         
     
     
-        
-        Libr&ary
-        
-    
-    
-        
-        &Add library
-        
-    
-    
-        
-        Add directory with documents, URL or other resource to library...
-        
-    
-    
-        
-        &Deprecate library
-        
-    
-    
-        
-        Move a library resource with documents to limbo...
-        
-    
-    
-        
+        
         Flash&cards
         
     
     
-        
+        
         &Organizer
         
     
     
-        
+        
         Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
+        
         Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
+        
         Make copy of the current Organizer
         
     
     
-        
+        
         &Delete
         
     
     
-        
+        
         Delete Organizer without undo
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
+        
         Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        
+        
+        
         Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
+        
         Move Notebook/Note to next column or quadrant...
         
     
     
-        
+        
         Move focus to previous column or quandrant...
         
     
     
-        
+        
         Move focus to next column or quandrant...
         
     
     
-        
+        
         Note&book
         
     
     
-        
+        
         E&xamine
         
     
     
-        
+        
         Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
+        
         E&xternal Editor Edit	Ctrl+X
         
     
     
-        
+        
         Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
+        
         &Forget	Ctrl+D
         
     
     
-        
+        
         Save and Leave	Ctrl+L
         
     
     
-        
-        &Find	Ctrl+Shift+F
+        
+        Move to F&irst	Ctrl+Shift+Up
         
     
     
-        
-        &Undo	Ctrl+Z
+        
+        Move the Note to be the first child of its parent
         
     
     
-        
-        Undo
+        
+        Move &Up	Ctrl+Up
         
     
     
-        
-        &Redo	Ctrl+Shift+Z
+        
+        Move the Note up
         
     
     
-        
-        Redo
+        
+        Move Do&wn	Ctrl+Down
         
     
     
-        
-        Cu&t	Ctrl+X
+        
+        Move the Note down
         
     
     
-        
-        Cut
+        
+        Move to &Last	Ctrl+Shift+Down
         
     
     
-        
-        &Copy	Ctrl+C
+        
+        Move the Note to be the last child of its parent
         
     
     
-        
-        Copy
+        
+        Move to Notebook	Ctrl+R
         
     
     
-        
-        &Paste	Ctrl+V
+        
+        &Move to Notebook
         
     
     
-        
-        Paste
+        
+        Move the current Note to another Notebook...
         
     
     
-        
-        Sp&ell Check
+        
+        &Find	Ctrl+Shift+F
         
     
     
-        
-        Spell check Notebook or Note description
+        
+        &Undo	Ctrl+Z
         
     
     
-        
-        With&out tags
+        
+        Undo
         
     
     
-        
-        Insert Notebook's table of contents without tags
+        
+        &Redo	Ctrl+Shift+Z
         
     
     
-        
-        &With tags
+        
+        Redo
         
     
     
-        
-        Insert Notebook's table of contents with tags
+        
+        Cu&t	Ctrl+X
+        
+    
+    
+        
+        Cut
         
     
     
-        
-        &Tools
+        
+        &Copy	Ctrl+C
         
     
     
-        
-        Open Wikipadia and find entry of the selected entity...
+        
+        Copy
         
     
     
-        
-        Open arXiv and find papers related to the selected entity...
+        
+        &Paste	Ctrl+V
         
     
     
-        
-        &ChatGPT: Explain ... in simple terms.
+        
+        Paste
         
     
     
-        
-        Let ChatGPT to explain the selected entry...
+        
+        Find Knowledge	Ctrl+/
         
     
     
-        
-        &Gramarly
+        
+        Run an external tool to find, explain, process text under the cursor
         
     
     
-        
-        Use Gramarly to check to grammar...
+        
+        Complete Link	Ctrl+L
         
     
     
-        
-        &DuckDuckGo
+        
+        Sp&ell Check
         
     
     
-        
-        Open DuckDuckGo and search web for the selected entity...
+        
+        Spell check Notebook or Note description
         
     
     
-        
-        &Pandoc
+        
+        With&out tags
         
     
     
-        
-        Use Pandoc to convert MindForger's Markdown documents...
+        
+        Insert Notebook's table of contents without tags
         
     
     
-        
-        D&ocusaurus
+        
+        &With tags
         
     
     
-        
-        Build your web with MindForger's Markdown documents and Docusaurus...
+        
+        Insert Notebook's table of contents with tags
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         
     
     
-        
+        
         &Forget	Del
         
     
     
-        
+        
         Forget Note
         
     
     
-        
-        Refactor Note to another Notebook...
-        
-    
-    
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Make &Home
         
     
@@ -1802,84 +1781,129 @@
         
     
     
-        
+        
+        Note&books Tree
+        
+    
+    
+        
+        Show tree of Notebooks...
+        
+    
+    
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
+        Lib&rary
+        
+    
+    
+        
+        &New library
+        
+    
+    
+        
+        Add path to the directory with documents (PDF, txt, HTML)...
+        
+    
+    
+        
+        &Update library
+        
+    
+    
+        
+        Synchronize library source directory with MindForger notebook(s) which representlibrary resources...
+        
+    
+    
+        
+        &Delete library
+        
+    
+    
+        
+        Delete all Notebooks representing the library resources...
+        
+    
+    
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Import
         
     
@@ -1929,212 +1953,167 @@
         
     
     
-        
+        
         Activate command line interface...
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
+        
         Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
+        
         Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
+        
         &Edit	Ctrl+E
         
     
     
-        
+        
         Edit current Note - you can also double click view to open the editor
         
     
     
-        
+        
         Remember	Ctrl+S
         
     
     
-        
+        
         Save Note being edited
         
     
     
-        
+        
         Leave	Alt+Left
         
     
     
-        
+        
         Save leave editor of Note being changed
         
     
     
-        
+        
         &Promote	Ctrl+Left
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         &Demote	Ctrl+Right
         
     
     
-        
+        
         Demote Note
         
     
     
-        
-        F&irst	Ctrl+Shift+Up
-        
-    
-    
-        
-        Move Note to be the first child of its parent
-        
-    
-    
-        
-        &Up	Ctrl+Up
-        
-    
-    
-        
-        Move Note up
-        
-    
-    
-        
-        Do&wn	Ctrl+Down
-        
-    
-    
-        
-        Move Note down
-        
-    
-    
-        
-        &Last	Ctrl+Shift+Down
-        
-    
-    
-        
-        Move Note to be the last child of its parent
-        
-    
-    
-        
-        &Refactor
-        
-    
-    
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2175,447 +2154,437 @@
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
-        Refactor	Ctrl+R
-        
-    
-    
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
-        Complete Link	Ctrl+/
-        
-    
-    
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
     
-        
+        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
@@ -2681,635 +2650,675 @@
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
+        
         Learn
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Export Memory to CSV
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
+        Home Notebook not set - use menu 'Notebooks/Make Home'
+        
+    
+    
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
+        
+        Library already indexed - use 'Update library' action to synchronize documents.
+        
+    
+    
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
+        Library synchronization
+        
+    
+    
+        
+        There are no libraries - nothing to synchronize.
+        
+    
+    
+        
+        Library deletion
+        
+    
+    
+        
+        There are no libraries - nothing to delete.
+        
+    
+    
+        
+        Delete Library
+        
+    
+    
+        
+        Do you really want to delete Notebooks which represent the library documents?
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
+        
         Export Notebook to HTML
         
     
     
-        
-        
+        
+        
         Export
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
-        Home Notebook is not defined!
-        
-    
-    
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
-        Library already indexed - use update action to reindex documents.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
+        View Limbo
+        
+    
+    
+        
+        Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
+        
+    
+    
+        
         About MindForger
         
     
@@ -3317,7 +3326,7 @@
 
     m8r::MainWindowView
     
-        
+        
         Thinking Notebook
         
     
@@ -3669,27 +3678,27 @@
         
     
     
-        
+        
         Exit Editor
         
     
     
-        
+        
         Do you really want to exit editor without saving?
         
     
     
-        
+        
         Full-text Search Result
         
     
     
-        
+        
         No matching text found.
         
     
     
-        
+        
         No spelling suggestions found
         
     
@@ -3931,71 +3940,71 @@
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
@@ -4216,7 +4225,7 @@
     m8r::OutlineTreeModel
     
         
-        Outline
+        Notebook Outline
         
     
     
@@ -4248,6 +4257,34 @@
         
     
 
+
+    m8r::OutlinesMapModel
+    
+        
+        Notebooks Tree
+        
+    
+    
+        
+        Done
+        
+    
+    
+        
+        Rs
+        
+    
+    
+        
+        Ws
+        
+    
+    
+        
+        Modified
+        
+    
+
 
     m8r::OutlinesTableModel
     
@@ -4341,7 +4378,39 @@
     
     
         
-        Refactor Note to Notebook
+        Move Note to Notebook
+        
+    
+
+
+    m8r::RemoveLibraryDialog
+    
+        
+        Choose a library to be removed - this action will delete
+Notebooks which represent documents from the library
+directory.
+Referenced documents will NOT be deleted.
+
+        
+    
+    
+        
+        Choose library to delete: 
+        
+    
+    
+        
+        &Delete
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Delete Document Library
         
     
 
@@ -4398,6 +4467,39 @@
         
     
 
+
+    m8r::RunToolDialog
+    
+        
+        Phrase:
+        
+    
+    
+        
+        Knowledge source:
+        
+    
+    
+        
+        Template:
+        
+    
+    
+        
+        &Get
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Get Knowledge
+        
+    
+
 
     m8r::ScopeDialog
     
@@ -4451,6 +4553,40 @@
         
     
 
+
+    m8r::SyncLibraryDialog
+    
+        
+        Choose a library directory to be synchronized - new notebook
+will be created for every new document found in the library.
+Existing MindForger notebooks for library documents which were
+deleted, renamed or moved (i.e. their link to library document
+is broken) will not be deprecated to protect your document-related
+notes. Feel free to deprecate such notebook(s) yourself.
+
+        
+    
+    
+        
+        Choose library to update: 
+        
+    
+    
+        
+        &Update
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Update Document Library
+        
+    
+
 
     m8r::TagsTableModel
     
@@ -4475,37 +4611,37 @@
 
     m8r::ViewToEditEditButtonsPanel
     
-        
+        
         View Notebook Header
         
     
     
-        
+        
         View Notebook
         
     
     
-        
+        
         Show preview of Notebook name and its description
         
     
     
-        
+        
         &Edit
         
     
     
-        
+        
         Full / Header Notebook Preview
         
     
     
-        
+        
         Whole Notebook &Preview
         
     
     
-        
+        
         Show whole Notebook preview or Notebook header preview
         
     
@@ -4513,73 +4649,73 @@
 
     main
     
-        
+        
         MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI.
         
     
     
-        
+        
         MindForger workspace or directory/file with Markdown(s) to open
         
     
     
-        
+        
         Use 'dark', 'light' or other GUI <theme>.
         
     
     
-        
+        
         theme
         
     
     
-        
+        
         Load configuration from given <file>.
         
     
     
-        
-        
+        
+        
         file
         
     
     
-        
+        
         Disable WebEngine security to allow loading of images on macOS.
         
     
     
-        
+        
         Disable WebEngine security by running single process on macOS.
         
     
     
-        
+        
         Disable WebEngine security by disabling sandbox on macOS.
         
     
     
-        
+        
         Disable WebEngine security by user data dir specification on macOS.
         
     
     
-        
+        
         Disable WebEngine security via site isolation trials on macOS.
         
     
     
-        
+        
         Disable WebEngine security via acess file from file on macOS.
         
     
     
-        
+        
         Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/resources/qt/translations/mindforger_zh_cn.ts b/app/resources/qt/translations/mindforger_zh_cn.ts
index 0beffa92..144f4af0 100644
--- a/app/resources/qt/translations/mindforger_zh_cn.ts
+++ b/app/resources/qt/translations/mindforger_zh_cn.ts
@@ -4,56 +4,79 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
+    
+        
+        Unsupported Knowledge Tool
+        
+    
+    
+        
+        
+        
+        Empty Phrase
+        
+    
+    
+        
+        
+        Phrase to search/explain/process is empty.
+        
+    
+    
+        
+        Phrase to search/explain/process is empty - either make a text selection or move cursor to a word/phrase.
+        
+    
 
 
     SpellChecker
@@ -126,47 +149,47 @@
 
     m8r::AddLibraryDialog
     
-        
-        Choose and find library source:
-        
-    
-    
-        
+        
         Directory
         
     
     
-        
-        Library name:
+        
+        Choose a directory (library) of PDF files to be indexed. MindForger
+will create new notebook for every library file. Such notebook can be
+used to easily open the library file and create library file related
+notes.
+
+Choose new library source:
         
     
     
-        
+        
         Library source path:
         
     
     
-        
+        
         index PDF
         
     
     
-        
+        
         &Create Library and Index Documents
         
     
     
-        
+        
         &Cancel
         
     
     
-        
+        
         Add Document Library
         
     
     
-        
+        
         Choose Directory
         
     
@@ -207,17 +230,17 @@
 
     m8r::CliAndBreadcrumbsPresenter
     
-        
+        
         Notebook 
         
     
     
-        
+        
         Notebook not found: 
         
     
     
-        
+        
         No command!
         
     
@@ -887,7 +910,7 @@
         
     
     
-        
+        
         Choose File with Image
         
     
@@ -983,6 +1006,14 @@
         
     
 
+
+    m8r::LeftToolbarView
+    
+        
+        Tool Bar
+        
+    
+
 
     m8r::MainMenuView
     
@@ -1055,7 +1086,7 @@
     
     
         
-        
+        
         &Forget
         &Deprecate
     
@@ -1212,285 +1243,325 @@
         
     
     
-        
+        
+        Note&books Tree
+        
+    
+    
+        
+        Show tree of Notebooks...
+        
+    
+    
+        
         &Tags
         
     
     
-        
+        
         Open Tag cloud...
         
     
     
-        
+        
         Knowledge Graph &Navigator
         
     
     
-        
+        
         Open knowledge graph Navigator...
         
     
     
-        
+        
         &Memory Dwell
         
     
     
-        
+        
         Open memory dwell...
         
     
     
-        
+        
         &CLI
         
     
     
-        
+        
         Ter&minal
         
     
     
-        
+        
         Run simple command line from current MindForger workspace...
         
     
     
-        
+        
         &Recent Notes
         
     
     
-        
+        
         View recently modified Notes...
         
     
     
-        
+        
         &Stencils
         
     
     
-        
+        
         List Notebook and Note stencils...
         
     
     
-        
+        
         List forgotten Notebooks and Notes...
         
     
     
-        
+        
         Ho&isting
         
     
     
-        
+        
         D&istraction Free
         
     
     
-        
+        
         Toggle distraction free mode
         
     
     
-        
+        
         &Fullscreen
         
     
     
-        
+        
         Toggle fullscreen
         
     
     
-        
+        
         &View
         
     
     
-        
+        
         Str&etch edges	e | mouse wheel
         
     
     
-        
+        
         Stretch knowledge graph edges
         
     
     
-        
+        
         &Sh&rink edge	E | mouse wheel
         
     
     
-        
+        
         Shring knowledge graph edges
         
     
     
-        
+        
         Zoom &in	z
         
     
     
-        
+        
         Zoom in knowledge graph
         
     
     
-        
+        
         Zoom &out	Z
         
     
     
-        
+        
         Zoom out knowledge graph
         
     
     
-        
+        
         &Shuffle	Space
         
     
     
-        
+        
         Shuffle knowledge graph
         
     
     
-        
+        
         N&avigate
         
     
     
-        
+        
+        Lib&rary
+        
+    
+    
+        
+        &New library
+        
+    
+    
+        
+        Add path to the directory with documents (PDF, txt, HTML)...
+        
+    
+    
+        
+        &Update library
+        
+    
+    
+        
+        Synchronize library source directory with MindForger notebook(s) which representlibrary resources...
+        
+    
+    
+        
+        &Delete library
+        
+    
+    
+        
+        Delete all Notebooks representing the library resources...
+        
+    
+    
+        
         &Edit                                                                                     ⌘↩
         
     
     
-        
+        
         &Edit       Alt-Enter
         
     
     
-        
+        
         Move Notebook/Note to Previous Column/Quadrant       ⌘[
         
     
     
-        
+        
         Move Notebook/Note to Next Column/Quadrant              ⌘]
         
     
     
-        
+        
         Focus to Previous Column/Quadrant                              ⇧⇥
         
     
     
-        
+        
         Focus to Next Column/Quadrant                                        ⇥
         
     
     
-        
+        
         &HTML
         
     
     
-        
+        
         Export Notebook to a file in HTML format
         
     
     
-        
+        
         &TWiki
         
     
     
-        
+        
         Import Notebook from an external TWiki file and restart MindForger
         
     
     
-        
-        Refactor	Ctrl+R
-        
-    
-    
-        
+        
         Search Note text
         
     
     
-        
+        
         Find Next	Ctrl+F
         
     
     
-        
+        
         Search Note text again
         
     
     
-        
+        
         &Undo	Ctrl+Z
         
     
     
-        
+        
         Undo
         
     
     
-        
+        
         &Redo	Ctrl+Shift+Z
         
     
     
-        
+        
         Redo
         
     
     
-        
+        
         Cu&t	Ctrl+X
         
     
     
-        
+        
         Cut
         
     
     
-        
+        
         &Copy	Ctrl+C
         
     
     
-        
+        
         Copy
         
     
     
-        
+        
         &Paste	Ctrl+V
         
     
     
-        
+        
         Paste
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &Edit
         
     
@@ -1525,588 +1596,606 @@
         
     
     
-        
+        
         &Library Documents
         
     
     
-        
+        
         List Library documents...
         
     
     
-        
+        
         Li&mbo
         
     
     
-        
-        &Know
+        
+        Str&etch edges
         
     
     
-        
-        
-        &Wikipedia
+        
+        &Sh&rink edge
         
     
     
-        
-        Find marked text on Wikipedia or open Wikipedia search
+        
+        Flash&cards
         
     
     
-        
-        
-        &arXiv
+        
+        &Organizer
         
     
     
-        
-        Find marked text on arXiv or get article by ID
+        
+        Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
         
     
     
-        
-        Str&etch edges
+        
+        Edit current Organizer - you can also double click view to open the editor
         
     
     
-        
-        &Sh&rink edge
+        
+        Make copy of the current Organizer
         
     
     
-        
-        Libr&ary
+        
+        &Delete
         
     
     
-        
-        &Add library
+        
+        Delete Organizer without undo
         
     
     
-        
-        Add directory with documents, URL or other resource to library...
+        
+        
+        Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
         
     
     
-        
-        &Deprecate library
+        
+        Move Notebook/Note to previous column or quadrant...
         
     
     
-        
-        Move a library resource with documents to limbo...
+        
+        
+        Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
         
     
     
-        
-        Flash&cards
+        
+        Move Notebook/Note to next column or quadrant...
         
     
     
-        
-        &Organizer
+        
+        Move focus to previous column or quandrant...
         
     
     
-        
-        Create new Organizer to prioritize your knowledge in Eisenhower Matrix style
+        
+        Move focus to next column or quandrant...
         
     
     
-        
-        Edit current Organizer - you can also double click view to open the editor
+        
+        Note&book
         
     
     
-        
-        Make copy of the current Organizer
+        
+        E&xamine
         
     
     
-        
-        &Delete
+        
+        Turn Notebook to deck of flashcard and start active recall testing...
         
     
     
-        
-        Delete Organizer without undo
+        
+        E&xternal Editor Edit	Ctrl+X
         
     
     
-        
-        
-        Move Notebook/Note to &Previous Column/Quadrant	Ctrl+Left
+        
+        Edit current Note in an external editor - use Preferences to configure the editor
         
     
     
-        
-        Move Notebook/Note to previous column or quadrant...
+        
+        &Forget	Ctrl+D
         
     
     
-        
-        
-        Move Notebook/Note to Ne&xt Column/Quadrant	Ctrl+Right
+        
+        Save and Leave	Ctrl+L
         
     
     
-        
-        Move Notebook/Note to next column or quadrant...
+        
+        Move to F&irst	Ctrl+Shift+Up
         
     
     
-        
-        Move focus to previous column or quandrant...
+        
+        Move the Note to be the first child of its parent
         
     
     
-        
-        Move focus to next column or quandrant...
+        
+        Move &Up	Ctrl+Up
         
     
     
-        
-        Note&book
+        
+        Move the Note up
         
     
     
-        
-        E&xamine
+        
+        Move Do&wn	Ctrl+Down
         
     
     
-        
-        Turn Notebook to deck of flashcard and start active recall testing...
+        
+        Move the Note down
         
     
     
-        
-        E&xternal Editor Edit	Ctrl+X
+        
+        Move to &Last	Ctrl+Shift+Down
         
     
     
-        
-        Edit current Note in an external editor - use Preferences to configure the editor
+        
+        Move the Note to be the last child of its parent
         
     
     
-        
-        &Forget	Ctrl+D
+        
+        Move to Notebook	Ctrl+R
         
     
     
-        
-        Save and Leave	Ctrl+L
+        
+        &Move to Notebook
         
     
     
-        
+        
+        Move the current Note to another Notebook...
+        
+    
+    
+        
         &Find	Ctrl+Shift+F
         
     
     
-        
+        
         &Live Preview
         
     
     
-        
+        
         Toggle live HTML preview
         
     
     
-        
+        
         &Word Wrap
         
     
     
-        
+        
         &Swap Name/Description Focus
         
     
     
-        
+        
         Swap focus of N title and description editors
         
     
     
-        
+        
+        Find Knowledge	Ctrl+/
+        
+    
+    
+        
+        Run an external tool to find, explain, process text under the cursor
+        
+    
+    
+        
+        Complete Link	Ctrl+L
+        
+    
+    
+        
         Sp&ell Check
         
     
     
-        
+        
         Spell check Notebook or Note description
         
     
     
-        
+        
         &Bold
         
     
     
-        
+        
         Format text as bold
         
     
     
-        
+        
         &Italic
         
     
     
-        
+        
         Format text as italic
         
     
     
-        
+        
         &Code
         
     
     
-        
+        
         Format text as inlined source code
         
     
     
-        
+        
         &Math
         
     
     
-        
+        
         Format text as math (MathJax)
         
     
     
-        
+        
         Comment
         
     
     
-        
+        
         Add comment to hide text in rendered HTML
         
     
     
-        
+        
         Lis&ts
         
     
     
-        
+        
         &Bulleted List
         
     
     
-        
+        
         &Numbered List
         
     
     
-        
+        
         &Task List
         
     
     
-        
+        
         Task List &Item
         
     
     
-        
+        
         Bl&ocks
         
     
     
-        
+        
         &Code Block
         
     
     
-        
+        
         &Math Block
         
     
     
-        
+        
         &Diagram Block
         
     
     
-        
+        
         Format code block as diagram (Mermaid)
         
     
     
-        
+        
         Diagrams
         
     
     
-        
+        
         &Flowchart
         
     
     
-        
+        
         Insert flowchart Mermaid diagram skeleton
         
     
     
-        
+        
         &Sequence Diagram
         
     
     
-        
+        
         Insert sequence Mermaid diagram skeleton
         
     
     
-        
+        
         &Class Diagram
         
     
     
-        
+        
         Insert class Mermaid diagram skeleton
         
     
     
-        
+        
         St&ate Diagram
         
     
     
-        
+        
         Insert state Mermaid diagram skeleton
         
     
     
-        
+        
         &Gantt Diagram
         
     
     
-        
+        
         Insert Gantt Mermaid diagram skeleton
         
     
     
-        
+        
         &Pie Diagram
         
     
     
-        
+        
         Insert pie Mermaid chart skeleton
         
     
     
-        
+        
         &Strikethrough
         
     
     
-        
+        
         Format text as strikethrough
         
     
     
-        
+        
         &Keyboard
         
     
     
-        
+        
         Format text as keyboard input
         
     
     
-        
+        
         Math cheatsheet
         
     
     
-        
+        
         Open MathJax quick reference
         
     
     
-        
+        
         Math live preview
         
     
     
-        
+        
         Open MathJax live demo
         
     
     
-        
+        
         Mermaid dia&grams documentation
         
     
     
-        
+        
         Open Mermaid diagrams documentation
         
     
     
-        
+        
         Format block as bulleted list
         
     
     
-        
+        
         Format block as numbered list
         
     
     
-        
-        
+        
+        
         Format block as task list
         
     
     
-        
+        
         T&able of Contents
         
     
     
-        
+        
         Insert current date and time
         
     
     
-        
+        
         Format text block as source code
         
     
     
-        
+        
         Format text block as math (MathJax)
         
     
     
-        
+        
         Block &Quote
         
     
     
-        
+        
         Format text block as blockquote
         
     
     
-        
+        
         &Link
         
     
     
-        
+        
         Insert link to a document, image or file
         
     
     
-        
+        
         Insert image
         
     
     
-        
+        
         Tabl&es
         
     
     
-        
+        
         &Horizontal ruler
         
     
     
-        
+        
         Horizontal ruler
         
     
     
-        
+        
         &Format
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         &New
         
     
     
-        
+        
         Create new Notebook to form new ideas, principles, combinations or applications
         
     
     
-        
+        
         Edit current Notebook - you can also double click view to open the editor
         
     
     
-        
+        
         Make &Home
         
     
     
-        
+        
         Import
         
     
     
-        
-        
+        
+        
         Make &Stencil
         
     
     
-        
-        
+        
+        
         Copy the current Notebook as to Stencil
         
     
     
-        
-        
+        
+        
         C&lone
         
     
     
-        
+        
         Make copy of the current Notebook
         
     
     
-        
+        
         Forget Notebook and move it to Limbo
         Delete Notebook and move it Limbo
     
     
-        
+        
         E&xport
         
     
     
-        
+        
         &Forget	Del
         Delete	Del
     
     
-        
+        
         Forget Note
         Delete Note
     
@@ -2116,12 +2205,12 @@
         &Open
     
     
-        
+        
         Toggle tag indicating whether to use the current Notebook as home
         
     
     
-        
+        
         &Import
         
     
@@ -2166,137 +2255,87 @@
         
     
     
-        
-        &Home Notebook
-        
-    
-    
-        
-        Activate command line interface...
-        
-    
-    
-        
-        Create new Note to form new ideas, principles, combinations and applications
-        
-    
-    
-        
-        Hoist/de-hoist Note to focus on Note being viewed or edited
-        
-    
-    
-        
-        &Edit	Ctrl+E
-        
-    
-    
-        
-        Edit current Note - you can also double click view to open the editor
-        
-    
-    
-        
-        Remember	Ctrl+S
-        Save	Ctrl+S
-    
-    
-        
-        Save Note being edited
-        
-    
-    
-        
-        Leave	Alt+Left
-        
-    
-    
-        
-        Save leave editor of Note being changed
+        
+        &Home Notebook
         
     
     
-        
-        &Promote	Ctrl+Left
+        
+        Activate command line interface...
         
     
     
-        
-        Promote Note
+        
+        Create new Note to form new ideas, principles, combinations and applications
         
     
     
-        
-        &Demote	Ctrl+Right
+        
+        Hoist/de-hoist Note to focus on Note being viewed or edited
         
     
     
-        
-        Demote Note
+        
+        &Edit	Ctrl+E
         
     
     
-        
-        F&irst	Ctrl+Shift+Up
+        
+        Edit current Note - you can also double click view to open the editor
         
     
     
-        
-        Move Note to be the first child of its parent
-        
+        
+        Remember	Ctrl+S
+        Save	Ctrl+S
     
     
-        
-        &Up	Ctrl+Up
+        
+        Save Note being edited
         
     
     
-        
-        Move Note up
+        
+        Leave	Alt+Left
         
     
     
-        
-        Do&wn	Ctrl+Down
+        
+        Save leave editor of Note being changed
         
     
     
         
-        Move Note down
+        &Promote	Ctrl+Left
         
     
     
-        
-        &Last	Ctrl+Shift+Down
+        
+        Promote Note
         
     
     
         
-        Move Note to be the last child of its parent
-        
-    
-    
-        
-        &Refactor
+        &Demote	Ctrl+Right
         
     
     
-        
-        Refactor Note to another Notebook...
+        
+        Demote Note
         
     
     
-        
+        
         E&xtract
         
     
     
-        
+        
         Create new Note from the text selected in the current Note...
         
     
     
-        
+        
         &Clone
         
     
@@ -2337,317 +2376,247 @@
         
     
     
-        
+        
         Make a copy of the Note to this or other Notebook...
         
     
     
-        
+        
         Export Note to an external file in a supported format
         
     
     
-        
+        
         Import Note from an external file in a supported format
         
     
     
-        
+        
         &Note
         
     
     
-        
+        
         Toggle word wrap mode
         
     
     
-        
-        Complete Link	Ctrl+/
-        
-    
-    
-        
+        
         Complete word being written by finding link to Notebook or Note
         
     
     
-        
+        
         MathJa&x
         
     
     
-        
+        
         &text
         
     
     
-        
+        
         &fraction
         
     
     
-        
+        
         &sum
         
     
     
-        
+        
         s&quare root
         
     
     
-        
+        
         &integral
         
     
     
-        
+        
         integrals
         
     
     
-        
+        
         &alpha
         
     
     
-        
+        
         &beta
         
     
     
-        
+        
         &Gama
         
     
     
-        
+        
         &Delta
         
     
     
-        
+        
         &bar
         
     
     
-        
+        
         &hat
         
     
     
-        
+        
         &dot
         
     
     
-        
+        
         &overrightarrow
         
     
     
-        
+        
         &cup
         
     
     
-        
+        
         &cap
         
     
     
-        
+        
         &empty set
         
     
     
-        
+        
         &in
         
     
     
-        
+        
         &not in
         
     
     
-        
+        
         With&out tags
         
     
     
-        
+        
         Insert Notebook's table of contents without tags
         
     
     
-        
+        
         &With tags
         
     
     
-        
+        
         Insert Notebook's table of contents with tags
         
     
     
-        
+        
         Timestam&p
         
     
     
-        
+        
         Ima&ge
         
     
     
-        
+        
         Insert table...
         
     
-    
-        
-        &Tools
-        
-    
-    
-        
-        Open Wikipadia and find entry of the selected entity...
-        
-    
-    
-        
-        Open arXiv and find papers related to the selected entity...
-        
-    
-    
-        
-        &ChatGPT: Explain ... in simple terms.
-        
-    
-    
-        
-        Let ChatGPT to explain the selected entry...
-        
-    
-    
-        
-        &Gramarly
-        
-    
     
         
-        Use Gramarly to check to grammar...
-        
-    
-    
-        
-        &DuckDuckGo
-        
-    
-    
-        
-        Open DuckDuckGo and search web for the selected entity...
-        
-    
-    
-        
-        &Pandoc
-        
-    
-    
-        
-        Use Pandoc to convert MindForger's Markdown documents...
-        
-    
-    
-        
-        D&ocusaurus
-        
-    
-    
-        
-        Build your web with MindForger's Markdown documents and Docusaurus...
-        
-    
-    
-        
         &Documentation
         
     
     
-        
+        
         F1
         
     
     
-        
+        
         Open MindForger documentation
         
     
     
-        
+        
         &Web
         
     
     
-        
+        
         Open MindForger web
         
     
     
-        
+        
         &Markdown tutorial
         
     
     
-        
+        
         Open Markdown tutorial
         
     
     
-        
+        
         Report &Bug or Request Feature
         
     
     
-        
+        
         Report bug or suggest an enhancement
         
     
     
-        
+        
         &Check for Updates
         
     
     
-        
+        
         Check for MindForger updates
         
     
     
-        
+        
         &About Qt
         
     
     
-        
+        
         About Qt...
         
     
     
-        
+        
         &About MindForger
         
     
     
-        
+        
         About MindForger...
         
     
     
-        
+        
         &Help
         
     
@@ -2713,34 +2682,34 @@
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
@@ -2749,603 +2718,643 @@
         Open Directory or MindForger Repository
     
     
-        
+        
         Learn Markdown File
         Open Markdown File
     
     
-        
+        
         Learn
         Open
     
     
-        
+        
         Export Notebook to HTML
         
     
     
-        
-        
+        
+        
         Export
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
+        
         Export Memory to CSV
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
-        Home Notebook is not defined!
-        
-    
-    
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         Deprecate Notebook
     
     
-        
+        
+        Library already indexed - use 'Update library' action to synchronize documents.
+        
+    
+    
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
+        Library synchronization
+        
+    
+    
+        
+        There are no libraries - nothing to synchronize.
+        
+    
+    
+        
+        Library deletion
+        
+    
+    
+        
+        There are no libraries - nothing to delete.
+        
+    
+    
+        
+        Delete Library
+        
+    
+    
+        
+        Do you really want to delete Notebooks which represent the library documents?
+        
+    
+    
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
+        Home Notebook not set - use menu 'Notebooks/Make Home'
+        
+    
+    
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         Please select a Note to forget.
         Please select a Note to delete.
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
-        Library already indexed - use update action to reindex documents.
-        
-    
-    
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
+        View Limbo
+        
+    
+    
+        
+        Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
+        
+    
+    
+        
         About MindForger
         
     
@@ -3353,7 +3362,7 @@
 
     m8r::MainWindowView
     
-        
+        
         Thinking Notebook
         
     
@@ -3705,27 +3714,27 @@
         
     
     
-        
+        
         Exit Editor
         
     
     
-        
+        
         Do you really want to exit editor without saving?
         
     
     
-        
+        
         Full-text Search Result
         
     
     
-        
+        
         No matching text found.
         
     
     
-        
+        
         No spelling suggestions found
         
     
@@ -3967,71 +3976,71 @@
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
@@ -4252,7 +4261,7 @@
     m8r::OutlineTreeModel
     
         
-        Outline
+        Notebook Outline
         
     
     
@@ -4284,6 +4293,34 @@
         
     
 
+
+    m8r::OutlinesMapModel
+    
+        
+        Notebooks Tree
+        
+    
+    
+        
+        Done
+        
+    
+    
+        
+        Rs
+        
+    
+    
+        
+        Ws
+        
+    
+    
+        
+        Modified
+        
+    
+
 
     m8r::OutlinesTableModel
     
@@ -4377,7 +4414,39 @@
     
     
         
-        Refactor Note to Notebook
+        Move Note to Notebook
+        
+    
+
+
+    m8r::RemoveLibraryDialog
+    
+        
+        Choose a library to be removed - this action will delete
+Notebooks which represent documents from the library
+directory.
+Referenced documents will NOT be deleted.
+
+        
+    
+    
+        
+        Choose library to delete: 
+        
+    
+    
+        
+        &Delete
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Delete Document Library
         
     
 
@@ -4434,6 +4503,39 @@
         
     
 
+
+    m8r::RunToolDialog
+    
+        
+        Phrase:
+        
+    
+    
+        
+        Knowledge source:
+        
+    
+    
+        
+        Template:
+        
+    
+    
+        
+        &Get
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Get Knowledge
+        
+    
+
 
     m8r::ScopeDialog
     
@@ -4487,6 +4589,40 @@
         
     
 
+
+    m8r::SyncLibraryDialog
+    
+        
+        Choose a library directory to be synchronized - new notebook
+will be created for every new document found in the library.
+Existing MindForger notebooks for library documents which were
+deleted, renamed or moved (i.e. their link to library document
+is broken) will not be deprecated to protect your document-related
+notes. Feel free to deprecate such notebook(s) yourself.
+
+        
+    
+    
+        
+        Choose library to update: 
+        
+    
+    
+        
+        &Update
+        
+    
+    
+        
+        &Cancel
+        
+    
+    
+        
+        Update Document Library
+        
+    
+
 
     m8r::TagsTableModel
     
@@ -4511,37 +4647,37 @@
 
     m8r::ViewToEditEditButtonsPanel
     
-        
+        
         View Notebook Header
         
     
     
-        
+        
         View Notebook
         
     
     
-        
+        
         Show preview of Notebook name and its description
         
     
     
-        
+        
         &Edit
         
     
     
-        
+        
         Full / Header Notebook Preview
         
     
     
-        
+        
         Whole Notebook &Preview
         
     
     
-        
+        
         Show whole Notebook preview or Notebook header preview
         
     
@@ -4549,73 +4685,73 @@
 
     main
     
-        
+        
         MindForger CANNOT be run from text console - set DISPLAY environment variable or run MindForger from GUI.
         
     
     
-        
+        
         MindForger workspace or directory/file with Markdown(s) to open
         
     
     
-        
+        
         Use 'dark', 'light' or other GUI <theme>.
         
     
     
-        
+        
         theme
         
     
     
-        
+        
         Load configuration from given <file>.
         
     
     
-        
-        
+        
+        
         file
         
     
     
-        
+        
         Disable WebEngine security to allow loading of images on macOS.
         
     
     
-        
+        
         Disable WebEngine security by running single process on macOS.
         
     
     
-        
+        
         Disable WebEngine security by disabling sandbox on macOS.
         
     
     
-        
+        
         Disable WebEngine security by user data dir specification on macOS.
         
     
     
-        
+        
         Disable WebEngine security via site isolation trials on macOS.
         
     
     
-        
+        
         Disable WebEngine security via acess file from file on macOS.
         
     
     
-        
+        
         Error: Unable to find given workspace/file to open - open MindForger without parameters and create it from menu Mind/New: '
         
     
     
-        
+        
         Ignoring unknown GUI theme: '
         
     
diff --git a/app/src/qt/cli_n_breadcrumbs_view.cpp b/app/src/qt/cli_n_breadcrumbs_view.cpp
index 843c8521..43b3b7df 100644
--- a/app/src/qt/cli_n_breadcrumbs_view.cpp
+++ b/app/src/qt/cli_n_breadcrumbs_view.cpp
@@ -27,11 +27,15 @@ CliView::CliView(CliAndBreadcrumbsView* cliAndBreadcrumps, QWidget* parent)
 #if !defined(__APPLE__)
     // changing pallette @ macOS w/ dark model @ Qt 5.15.x+ causes edit line to be unreadable
 
+    // TODO leak
     QPalette* palette = new QPalette();
-    palette->setColor(QPalette::Text, LookAndFeels::getInstance().getCliTextColor());
+    palette->setColor(
+        QPalette::Text, 
+        QColor(125, 125, 125));
+        // TODO LookAndFeels::getInstance().getCliTextColor());
     setPalette(*palette);
 #endif
-    setToolTip("Run command: type . for available commands, type search string for FTS, Alt-x to activate.");
+    setToolTip("Run a command: Alt-x to activate, type > for available commands, type search string for FTS.");
 }
 
 void CliView::keyPressEvent(QKeyEvent* event)
@@ -48,19 +52,26 @@ void CliView::keyPressEvent(QKeyEvent* event)
 }
 
 /*
- * CliAndBreadcrumbsView
+ * CLI and breadcrumbs view.
  */
 
-const QString CliAndBreadcrumbsView::CMD_FTS = ".fts ";
-const QString CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME = ".find outline by name ";
-const QString CliAndBreadcrumbsView::CMD_LIST_OUTLINES = ".list outlines";
+const QString CliAndBreadcrumbsView::CMD_HELP
+    = "?";
 
-const QString CliAndBreadcrumbsView::CMD_TOOL= ".tool";
+const QString CliAndBreadcrumbsView::CMD_FTS
+    = "> fts ";
+const QString CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME
+    = "> find outline by name ";
+const QString CliAndBreadcrumbsView::CMD_LIST_OUTLINES
+    = "> list outlines";
+
+const QString CliAndBreadcrumbsView::CMD_TOOL
+    = "> tool";
 
 // TODO migrate all commands to constants
 const QStringList CliAndBreadcrumbsView::DEFAULT_CMDS = QStringList()
-        /*
         << CMD_HELP
+        /*
         << CMD_EXIT
         // home tools
         //<< "home"
@@ -120,6 +131,7 @@ CliAndBreadcrumbsView::CliAndBreadcrumbsView(QWidget* parent, bool zenMode)
     cliCompleter->setCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive);
     cliCompleter->setCompletionMode(QCompleter::PopupCompletion);
     cli->setCompleter(cliCompleter);
+    cli->setText("Use \"? ...\" to chat (Alt-x), \"> ...\" for commands (Ctrl-/), or type a phrase to search.");
     layout->addWidget(cli);
 
     showBreadcrumb();
@@ -227,6 +239,18 @@ void CliAndBreadcrumbsView::showBreadcrumb()
 
 void CliAndBreadcrumbsView::showCli(bool selectAll)
 {
+    // clear help if it presents
+    if(cli->text().startsWith("Use ")) {
+        cli->setText("");
+
+        // TODO leak?
+        QPalette* palette = new QPalette();
+        palette->setColor(
+            QPalette::Text, 
+            LookAndFeels::getInstance().getCliTextColor());
+        setPalette(*palette);
+    }
+
     show();
     cli->setFocus();
     if(selectAll) {
diff --git a/app/src/qt/cli_n_breadcrumbs_view.h b/app/src/qt/cli_n_breadcrumbs_view.h
index 9f7b82f9..36de011e 100644
--- a/app/src/qt/cli_n_breadcrumbs_view.h
+++ b/app/src/qt/cli_n_breadcrumbs_view.h
@@ -60,6 +60,8 @@ class CliAndBreadcrumbsView : public QWidget
     bool zenMode;
 
 public:
+    static const QString CMD_HELP;
+
     static const QString CMD_FTS;
     static const QString CMD_FIND_OUTLINE_BY_NAME;
     static const QString CMD_LIST_OUTLINES;
diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp
index 53012866..292fdafd 100644
--- a/app/src/qt/main_menu_presenter.cpp
+++ b/app/src/qt/main_menu_presenter.cpp
@@ -116,6 +116,7 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
     QObject::connect(view->actionViewHome, SIGNAL(triggered()), mwp, SLOT(doActionViewHome()));
     QObject::connect(view->actionViewOrganizers, SIGNAL(triggered()), mwp, SLOT(doActionViewOrganizers()));
     QObject::connect(view->actionViewOutlines, SIGNAL(triggered()), mwp, SLOT(doActionViewOutlines()));
+    QObject::connect(view->actionViewOutlinesMap, SIGNAL(triggered()), mwp, SLOT(doActionViewOutlinesMap()));
     QObject::connect(view->actionViewTags, SIGNAL(triggered()), mwp, SLOT(doActionViewTagCloud()));
     QObject::connect(view->actionViewNavigator, SIGNAL(triggered()), mwp, SLOT(doActionViewKnowledgeGraphNavigator()));
     QObject::connect(view->actionViewCli, SIGNAL(triggered()), mwp, SLOT(doActionCli()));
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index c8e2b43b..078a3ccc 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -98,7 +98,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
 #ifdef MF_MD_2_HTML_CMARK
     actionMindAutolink->setCheckable(true);
     actionMindAutolink->setStatusTip(tr("Automatically inject links to relevant Notebooks and Notes when browsing HTML preview"));
-    actionMindAutolink->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_A));
+    actionMindAutolink->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_L));
 #else
     actionMindAutolink->setVisible(false);
 #endif
@@ -253,9 +253,15 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionViewOutlines->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_O));
     actionViewOutlines->setStatusTip(tr("Show list of Notebooks..."));
 
+#ifdef MF_WIP
+    actionViewOutlinesMap = new QAction(QIcon(":/menu-icons/dashboard.svg"), tr("Note&books Tree"), mainWindow);
+    actionViewOutlinesMap->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_T));
+    actionViewOutlinesMap->setStatusTip(tr("Show tree of Notebooks..."));
+#endif
+
     actionViewLibraryDocs = new QAction(QIcon(":/menu-icons/copy.svg"), tr("&Library Documents"), mainWindow);
     actionViewLibraryDocs->setStatusTip(tr("List Library documents..."));
-    actionViewLibraryDocs->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_L));
+    //actionViewLibraryDocs->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_));
 
     actionViewTags = new QAction(QIcon(":/menu-icons/tag.svg"), tr("&Tags"), mainWindow);
     actionViewTags->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_G));
@@ -331,6 +337,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuView->addAction(actionViewOrganizers);
     menuView->addAction(actionViewOutlines);
 #ifdef MF_WIP
+    menuView->addAction(actionViewOutlinesMap);
     menuView->addAction(actionViewLibraryDocs);
 #endif
     menuView->addAction(actionViewTags);
@@ -398,7 +405,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     // - includes synchronization in one on another direction
     // - decisions executed AFTER user clicks DO IT button (not while editing dialog)
     actionLibrarySync= new QAction(
-        QIcon(":/menu-icons/new.svg"),
+        QIcon(":/menu-icons/edit.svg"),
         tr("&Update library"),
         mainWindow);
     actionLibrarySync->setStatusTip(
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index d6ce0921..b0db240d 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -111,6 +111,9 @@ class MainMenuView : public QObject
     QAction* actionViewDecks;
     QAction* actionViewOrganizers;
     QAction* actionViewOutlines;
+#ifdef MF_WIP
+    QAction* actionViewOutlinesMap;
+#endif
     QAction* actionViewLibraryDocs;
     QAction* actionViewTags;
     QAction* actionViewNavigator;
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index 523a22bc..80bc765d 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -171,6 +171,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
         this, SLOT(doActionEditPasteImageData(QImage))
     );
     // wire LEFT toolbar signals
+    /*     
     QObject::connect(
         new QShortcut(QKeySequence("Alt+1"), view.getOrloj()), SIGNAL(activated()),
         this, SLOT(doActionArxivToolbar())
@@ -239,10 +240,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
         new QShortcut(QKeySequence("Alt+9"), view.getOrloj()), SIGNAL(activated()),
         this, SLOT(doActionCppToolbar())
     );
-    QObject::connect(
-        view.getLeftToolBar()->actionLeftToolbarCpp, SIGNAL(triggered()),
-        this, SLOT(doActionCppToolbar())
-    );
+    */    
     // wire TOP toolbar signals
     QObject::connect(
         view.getToolBar()->actionNewOutlineOrNote, SIGNAL(triggered()),
@@ -595,7 +593,7 @@ void MainWindowPresenter::handleNoteViewLinkClicked(const QUrl& url)
 #ifdef DO_MF_DEBUG
 void MainWindowPresenter::doActionMindHack()
 {
-    MF_DEBUG("[MindHack] Current facet: " << orloj->getFacet() << endl);
+    MF_DEBUG("MindHack" << endl);
 }
 #endif
 
@@ -1342,7 +1340,9 @@ bool MainWindowPresenter::doActionViewHome()
         orloj->showFacetOutline(homeOutline.at(0));
         return true;
     } else {
-        statusBar->showInfo(tr("Home Notebook is not defined!"));
+        statusBar->showInfo(
+            tr("Home Notebook not set - use menu 'Notebooks/Make Home'")
+        );
         return false;
     }
 }
@@ -1356,6 +1356,19 @@ void MainWindowPresenter::doActionViewOutlines()
     }
 }
 
+
+void MainWindowPresenter::doActionViewOutlinesMap()
+{
+    if(config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
+         &&
+       config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY)
+    {
+        orloj->showFacetOutlinesMap(
+            mind->outlinesMapGet()
+        );
+    }
+}
+
 void MainWindowPresenter::doActionViewTagCloud()
 {
     orloj->showFacetTagCloud();
diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h
index b798eeea..33932fd4 100644
--- a/app/src/qt/main_window_presenter.h
+++ b/app/src/qt/main_window_presenter.h
@@ -247,6 +247,7 @@ public slots:
     void doActionViewTagCloud();
     bool doActionViewHome();
     void doActionViewOutlines();
+    void doActionViewOutlinesMap();
     void doActionViewRecentNotes();
     void doActionViewKnowledgeGraphNavigator();
     void doActionCli();
diff --git a/app/src/qt/main_window_view.cpp b/app/src/qt/main_window_view.cpp
index 12569b3d..1aa5d343 100644
--- a/app/src/qt/main_window_view.cpp
+++ b/app/src/qt/main_window_view.cpp
@@ -24,7 +24,16 @@ MainWindowView::MainWindowView(LookAndFeels& lookAndFeel)
     : QMainWindow(nullptr), // main window has no parent - it is destroyed by main MF class
       lookAndFeel(lookAndFeel)
 {
-    windowTitleSkeleton = "MindForger - "+tr("Thinking Notebook")+" - "+MINDFORGER_VERSION;
+#ifdef MF_LLAMA_CPP
+  #define MINDFORGER_GPT " GPT"
+#else
+  #define MINDFORGER_GPT ""
+#endif
+    windowTitleSkeleton
+        = "MindForger" MINDFORGER_GPT " - "
+          +tr("Thinking Notebook")+" - "
+          +MINDFORGER_VERSION;
+
     setWindowTitle(windowTitleSkeleton);
 
     toolBarView = new MainToolbarView{this};
@@ -32,7 +41,7 @@ MainWindowView::MainWindowView(LookAndFeels& lookAndFeel)
     addToolBar(Qt::TopToolBarArea, toolBarView);
 
     leftToolBarView = new LeftToolbarView{this};
-    addToolBar(Qt::LeftToolBarArea, leftToolBarView);
+    // addToolBar(Qt::LeftToolBarArea, leftToolBarView);
 
     centralWidget = new QWidget(this);
 
diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp
index 5341e1f0..a41b5db4 100644
--- a/app/src/qt/orloj_presenter.cpp
+++ b/app/src/qt/orloj_presenter.cpp
@@ -42,6 +42,7 @@ OrlojPresenter::OrlojPresenter(
     this->kanbanPresenter = new KanbanPresenter(view->getKanban(), this);
     this->tagCloudPresenter = new TagsTablePresenter(view->getTagCloud(), mainPresenter->getHtmlRepresentation());
     this->outlinesTablePresenter = new OutlinesTablePresenter(view->getOutlinesTable(), mainPresenter->getHtmlRepresentation());
+    this->outlinesMapPresenter = new OutlinesMapPresenter(view->getOutlinesMap(), mainPresenter, this);
     this->recentNotesTablePresenter = new RecentNotesTablePresenter(view->getRecentNotesTable(), mainPresenter->getHtmlRepresentation());
     this->outlineViewPresenter = new OutlineViewPresenter(view->getOutlineView(), this);
     this->outlineHeaderViewPresenter = new OutlineHeaderViewPresenter(view->getOutlineHeaderView(), this);
@@ -398,6 +399,15 @@ void OrlojPresenter::showFacetOutlineList(const vector& outlines)
     mainPresenter->getStatusBar()->showMindStatistics();
 }
 
+void OrlojPresenter::showFacetOutlinesMap(Outline* outlinesMap)
+{
+    setFacet(OrlojPresenterFacets::FACET_MAP_OUTLINES);
+    outlinesMapPresenter->refresh(outlinesMap);
+    view->showFacetOutlinesMap();
+    mainPresenter->getMainMenu()->showFacetOutlineList();
+    mainPresenter->getStatusBar()->showMindStatistics();
+}
+
 void OrlojPresenter::slotShowOutlines()
 {
     showFacetOutlineList(mind->getOutlines());
diff --git a/app/src/qt/orloj_presenter.h b/app/src/qt/orloj_presenter.h
index ce1bc6cc..fa091554 100644
--- a/app/src/qt/orloj_presenter.h
+++ b/app/src/qt/orloj_presenter.h
@@ -35,6 +35,7 @@
 #include "recent_notes_table_presenter.h"
 #include "main_window_presenter.h"
 #include "outlines_table_presenter.h"
+#include "outlines_map_presenter.h"
 #include "notes_table_presenter.h"
 #include "outline_view_presenter.h"
 #include "outline_header_view_presenter.h"
@@ -56,6 +57,7 @@ class NoteEditPresenter;
 class OutlineHeaderViewPresenter;
 class OutlineHeaderEditPresenter;
 class OutlineViewPresenter;
+class OutlinesMapPresenter;
 class OrlojView;
 
 enum OrlojPresenterFacets {
@@ -73,7 +75,8 @@ enum OrlojPresenterFacets {
     FACET_NAVIGATOR,              // 11
     FACET_DASHBOARD,              // 12
     FACET_LIST_ORGANIZERS,        // 13
-    FACET_KANBAN                  // 14
+    FACET_KANBAN,                 // 14
+    FACET_MAP_OUTLINES            // 15
 };
 
 // aspect modifies facet
@@ -113,6 +116,7 @@ class OrlojPresenter : public QObject
     KanbanPresenter* kanbanPresenter;
     TagsTablePresenter* tagCloudPresenter;
     OutlinesTablePresenter* outlinesTablePresenter;
+    OutlinesMapPresenter* outlinesMapPresenter;
     RecentNotesTablePresenter* recentNotesTablePresenter;
     OutlineViewPresenter* outlineViewPresenter;
     OutlineHeaderViewPresenter* outlineHeaderViewPresenter;
@@ -138,6 +142,7 @@ class OrlojPresenter : public QObject
     NavigatorPresenter* getNavigator() const { return navigatorPresenter; }
     MainWindowPresenter* getMainPresenter() const { return mainPresenter; }
     OutlinesTablePresenter* getOutlinesTable() const { return outlinesTablePresenter; }
+    OutlinesMapPresenter* getOutlinesMap() const { return outlinesMapPresenter; }
     RecentNotesTablePresenter* getRecentNotesTable() const { return recentNotesTablePresenter; }
     OutlineViewPresenter* getOutlineView() const { return outlineViewPresenter; }
     OutlineHeaderViewPresenter* getOutlineHeaderView() const { return outlineHeaderViewPresenter; }
@@ -200,6 +205,7 @@ class OrlojPresenter : public QObject
     );
     void showFacetTagCloud();
     void showFacetOutlineList(const std::vector& outlines);
+    void showFacetOutlinesMap(Outline* outlinesMap);
     void showFacetRecentNotes(const std::vector& notes);
     void showFacetKnowledgeGraphNavigator();
     void showFacetFtsResult(std::vector* result);
diff --git a/app/src/qt/orloj_view.cpp b/app/src/qt/orloj_view.cpp
index 4e1c5511..c70f4932 100644
--- a/app/src/qt/orloj_view.cpp
+++ b/app/src/qt/orloj_view.cpp
@@ -43,6 +43,9 @@ OrlojView::OrlojView(QWidget* parent)
     outlinesTable = new OutlinesTableView(this);
     addWidget(outlinesTable);
 
+    outlinesMap = new OutlinesMapView(this);
+    addWidget(outlinesMap);
+
     recentNotesTable = new RecentNotesTableView(this);
     addWidget(recentNotesTable);
 
@@ -133,6 +136,12 @@ void OrlojView::showFacetOutlines()
     hideChildren(v);
 }
 
+void OrlojView::showFacetOutlinesMap()
+{
+    QSet v; v << outlinesMap;
+    hideChildren(v);
+}
+
 void OrlojView::showFacetOutlinesDetail()
 {
     QSet v; v << outlinesTable << outlineView;
diff --git a/app/src/qt/orloj_view.h b/app/src/qt/orloj_view.h
index 455398a4..81b309f1 100644
--- a/app/src/qt/orloj_view.h
+++ b/app/src/qt/orloj_view.h
@@ -27,6 +27,7 @@
 #include "kanban_view.h"
 #include "tags_table_view.h"
 #include "outlines_table_view.h"
+#include "outlines_map_view.h"
 #include "notes_table_view.h"
 #include "recent_notes_table_view.h"
 #include "outline_view_splitter.h"
@@ -67,6 +68,7 @@ class OrlojView : public QSplitter
     KanbanView* kanban;
     TagsTableView* tagCloud;
     OutlinesTableView* outlinesTable;
+    OutlinesMapView* outlinesMap;
     RecentNotesTableView* recentNotesTable;
     OutlineViewSplitter* outlineView;
     OutlineHeaderView* outlineHeaderView;
@@ -91,6 +93,7 @@ class OrlojView : public QSplitter
     KanbanView* getKanban() const { return kanban; }
     TagsTableView* getTagCloud() const { return tagCloud; }
     OutlinesTableView* getOutlinesTable() const { return outlinesTable; }
+    OutlinesMapView* getOutlinesMap() const { return outlinesMap; }
     RecentNotesTableView* getRecentNotesTable() const { return recentNotesTable; }
     OutlineViewSplitter* getOutlineView() const { return outlineView; }
     OutlineHeaderView* getOutlineHeaderView() const { return outlineHeaderView; }
@@ -131,6 +134,11 @@ class OrlojView : public QSplitter
      */
     void showFacetOutlines();
 
+    /**
+     * @brief Tree of Outlines
+     */
+    void showFacetOutlinesMap();
+
     /**
      * @brief Outline detail: name and tree of Notes
      */
diff --git a/app/src/qt/outline_tree_model.cpp b/app/src/qt/outline_tree_model.cpp
index 0f85b276..d135b5f0 100644
--- a/app/src/qt/outline_tree_model.cpp
+++ b/app/src/qt/outline_tree_model.cpp
@@ -39,7 +39,7 @@ void OutlineTreeModel::removeAllRows()
 
     QStringList tableHeader;
     tableHeader
-            << tr("Outline") // tree of Notes is in fact Notebook's outline
+            << tr("Notebook Outline") // tree of Notes is in fact Notebook's outline
             << tr("Done")
             << tr("Rs")
             << tr("Ws")
diff --git a/app/src/qt/outlines_map_model.cpp b/app/src/qt/outlines_map_model.cpp
new file mode 100644
index 00000000..4c214298
--- /dev/null
+++ b/app/src/qt/outlines_map_model.cpp
@@ -0,0 +1,175 @@
+/*
+ outlines_map_model.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "outlines_map_model.h"
+
+#include 
+
+#define NO_INDEX -1
+
+using namespace std;
+
+namespace m8r {
+
+OutlinesMapModel::OutlinesMapModel(QObject *parent, HtmlOutlineRepresentation* htmlRepresentation)
+    : QStandardItemModel(parent), htmlRepresentation(htmlRepresentation)
+{
+    setColumnCount(5);
+    setRowCount(0);
+}
+
+void OutlinesMapModel::removeAllRows()
+{
+    QStandardItemModel::clear();
+
+    QStringList tableHeader;
+    tableHeader
+            << tr("Notebooks Tree") // tree of Notebooks ~ mind map of Notebooks
+            << tr("Done")
+            << tr("Rs")
+            << tr("Ws")
+            << tr("Modified");
+    setHorizontalHeaderLabels(tableHeader);
+}
+
+void OutlinesMapModel::createNameText(string& html, Note* note)
+{
+    for(auto depth=0; depthgetDepth(); depth++) {
+        html += "    ";
+    }
+    html += note->getName();
+
+    htmlRepresentation->tagsToHtml(note->getTags(), html);
+    // IMPROVE make showing of type configurable
+    htmlRepresentation->noteTypeToHtml(note->getType(), html);
+}
+
+void OutlinesMapModel::createRowFor(Note* note, QList& rowItems)
+{
+    // name
+    string name{};
+    name.reserve(200);
+    createNameText(name, note);
+    QStandardItem* noteItem = new QStandardItem{QString::fromStdString(name)};
+    // TODO declare custom role
+    noteItem->setData(QVariant::fromValue(note), Qt::UserRole + 1);
+    rowItems += noteItem;
+    // %
+    QString s{};
+    if(note->getProgress()) {
+        s.clear();
+        s += QString::number(note->getProgress());
+        s += "%";
+        rowItems += new QStandardItem{s};
+    } else {
+        rowItems += new QStandardItem{""};
+    }
+    // rd/wr
+    rowItems += new QStandardItem{QString::number(note->getReads())};
+    rowItems += new QStandardItem{QString::number(note->getRevision())};
+    // pretty
+    s = note->getModifiedPretty().c_str();
+    rowItems += new QStandardItem{s};
+}
+
+
+void OutlinesMapModel::addNote(Note* note)
+{
+    QList items;
+    createRowFor(note, items);
+    appendRow(items);
+}
+
+int OutlinesMapModel::insertNote(Note* note)
+{
+    if(note) {
+        QList items;
+        createRowFor(note, items);
+        int offset = note->getOutline()->getNoteOffset(note);
+        insertRow(offset, items);
+        return offset;
+    } else {
+        return 0;
+    }
+}
+
+int OutlinesMapModel::getRowByNote(const Note* note)
+{
+    for(int row = 0; rowdata().value() == note) {
+            return row;
+        }
+    }
+    return NO_INDEX;
+}
+
+void OutlinesMapModel::refresh(Note* note, int row, bool set)
+{
+    if(row > NO_INDEX) {
+        if(set) {
+            // TODO declare custom role
+            item(row,0)->setData(QVariant::fromValue(note), Qt::UserRole + 1);
+        }
+
+        string s{};
+        s.reserve(100);
+        createNameText(s, note);
+        // refresh content
+        item(row,0)->setText(QString::fromStdString(s));
+
+        if(note->getProgress()) {
+            s.clear();
+            s += std::to_string(note->getProgress());
+            s += "%";
+            item(row,1)->setText(QString::fromStdString(s));
+        } else {
+            item(row,1)->setText("");
+        }
+
+        item(row,2)->setText(QString::number(note->getReads()));
+        item(row,3)->setText(QString::number(note->getRevision()));
+        item(row,4)->setText(QString::fromStdString(note->getModifiedPretty()));
+
+        QModelIndex from = createIndex(row, 0, item(row,0));
+        QModelIndex to = createIndex(row, 3, item(row,3));
+
+        // notify widget about changes
+        emit dataChanged(from,to);
+    }
+}
+
+void OutlinesMapModel::refresh(Note* note, QModelIndexList selection)
+{
+    int row = NO_INDEX;
+
+    // determine row number by note attached to the row - selection or iteration
+    if(selection.size()) {
+        // TODO declare custom role
+        if(item(selection[0].row())->data(Qt::UserRole + 1).value() == note) {
+            row = selection[0].row();
+        }
+    }
+    if(row <= NO_INDEX) {
+        // IMPROVE UI note that has both Note and QStandardItem refs
+        row = getRowByNote(note);
+    }
+
+    refresh(note, row);
+}
+
+} // m8r namespace
diff --git a/app/src/qt/outlines_map_model.h b/app/src/qt/outlines_map_model.h
new file mode 100644
index 00000000..1f51668d
--- /dev/null
+++ b/app/src/qt/outlines_map_model.h
@@ -0,0 +1,64 @@
+/*
+ outlines_map_model.h     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8RUI_OUTLINES_MAP_MODEL_H
+#define M8RUI_OUTLINES_MAP_MODEL_H
+
+#include 
+
+#include 
+
+#include "../../lib/src/model/note.h"
+#include "../../lib/src/representations/html/html_outline_representation.h"
+
+#include "notes_table_model.h"
+#include "gear/qutils.h"
+
+namespace m8r {
+
+class OutlinesMapModel : public QStandardItemModel
+{
+    Q_OBJECT
+
+private:
+    HtmlOutlineRepresentation* htmlRepresentation;
+    QList noselection;
+
+public:
+    OutlinesMapModel(QObject *parent, HtmlOutlineRepresentation* htmlRepresentation);
+    OutlinesMapModel(const OutlinesMapModel&) = delete;
+    OutlinesMapModel(const OutlinesMapModel&&) = delete;
+    OutlinesMapModel &operator=(const OutlinesMapModel&) = delete;
+    OutlinesMapModel &operator=(const OutlinesMapModel&&) = delete;
+
+    void removeAllRows();
+    void addNote(Note* note);
+    int insertNote(Note* note);
+    int getRowByNote(const Note* note);
+    void refresh(Note* note) { refresh(note, noselection); }
+    void refresh(Note* note, int row, bool set=false);
+    void refresh(Note* note, QModelIndexList selection);
+
+private:
+    void createNameText(std::string& name, Note* note);
+    void createRowFor(Note* note, QList& rowItems);
+};
+
+}
+
+#endif // M8RUI_OUTLINES_MAP_MODEL_H
diff --git a/app/src/qt/outlines_map_presenter.cpp b/app/src/qt/outlines_map_presenter.cpp
new file mode 100644
index 00000000..741cbe87
--- /dev/null
+++ b/app/src/qt/outlines_map_presenter.cpp
@@ -0,0 +1,242 @@
+/*
+ outlines_map_presenter.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "outlines_map_presenter.h"
+
+namespace m8r {
+
+using namespace std;
+
+OutlinesMapPresenter::OutlinesMapPresenter(
+    OutlinesMapView* view, MainWindowPresenter* mwp, QObject* parent
+) : QObject(parent)
+{
+    this->view = view;
+    this->model = new OutlinesMapModel{view, mwp->getHtmlRepresentation()};
+    this->view->setModel(this->model);
+    this->mind = mwp->getMind();
+
+    // ensure HTML cells rendering
+    HtmlDelegate* delegate = new HtmlDelegate{};
+    this->view->setItemDelegate(delegate);
+
+    // signals
+    QObject::connect(
+        view, SIGNAL(signalSelectNextRow()),
+        this, SLOT(slotSelectNextRow()));
+    QObject::connect(
+        view, SIGNAL(signalSelectPreviousRow()),
+        this, SLOT(slotSelectPreviousRow()));
+
+    QObject::connect(
+        view, SIGNAL(signalOutlineShow()),
+        mwp, SLOT(doActionOutlineShow()));
+
+    QObject::connect(
+        view, SIGNAL(signalChangePromote()),
+        mwp, SLOT(doActionNotePromote()));
+    QObject::connect(
+        view, SIGNAL(signalChangeDemote()),
+        mwp, SLOT(doActionNoteDemote()));
+    QObject::connect(
+        view, SIGNAL(signalChangeFirst()),
+        mwp, SLOT(doActionNoteFirst()));
+    QObject::connect(
+        view, SIGNAL(signalChangeUp()),
+        mwp, SLOT(doActionNoteUp()));
+    QObject::connect(
+        view, SIGNAL(signalChangeDown()),
+        mwp, SLOT(doActionNoteDown()));
+    QObject::connect(
+        view, SIGNAL(signalChangeLast()),
+        mwp, SLOT(doActionNoteLast()));
+
+    QObject::connect(
+        view, SIGNAL(signalOutlineOrNoteEdit()),
+        mwp, SLOT(doActionOutlineOrNoteEdit()));
+    QObject::connect(
+        view, SIGNAL(signalOutlineOrNoteExternalEdit()),
+        mwp, SLOT(doActionNoteExternalEdit()));
+    QObject::connect(
+        view, SIGNAL(signalEdit()),
+        mwp, SLOT(doActionNoteEdit()));
+    QObject::connect(
+        view, SIGNAL(signalForget()),
+        mwp, SLOT(doActionNoteForget()));
+}
+
+OutlinesMapPresenter::~OutlinesMapPresenter()
+{
+    if(model) delete model;
+}
+
+void OutlinesMapPresenter::refresh(Outline* outline, Outline::Patch* patch)
+{
+    // If FORGET aspect is used, then only VIEW is filtered, but operations are performed
+    // on the non-filtered O's Ns. UI view serves just as a FILTER of what can be changed.
+    // Therefore anything special is needed on the backend.
+    //   Unfortunately PATCH will NOT help if VIEW is filtered and everyhing must be
+    // refreshed.
+    if(outline) {
+        if(patch) {
+            const vector& notes = outline->getNotes();
+            switch(patch->diff) {
+            case Outline::Patch::Diff::CHANGE:
+                for(unsigned int i=patch->start; i<=patch->start+patch->count; i++) {
+                    model->refresh(notes[i], i, false);
+                }
+                break;
+            case Outline::Patch::Diff::MOVE:
+                for(unsigned int i=patch->start; i<=patch->start+patch->count; i++) {
+                    model->refresh(notes[i], i, true);
+                }
+                break;
+            default:
+                break;
+            }
+        } else {
+            model->removeAllRows();
+            for(Note* note:outline->getNotes()) {
+                model->addNote(note);
+            }
+        }
+
+        // forget / time scope: hide view rows ~ there is full model, I just hide what's visible > patch should work
+        if(mind->getScopeAspect().isEnabled()) {
+            vector parents;
+            for(size_t i=0; igetNotesCount(); i++) {
+                if(mind->getScopeAspect().isInScope(outline->getNotes()[i])) {
+                    // N's parents
+                    parents.clear();
+                    outline->getNotePathToRoot(i, parents);
+                    if(parents.size()) {
+                        for(size_t p=0; pshowRow(parents[p]);
+                        }
+                    }
+                    // N
+                    view->showRow(i);
+                } else {
+                    view->hideRow(i);
+                }
+            }
+        }
+    }
+}
+
+void OutlinesMapPresenter::refresh(Note* note)
+{
+    QItemSelectionModel *select = view->selectionModel();
+    if(select->hasSelection()) {
+        model->refresh(note, select->selectedRows());
+    } else {
+        model->refresh(note);
+    }
+}
+
+void OutlinesMapPresenter::selectRow(int row)
+{
+    view->scrollTo(model->index(row, 0));
+    view->selectRow(row);
+}
+
+void OutlinesMapPresenter::insertAndSelect(Note* note)
+{
+    this->selectRow(model->insertNote(note));
+}
+
+void OutlinesMapPresenter::clearSelection()
+{
+    view->clearSelection();
+}
+
+void OutlinesMapPresenter::selectRowByNote(const Note* note)
+{
+    if(note) {
+        int row = model->getRowByNote(note);
+        if(row >= 0) {
+            view->selectRow(row);
+            view->scrollTo(model->index(row, 0));
+            return;
+        }
+    }
+    view->clearSelection();
+}
+
+int OutlinesMapPresenter::getCurrentRow() const
+{
+    QModelIndexList indexes = view->selectionModel()->selection().indexes();
+    for(int i=0; iitem(row)->data().value();
+    }
+
+    return nullptr;
+}
+
+/**
+ * @brief Get adjacent N - adjacent above or below N.
+ *
+ * @return adjacent note or NULL if no such N.
+ */
+Note* OutlinesMapPresenter::getAdjacentNote() const
+{
+    int row = getCurrentRow();
+    if(row != NO_ROW) {
+        if(row > 0) {
+            return model->item(row-1)->data().value();
+        }
+        // ELSE row == 0 and child row cannot be selected
+        // as its not clear upfront whether/how many
+        // children will be deleted
+        // therefore it is expected that this function
+        // returns nullptr, so that row 0 can be selected
+        // AFTER N is deleted (if any row is remaining in O)
+    }
+
+    return nullptr;
+}
+
+void OutlinesMapPresenter::slotSelectPreviousRow()
+{
+    int row = getCurrentRow();
+    if(row) {
+        QModelIndex previousIndex = model->index(row-1, 0);
+        view->setCurrentIndex(previousIndex);
+    }
+}
+
+void OutlinesMapPresenter::slotSelectNextRow()
+{
+    int row = getCurrentRow();
+    if(row < model->rowCount()-1) {
+        QModelIndex nextIndex = model->index(row+1, 0);
+        view->setCurrentIndex(nextIndex);
+    }
+}
+
+} // m8r namespace
diff --git a/app/src/qt/outlines_map_presenter.h b/app/src/qt/outlines_map_presenter.h
new file mode 100644
index 00000000..fd61261c
--- /dev/null
+++ b/app/src/qt/outlines_map_presenter.h
@@ -0,0 +1,107 @@
+/*
+ outlines_map_presenter.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8RUI_OUTLINES_MAP_PRESENTER_H
+#define M8RUI_OUTLINES_MAP_PRESENTER_H
+
+#include 
+
+#include "../../lib/src/model/outline.h"
+#include "../../lib/src/mind/mind.h"
+
+#include 
+
+#include "orloj_presenter.h"
+#include "outlines_map_view.h"
+#include "outlines_map_model.h"
+
+namespace m8r {
+
+class OrlojPresenter;
+
+/**
+ * @brief The Outlines map presenter.
+ *
+ * Outlines map ~ tree of Outlines is in fact ~ mind map of Outlines
+ */
+class OutlinesMapPresenter : public QObject
+{
+    Q_OBJECT
+
+    // Assembly ... view / model / presenter:
+    //
+    //   view <- new View
+    //     presenter <- new Presenter(view) w/ new Model(view)
+    //       model <- presenter.model
+    //
+    // Integration:
+    //
+    //   orlojView <- new View()
+    //   orlojPresenter <- presenter
+    //
+    // Materialization / view:
+    //
+    //   menu ... MainMenuView::actionViewOutlinesMap
+    //     ->  @ MainMenuPresenter
+    //       ->  MainWindowPresenter::doActionViewOutlinesMap()
+    //          ... generate virtual O from Os headers
+    //         -> OrlojPresenter::showFacetOutlinesMap( virtualO )
+    //
+
+public:
+    static const int NO_ROW = -1;
+
+private:
+    OutlinesMapView* view;
+    OutlinesMapModel* model;
+
+    Mind* mind;
+
+public:
+    explicit OutlinesMapPresenter(
+        OutlinesMapView* view, MainWindowPresenter* mwp, QObject* parent);
+    OutlinesMapPresenter(const OutlinesMapPresenter&) = delete;
+    OutlinesMapPresenter(const OutlinesMapPresenter&&) = delete;
+    OutlinesMapPresenter &operator=(const OutlinesMapPresenter&) = delete;
+    OutlinesMapPresenter &operator=(const OutlinesMapPresenter&&) = delete;
+
+    OutlinesMapView* getView() const { return view; }
+    OutlinesMapModel* getModel() const { return model; }
+
+    void refresh(Outline* outline, Outline::Patch* patch=nullptr);
+    void refresh(Note* note);
+    void selectRow(int row);
+    void insertAndSelect(Note* note);
+
+    void clearSelection();
+    void focus() { view->setFocus(); }
+    void selectRowByNote(const Note* note);
+
+    int getCurrentRow() const;
+    Note* getCurrentNote() const;
+    Note* getAdjacentNote() const;
+
+    ~OutlinesMapPresenter();
+
+public slots:
+    void slotSelectNextRow();
+    void slotSelectPreviousRow();
+};
+
+}
+#endif // M8RUI_OUTLINES_MAP_PRESENTER_H
diff --git a/app/src/qt/outlines_map_view.cpp b/app/src/qt/outlines_map_view.cpp
new file mode 100644
index 00000000..d285b0af
--- /dev/null
+++ b/app/src/qt/outlines_map_view.cpp
@@ -0,0 +1,217 @@
+/*
+ outlines_map_view.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include "outlines_map_view.h"
+
+namespace m8r {
+
+OutlinesMapView::OutlinesMapView(QWidget* parent)
+    : QTableView(parent)
+{
+    verticalHeader()->setVisible(false);
+
+    // BEFARE: this kills performance in case of big(ger) tables
+    // verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+
+    setSortingEnabled(false);
+
+    setEditTriggers(QAbstractItemView::NoEditTriggers);
+    setSelectionBehavior(QAbstractItemView::SelectRows);
+    setSelectionMode(QAbstractItemView::SingleSelection);
+    // disable TAB and Ctrl+O up/down navigation (Ctrl+O no longer bound)
+    setTabKeyNavigation(false);
+
+    verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
+}
+
+void OutlinesMapView::keyPressEvent(QKeyEvent* event)
+{
+    // leave note view navigation
+#ifndef __APPLE__
+    if(event->modifiers() & Qt::AltModifier) {
+        if(event->key()==Qt::Key_Left) {
+            emit signalFromOutlinesMapToOutlines();
+        }
+    } else {
+#endif
+        // up/down/promote/demote note tree changes
+        if(event->modifiers() & Qt::ControlModifier){
+            if(event->modifiers() & Qt::ShiftModifier) {
+                switch(event->key()) {
+                case Qt::Key_Up:
+                    emit signalChangeFirst();
+                    break;
+                case Qt::Key_Down:
+                    emit signalChangeLast();
+                    break;
+                }
+            } else {
+                switch(event->key()) {
+#ifndef __APPLE__
+                case Qt::Key_Up:
+                    emit signalChangeUp();
+                    break;
+                case Qt::Key_Down:
+                    emit signalChangeDown();
+                    break;
+                case Qt::Key_Left:
+                    emit signalChangePromote();
+                    break;
+                case Qt::Key_Right:
+                    emit signalChangeDemote();
+                    break;
+#else
+                case Qt::Key_L:
+                    emit signalFromOutlinesMapToOutlines();
+                    break;
+                case Qt::Key_D:
+                    emit signalForget();
+                    break;
+#endif
+                case Qt::Key_E:
+                    emit signalOutlineOrNoteEdit();
+                    break;
+                case Qt::Key_X:
+                    emit signalOutlineOrNoteExternalEdit();
+                    break;
+                }
+            }
+        } else {
+            // up/down note tree navigation
+            switch(event->key()) {
+            case Qt::Key_Escape:
+                emit signalOutlineShow();
+                break;
+            case Qt::Key_Up:
+                emit signalSelectPreviousRow();
+                break;
+            case Qt::Key_Down:
+                emit signalSelectNextRow();
+                break;
+            case Qt::Key_Home:
+                MF_DEBUG("  OutlinesMapView::keyPressEvent HOME" << std::endl);
+                if(this->model()->rowCount() > 0) {
+                    this->selectRow(0);
+                }
+                return;
+            case Qt::Key_End:
+                MF_DEBUG("  OutlinesMapView::keyPressEvent END" << std::endl);
+                if(this->model()->rowCount() > 0) {
+                    this->selectRow(this->model()->rowCount()-1);
+                }
+                return;
+            case Qt::Key_PageUp: {
+                MF_DEBUG("  OutlinesMapView::keyPressEvent PAGE_UP" << std::endl);
+                // get currently selected row
+                QModelIndexList indices = selectionModel()->selection().indexes();
+                // no indexes > no row > no selection
+                for(int i=0; iselectRow(newRow);
+                }
+                // no row selected
+                return;
+            }
+            case Qt::Key_PageDown: {
+                MF_DEBUG("  OutlinesMapView::keyPressEvent PAGE_DOWN" << std::endl);
+                // get currently selected row
+                QModelIndexList indices = selectionModel()->selection().indexes();
+                // no indexes > no row > no selection
+                for(int i=0; i this->model()->rowCount()-1) {
+                        newRow = this->model()->rowCount()-1;
+                    }
+                    // select row
+                    this->selectRow(newRow);
+                }
+                // no row selected
+                return;
+                }
+            case Qt::Key_Return:
+            case Qt::Key_Right:
+                emit signalEdit();
+                break;
+#ifndef __APPLE__
+            case Qt::Key_Delete:
+                emit signalForget();
+                break;
+#endif
+            case Qt::Key_Left:
+                signalFromOutlinesMapToOutlines();
+                break;
+            }
+        }
+#ifndef __APPLE__
+    }
+#endif
+
+    QWidget::keyPressEvent(event);
+}
+
+void OutlinesMapView::mouseDoubleClickEvent(QMouseEvent* event)
+{
+    Q_UNUSED(event);
+
+    // double click to N opens it
+    emit signalEdit();
+}
+
+void OutlinesMapView::resizeEvent(QResizeEvent* event)
+{
+    MF_DEBUG("OutlinesMapView::resizeEvent " << event << std::endl);
+
+    if(horizontalHeader()->length() > 0) {
+        // ensure that 1st column gets the remaining space from others
+        horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
+    }
+    verticalHeader()->setDefaultSectionSize(fontMetrics().height()*1.5);
+
+    int normalizedWidth = width()/fontMetrics().averageCharWidth();
+    if(normalizedWidth < SIMPLIFIED_VIEW_THRESHOLD_WIDTH) {
+        this->setColumnHidden(1, true);
+        this->setColumnHidden(2, true);
+        this->setColumnHidden(3, true);
+    } else {
+        if(this->isColumnHidden(1)) {
+            this->setColumnHidden(1, false);
+            this->setColumnHidden(2, false);
+            this->setColumnHidden(3, false);
+        }
+        // progress
+        this->setColumnWidth(1, this->fontMetrics().averageCharWidth()*6);
+        // rd/wr
+        this->setColumnWidth(2, this->fontMetrics().averageCharWidth()*5);
+        this->setColumnWidth(3, this->fontMetrics().averageCharWidth()*5);
+    }
+
+    // pretty
+    this->setColumnWidth(4, this->fontMetrics().averageCharWidth()*12);
+
+    QTableView::resizeEvent(event);
+}
+
+} // m8r namespace
diff --git a/app/src/qt/outlines_map_view.h b/app/src/qt/outlines_map_view.h
new file mode 100644
index 00000000..257bea8e
--- /dev/null
+++ b/app/src/qt/outlines_map_view.h
@@ -0,0 +1,114 @@
+/*
+ outlines_map_view.cpp     MindForger thinking notebook
+
+ Copyright (C) 2016-2023 Martin Dvorak 
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#ifndef M8RUI_OUTLINES_MAP_VIEW_H
+#define M8RUI_OUTLINES_MAP_VIEW_H
+
+#include "../../lib/src/gear/lang_utils.h"
+#include "../lib/src/debug.h"
+
+#include 
+
+#include "qt_commons.h"
+
+namespace m8r {
+
+class OutlinesMapView;
+
+class OutlinesMapViewItemDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+
+public:
+    OutlinesMapViewItemDelegate(QObject* outlinesMapView)
+        : QStyledItemDelegate(outlinesMapView)
+    {
+        installEventFilter(this);
+    }
+
+    /**
+     * If you want to FILTER the event out, i.e. STOP it being
+     * handled further, then return TRUE; otherwise return FALSE.
+     *
+     * Event filter must be installed in constructor.
+     */
+    bool eventFilter(QObject* obj, QEvent* event) override
+    {
+        if(event->type() == QEvent::KeyPress) {
+            return true;
+        } else {
+            return QStyledItemDelegate::eventFilter(obj, event);
+        }
+    }
+
+    QWidget *createEditor(
+        QWidget *parent,
+        const QStyleOptionViewItem& option,
+        const QModelIndex& index) const override
+    {
+        QWidget *result = QStyledItemDelegate::createEditor(parent, option, index);
+        result->installEventFilter(new OutlinesMapViewItemDelegate(parent));
+        return result;
+    }
+};
+
+class OutlinesMapView : public QTableView
+{
+    Q_OBJECT
+
+private:
+    // if view is width < threshold columns, then shows simplified view w/o Mind-related columns
+    static constexpr int SIMPLIFIED_VIEW_THRESHOLD_WIDTH = 75;
+
+public:
+    explicit OutlinesMapView(QWidget* parent);
+    OutlinesMapView(const OutlinesMapView&) = delete;
+    OutlinesMapView(const OutlinesMapView&&) = delete;
+    OutlinesMapView &operator=(const OutlinesMapView&) = delete;
+    OutlinesMapView &operator=(const OutlinesMapView&&) = delete;
+
+    virtual void keyPressEvent(QKeyEvent* event) override;
+    virtual void mouseDoubleClickEvent(QMouseEvent* event) override;
+    virtual void resizeEvent(QResizeEvent* event) override;
+    void refreshNotes(const QModelIndex& from, const QModelIndex& to) {
+        dataChanged(from, to);
+    }
+
+signals:
+    void signalOutlineShow();
+
+    void signalFromOutlinesMapToOutlines();
+
+    void signalSelectNextRow();
+    void signalSelectPreviousRow();
+
+    void signalChangeUp();
+    void signalChangeDown();
+    void signalChangePromote();
+    void signalChangeDemote();
+    void signalChangeFirst();
+    void signalChangeLast();
+
+    void signalOutlineOrNoteEdit(); // O or N edit
+    void signalOutlineOrNoteExternalEdit(); // O or N edit
+    void signalEdit(); // N edit
+    void signalForget();
+};
+
+}
+#endif // M8RUI_OUTLINES_MAP_VIEW_H
diff --git a/build/Makefile b/build/Makefile
index 60972fb0..49f87caf 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -35,7 +35,11 @@ DISTRO := "bionic"
 help:
 	@echo "MindForger Swiss knife help:"
 	@echo "clean             clean build artifacts"
-	@echo "build             build MindForger application binary"
+	@echo "build             production build MindForger application binary"
+	@echo "build-dev         development build of MindForger application binary"
+	@echo "build-ci          CI build MindForger application binary"
+	@echo "run               run production MindForger"
+	@echo "run-dev           run development MindForger"
 	@echo "l10n              update and release localization strings: MF_LANG=en"
 	@echo "gen-lib-class     generate lib C++ class skeleton: CLASS_NAME=My_Class"
 	@echo "gen-ui-class      generate UI C++ class skeleton: CLASS_NAME=My_Class"
@@ -83,13 +87,33 @@ gen-ui-class:
 	./make/gen-cpp-ui-class.py $(CLASS_NAME)
 
 
-.PHONY: build
-build: clean
-	cd .. && qmake -r mindforger.pro && make -j 7
+#
+# build
+#
+
+
+../app/mindforger:
+	@echo "Building PRODUCTION MindForger executable..."
+	cd .. && qmake -r mindforger.pro && make -j 7 ; cd ..
+	@echo "If build succeeded, then MindForger executable can be found in:\n  app/mindforger"
+	ls -al ../app/mindforger
+
+
+build: ../app/mindforger
+	ls -al ../app/mindforger
+
+
+.PHONY: build-dev
+build-dev:
+	@echo "Building DEV MindForger executable..."
+	cd .. && qmake -r mindforger.pro DEFINES+=DO_MF_DEBUG && make -j 7 ; cd ..
 	@echo "If build succeeded, then MindForger executable can be found in:\n  app/mindforger"
 	ls -al ../app/mindforger
 
 
+# TODO: build-dev-clang
+
+
 build-ci: clean
 	@echo "MindForger CI build..."
 	cd .. && qmake CONFIG+=mfci -r mindforger.pro && make -j 7
@@ -97,7 +121,39 @@ build-ci: clean
 	ls -al ../app/mindforger
 
 
-# TODO build-cmark-gfm
+#
+# build
+#
+
+
+run: ../app/mindforger
+	cd ../app && pwd && ./mindforger
+
+
+run-dev: build-dev
+	cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer
+
+
+#
+# install
+#
+
+
+install: clean ../app/mindforger
+	cp -vf ../app/mindforger ~/bin
+	mv -vf ~/bin/mindforger ~/bin/mind
+	~/bin/mind --version
+
+
+install-dev-local: clean build-dev
+	cp -vf ../app/mindforger ~/bin
+	mv -vf ~/bin/mindforger ~/bin/mind
+	~/bin/mind --version
+
+
+#
+# tools
+#
 
 
 .PHONY: l10n
@@ -206,10 +262,4 @@ doc-to-wiki:
 api-reference:
 	cd doxygen && doxygen ./mindforger.cfg
 
-
-dev-install-local: build-ci ../app/mindforger
-	cp -vf ../app/mindforger ~/bin
-	mv -vf ~/bin/mindforger ~/bin/mind
-	~/bin/mind --version
-
 # eof
diff --git a/build/make/test-lib-units.sh b/build/make/test-lib-units.sh
index 0fb2d24e..c769deda 100755
--- a/build/make/test-lib-units.sh
+++ b/build/make/test-lib-units.sh
@@ -33,90 +33,93 @@ export OPTION_RECOMPILE=yes # recompile before running test(s) (comment this lin
 #export OPTION_TEST="MarkdownParserBenchmark.ParserMeta"
 
 # tests
-#export OPTION_TEST="AutolinkingCmarkTestCase.Monster"
+
+#export OPTION_TEST="AiNlpTestCase.*"
+#export OPTION_TEST="AiNlpTestCase.AaRepositoryBow"
+#export OPTION_TEST="AiNlpTestCase.AaUniverseBow"
+#export OPTION_TEST="AiNlpTestCase.Lexicon"
+#export OPTION_TEST="AiNlpTestCase.Outline"
+#export OPTION_TEST="AiNlpTestCase.Stemmer"
+#export OPTION_TEST="AiNlpTestCase.Tokenizer"
 #export OPTION_TEST="AutolinkingCmarkTestCase.*"
-#export OPTION_TEST="AutolinkingCmarkTestCase.CmarkAstRowWalker"
 #export OPTION_TEST="AutolinkingCmarkTestCase.CmarkAstBlockTransformer"
-#export OPTION_TEST="AutolinkingCmarkTestCase.NanoRepo"
+#export OPTION_TEST="AutolinkingCmarkTestCase.CmarkAstRowWalker"
 #export OPTION_TEST="AutolinkingCmarkTestCase.MicroRepo"
+#export OPTION_TEST="AutolinkingCmarkTestCase.Monster"
+#export OPTION_TEST="AutolinkingCmarkTestCase.NanoRepo"
 #export OPTION_TEST="AutolinkingTestCase.*"
 #export OPTION_TEST="AutolinkingTestCase.CrashAndBurn"
-#export OPTION_TEST="FtsTestCase.*"
-#export OPTION_TEST="TrieTestCase.*"
-#export OPTION_TEST="TrieTestCase.AddAndRemove"
-#export OPTION_TEST="FileGearTestCase.FilesystemPath"
+#export OPTION_TEST="ConfigurationTestCase.*"
+#export OPTION_TEST="ConfigurationTestCase.FromConstructor"
+#export OPTION_TEST="ConfigurationTestCase.FromEnvironment"
+#export OPTION_TEST="ConfigurationTestCase.Save*"
+#export OPTION_TEST="ConfigurationTestCase.SaveAndLoad"
+#export OPTION_TEST="ConfigurationTestCase.SaveDefaultConfig"
+#export OPTION_TEST="DateTimeGearTestCase.*"
+#export OPTION_TEST="DateTimeGearTestCase.Immutability"
 #export OPTION_TEST="FileGearTestCase.DeepCopy"
-#export OPTION_TEST="FileGearTestCase.DeepProductionCopy"
 #export OPTION_TEST="FileGearTestCase.DeepCopyToExisting"
-#export OPTION_TEST="AiNlpTestCase.*"
-#export OPTION_TEST="AiNlpTestCase.AaUniverseBow"
-#export OPTION_TEST="AiNlpTestCase.AaRepositoryBow"
-#export OPTION_TEST="AiNlpTestCase.Outline"
-#export OPTION_TEST="AiNlpTestCase.Lexicon"
-#export OPTION_TEST="AiNlpTestCase.Tokenizer"
-#export OPTION_TEST="AiNlpTestCase.Stemmer"
+#export OPTION_TEST="FileGearTestCase.DeepProductionCopy"
+#export OPTION_TEST="FileGearTestCase.FilesystemPath"
+#export OPTION_TEST="FilesystemInformationTestCase.IndexPdfs"
+#export OPTION_TEST="FtsTestCase.*"
 #export OPTION_TEST="HtmlTestCase.*"
+#export OPTION_TEST="HtmlTestCase.NoteLinks"
 #export OPTION_TEST="HtmlTestCase.Outline"
 #export OPTION_TEST="HtmlTestCase.TaskList"
-#export OPTION_TEST="HtmlTestCase.NoteLinks"
+#export OPTION_TEST="MarkdownParserBugsTestCase.*"
+#export OPTION_TEST="MarkdownParserTestCase.*"
 #export OPTION_TEST="MarkdownParserTestCase.*"
+#export OPTION_TEST="MarkdownParserTestCase.Bug37Notrailing"
 #export OPTION_TEST="MarkdownParserTestCase.Bug622Loop64kLinesOverflow"
-#export OPTION_TEST="MarkdownParserTestCase.Links"
-#export OPTION_TEST="MarkdownParserTestCase.TimeScope"
 #export OPTION_TEST="MarkdownParserTestCase.Deadline"
+#export OPTION_TEST="MarkdownParserTestCase.Links"
+export OPTION_TEST="MarkdownParserTestCase.LinksWithParenthesis"
+#export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerLinks"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerSections"
-#export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerSectionsPreamble"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerSectionsNoMetadata"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerSectionsPostDeclaredHeaders"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerSectionsPostDeclaredHeaders2"
+#export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerSectionsPreamble"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerTimeScope"
-#export OPTION_TEST="MarkdownParserTestCase.MarkdownLexerLinks"
-#export OPTION_TEST="MarkdownParserTestCase.*"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownParserSections"
-#export OPTION_TEST="MarkdownParserTestCase.MarkdownParserSectionsPreamble"
+#export OPTION_TEST="MarkdownParserTestCase.MarkdownParserSections"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownParserSectionsEmptyFirstLine"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownParserSectionsNoMetadata"
-#export OPTION_TEST="MarkdownParserTestCase.MarkdownParserSections"
-#export OPTION_TEST="MarkdownParserTestCase.MarkdownRepresentationPostDeclaredSection"
-#export OPTION_TEST="MarkdownParserTestCase.MarkdownRepresentationTrailingHashesSection"
+#export OPTION_TEST="MarkdownParserTestCase.MarkdownParserSectionsPreamble"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownRepresentationEmptyFirstLine"
+#export OPTION_TEST="MarkdownParserTestCase.MarkdownRepresentationPostDeclaredSection"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownRepresentationPreamble"
 #export OPTION_TEST="MarkdownParserTestCase.MarkdownRepresentationSectionTrailingHashes"
-#export OPTION_TEST="RepositoryIndexerTestCase.*"
-export OPTION_TEST="RepositoryIndexerTestCase.RepositoryTypeDetection"
-#export OPTION_TEST="RepositoryIndexerTestCase.MarkdownRepository"
-#export OPTION_TEST="RepositoryIndexerTestCase.MindForgerRepository"
-#export OPTION_TEST="RepositoryIndexerTestCase.MindForgerFile"
-#export OPTION_TEST="RepositoryIndexerTestCase.MarkdownFile"
-#export OPTION_TEST="RepositoryIndexerTestCase.MakePathRelative"
+#export OPTION_TEST="MarkdownParserTestCase.MarkdownRepresentationTrailingHashesSection"
+#export OPTION_TEST="MarkdownParserTestCase.TimeScope"
+#export OPTION_TEST="MindTestCase.CommonWordsBlacklist"
+#export OPTION_TEST="MindTestCase.LearnAmnesiaLearn"
+#export OPTION_TEST="MindTestCase.LearnAndRememberMindForgerRepository"
 #export OPTION_TEST="NoteTestCase.*"
-#export OPTION_TEST="NoteTestCase.MangleNoteName"
 #export OPTION_TEST="NoteTestCase.DeepUpDownFirstLastClone"
+#export OPTION_TEST="NoteTestCase.DirectNoteChildren"
+#export OPTION_TEST="NoteTestCase.MangleNoteName"
 #export OPTION_TEST="NoteTestCase.PromoteDemoteUpDownNote"
 #export OPTION_TEST="NoteTestCase.RefactorNote"
-#export OPTION_TEST="NoteTestCase.DirectNoteChildren"
-#export OPTION_TEST="MindTestCase.LearnAndRememberMindForgerRepository"
-#export OPTION_TEST="MindTestCase.LearnAmnesiaLearn"
-#export OPTION_TEST="MindTestCase.CommonWordsBlacklist"
-#export OPTION_TEST="DateTimeGearTestCase.*"
-#export OPTION_TEST="DateTimeGearTestCase.Immutability"
-#export OPTION_TEST="ConfigurationTestCase.*"
-#export OPTION_TEST="ConfigurationTestCase.SaveDefaultConfig"
-#export OPTION_TEST="ConfigurationTestCase.FromConstructor"
-#export OPTION_TEST="ConfigurationTestCase.FromEnvironment"
-#export OPTION_TEST="ConfigurationTestCase.Save*"
-#export OPTION_TEST="MarkdownParserTestCase.Bug37Notrailing"
-#export OPTION_TEST="MarkdownParserBugsTestCase.*"
-#export OPTION_TEST="OutlineTestCase.CloneOutline"
-#export OPTION_TEST="OutlineTestCase.DirectOutlineNoteChildren"
-#export OPTION_TEST="StringGearTestCase.Split"
-#export OPTION_TEST="FilesystemInformationTestCase.IndexPdfs"
 #export OPTION_TEST="OrganizerTestCase.*"
-#export OPTION_TEST="OrganizerTestCase.SerializeAndSplitTags"
-#export OPTION_TEST="OrganizerTestCase.NoMindForgerRepositoryNoOrganizer"
 #export OPTION_TEST="OrganizerTestCase.DefaultOrganizerParseSaveAndLoad"
+#export OPTION_TEST="OrganizerTestCase.NoMindForgerRepositoryNoOrganizer"
 #export OPTION_TEST="OrganizerTestCase.ParseSaveAndLoad"
-#export OPTION_TEST="ConfigurationTestCase.SaveAndLoad"
+#export OPTION_TEST="OrganizerTestCase.SerializeAndSplitTags"
+#export OPTION_TEST="OutlineTestCase.CloneOutline"
+#export OPTION_TEST="OutlineTestCase.DirectOutlineNoteChildren"
+#export OPTION_TEST="RepositoryIndexerTestCase.*"
+#export OPTION_TEST="RepositoryIndexerTestCase.MakePathRelative"
+#export OPTION_TEST="RepositoryIndexerTestCase.MarkdownFile"
+#export OPTION_TEST="RepositoryIndexerTestCase.MarkdownRepository"
+#export OPTION_TEST="RepositoryIndexerTestCase.MindForgerFile"
+#export OPTION_TEST="RepositoryIndexerTestCase.MindForgerRepository"
+#export OPTION_TEST="RepositoryIndexerTestCase.RepositoryTypeDetection"
+#export OPTION_TEST="StringGearTestCase.Split"
+#export OPTION_TEST="StringGearTestCase.StringToNcName"
+#export OPTION_TEST="TrieTestCase.*"
+#export OPTION_TEST="TrieTestCase.AddAndRemove"
 
 # environment - to be specified in .bashrc or elsewhere:
 #   export M8R_CPU_CORES=7
diff --git a/lib/lib.pro b/lib/lib.pro
index 01c39494..8f6a6da0 100644
--- a/lib/lib.pro
+++ b/lib/lib.pro
@@ -41,7 +41,7 @@ win32 {
  DEPENDPATH += $$PWD/../deps/zlib-win/include
 }
 
-# NER library
+# DEPRECATED: Mitie (NER library)
 mfner {
     DEFINES += MF_NER
     INCLUDEPATH += $$PWD/../deps/mitie/mitielib/include
@@ -68,6 +68,8 @@ win32{
       # debug info
       QMAKE_CXXFLAGS += -g
     }
+
+    # -O3 ... can be specified by this variable (overrides -O1 -O2)
     QMAKE_CXXFLAGS += -pedantic -std=c++11
 }
 
@@ -159,6 +161,7 @@ SOURCES += \
     src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp
 }
 
+# DEPRECATED: Mitie (NER library)
 mfner {
     SOURCES += \
     src/mind/ai/nlp/named_entity_recognition.cpp \
@@ -298,6 +301,7 @@ HEADERS += \
     src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h
 }
 
+# DEPRECATED: Mitie (NER library)
 mfner {
     HEADERS += \
     src/mind/ai/nlp/named_entity_recognition.h \
diff --git a/lib/src/config/configuration.cpp b/lib/src/config/configuration.cpp
index b341a268..35123e5b 100644
--- a/lib/src/config/configuration.cpp
+++ b/lib/src/config/configuration.cpp
@@ -270,7 +270,11 @@ void Configuration::setActiveRepository(
             memoryPath.clear();
             memoryPath += activeRepository->getDir();
 
-            // TODO limbo class
+            mindPath.clear();
+            mindPath += activeRepository->getDir();
+
+            outlinesMapPath.clear();
+
             limboPath.clear();
             limboPath += activeRepository->getDir();
 
@@ -281,7 +285,13 @@ void Configuration::setActiveRepository(
                 memoryPath+=FILE_PATH_SEPARATOR;
                 memoryPath+=DIRNAME_MEMORY;
 
-                // TODO limbo class
+                mindPath+=FILE_PATH_SEPARATOR;
+                mindPath+=DIRNAME_MIND;
+
+                outlinesMapPath+=mindPath;
+                outlinesMapPath+=FILE_PATH_SEPARATOR;
+                outlinesMapPath+=FILENAME_OUTLINES_MAP;
+
                 limboPath+=FILE_PATH_SEPARATOR;
                 limboPath+=DIRNAME_LIMBO;
 
diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h
index 35bbdd58..6500fad3 100644
--- a/lib/src/config/configuration.h
+++ b/lib/src/config/configuration.h
@@ -50,6 +50,7 @@ constexpr const auto DIRNAME_M8R_REPOSITORY = "mindforger-repository";
 constexpr const auto FILE_PATH_M8R_REPOSITORY = "~/mindforger-repository";
 
 constexpr const auto FILENAME_M8R_CONFIGURATION = ".mindforger.md";
+constexpr const auto FILENAME_OUTLINES_MAP = "outlines-map.md";
 constexpr const auto DIRNAME_MEMORY = "memory";
 constexpr const auto DIRNAME_MIND = "mind";
 constexpr const auto DIRNAME_LIMBO = "limbo";
@@ -255,6 +256,8 @@ class Configuration {
 
     // active repository memory, limbo, ... paths (efficiency)
     std::string memoryPath;
+    std::string mindPath;
+    std::string outlinesMapPath;
     std::string limboPath;
 
     // repository configuration (when in repository mode)
@@ -346,6 +349,8 @@ class Configuration {
     }
 
     const std::string& getMemoryPath() const { return memoryPath; }
+    const std::string& getMindPath() const { return mindPath; }
+    const std::string& getOutlinesMapPath() const { return outlinesMapPath; }
     const std::string& getLimboPath() const { return limboPath; }
     const char* getRepositoryPathFromEnv();
     /**
diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h
index 45f78376..7dc23469 100644
--- a/lib/src/mind/ai/llm/wingman.h
+++ b/lib/src/mind/ai/llm/wingman.h
@@ -79,8 +79,30 @@ class Wingman
     void fix_source(std::string source);
     void fix_bug(std::string bug);
     void create_plan(std::string plan);
-    
+};
+
 
+/**
+ * llama.cpp wingman implementation.
+ *
+ * LLM models to use:
+ *
+ * - llama 7B
+ *   - llama-2-7b.Q4_0.gguf
+ * - Zephir 7B
+ *   - ...
+ * - Mistral 7B
+ *   - ...
+ *
+ * Plan:
+ *
+ * TODO: first implement unit tests for the wingman UCs as it is in the lib/
+ * TODO: then integrate wingman to UI
+ *   - if GPT not available in RUNTIME, then hide/disable menu items
+ */
+class WingmanLlamaCpp: Wingman
+{
+public:
 };
 
 }
diff --git a/lib/src/mind/memory.cpp b/lib/src/mind/memory.cpp
index 4d156dfc..f95c313f 100644
--- a/lib/src/mind/memory.cpp
+++ b/lib/src/mind/memory.cpp
@@ -210,6 +210,11 @@ bool Memory::learnOutlineTWiki(const string& twikiFileName, const string& outlin
     return twikiRepresentation.outline(File{twikiFileName}, File{outlineFileName});
 }
 
+Outline* Memory::learnOutlinesMap(const string& filePath)
+{
+    return mdRepresentation.outline(File{filePath});
+}
+
 Note* Memory::createNote(Stencil* stencil)
 {
     if(stencil && ResourceType::NOTE==stencil->getType()) {
diff --git a/lib/src/mind/memory.h b/lib/src/mind/memory.h
index 5a570948..2239ea52 100644
--- a/lib/src/mind/memory.h
+++ b/lib/src/mind/memory.h
@@ -117,6 +117,11 @@ class Memory
      */
     Outline* createOutline(Stencil* stencil);
 
+    /**
+     * @brief Learn Outlines map (tree).
+     */
+    Outline* learnOutlinesMap(const std::string& fileNamePath);
+
     /**
      * @brief Convert TWiki file to MD file (O not instantiated).
      */
diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp
index 4d4b166a..d5f077e9 100644
--- a/lib/src/mind/mind.cpp
+++ b/lib/src/mind/mind.cpp
@@ -45,6 +45,7 @@ Mind::Mind(Configuration &configuration)
 #else
       autolinking{nullptr},
 #endif
+      outlinesMap{},
       exclusiveMind{},
       timeScopeAspect{},
       tagsScopeAspect{ontology},
@@ -78,6 +79,10 @@ Mind::~Mind()
     delete autolinking;
     delete stats;
 
+    if(this->outlinesMap) {
+        delete this->outlinesMap;
+    }
+
     // - Memory destruct outlines
     // - allNotesCache Notes is just container referencing Memory's Outlines
 }
@@ -357,6 +362,15 @@ void Mind::getOutlineNames(vector& names) const
     }
 }
 
+void Mind::getOutlineKeys(vector& keys) const
+{
+    // IMPROVE PERF cache vector (stack member) until and evict on memory modification
+    vector outlines = memory.getOutlines();
+    for(Outline* outline:outlines) {
+        keys.push_back(outline->getKey());
+    }
+}
+
 // One match in either title or body is enought to be added to the result
 void Mind::findNoteFts(
         vector* result,
@@ -950,16 +964,203 @@ bool Mind::outlineForget(string outlineKey)
     return false;
 }
 
+string Mind::outlineMapKey2Relative(const string& outlineKey) const
+{
+    string relativeKey{
+        outlineKey.substr(config.getMemoryPath().size() +1)
+    };
+    MF_DEBUG("  " << relativeKey << endl);
+
+    return relativeKey;
+}
+
+string Mind::outlineMapKey2Absolute(const string& outlineKey) const
+{
+    string resolvedKey{
+        config.getMemoryPath() 
+        + FILE_PATH_SEPARATOR 
+        + outlineKey
+    };
+    MF_DEBUG("  " << resolvedKey << endl);
+
+    return resolvedKey;
+}
+
+Outline* Mind::outlinesMapNew(string outlineKey)
+{
+    MF_DEBUG("Creating Os map:" << endl);
+    Outline* newOutlinesMap = new Outline{
+        memory.getOntology().getDefaultOutlineType()};
+
+    for(Outline* o:getOutlines()) {
+        Note* n = o->getOutlineDescriptorAsNote();
+        newOutlinesMap->addNote(n);
+
+        // relative key will be valid even if repository is moved to a different path
+        Link* link = new Link{
+            LINK_NAME_ASSOCIATED_OUTLINE, 
+            this->outlineMapKey2Relative(o->getKey())
+        };
+        n->addLink(link);
+    }
+
+    newOutlinesMap->setName("Notebooks Map");
+    newOutlinesMap->setKey(outlineKey);
+    newOutlinesMap->sortNotesByRead();
+
+    newOutlinesMap->completeProperties(datetimeNow());
+
+    return newOutlinesMap;
+}
+
+/**
+ * Synchronize Outlines map parameter with mind's Outlines.
+ */
+void Mind::outlinesMapSynchronize(Outline* outlinesMap)
+{
+    vector osToRemove{};
+
+    // ensure that map contains only valid Os
+    //   - remove from map: map O NOT in runtime O
+    //   - add at the top of map: runtime Os NOT in mapOs
+    MF_DEBUG("Map O links validity check:");
+    vector mapOsKeys{};
+    for(Note* n:outlinesMap->getNotes()) {
+        if(n->getLinks().size() > 0 
+            && n->getLinks().at(0)->getUrl().size() > 0
+        ) {
+            string oKey{n->getLinks().at(0)->getUrl()};
+            if(findOutlineByKey(oKey)) {
+                // valid O in MF & map
+                MF_DEBUG(
+                    "  VALID  : " << n->getName() << endl <<
+                    "           " << oKey << endl
+                );
+                mapOsKeys.push_back(oKey);
+            } else {
+                MF_DEBUG("  INVALID (no O for link): " << n->getName() << endl);
+                osToRemove.push_back(n);
+            }
+        } else {
+            MF_DEBUG("  INVALID (missing link): " << n->getName() << endl);
+            osToRemove.push_back(n);
+        }
+    }
+    MF_DEBUG("DONE O links validity check" << endl);
+
+    if(osToRemove.size()) {
+        MF_DEBUG("Removing Ns with INVALID O key:" << endl);    
+        for(auto oToRemove:osToRemove) {
+            MF_DEBUG("  " << oToRemove->getName() << endl);
+            delete oToRemove;
+            outlinesMap->removeNote(oToRemove);
+        }
+        osToRemove.clear();
+    }
+
+    // find mind keys which are NOT in map > prepend them to map
+    vector osToAdd{};
+    MF_DEBUG("Finding mind keys to be ADDED to map:" << endl);
+    for(auto mindO: getOutlines()) {
+        if(find(mapOsKeys.begin(), mapOsKeys.end(), mindO->getKey()) == mapOsKeys.end()) {
+            MF_DEBUG("  " << mindO->getKey() << endl);
+            osToAdd.push_back(mindO);
+        }
+    }
+    MF_DEBUG("ADDING mind keys to map:" << endl);
+    for(auto o:osToAdd) {
+        MF_DEBUG("  " << o->getKey() << endl);
+        // clone O's descriptor to get N which might be deleted later
+        Note* n = new Note(*o->getOutlineDescriptorAsNote());
+        outlinesMap->addNote(n , 0);
+    }
+}
+
+Outline* Mind::outlinesMapLearn(string outlineKey)
+{
+    MF_DEBUG("Learning Os map from " << outlineKey << endl);
+    Outline* outlinesMap = memory.learnOutlinesMap(outlineKey);
+
+    vector osToRemove{};
+
+    // normalization: set Ns types to O + resolve O links to absolute
+    MF_DEBUG("Setting map's Ns type O" << endl);
+    for(auto n:outlinesMap->getNotes()) {
+        MF_DEBUG(
+            "  Setting " << n->getName() 
+            << " with " << n->getLinks().size() << " link(s)"
+            << " to O" << endl
+        );
+        n->setType(&Outline::NOTE_4_OUTLINE_TYPE);
+
+        if(n->getLinks().size() > 0 
+            && n->getLinks().at(0)->getUrl().size() > 0
+        ) {
+            // IMPROVE find link w/ name LINK_NAME_ASSOCIATED_OUTLINE (in case there would be >1 link)
+            string relativeLink{
+                this->outlineMapKey2Absolute(n->getLinks().at(0)->getUrl())
+            };
+
+            // N key is generated based on O key > keep link in "Outline" link
+            n->clearLinks();
+            n->addLink(new Link(LINK_NAME_ASSOCIATED_OUTLINE, relativeLink));
+        } else {
+            MF_DEBUG("  SKIPPING N w/o link: " << n->getName() << endl);
+            osToRemove.push_back(n);
+        }
+    }
+
+    if(osToRemove.size()) {
+        MF_DEBUG("Removing Ns with MISSING relative O key:" << endl);    
+        for(auto oToRemove:osToRemove) {
+            MF_DEBUG("  " << oToRemove->getName() << endl);
+            delete oToRemove;
+            outlinesMap->removeNote(oToRemove);
+        }
+        osToRemove.clear();
+    }
+
+    // synchronize map's Os with mind's Os
+    outlinesMapSynchronize(outlinesMap);
+
+    return outlinesMap;
+}
+
+Outline* Mind::outlinesMapGet()
+{
+    if(this->outlinesMap) {
+        // ensure consistency between mind's and map's Os
+        outlinesMapSynchronize(this->outlinesMap);
+
+        return this->outlinesMap;
+    }
+
+    string outlinesMapPath{config.getOutlinesMapPath()};
+
+    if(isFile(outlinesMapPath.c_str())) {
+        // load existing Os map
+        this->outlinesMap = outlinesMapLearn(outlinesMapPath);
+    } else {
+        // create new Os map
+        this->outlinesMap = outlinesMapNew(outlinesMapPath);
+
+        remind().getPersistence().save(this->outlinesMap);
+    }
+
+    return this->outlinesMap;
+}
+
+
 Note* Mind::noteNew(
-        const std::string& outlineKey,
-        const uint16_t offset,
-        // IMPROVE pass name by reference
-        const std::string* name,
-        const NoteType* noteType,
-        u_int16_t depth,
-        const std::vector* tags,
-        const int8_t progress,
-        Stencil* noteStencil)
+    const std::string& outlineKey,
+    const uint16_t offset,
+    // IMPROVE pass name by reference
+    const std::string* name,
+    const NoteType* noteType,
+    u_int16_t depth,
+    const std::vector* tags,
+    const int8_t progress,
+    Stencil* noteStencil)
 {
     Outline* o = memory.getOutline(outlineKey);
     if(o) {
@@ -1192,4 +1393,18 @@ unique_ptr> Mind::findOutlineByNameFts(const string& pattern) c
     return result;
 }
 
+bool Mind::findOutlineByKey(const string& key) const
+{
+    if(key.size()) {
+        vector outlines = memory.getOutlines();
+        for(Outline* outline:outlines) {
+            if(key.compare(outline->getKey()) == 0) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
 } /* namespace */
diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h
index 77cee573..d7974356 100644
--- a/lib/src/mind/mind.h
+++ b/lib/src/mind/mind.h
@@ -23,6 +23,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "memory.h"
 #include "knowledge_graph.h"
@@ -44,6 +45,8 @@ class KnowledgeGraph;
 class AutolinkingMind;
 
 constexpr auto NO_PARENT = 0xFFFF;
+// const in constexpr ensures const value
+constexpr const auto LINK_NAME_ASSOCIATED_OUTLINE = "TargetOutline";
 
 enum class FtsSearch {
     EXACT,
@@ -153,6 +156,19 @@ class Mind : public OntologyProvider
     AutolinkingMind* autolinking;
     MindStatistics* stats;
 
+    /**
+     * Outline map is an Outline used to organize Outlines into the tree.
+     * Notes in the Outline map:
+     * 
+     * - has exactly one link which points to the Outline they represent
+     * - Outline link is *relative* on the filesystem and absolute (resolved) in runtime
+     */
+    Outline* outlinesMap;
+
+    std::string outlineMapKey2Relative(const std::string& outlineKey) const;
+    std::string outlineMapKey2Absolute(const std::string& outlineKey) const;
+    void outlinesMapSynchronize(Outline* outlinesMap);
+
     /**
      * Atomic mind state changes and asynchronous computations synchronization
      * through Mind components and processes.
@@ -367,6 +383,7 @@ class Mind : public OntologyProvider
      */
     std::unique_ptr> findOutlineByNameFts(const std::string& pattern) const;
     //std::vector* findNoteByNameFts(const std::string& pattern) const;
+    bool findOutlineByKey(const std::string& key) const;
     std::vector* findNoteFts(
             const std::string& pattern,
             const FtsSearch mode = FtsSearch::EXACT,
@@ -374,7 +391,8 @@ class Mind : public OntologyProvider
     // TODO findFts() - search also outline name and description
     //   >> temporary note of Outline type (never saved), cannot be created by user
     void getOutlineNames(std::vector& names) const;
-
+    void getOutlineKeys(std::vector& keys) const;
+    
     /*
      * SCOPING
      */
@@ -541,6 +559,23 @@ class Mind : public OntologyProvider
      */
     bool outlineForget(std::string outlineKey);
 
+    /*
+     * OUTLINE MAP (TREE)
+     */
+
+    /**
+     * @brief Create new O map (tree).
+     */
+    Outline* outlinesMapNew(std::string outlineKey);
+    /**
+     * @brief Load Os map (tree).
+     */
+    Outline* outlinesMapLearn(std::string outlineKey);
+    /**
+     * @brief Load or create Os map (tree).
+     */
+    Outline* outlinesMapGet();
+
     /*
      * NOTE MGMT
      */
diff --git a/lib/src/model/note.h b/lib/src/model/note.h
index dbcda3a4..31710a48 100644
--- a/lib/src/model/note.h
+++ b/lib/src/model/note.h
@@ -160,6 +160,10 @@ class Note : public ThingInTime
 
     void addLink(Link* link);
     const std::vector& getLinks() const { return links; }
+    void clearLinks() { 
+        for(auto l:links) { delete l; }
+        links.clear(); 
+    }
     size_t getLinksCount() const { return links.size(); }
 
     void promote();
diff --git a/lib/src/model/outline.cpp b/lib/src/model/outline.cpp
index acf291a6..9853a026 100644
--- a/lib/src/model/outline.cpp
+++ b/lib/src/model/outline.cpp
@@ -393,6 +393,11 @@ void Outline::setNotes(const vector& notes)
     this->notes = notes;
 }
 
+void Outline::sortNotesByRead()
+{
+    Outline::sortByRead(this->notes);
+}
+
 int8_t Outline::getProgress() const
 {
     return progress;
@@ -504,7 +509,7 @@ Note* Outline::cloneNote(const Note* clonedNote, const bool deep)
 {
     int offset = getNoteOffset(clonedNote);
     if(offset != -1) {
-        Note* newNote;
+        Note* newNote{};
 
         vector children{};
         getAllNoteChildren(clonedNote, &children);
diff --git a/lib/src/model/outline.h b/lib/src/model/outline.h
index 78cb7c5f..b3051f5d 100644
--- a/lib/src/model/outline.h
+++ b/lib/src/model/outline.h
@@ -259,6 +259,7 @@ class Outline : public ThingInTime
     const std::vector& getNotes() const;
     size_t getNotesCount() const;
     void setNotes(const std::vector& notes);
+    void sortNotesByRead();
     void addNote(Note*);    
     /**
      * @brief Clone Note including its children.
diff --git a/lib/test/src/gear/string_utils_test.cpp b/lib/test/src/gear/string_utils_test.cpp
index 58828743..757a4366 100644
--- a/lib/test/src/gear/string_utils_test.cpp
+++ b/lib/test/src/gear/string_utils_test.cpp
@@ -27,15 +27,29 @@ using namespace m8r;
 
 TEST(StringGearTestCase, StringToNcName)
 {
+    // GIVEN
     string s("123 text 456");
+    // WHEN
     string r = normalizeToNcName(s, '-');
+    // THEN
     cout << s << " => " << r << endl;
     ASSERT_EQ("123-text-456", r);
 
+    // GIVEN
     s.assign("čeština už je tu!");
+    // WHEN
     r = normalizeToNcName(s, '-');
+    // THEN
     cout << s << " => " << r << endl;
     ASSERT_EQ("---e--tina-u---je-tu-", r);
+
+    // GIVEN
+    s.assign("Compensation Letter 05012021 - Doe, John (Clifton, Tony).pdf");
+    // WHEN
+    r = normalizeToNcName(s, '-');
+    // THEN
+    cout << s << " => " << r << endl;
+    ASSERT_EQ("Compensation-Letter-05012021---Doe--John--Clifton--Tony--pdf", r);
 }
 
 TEST(StringGearTestCase, Split)
diff --git a/lib/test/src/markdown/markdown_test.cpp b/lib/test/src/markdown/markdown_test.cpp
index 7285f4dc..7e890a95 100644
--- a/lib/test/src/markdown/markdown_test.cpp
+++ b/lib/test/src/markdown/markdown_test.cpp
@@ -952,6 +952,63 @@ TEST(MarkdownParserTestCase, Links)
     delete o;
 }
 
+// Repro for BUG: https://github.com/dvorka/mindforger/issues/1518
+TEST(MarkdownParserTestCase, DISABLED_LinksWithParenthesis)
+{
+    string repositoryPath{"/tmp"};
+    string fileName{"md-parser-links-parenthesis.md"};
+    string content;
+    string filePath{repositoryPath+"/"+fileName};
+
+    content.assign(
+                "# Outline Name \n"
+                "O text.\n"
+                "\n"
+//                "## First Section \n"
+//                "N1 text.\n"
+                "\n"
+                "## Second Section\n"
+                "N2 text.\n"
+                "\n");
+    m8r::stringToFile(filePath, content);
+
+    m8r::Repository* repository = m8r::RepositoryIndexer::getRepositoryForPath(repositoryPath);
+    repository->setMode(m8r::Repository::RepositoryMode::FILE);
+    repository->setFile(fileName);
+    m8r::MarkdownRepositoryConfigurationRepresentation repositoryConfigRepresentation{};
+    m8r::Configuration& config = m8r::Configuration::getInstance();
+    config.clear();
+    config.setConfigFilePath("/tmp/cfg-mptc-l.md");
+    config.setActiveRepository(config.addRepository(repository), repositoryConfigRepresentation);
+    m8r::Ontology ontology{};
+
+    // parse
+    m8r::MarkdownOutlineRepresentation mdr{ontology, nullptr};
+    m8r::filesystem::File file{filePath};
+    m8r::Outline* o = mdr.outline(file);
+
+    // asserts
+    EXPECT_NE(nullptr, o);
+    EXPECT_EQ(2, o->getNotesCount());
+
+    cout << endl << "O links: " << o->getLinksCount();
+    EXPECT_EQ(1, o->getLinksCount());
+
+    cout << endl << "N links: " << o->getNotes()[0]->getLinksCount();
+    EXPECT_EQ(2, o->getNotes()[0]->getLinksCount());
+
+    // serialize
+    string* serialized = mdr.to(o);
+    cout << endl << "- SERIALIZED ---";
+    cout << endl << *serialized;
+    EXPECT_NE(std::string::npos, serialized->find("[root link](./Compensation Letter 05012021 - Doe, John (Clifton, Tony).pdf)"));
+    EXPECT_NE(std::string::npos, serialized->find("[first link](./Compensation Letter 05012021 - Doe, John (Clifton, Tony).pdf)"));
+    EXPECT_NE(std::string::npos, serialized->find("[second link](./Compensation Letter 05012021 - Doe, John (Clifton, Tony).pdf)"));
+
+    delete serialized;
+    delete o;
+}
+
 TEST(MarkdownParserTestCase, Bug622Loop64kLinesOverflow)
 {
     string fileName{"/lib/test/resources/bugs-repository/memory/bug-622-70k-lines.md"};
diff --git a/licenses/llama-cpp-license.txt b/licenses/llama-cpp-license.txt
new file mode 100644
index 00000000..76f67efd
--- /dev/null
+++ b/licenses/llama-cpp-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Georgi Gerganov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/mindforger.pro b/mindforger.pro
index 5d636eb3..43c18934 100644
--- a/mindforger.pro
+++ b/mindforger.pro
@@ -17,6 +17,10 @@
 
 #########################################################################
 #
+# QMake example:
+#
+#   qmake -project project.pro CONFIG+=mysetting1 CONFIG+=mysetting2
+#
 # QMake build options:
 #
 #   qmake CONFIG+=mfwebengine       ... build project w/ Qt WebEngine instead of Qt WebKit
@@ -27,6 +31,7 @@
 #   qmake CONFIG+=mfdebug           ... show debug messages + include WIP code
 #   qmake CONFIG+=mfci              ... CI build (AppVeyor, ...) w/ build info @ window title
 #   qmake CONFIG+=mfunits           ... option to run unit tests
+#   qmake CONFIG+=mfllamacpp        ... EXPERIMENTAL option to enable wingman @ llama.cpp
 #   qmake CONFIG+=mfner             ... DEPRECATED: build project w/ NER and link dlib/MITIE
 #
 # Warning: DEPRECATED build options will be removed in the next major release.

From 7a65251d589d7d6ff1e0da3ef6eb9dd6ad23ce78 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Mon, 25 Dec 2023 10:16:19 +0100
Subject: [PATCH 053/131] Finishing initial Os map implementation w/ outliner
 operations, menu enable/disable rerite, reliable key/path persitence which
 resolves #1200

---
 .../qt/translations/mindforger_cs.ts          | 395 ++++++++---------
 .../qt/translations/mindforger_en.qm          | Bin 2645 -> 2655 bytes
 .../qt/translations/mindforger_en.ts          | 399 +++++++++---------
 .../qt/translations/mindforger_nerd_cs.ts     | 395 ++++++++---------
 .../qt/translations/mindforger_nerd_en.ts     | 395 ++++++++---------
 .../qt/translations/mindforger_zh_cn.ts       | 395 ++++++++---------
 app/src/qt/cli_n_breadcrumbs_view.cpp         |   2 +-
 app/src/qt/dialogs/configuration_dialog.cpp   |   1 +
 app/src/qt/main_menu_presenter.cpp            |  56 ++-
 app/src/qt/main_menu_presenter.h              |   1 +
 app/src/qt/main_menu_view.cpp                 | 198 ++++++---
 app/src/qt/main_menu_view.h                   |  23 +-
 app/src/qt/main_window_presenter.cpp          | 206 +++++++--
 app/src/qt/main_window_presenter.h            |   1 +
 app/src/qt/orloj_presenter.cpp                |  51 ++-
 app/src/qt/orloj_presenter.h                  |   1 +
 app/src/qt/orloj_view.h                       |   1 +
 app/src/qt/outlines_map_presenter.cpp         |  10 +-
 app/src/qt/outlines_map_presenter.h           |  49 ++-
 app/src/qt/outlines_map_view.cpp              |   6 +-
 app/src/qt/outlines_map_view.h                |   2 +-
 build/Makefile                                |   7 +-
 lib/src/config/configuration.h                |   1 +
 lib/src/mind/ai/llm/wingman.h                 |  13 +-
 lib/src/mind/mind.cpp                         |  90 ++--
 lib/src/mind/mind.h                           |  12 +-
 lib/src/model/note.cpp                        |  17 +
 lib/src/model/note.h                          |   3 +-
 lib/test/src/markdown/markdown_test.cpp       |  19 +-
 29 files changed, 1584 insertions(+), 1165 deletions(-)

diff --git a/app/resources/qt/translations/mindforger_cs.ts b/app/resources/qt/translations/mindforger_cs.ts
index 681feb9d..aef925c8 100644
--- a/app/resources/qt/translations/mindforger_cs.ts
+++ b/app/resources/qt/translations/mindforger_cs.ts
@@ -4,53 +4,53 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
@@ -60,15 +60,15 @@
         
     
     
-        
-        
+        
+        
         
         Empty Phrase
         
     
     
-        
-        
+        
+        
         Phrase to search/explain/process is empty.
         
     
@@ -2654,44 +2654,44 @@ Choose new library source:
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Learn
         
     
@@ -2707,54 +2707,54 @@ Choose new library source:
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
@@ -2764,565 +2764,565 @@ Choose new library source:
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
         Library already indexed - use 'Update library' action to synchronize documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
         Library synchronization
         
     
     
-        
+        
         There are no libraries - nothing to synchronize.
         
     
     
-        
+        
         Library deletion
         
     
     
-        
+        
         There are no libraries - nothing to delete.
         
     
     
-        
+        
         Delete Library
         
     
     
-        
+        
         Do you really want to delete Notebooks which represent the library documents?
         
     
     
-        
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
         Home Notebook not set - use menu 'Notebooks/Make Home'
         
     
     
-        
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         View Limbo
         
     
     
-        
+        
         Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3944,71 +3944,74 @@ Choose new library source:
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
+        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
diff --git a/app/resources/qt/translations/mindforger_en.qm b/app/resources/qt/translations/mindforger_en.qm
index 7683aa325b696d2e0f8ee066fc4eec40f29911ec..7536dc9bab3f434ca59b9b2e1e16f242c8d4319b 100644
GIT binary patch
delta 260
zcmcaAa$jVEPQ4!E*8JT_Y5AO{>$7w4kJw@D+Tg9AvAjfkBzMpP`?K+n>tWDoMk$%scS0G0U5kD37dch#qiFb2C~qG_Z^Q7
z&_GGPSsuQ^G=T

delta 259
zcmcaFa#du4PQ41_*+(o5SqP=$HvwPsNaK^O&us6!_v!Z>Y564Kpd}4!X}_WLA>*)fh;uQeaB-1
zG*FT+c``rHfMa|a(T{=RANk4;WCI;`gzxZ6R-grO{N4`13=AxG{PQJ%@~kH^85lTy
pn1NP^P4;7!->k-1!pO2pvI6hc`cJ3vm1lj=6g(y>;QmgKzjfH

diff --git a/app/resources/qt/translations/mindforger_en.ts b/app/resources/qt/translations/mindforger_en.ts
index 1acd7889..3ec6ee79 100644
--- a/app/resources/qt/translations/mindforger_en.ts
+++ b/app/resources/qt/translations/mindforger_en.ts
@@ -4,53 +4,53 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
@@ -60,15 +60,15 @@
         
     
     
-        
-        
+        
+        
         
         Empty Phrase
         
     
     
-        
-        
+        
+        
         Phrase to search/explain/process is empty.
         
     
@@ -1019,7 +1019,7 @@ Choose new library source:
     
         
         &Mind
-        Fi&le
+        &Workspace
     
     
         
@@ -1220,7 +1220,7 @@ Choose new library source:
     
         
         &Recall
-        F&ind
+        &Find
     
     
         
@@ -2682,34 +2682,34 @@ Choose new library source:
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
@@ -2718,12 +2718,12 @@ Choose new library source:
         Open Directory or MindForger Repository
     
     
-        
+        
         Learn Markdown File
         Open Markdown File
     
     
-        
+        
         Learn
         Open
     
@@ -2739,54 +2739,54 @@ Choose new library source:
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
@@ -2796,565 +2796,565 @@ Choose new library source:
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         Deprecate Notebook
     
     
-        
+        
         Library already indexed - use 'Update library' action to synchronize documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
         Library synchronization
         
     
     
-        
+        
         There are no libraries - nothing to synchronize.
         
     
     
-        
+        
         Library deletion
         
     
     
-        
+        
         There are no libraries - nothing to delete.
         
     
     
-        
+        
         Delete Library
         
     
     
-        
+        
         Do you really want to delete Notebooks which represent the library documents?
         
     
     
-        
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
         Home Notebook not set - use menu 'Notebooks/Make Home'
         
     
     
-        
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         Please select a Note to forget.
         Please select a Note to delete.
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         View Limbo
         
     
     
-        
+        
         Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3976,71 +3976,74 @@ Choose new library source:
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
+        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_cs.ts b/app/resources/qt/translations/mindforger_nerd_cs.ts
index 52e18d32..c3846f16 100644
--- a/app/resources/qt/translations/mindforger_nerd_cs.ts
+++ b/app/resources/qt/translations/mindforger_nerd_cs.ts
@@ -4,53 +4,53 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
@@ -60,15 +60,15 @@
         
     
     
-        
-        
+        
+        
         
         Empty Phrase
         
     
     
-        
-        
+        
+        
         Phrase to search/explain/process is empty.
         
     
@@ -2666,66 +2666,66 @@ Choose new library source:
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
+        
         Learn
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
@@ -2735,195 +2735,195 @@ Choose new library source:
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Home Notebook not set - use menu 'Notebooks/Make Home'
         
     
     
-        
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
+        
         Library already indexed - use 'Update library' action to synchronize documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
         Library synchronization
         
     
     
-        
+        
         There are no libraries - nothing to synchronize.
         
     
     
-        
+        
         Library deletion
         
     
     
-        
+        
         There are no libraries - nothing to delete.
         
     
     
-        
+        
         Delete Library
         
     
     
-        
+        
         Do you really want to delete Notebooks which represent the library documents?
         
     
     
-        
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
@@ -2939,402 +2939,402 @@ Choose new library source:
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         View Limbo
         
     
     
-        
+        
         Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3956,71 +3956,74 @@ Choose new library source:
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
+        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
diff --git a/app/resources/qt/translations/mindforger_nerd_en.ts b/app/resources/qt/translations/mindforger_nerd_en.ts
index 7567abc6..b39a40c4 100644
--- a/app/resources/qt/translations/mindforger_nerd_en.ts
+++ b/app/resources/qt/translations/mindforger_nerd_en.ts
@@ -4,53 +4,53 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
@@ -60,15 +60,15 @@
         
     
     
-        
-        
+        
+        
         
         Empty Phrase
         
     
     
-        
-        
+        
+        
         Phrase to search/explain/process is empty.
         
     
@@ -2650,66 +2650,66 @@ Choose new library source:
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
     
-        
+        
         Learn
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
@@ -2719,195 +2719,195 @@ Choose new library source:
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Learn Markdown File
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Home Notebook not set - use menu 'Notebooks/Make Home'
         
     
     
-        
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
+        
         Library already indexed - use 'Update library' action to synchronize documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
         Library synchronization
         
     
     
-        
+        
         There are no libraries - nothing to synchronize.
         
     
     
-        
+        
         Library deletion
         
     
     
-        
+        
         There are no libraries - nothing to delete.
         
     
     
-        
+        
         Delete Library
         
     
     
-        
+        
         Do you really want to delete Notebooks which represent the library documents?
         
     
     
-        
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
@@ -2923,402 +2923,402 @@ Choose new library source:
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
-        
+        
+        
         Forget Notebook
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         
     
     
-        
+        
         Please select a Note to forget.
         
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         View Limbo
         
     
     
-        
+        
         Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3940,71 +3940,74 @@ Choose new library source:
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
+        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
diff --git a/app/resources/qt/translations/mindforger_zh_cn.ts b/app/resources/qt/translations/mindforger_zh_cn.ts
index 144f4af0..0f4de728 100644
--- a/app/resources/qt/translations/mindforger_zh_cn.ts
+++ b/app/resources/qt/translations/mindforger_zh_cn.ts
@@ -4,53 +4,53 @@
 
     QObject
     
-        
+        
         Save Note
         
     
     
-        
+        
         Do you want to save changes?
         
     
     
-        
+        
         Discard changes
         
     
     
-        
+        
         &Discard changes
         
     
     
-        
-        
+        
+        
         Autosave
         
     
     
-        
+        
         Do not ask & autosave
         
     
     
-        
+        
         Continue editing
         
     
     
-        
+        
         Continue &editing
         
     
     
-        
+        
         Save
         
     
     
-        
+        
         &Save
         
     
@@ -60,15 +60,15 @@
         
     
     
-        
-        
+        
+        
         
         Empty Phrase
         
     
     
-        
-        
+        
+        
         Phrase to search/explain/process is empty.
         
     
@@ -2682,34 +2682,34 @@ Choose new library source:
 
     m8r::MainWindowPresenter
     
-        
+        
         Cannot think - either Mind already dreaming or repository too big
         
     
     
-        
+        
         Hyperlink %1 clicked...
         
     
     
-        
+        
         Link target not found for relative link %1
         
     
     
-        
+        
         New Markdown File Error
         
     
     
-        
-        
-        
+        
+        
+        
         Specified file path already exists!
         
     
     
-        
+        
         Cannot start sleeping - please wait until dreaming finishes and then try again
         
     
@@ -2718,12 +2718,12 @@ Choose new library source:
         Open Directory or MindForger Repository
     
     
-        
+        
         Learn Markdown File
         Open Markdown File
     
     
-        
+        
         Learn
         Open
     
@@ -2739,54 +2739,54 @@ Choose new library source:
         
     
     
-        
+        
         Autolinked Notebooks and Notes
         
     
     
-        
+        
         Notebook Full-text Search
         
     
     
-        
+        
         Note Full-text Search
         
     
     
-        
+        
         Full-text Search
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Notebook 
         
     
     
-        
-        
+        
+        
         Notebook not found
         
     
     
-        
+        
         Find Note by Tags in Notebook
         
     
     
-        
-        
+        
+        
         Find Note by Tags
         
     
     
-        
-        
-        
+        
+        
+        
         Note 
         
     
@@ -2796,565 +2796,565 @@ Choose new library source:
         
     
     
-        
+        
         Thing not found
         
     
     
-        
-        
+        
+        
         Note not found
         
     
     
-        
+        
         Refactored Note to Notebook '
         
     
     
-        
+        
         Target Notebook not found
         
     
     
-        
+        
         Refactor Note
         
     
     
-        
+        
         Note to be refactored not specified!
         
     
     
-        
+        
         Find Note by Name in Notebook
         
     
     
-        
+        
         Find Note by Name
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Initializing NER and predicting...
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         NER
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Memory NER not implemented yet.
         
     
     
-        
+        
         Recognizing named entities...
         
     
     
-        
+        
         Initializing NER and recognizing named entities...
         
     
     
-        
+        
          Initializing (the first run only) NER and predicting... 
         
     
     
-        
-        
+        
+        
         Named-entity Recognition
         
     
     
-        
+        
         NER predicition finished
         
     
     
-        
+        
         No named entities recognized.
         
     
     
-        
+        
         image
         
     
     
-        
+        
         Given path '%1' doesn't exist - target will not be copied, but link will be created
         
     
     
-        
+        
         Saving pasted image data to file: '%1'
         
     
     
-        
+        
         HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu
         
     
     
-        
+        
         Edit Notebook
         
     
     
-        
+        
         Please open an Notebook to edit.
         
     
     
-        
-        
+        
+        
         New Note
         
     
     
-        
+        
         Failed to create new Note!
         
     
     
-        
-        
+        
+        
         Clone Notebook
         
     
     
-        
+        
         Failed to clone Notebook!
         
     
     
-        
+        
         Please open and Notebook to be cloned.
         
     
     
-        
+        
         Home tag toggled/removed - Notebook '%1' is no longer home
         
     
     
-        
+        
         Notebook '%1' successfully marked as home
         
     
     
-        
+        
         Make Notebook home
         
     
     
-        
+        
         Notebook can be marked as home only when viewed.
         
     
     
-        
-        
+        
+        
         Forget Notebook
         Deprecate Notebook
     
     
-        
+        
         Library already indexed - use 'Update library' action to synchronize documents.
         
     
     
-        
+        
         Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode.
         
     
     
-        
+        
         Library synchronization
         
     
     
-        
+        
         There are no libraries - nothing to synchronize.
         
     
     
-        
+        
         Library deletion
         
     
     
-        
+        
         There are no libraries - nothing to delete.
         
     
     
-        
+        
         Delete Library
         
     
     
-        
+        
         Do you really want to delete Notebooks which represent the library documents?
         
     
     
-        
+        
         Do you really want to forget '
         
     
     
-        
+        
         ' Notebook?
         
     
     
-        
+        
         Cannot think - either Mind already dreaming or workspace too big
         
     
     
-        
-        
+        
+        
         New Workspace Error
         
     
     
-        
+        
         Specified workspace path already exists!
         
     
     
-        
+        
         Failed to create empty workspace!
         
     
     
-        
+        
         ERROR: workspace created, but attempt to copy documentation and/or stencils failed
         
     
     
-        
+        
         Learn Directory or MindForger Workspace
         
     
     
-        
+        
         This is neither valid MindForger/Markdown workspace nor file.
         
     
     
-        
+        
         Home Notebook not set - use menu 'Notebooks/Make Home'
         
     
     
-        
+        
         File copied to workspace path '%1'
         
     
     
-        
+        
         🔒 Notebook Write Error
         
     
     
-        
+        
         Notebook file is read-only and cannot be written:
 '%1' 
         
     
     
-        
+        
         Do you really want to deprecate '
         
     
     
-        
+        
         Notebook can be forgotten only when viewed.
         
     
     
-        
-        
-        
+        
+        
+        
         Export Error
         
     
     
-        
+        
         Unable to find Notebook to export!
         
     
     
-        
+        
         Import TWiki File
         
     
     
-        
+        
         Open and view a Notebook to create new Note.
         
     
     
-        
+        
         Edit Note
         
     
     
-        
-        
+        
+        
         Please select a Note to edit in the Notebook.
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor Error
         
     
     
-        
+        
         External editor command is not configured in preferences (Editor tab).
         
     
     
-        
-        
+        
+        
         Edit Note with External Editor
         
     
     
-        
+        
         Running command: '%1'
         
     
     
-        
+        
         Running command: '%1'. Close external editor to return control back to MindForger.
         
     
     
-        
+        
         Delete Note
         
     
     
-        
+        
         Do you really want to delete note '
         
     
     
-        
+        
         ' along with its child notes?
         
     
     
-        
+        
         Forget Note
         Delete Note
     
     
-        
+        
         Please select a Note to forget.
         Please select a Note to delete.
     
     
-        
-        
-        
+        
+        
+        
         Extract Note
         
     
     
-        
+        
         Please select a text to extract.
         
     
     
-        
+        
         Failed to extract new Note!
         
     
     
-        
+        
         Please select a Note, edit it and select a text to extract.
         
     
     
-        
-        
-        
+        
+        
+        
         Clone Note
         
     
     
-        
+        
         Do you want to clone Note '
         
     
     
-        
+        
         ' including its child notes?'?
         
     
     
-        
+        
         Failed to clone Note!
         
     
     
-        
+        
         Please select a Note to be cloned.
         
     
     
-        
+        
         Moved Note '%1' to be the first child
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Move Note
         
     
     
-        
-        
-        
-        
+        
+        
+        
+        
         Please select a Note to be moved.
         
     
     
-        
+        
         Moved up Note '%1'
         
     
     
-        
+        
         Moved down Note '%1'
         
     
     
-        
+        
         Moved Note '%1' to be the last child
         
     
     
-        
+        
         Promoted Note '%1'
         
     
     
-        
+        
         Promote Note
         
     
     
-        
+        
         Please select a Note to be promoted.
         
     
     
-        
+        
         Demoted Note '%1'
         
     
     
-        
+        
         Demote Note
         
     
     
-        
+        
         Please select a Note to be demoted.
         
     
     
-        
-        
-        
+        
+        
+        
         Add Library Error
         
     
     
-        
+        
         Library directory doesn't exist!
         
     
     
-        
+        
         Organizer Update Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer.
         
     
     
-        
+        
         Organizer Clone Error
         
     
     
-        
+        
         Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer.
         
     
     
-        
+        
         Forget Organizer
         
     
     
-        
+        
         ' Organizer?
         
     
     
-        
+        
         Delete Organizer
         
     
     
-        
+        
         Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can.
         
     
     
-        
+        
         View Limbo
         
     
     
-        
+        
         Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened.
         
     
     
-        
+        
         About MindForger
         
     
@@ -3976,71 +3976,74 @@ Choose new library source:
 
     m8r::OrlojPresenter
     
-        
+        
         Eisenhower Matrix: 
         
     
     
-        
+        
         Kanban: 
         
     
     
-        
+        
         Organizer: '
         
     
     
-        
+        
         Selected Organizer not found!
         
     
     
-        
+        
         No Organizer selected!
         
     
     
-        
+        
+        
+        
         Selected Notebook not found!
         
     
     
-        
-        
+        
+        
+        
         No Notebook selected!
         
     
     
-        
+        
         Selected Tag not found!
         
     
     
-        
-        
+        
+        
         No Tag selected!
         
     
     
-        
+        
         Note '%1'   %2
         
     
     
-        
-        
+        
+        
         Note 
         
     
     
-        
+        
         Selected Notebook/Note not found!
         
     
     
-        
-        
+        
+        
         No Note selected!
         
     
diff --git a/app/src/qt/cli_n_breadcrumbs_view.cpp b/app/src/qt/cli_n_breadcrumbs_view.cpp
index 43b3b7df..087a5c7e 100644
--- a/app/src/qt/cli_n_breadcrumbs_view.cpp
+++ b/app/src/qt/cli_n_breadcrumbs_view.cpp
@@ -131,7 +131,7 @@ CliAndBreadcrumbsView::CliAndBreadcrumbsView(QWidget* parent, bool zenMode)
     cliCompleter->setCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive);
     cliCompleter->setCompletionMode(QCompleter::PopupCompletion);
     cli->setCompleter(cliCompleter);
-    cli->setText("Use \"? ...\" to chat (Alt-x), \"> ...\" for commands (Ctrl-/), or type a phrase to search.");
+    cli->setText("Enter a prompt - \"? .\" for help, \"/ .\" to chat (Alt-x), \"> .\" run command (Ctrl-/), or type a phrase to find.");
     layout->addWidget(cli);
 
     showBreadcrumb();
diff --git a/app/src/qt/dialogs/configuration_dialog.cpp b/app/src/qt/dialogs/configuration_dialog.cpp
index 3b8a1b6a..be1e4602 100644
--- a/app/src/qt/dialogs/configuration_dialog.cpp
+++ b/app/src/qt/dialogs/configuration_dialog.cpp
@@ -123,6 +123,7 @@ ConfigurationDialog::AppTab::AppTab(QWidget *parent)
     startupCombo->addItem(QString{START_TO_DASHBOARD});
 #endif
     startupCombo->addItem(QString{START_TO_OUTLINES});
+    startupCombo->addItem(QString{START_TO_OUTLINES_TREE});
     startupCombo->addItem(QString{START_TO_TAGS});
     startupCombo->addItem(QString{START_TO_RECENT});
 #ifdef MF_BUG
diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp
index 292fdafd..800d579c 100644
--- a/app/src/qt/main_menu_presenter.cpp
+++ b/app/src/qt/main_menu_presenter.cpp
@@ -170,6 +170,24 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp)
     QObject::connect(
         view->actionOutlineClone, SIGNAL(triggered()),
         mwp, SLOT(doActionOutlineClone()));
+    QObject::connect(
+        view->actionOutlinePromote, SIGNAL(triggered()),
+        mwp, SLOT(doActionNotePromote()));
+    QObject::connect(
+        view->actionOutlineDemote, SIGNAL(triggered()),
+        mwp, SLOT(doActionNoteDemote()));
+    QObject::connect(
+        view->actionOutlineFirst, SIGNAL(triggered()),
+        mwp, SLOT(doActionNoteFirst()));
+    QObject::connect(
+        view->actionOutlineUp, SIGNAL(triggered()),
+        mwp, SLOT(doActionNoteUp()));
+    QObject::connect(
+        view->actionOutlineDown, SIGNAL(triggered()),
+        mwp, SLOT(doActionNoteDown()));
+    QObject::connect(
+        view->actionOutlineLast, SIGNAL(triggered()),
+        mwp, SLOT(doActionNoteLast()));
     QObject::connect(
         view->actionOutlineHtmlExport, SIGNAL(triggered()),
         mwp, SLOT(doActionOutlineHtmlExport()));
@@ -325,17 +343,26 @@ MainMenuPresenter::~MainMenuPresenter()
 
 void MainMenuPresenter::showFacetDashboard()
 {
-    view->showFacetOutlineList(config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY);
+    view->showFacetOutlineList(
+        config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY,
+        config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
+    );
 }
 
 void MainMenuPresenter::showFacetOrganizerList()
 {
-    view->showFacetOrganizerList(config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY);
+    view->showFacetOrganizerList(
+        config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY,
+        config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
+    );
 }
 
 void MainMenuPresenter::showFacetOrganizer()
 {
-    view->showFacetOrganizerView(config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY);
+    view->showFacetOrganizerView(
+        config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY,
+        config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
+    );
 }
 
 void MainMenuPresenter::showFacetNavigator()
@@ -343,19 +370,36 @@ void MainMenuPresenter::showFacetNavigator()
     view->showFacetNavigator();
 }
 
+void MainMenuPresenter::showFacetOutlinesMap()
+{
+    view->showFacetOutlinesMap(
+        config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY,
+        config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
+    );
+}
+
 void MainMenuPresenter::showFacetOutlineList()
 {
-    view->showFacetOutlineList(config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY);
+    view->showFacetOutlineList(
+        config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY,
+        config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
+    );
 }
 
 void MainMenuPresenter::showFacetOutlineView()
 {
-    view->showFacetOutlineView(config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY);
+    view->showFacetOutlineView(
+        config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY,
+        config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
+    );
 }
 
 void MainMenuPresenter::showFacetNoteEdit()
 {
-    view->showFacetNoteEdit(config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY);
+    view->showFacetNoteEdit(
+        config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY,
+        config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
+    );
 }
 
 void MainMenuPresenter::showFacetMindThink()
diff --git a/app/src/qt/main_menu_presenter.h b/app/src/qt/main_menu_presenter.h
index 8a96c74d..7702b779 100644
--- a/app/src/qt/main_menu_presenter.h
+++ b/app/src/qt/main_menu_presenter.h
@@ -60,6 +60,7 @@ class MainMenuPresenter : public QObject
     void showFacetOrganizer();
     void showFacetNavigator();
 
+    void showFacetOutlinesMap();
     void showFacetOutlineList();
     void showFacetOutlineView();
     void showFacetNoteEdit();
diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp
index 078a3ccc..cc0f7327 100644
--- a/app/src/qt/main_menu_view.cpp
+++ b/app/src/qt/main_menu_view.cpp
@@ -220,7 +220,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuFind->addAction(actionFindOutlineByName);
     menuFind->addAction(actionFindNoteByName);
     menuFind->addAction(actionFindOutlineByTag);
-    menuFind->addAction(actionFindNoteByTag);    
+    menuFind->addAction(actionFindNoteByTag);
 #ifdef MF_WIP
     menuFind->addAction(actionFindDocByName);
 #endif
@@ -253,15 +253,15 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionViewOutlines->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_O));
     actionViewOutlines->setStatusTip(tr("Show list of Notebooks..."));
 
-#ifdef MF_WIP
     actionViewOutlinesMap = new QAction(QIcon(":/menu-icons/dashboard.svg"), tr("Note&books Tree"), mainWindow);
     actionViewOutlinesMap->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_T));
     actionViewOutlinesMap->setStatusTip(tr("Show tree of Notebooks..."));
-#endif
 
+#ifdef MF_WIP
     actionViewLibraryDocs = new QAction(QIcon(":/menu-icons/copy.svg"), tr("&Library Documents"), mainWindow);
     actionViewLibraryDocs->setStatusTip(tr("List Library documents..."));
     //actionViewLibraryDocs->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_));
+#endif
 
     actionViewTags = new QAction(QIcon(":/menu-icons/tag.svg"), tr("&Tags"), mainWindow);
     actionViewTags->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_G));
@@ -335,9 +335,9 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuView->addAction(actionViewDecks);
 #endif
     menuView->addAction(actionViewOrganizers);
+    menuView->addAction(actionViewOutlinesMap);
     menuView->addAction(actionViewOutlines);
 #ifdef MF_WIP
-    menuView->addAction(actionViewOutlinesMap);
     menuView->addAction(actionViewLibraryDocs);
 #endif
     menuView->addAction(actionViewTags);
@@ -537,7 +537,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionOutlineStencil->setStatusTip(tr("Copy the current Notebook as to Stencil"));
     actionOutlineStencil->setEnabled(false);
 
-    actionOutlineClone = new QAction(QIcon(":/menu-icons/copy.svg"), tr("C&lone"), mainWindow);
+    actionOutlineClone = new QAction(QIcon(":/menu-icons/copy.svg"), tr("&Clone"), mainWindow);
     actionOutlineClone->setStatusTip(tr("Make copy of the current Notebook"));
 
     actionOutlineArtExamine= new QAction(QIcon(":/menu-icons/on.svg"), tr("E&xamine"), mainWindow);
@@ -546,6 +546,29 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     actionOutlineForget = new QAction(QIcon(":/menu-icons/delete.svg"), tr("&Forget"), mainWindow);
     actionOutlineForget->setStatusTip(tr("Forget Notebook and move it to Limbo"));
 
+    actionOutlinePromote = new QAction(QIcon(":/menu-icons/left.svg"), tr("&Promote"), mainWindow);
+    actionOutlinePromote->setStatusTip(tr("Promote Notebook"));
+
+    actionOutlineDemote = new QAction(QIcon(":/menu-icons/right.svg"), tr("De&mote"), mainWindow);
+    actionOutlineDemote->setStatusTip(tr("Demote Notebook"));
+
+    actionOutlineFirst = new QAction(
+        QIcon(":/menu-icons/top.svg"), tr("Move to &First"),
+        mainWindow);
+    actionOutlineFirst->setStatusTip(tr("Move the Notebook to be the first child of its parent"));
+
+    actionOutlineUp = new QAction(
+        QIcon(":/menu-icons/up.svg"), tr("Move &Up"), mainWindow);
+    actionOutlineUp->setStatusTip(tr("Move the Notebook up"));
+
+    actionOutlineDown = new QAction(
+        QIcon(":/menu-icons/down.svg"), tr("Move Do&wn"), mainWindow);
+    actionOutlineDown->setStatusTip(tr("Move the Notebook down"));
+
+    actionOutlineLast = new QAction(
+        QIcon(":/menu-icons/bottom.svg"), tr("Move to &Last"), mainWindow);
+    actionOutlineLast->setStatusTip(tr("Move the Notebook to be the last child of its parent"));
+
     submenuOutlineExport = menuOutline->addMenu(QIcon(":/menu-icons/export.svg"), "E&xport");
     actionOutlineHtmlExport = new QAction(tr("&HTML"), mainWindow);
     actionOutlineHtmlExport->setStatusTip(tr("Export Notebook to a file in HTML format"));
@@ -562,11 +585,19 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView)
     menuOutline->addAction(actionOutlineEdit);
     menuOutline->addAction(actionOutlineForget);
     menuOutline->addSeparator();
+    menuOutline->addAction(actionOutlinePromote);
+    menuOutline->addAction(actionOutlineDemote);
+    menuOutline->addSeparator();
+    menuOutline->addAction(actionOutlineFirst);
+    menuOutline->addAction(actionOutlineUp);
+    menuOutline->addAction(actionOutlineDown);
+    menuOutline->addAction(actionOutlineLast);
+    menuOutline->addSeparator();
     menuOutline->addAction(actionOutlineHome);
 #ifdef MF_WIP
     menuOutline->addAction(actionOutlineStencil);
 #endif
-    menuOutline->addAction(actionOutlineClone);   
+    menuOutline->addAction(actionOutlineClone);
     menuOutline->addSeparator();
 #ifdef MF_WIP
     menuOutline->addAction(actionOutlineArtExamine);
@@ -1031,6 +1062,7 @@ void MainMenuView::showAllMenuItems()
 {
     menuMind->setEnabled(true);
     // autolink: leave as is - it's not that simple as it's status, not just action
+    actionMindScope->setEnabled(true);
     actionExit->setEnabled(true);
 
     menuFind->setEnabled(true);
@@ -1039,22 +1071,28 @@ void MainMenuView::showAllMenuItems()
     actionFindOutlineByTag->setEnabled(true);
     actionFindNoteByName->setEnabled(true);
     actionFindNoteByTag->setEnabled(true);
+#ifdef MF_WIP
+    actionFindDocByName->setEnabled(true);
+#endif
 
     menuView->setEnabled(true);
     actionViewDashboard->setEnabled(true);
     actionViewHome->setEnabled(true);
     actionViewOrganizers->setEnabled(true);
+    actionViewOutlinesMap->setEnabled(true);
     actionViewOutlines->setEnabled(true);
     actionViewTags->setEnabled(true);
     actionViewNavigator->setEnabled(true);
+#ifdef MF_WIP
+    actionViewLibraryDocs->setEnabled(true);
+    actionViewDecks->setEnabled(true);
+#endif
     actionViewLimbo->setEnabled(true);
     actionViewRecentNotes->setEnabled(true);
 
-#ifdef MF_WIP
     menuLibrary->setEnabled(true);
     actionLibraryAdd->setEnabled(true);
     actionLibraryDeprecate->setEnabled(true);
-#endif
 
 #ifdef MF_WIP
     menuFlashcards->setEnabled(true);
@@ -1078,6 +1116,20 @@ void MainMenuView::showAllMenuItems()
     actionOutlineForget->setEnabled(true);
 
     menuOutline->setEnabled(true);
+    actionOutlineEdit->setEnabled(true);
+    actionOutlineClone->setEnabled(true);
+    actionOutlineHome->setEnabled(true);
+    actionOutlineForget->setEnabled(true);
+    actionOutlineUp->setEnabled(true);
+    actionOutlineDown->setEnabled(true);
+    actionOutlineFirst->setEnabled(true);
+    actionOutlineLast->setEnabled(true);
+    actionOutlinePromote->setEnabled(true);
+    actionOutlineDemote->setEnabled(true);
+        actionOutlineHome->setEnabled(true);
+#ifdef MF_WIP
+    actionOutlineArtExamine->setEnabled(true);
+#endif
     submenuOutlineExport->setEnabled(true);
 
     menuNote->setEnabled(true);
@@ -1098,7 +1150,56 @@ void MainMenuView::showAllMenuItems()
     mainWindow->getToolBar()->setEnabled(true);
 }
 
-void MainMenuView::showFacetOrganizerList(bool repositoryMode)
+void MainMenuView::showModeAwareFacet(bool repositoryMode, bool mfMode)
+{
+   if(!repositoryMode) {
+        menuView->setEnabled(false);
+        menuLibrary->setEnabled(false);
+        menuOutline->setEnabled(false);
+        menuEdit->setEnabled(false);
+        menuFormat->setEnabled(false);
+
+        actionMindScope->setEnabled(false);
+
+        actionFindOutlineByName->setEnabled(false);
+        actionFindOutlineByTag->setEnabled(false);
+    }
+    if(!mfMode) {
+        menuLibrary->setEnabled(false);
+#ifdef MF_WIP
+        menuFlashcards->setEnabled(false);
+#endif
+
+        actionMindScope->setEnabled(false);
+
+        actionViewHome->setEnabled(false);
+        actionViewOrganizers->setEnabled(false);
+        actionViewOutlinesMap->setEnabled(false);
+#ifdef MF_WIP
+        actionViewLibraryDocs->setEnabled(false);
+#endif
+        actionViewTags->setEnabled(false);
+        actionViewLimbo->setEnabled(false);
+#ifdef MF_WIP
+        actionViewDashboard->setEnabled(false);
+        actionViewDecks->setEnabled(false);
+#endif
+
+        actionFindOutlineByTag->setEnabled(false);
+        actionFindNoteByTag->setEnabled(false);
+#ifdef MF_WIP
+        actionFindDocByName->setEnabled(false);
+#endif
+
+        actionOutlineHome->setEnabled(false);
+#ifdef MF_WIP
+        actionOutlineArtExamine->setEnabled(false);
+#endif
+    }
+}
+
+
+void MainMenuView::showFacetOrganizerList(bool repositoryMode, bool mfMode)
 {
     showAllMenuItems();
 
@@ -1111,25 +1212,17 @@ void MainMenuView::showFacetOrganizerList(bool repositoryMode)
     actionOrganizerMoveNext->setEnabled(false);
 
     menuNavigator->setEnabled(false);
-#ifdef MF_WIP
     menuLibrary->setEnabled(false);
-#endif
     menuOutline->setEnabled(false);
     menuNote->setEnabled(false);
     menuEdit->setEnabled(false);
     menuFormat->setEnabled(false);
     submenuOutlineExport->setEnabled(false);
 
-    if(!repositoryMode) {
-        menuView->setEnabled(false);
-        menuFormat->setEnabled(false);
-
-        actionFindOutlineByName->setEnabled(false);
-        actionFindOutlineByTag->setEnabled(false);
-    }
+    showModeAwareFacet(repositoryMode, mfMode);
 }
 
-void MainMenuView::showFacetOrganizerView(bool repositoryMode)
+void MainMenuView::showFacetOrganizerView(bool repositoryMode, bool mfMode)
 {
     showAllMenuItems();
 
@@ -1143,23 +1236,37 @@ void MainMenuView::showFacetOrganizerView(bool repositoryMode)
     menuFormat->setEnabled(false);
     submenuOutlineExport->setEnabled(false);
 
-    if(!repositoryMode) {
-        menuView->setEnabled(false);
-        menuFormat->setEnabled(false);
-
-        actionFindOutlineByName->setEnabled(false);
-        actionFindOutlineByTag->setEnabled(false);
-    }
+    showModeAwareFacet(repositoryMode, mfMode);
 }
 
-void MainMenuView::showFacetOutlineList(bool repositoryMode)
+void MainMenuView::showFacetOutlineList(bool repositoryMode, bool mfMode)
 {
     showAllMenuItems();
 
+    menuNavigator->setEnabled(false);
+    menuOrganizer->setEnabled(false);
+    menuEdit->setEnabled(false);
+    menuFormat->setEnabled(false);
+    menuNote->setEnabled(false);
+    submenuOutlineExport->setEnabled(false);
+
     actionOutlineEdit->setEnabled(false);
     actionOutlineClone->setEnabled(false);
     actionOutlineHome->setEnabled(false);
     actionOutlineForget->setEnabled(false);
+    actionOutlineUp->setEnabled(false);
+    actionOutlineDown->setEnabled(false);
+    actionOutlineFirst->setEnabled(false);
+    actionOutlineLast->setEnabled(false);
+    actionOutlinePromote->setEnabled(false);
+    actionOutlineDemote->setEnabled(false);
+
+    showModeAwareFacet(repositoryMode, mfMode);
+}
+
+void MainMenuView::showFacetOutlinesMap(bool repositoryMode, bool mfMode)
+{
+    showAllMenuItems();
 
     menuNavigator->setEnabled(false);
     menuOrganizer->setEnabled(false);
@@ -1168,18 +1275,10 @@ void MainMenuView::showFacetOutlineList(bool repositoryMode)
     menuNote->setEnabled(false);
     submenuOutlineExport->setEnabled(false);
 
-    if(!repositoryMode) {
-        menuView->setEnabled(false);
-        menuOutline->setEnabled(false);
-        menuEdit->setEnabled(false);
-        menuFormat->setEnabled(false);
-
-        actionFindOutlineByName->setEnabled(false);
-        actionFindOutlineByTag->setEnabled(false);
-    }
+    showModeAwareFacet(repositoryMode, mfMode);
 }
 
-void MainMenuView::showFacetOutlineView(bool repositoryMode)
+void MainMenuView::showFacetOutlineView(bool repositoryMode, bool mfMode)
 {
     showAllMenuItems();
 
@@ -1191,18 +1290,17 @@ void MainMenuView::showFacetOutlineView(bool repositoryMode)
     menuEdit->setEnabled(false);
     menuFormat->setEnabled(false);
 
-    if(!repositoryMode) {
-        menuView->setEnabled(false);
-        menuOutline->setEnabled(false);
-        menuEdit->setEnabled(false);
-        menuFormat->setEnabled(false);
+    actionOutlineUp->setEnabled(false);
+    actionOutlineDown->setEnabled(false);
+    actionOutlineFirst->setEnabled(false);
+    actionOutlineLast->setEnabled(false);
+    actionOutlinePromote->setEnabled(false);
+    actionOutlineDemote->setEnabled(false);
 
-        actionFindOutlineByName->setEnabled(false);
-        actionFindOutlineByTag->setEnabled(false);
-    }
+    showModeAwareFacet(repositoryMode, mfMode);
 }
 
-void MainMenuView::showFacetNoteEdit(bool repositoryMode)
+void MainMenuView::showFacetNoteEdit(bool repositoryMode, bool mfMode)
 {
     showAllMenuItems();
 
@@ -1259,13 +1357,7 @@ void MainMenuView::showFacetNoteEdit(bool repositoryMode)
 
     mainWindow->getToolBar()->setEnabled(false);
 
-    if(!repositoryMode) {
-        menuView->setEnabled(false);
-        menuOutline->setEnabled(false);
-
-        actionFindOutlineByName->setEnabled(false);
-        actionFindOutlineByTag->setEnabled(false);
-    }
+    showModeAwareFacet(repositoryMode, mfMode);
 }
 
 void MainMenuView::showFacetMindThink()
diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h
index b0db240d..075e926b 100644
--- a/app/src/qt/main_menu_view.h
+++ b/app/src/qt/main_menu_view.h
@@ -111,10 +111,10 @@ class MainMenuView : public QObject
     QAction* actionViewDecks;
     QAction* actionViewOrganizers;
     QAction* actionViewOutlines;
-#ifdef MF_WIP
     QAction* actionViewOutlinesMap;
-#endif
+#ifdef MF_WIP
     QAction* actionViewLibraryDocs;
+#endif
     QAction* actionViewTags;
     QAction* actionViewNavigator;
     QAction* actionViewDwell;
@@ -160,6 +160,12 @@ class MainMenuView : public QObject
     QAction* actionOutlineClone;
     QAction* actionOutlineArtExamine;
     QAction* actionOutlineForget;
+    QAction* actionOutlinePromote;
+    QAction* actionOutlineDemote;
+    QAction* actionOutlineFirst;
+    QAction* actionOutlineUp;
+    QAction* actionOutlineDown;
+    QAction* actionOutlineLast;
     QMenu* submenuOutlineExport;
     QAction* actionOutlineHtmlExport;
     QMenu* submenuOutlineImport;
@@ -269,6 +275,8 @@ class MainMenuView : public QObject
     QAction* actionHelpAboutQt;
     QAction* actionHelpAbout;
 
+    void showModeAwareFacet(bool repositoryMode, bool mfMode);
+
 public:
     MainMenuView(MainWindowView& mainWindow);
     MainMenuView(const MainMenuView&) = delete;
@@ -277,11 +285,12 @@ class MainMenuView : public QObject
     MainMenuView &operator=(const MainMenuView&&) = delete;
     virtual ~MainMenuView();
 
-    void showFacetOrganizerList(bool repositoryMode=true);
-    void showFacetOrganizerView(bool repositoryMode=true);
-    void showFacetOutlineList(bool repositoryMode=true);
-    void showFacetOutlineView(bool repositoryMode=true);
-    void showFacetNoteEdit(bool repositoryMode=true);
+    void showFacetOrganizerList(bool repositoryMode=true, bool mfMode=true);
+    void showFacetOrganizerView(bool repositoryMode=true, bool mfMode=true);
+    void showFacetOutlinesMap(bool repositoryMode=true, bool mfMode=true);
+    void showFacetOutlineList(bool repositoryMode=true, bool mfMode=true);
+    void showFacetOutlineView(bool repositoryMode=true, bool mfMode=true);
+    void showFacetNoteEdit(bool repositoryMode=true, bool mfMode=true);
 
     void showFacetMindThink();
     void showFacetMindSleep();
diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp
index 80bc765d..3a51f8bc 100644
--- a/app/src/qt/main_window_presenter.cpp
+++ b/app/src/qt/main_window_presenter.cpp
@@ -171,7 +171,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
         this, SLOT(doActionEditPasteImageData(QImage))
     );
     // wire LEFT toolbar signals
-    /*     
+    /*
     QObject::connect(
         new QShortcut(QKeySequence("Alt+1"), view.getOrloj()), SIGNAL(activated()),
         this, SLOT(doActionArxivToolbar())
@@ -240,7 +240,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view)
         new QShortcut(QKeySequence("Alt+9"), view.getOrloj()), SIGNAL(activated()),
         this, SLOT(doActionCppToolbar())
     );
-    */    
+    */
     // wire TOP toolbar signals
     QObject::connect(
         view.getToolBar()->actionNewOutlineOrNote, SIGNAL(triggered()),
@@ -355,6 +355,8 @@ void MainWindowPresenter::showInitialView()
                     orloj->showFacetDashboard();
                 } else if(!string{START_TO_OUTLINES}.compare(config.getStartupView())) {
                     orloj->showFacetOutlineList(mind->getOutlines());
+                } else if(!string{START_TO_OUTLINES_TREE}.compare(config.getStartupView())) {
+                    orloj->showFacetOutlinesMap(mind->outlinesMapGet());
                 } else if(!string{START_TO_TAGS}.compare(config.getStartupView())) {
                     orloj->showFacetTagCloud();
                 } else if(!string{START_TO_RECENT}.compare(config.getStartupView())) {
@@ -1010,7 +1012,7 @@ void MainWindowPresenter::doActionFindNoteByTag()
 void MainWindowPresenter::doTriggerFindNoteByTag(const Tag* tag)
 {
     findNoteByTagDialog->setWindowTitle(tr("Find Note by Tags"));
-    findNoteByTagDialog->clearScope();    
+    findNoteByTagDialog->clearScope();
     vector allNotes{};
     mind->getAllNotes(allNotes);
     vector tags{};
@@ -1356,16 +1358,13 @@ void MainWindowPresenter::doActionViewOutlines()
     }
 }
 
-
 void MainWindowPresenter::doActionViewOutlinesMap()
 {
     if(config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER
          &&
        config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY)
     {
-        orloj->showFacetOutlinesMap(
-            mind->outlinesMapGet()
-        );
+        orloj->showFacetOutlinesMap(mind->outlinesMapGet());
     }
 }
 
@@ -2262,7 +2261,7 @@ void MainWindowPresenter::doActionOutlineOrNoteNew()
        orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_NOTE)
          ||
        orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE))
-    {        
+    {
         doActionNoteNew();
     } else {
         doActionOutlineNew();
@@ -2346,7 +2345,7 @@ bool MainWindowPresenter::withWriteableOutline(const std::string& outlineKey)
 }
 
 void MainWindowPresenter::handleNoteNew()
-{    
+{
     int offset
         = orloj->getOutlineView()->getOutlineTree()->getCurrentRow();
     if(offset == OutlineTreePresenter::NO_ROW) {
@@ -2951,20 +2950,63 @@ void MainWindowPresenter::doActionNoteClone()
     }
 }
 
+void MainWindowPresenter::doActionOutlineShow()
+{
+    orloj->showFacetOutline(orloj->getOutlineView()->getCurrentOutline());
+}
+
+void MainWindowPresenter::selectNoteInOutlineTree(Note* note, Outline::Patch& patch, bool onUp)
+{
+    QModelIndex idx;
+    if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+        QModelIndex idx;
+        if(onUp) {
+            idx = orloj->getOutlinesMap()->getModel()->index(patch.start, 0);
+        } else {
+            idx = orloj->getOutlinesMap()->getModel()->index(note->getOutline()->getNoteOffset(note), 0);
+        }
+
+        orloj->getOutlinesMap()->getView()->setCurrentIndex(idx);
+    } else {
+        QModelIndex idx;
+        if(onUp) {
+            idx = orloj->getOutlineView()->getOutlineTree()->getView()->model()->index(patch.start, 0);
+        } else {
+            idx = orloj->getOutlineView()->getOutlineTree()->getView()->model()->index(note->getOutline()->getNoteOffset(note), 0);
+        }
+        orloj->getOutlineView()->getOutlineTree()->getView()->setCurrentIndex(idx);
+    }
+}
+
 void MainWindowPresenter::doActionNoteFirst()
 {
-    Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    Note* note{};
+
+    if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+        note = orloj->getOutlinesMap()->getCurrentNote();
+    } else {
+        note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    }
+
     if(note && withWriteableOutline(note->getOutline()->getKey())) {
         // IMPROVE consider patch once in class (cross functions)
         Outline::Patch patch{Outline::Patch::Diff::NO,0,0}; // explicit initialization required by older GCC versions
         mind->noteFirst(note, &patch);
         if(patch.diff != Outline::Patch::Diff::NO) {
-            mind->remind().remember(note->getOutline());
-            orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                mind->outlinesMapRemember();
+            } else {
+                mind->remind().remember(note->getOutline());
+            }
+
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                orloj->getOutlinesMap()->refresh(note->getOutline(), &patch);
+            } else {
+                orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            }
+
             // select Note in the tree
-            QModelIndex idx
-                = orloj->getOutlineView()->getOutlineTree()->getView()->model()->index(patch.start, 0);
-            orloj->getOutlineView()->getOutlineTree()->getView()->setCurrentIndex(idx);
+            this->selectNoteInOutlineTree(note, patch, true);
             statusBar->showInfo(QString(tr("Moved Note '%1' to be the first child")).arg(note->getName().c_str()));
         }
     } else {
@@ -2974,18 +3016,33 @@ void MainWindowPresenter::doActionNoteFirst()
 
 void MainWindowPresenter::doActionNoteUp()
 {
-    Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    Note* note{};
+
+    if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+        note = orloj->getOutlinesMap()->getCurrentNote();
+    } else {
+        note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    }
+
     if(note && withWriteableOutline(note->getOutline()->getKey())) {
         // IMPROVE consider patch once in class (cross functions)
         Outline::Patch patch{Outline::Patch::Diff::NO,0,0}; // explicit initialization required by older GCC versions
         mind->noteUp(note, &patch);
         if(patch.diff != Outline::Patch::Diff::NO) {
-            mind->remind().remember(note->getOutline());
-            orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                mind->outlinesMapRemember();
+            } else {
+                mind->remind().remember(note->getOutline());
+            }
+
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                orloj->getOutlinesMap()->refresh(note->getOutline(), &patch);
+            } else {
+                orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            }
+
             // select Note in the tree
-            QModelIndex idx
-                = orloj->getOutlineView()->getOutlineTree()->getView()->model()->index(patch.start, 0);
-            orloj->getOutlineView()->getOutlineTree()->getView()->setCurrentIndex(idx);
+            this->selectNoteInOutlineTree(note, patch, true);
             statusBar->showInfo(QString(tr("Moved up Note '%1'")).arg(note->getName().c_str()));
         }
     } else {
@@ -2995,18 +3052,33 @@ void MainWindowPresenter::doActionNoteUp()
 
 void MainWindowPresenter::doActionNoteDown()
 {
-    Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    Note* note{};
+
+    if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+        note = orloj->getOutlinesMap()->getCurrentNote();
+    } else {
+        note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    }
+
     if(note && withWriteableOutline(note->getOutline()->getKey())) {
         // IMPROVE consider patch once in class (cross functions)
         Outline::Patch patch{Outline::Patch::Diff::NO,0,0}; // explicit initialization required by older GCC versions
         mind->noteDown(note, &patch);
         if(patch.diff != Outline::Patch::Diff::NO) {
-            mind->remind().remember(note->getOutline());
-            orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                mind->outlinesMapRemember();
+            } else {
+                mind->remind().remember(note->getOutline());
+            }
+
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                orloj->getOutlinesMap()->refresh(note->getOutline(), &patch);
+            } else {
+                orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            }
+
             // select Note in the tree
-            QModelIndex idx
-                = orloj->getOutlineView()->getOutlineTree()->getView()->model()->index(note->getOutline()->getNoteOffset(note), 0);
-            orloj->getOutlineView()->getOutlineTree()->getView()->setCurrentIndex(idx);
+            this->selectNoteInOutlineTree(note, patch, false);
             statusBar->showInfo(QString(tr("Moved down Note '%1'").arg(note->getName().c_str())));
         }
     } else {
@@ -3016,18 +3088,33 @@ void MainWindowPresenter::doActionNoteDown()
 
 void MainWindowPresenter::doActionNoteLast()
 {
-    Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    Note* note{};
+
+    if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+        note = orloj->getOutlinesMap()->getCurrentNote();
+    } else {
+        note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    }
+
     if(note && withWriteableOutline(note->getOutline()->getKey())) {
         // IMPROVE consider patch once in class (cross functions)
         Outline::Patch patch{Outline::Patch::Diff::NO,0,0}; // explicit initialization required by older GCC versions
         mind->noteLast(note, &patch);
         if(patch.diff != Outline::Patch::Diff::NO) {
-            mind->remind().remember(note->getOutline());
-            orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                mind->outlinesMapRemember();
+            } else {
+                mind->remind().remember(note->getOutline());
+            }
+
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                orloj->getOutlinesMap()->refresh(note->getOutline(), &patch);
+            } else {
+                orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            }
+
             // select Note in the tree
-            QModelIndex idx
-                = orloj->getOutlineView()->getOutlineTree()->getView()->model()->index(note->getOutline()->getNoteOffset(note), 0);
-            orloj->getOutlineView()->getOutlineTree()->getView()->setCurrentIndex(idx);
+            this->selectNoteInOutlineTree(note, patch, false);
             statusBar->showInfo(QString(tr("Moved Note '%1' to be the last child")).arg(note->getName().c_str()));
         }
     } else {
@@ -3035,21 +3122,33 @@ void MainWindowPresenter::doActionNoteLast()
     }
 }
 
-void MainWindowPresenter::doActionOutlineShow()
-{
-    orloj->showFacetOutline(orloj->getOutlineView()->getCurrentOutline());
-}
-
 void MainWindowPresenter::doActionNotePromote()
 {
-    Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    Note* note{};
+
+    if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+        note = orloj->getOutlinesMap()->getCurrentNote();
+    } else {
+        note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    }
+
     if(note && withWriteableOutline(note->getOutline()->getKey())) {
         // IMPROVE consider patch once in class (cross functions)
         Outline::Patch patch{Outline::Patch::Diff::NO,0,0}; // explicit initialization required by older GCC versions
         mind->notePromote(note, &patch);
         if(patch.diff != Outline::Patch::Diff::NO) {
-            mind->remind().remember(note->getOutline());
-            orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                mind->outlinesMapRemember();
+            } else {
+                mind->remind().remember(note->getOutline());
+            }
+
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                orloj->getOutlinesMap()->refresh(note->getOutline(), &patch);
+            } else {
+                orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            }
+
             statusBar->showInfo(QString(tr("Promoted Note '%1'")).arg(note->getName().c_str()));
         }
     } else {
@@ -3059,14 +3158,31 @@ void MainWindowPresenter::doActionNotePromote()
 
 void MainWindowPresenter::doActionNoteDemote()
 {
-    Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    Note* note{};
+
+    if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+        note = orloj->getOutlinesMap()->getCurrentNote();
+    } else {
+        note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote();
+    }
+
     if(note && withWriteableOutline(note->getOutline()->getKey())) {
         // IMPROVE consider patch once in class (cross functions)
         Outline::Patch patch{Outline::Patch::Diff::NO,0,0}; // explicit initialization required by older GCC versions
         mind->noteDemote(note, &patch);
-        mind->remind().remember(note->getOutline());
-        orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
         if(patch.diff != Outline::Patch::Diff::NO) {
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                mind->outlinesMapRemember();
+            } else {
+                mind->remind().remember(note->getOutline());
+            }
+
+            if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) {
+                orloj->getOutlinesMap()->refresh(note->getOutline(), &patch);
+            } else {
+                orloj->getOutlineView()->getOutlineTree()->refresh(note->getOutline(), &patch);
+            }
+
             statusBar->showInfo(QString(tr("Demoted Note '%1'")).arg(note->getName().c_str()));
         }
     } else {
@@ -3431,7 +3547,7 @@ void MainWindowPresenter::handleCreateOrganizer()
 
     // add organizer & save configuration
     if(!newOrganizerDialog->getOrganizerToEdit()) {
-        config.getRepositoryConfiguration().addOrganizer(o);        
+        config.getRepositoryConfiguration().addOrganizer(o);
     }
     sortAndSaveOrganizersConfig();
 
diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h
index 33932fd4..bfad20c9 100644
--- a/app/src/qt/main_window_presenter.h
+++ b/app/src/qt/main_window_presenter.h
@@ -348,6 +348,7 @@ public slots:
     void doActionOutlineShow();
     void doActionNoteEdit();
     void doActionNoteExternalEdit();
+    void selectNoteInOutlineTree(Note* note, Outline::Patch& patch, bool onUp);
     void doActionNoteFirst();
     void doActionNoteUp();
     void doActionNotePromote();
diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp
index a41b5db4..80222fbc 100644
--- a/app/src/qt/orloj_presenter.cpp
+++ b/app/src/qt/orloj_presenter.cpp
@@ -74,6 +74,11 @@ OrlojPresenter::OrlojPresenter(
         SIGNAL(signalShowSelectedOutline()),
         this,
         SLOT(slotShowSelectedOutline()));
+    QObject::connect(
+        view->getOutlinesMapTable(),
+        SIGNAL(signalMapShowSelectedOutline()),
+        this,
+        SLOT(slotMapShowSelectedOutline()));
     QObject::connect(
         view->getOutlinesTable(),
         SIGNAL(signalFindOutlineByName()),
@@ -404,8 +409,18 @@ void OrlojPresenter::showFacetOutlinesMap(Outline* outlinesMap)
     setFacet(OrlojPresenterFacets::FACET_MAP_OUTLINES);
     outlinesMapPresenter->refresh(outlinesMap);
     view->showFacetOutlinesMap();
-    mainPresenter->getMainMenu()->showFacetOutlineList();
+    mainPresenter->getMainMenu()->showFacetOutlinesMap();
     mainPresenter->getStatusBar()->showMindStatistics();
+
+    // give focus to the component
+    auto componentView = view->getOutlinesMapTable();
+    componentView->setFocus();
+    // give focus to the first row in the view
+    if(componentView->model()->rowCount() > 0) {
+        componentView->setCurrentIndex(
+            componentView->model()->index(0, 0)
+        );
+    }
 }
 
 void OrlojPresenter::slotShowOutlines()
@@ -505,6 +520,40 @@ void OrlojPresenter::showFacetOutline(Outline* outline)
     mainPresenter->getStatusBar()->showInfo(QString("Notebook '%1'   %2").arg(outline->getName().c_str()).arg(outline->getKey().c_str()));
 }
 
+void OrlojPresenter::slotMapShowSelectedOutline()
+{
+    MF_DEBUG("  -> signal HANDLER @ OrlojPresenter: show O " << activeFacet << std::endl);
+    if(activeFacet == OrlojPresenterFacets::FACET_MAP_OUTLINES){
+        int row = outlinesMapPresenter->getCurrentRow();
+        MF_DEBUG("  current row: " << row << std::endl);
+        if(row != OutlinesTablePresenter::NO_ROW) {
+            QStandardItem* item = outlinesMapPresenter->getModel()->item(row);
+            MF_DEBUG("    Item: " << item << std::endl);
+            if(item) {
+                Note* noteForOutline = item->data(Qt::UserRole + 1).value();
+                MF_DEBUG("    N for O: " << noteForOutline << endl);
+                if(noteForOutline
+                   && noteForOutline->getLinks().size() > 0
+                   && noteForOutline->getLinks().at(0)->getUrl().size() > 0
+                ) {
+                    MF_DEBUG("    Getting O: " << noteForOutline->getLinks().at(0)->getUrl() << endl);
+                    Outline* outline = mind->remind().getOutline(noteForOutline->getLinks().at(0)->getUrl());
+                    if(outline) {
+                        showFacetOutline(outline);
+                        return;
+                    } else {
+                        mainPresenter->getStatusBar()->showInfo(QString(tr("Selected Notebook not found!")));
+                    }
+                }
+                return;
+            } else {
+                mainPresenter->getStatusBar()->showInfo(QString(tr("Selected Notebook not found!")));
+            }
+        }
+        mainPresenter->getStatusBar()->showInfo(QString(tr("No Notebook selected!")));
+    }
+}
+
 void OrlojPresenter::slotShowSelectedOutline()
 {
     if(activeFacet!=OrlojPresenterFacets::FACET_ORGANIZER
diff --git a/app/src/qt/orloj_presenter.h b/app/src/qt/orloj_presenter.h
index fa091554..ee4974d7 100644
--- a/app/src/qt/orloj_presenter.h
+++ b/app/src/qt/orloj_presenter.h
@@ -228,6 +228,7 @@ public slots:
     void slotShowSelectedOrganizer();
     void slotShowOutlines();
     void slotShowSelectedOutline();
+    void slotMapShowSelectedOutline();
     void slotShowOutline(const QItemSelection& selected, const QItemSelection& deselected);
     void slotShowOutlineHeader();
     void slotShowNote(const QItemSelection& selected, const QItemSelection& deselected);
diff --git a/app/src/qt/orloj_view.h b/app/src/qt/orloj_view.h
index 81b309f1..72c34230 100644
--- a/app/src/qt/orloj_view.h
+++ b/app/src/qt/orloj_view.h
@@ -93,6 +93,7 @@ class OrlojView : public QSplitter
     KanbanView* getKanban() const { return kanban; }
     TagsTableView* getTagCloud() const { return tagCloud; }
     OutlinesTableView* getOutlinesTable() const { return outlinesTable; }
+    OutlinesMapView* getOutlinesMapTable() const { return outlinesMap; }
     OutlinesMapView* getOutlinesMap() const { return outlinesMap; }
     RecentNotesTableView* getRecentNotesTable() const { return recentNotesTable; }
     OutlineViewSplitter* getOutlineView() const { return outlineView; }
diff --git a/app/src/qt/outlines_map_presenter.cpp b/app/src/qt/outlines_map_presenter.cpp
index 741cbe87..1c91dc20 100644
--- a/app/src/qt/outlines_map_presenter.cpp
+++ b/app/src/qt/outlines_map_presenter.cpp
@@ -43,10 +43,6 @@ OutlinesMapPresenter::OutlinesMapPresenter(
         view, SIGNAL(signalSelectPreviousRow()),
         this, SLOT(slotSelectPreviousRow()));
 
-    QObject::connect(
-        view, SIGNAL(signalOutlineShow()),
-        mwp, SLOT(doActionOutlineShow()));
-
     QObject::connect(
         view, SIGNAL(signalChangePromote()),
         mwp, SLOT(doActionNotePromote()));
@@ -66,6 +62,11 @@ OutlinesMapPresenter::OutlinesMapPresenter(
         view, SIGNAL(signalChangeLast()),
         mwp, SLOT(doActionNoteLast()));
 
+    // TODO signals to be re-written and re-wired
+    /*
+    QObject::connect(
+        view, SIGNAL(signalOutlineShow()),
+        mwp, SLOT(doActionOutlineShow()));
     QObject::connect(
         view, SIGNAL(signalOutlineOrNoteEdit()),
         mwp, SLOT(doActionOutlineOrNoteEdit()));
@@ -78,6 +79,7 @@ OutlinesMapPresenter::OutlinesMapPresenter(
     QObject::connect(
         view, SIGNAL(signalForget()),
         mwp, SLOT(doActionNoteForget()));
+    */
 }
 
 OutlinesMapPresenter::~OutlinesMapPresenter()
diff --git a/app/src/qt/outlines_map_presenter.h b/app/src/qt/outlines_map_presenter.h
index fd61261c..0633f275 100644
--- a/app/src/qt/outlines_map_presenter.h
+++ b/app/src/qt/outlines_map_presenter.h
@@ -39,30 +39,39 @@ class OrlojPresenter;
  *
  * Outlines map ~ tree of Outlines is in fact ~ mind map of Outlines
  */
+//
+// MVP assembly: View / Model / Presenter:
+//
+//   view <- new View
+//     presenter <- new Presenter(view) + new Model(view)
+//       model <- presenter.model
+//
+// Integration:
+//
+//   orlojView <- new View()
+//   orlojPresenter <- presenter
+//
+// Materialization / view:
+//
+//   menu ... MainMenuView::actionViewOutlinesMap
+//     ->  @ MainMenuPresenter
+//       ->  MainWindowPresenter::doActionViewOutlinesMap()
+//          ... generate virtual O from Os headers
+//         -> OrlojPresenter::showFacetOutlinesMap( virtualO )
+//
+// Signals:
+//
+//   - emit: OutlinesMapView
+//       ... OK ~ view is the source of signals
+//   - wire: OutlinesMapPresenter
+//       ... OK ~ this is where code belongs & it's presenter's role in MVP
+//   - slot: MainWindowPresenter
+//       ... OK ~ this is where are presenters are instantiated
+//
 class OutlinesMapPresenter : public QObject
 {
     Q_OBJECT
 
-    // Assembly ... view / model / presenter:
-    //
-    //   view <- new View
-    //     presenter <- new Presenter(view) w/ new Model(view)
-    //       model <- presenter.model
-    //
-    // Integration:
-    //
-    //   orlojView <- new View()
-    //   orlojPresenter <- presenter
-    //
-    // Materialization / view:
-    //
-    //   menu ... MainMenuView::actionViewOutlinesMap
-    //     ->  @ MainMenuPresenter
-    //       ->  MainWindowPresenter::doActionViewOutlinesMap()
-    //          ... generate virtual O from Os headers
-    //         -> OrlojPresenter::showFacetOutlinesMap( virtualO )
-    //
-
 public:
     static const int NO_ROW = -1;
 
diff --git a/app/src/qt/outlines_map_view.cpp b/app/src/qt/outlines_map_view.cpp
index d285b0af..406866b7 100644
--- a/app/src/qt/outlines_map_view.cpp
+++ b/app/src/qt/outlines_map_view.cpp
@@ -153,7 +153,8 @@ void OutlinesMapView::keyPressEvent(QKeyEvent* event)
                 }
             case Qt::Key_Return:
             case Qt::Key_Right:
-                emit signalEdit();
+                MF_DEBUG("  OutlinesMapView: SIGNAL show O ->" << std::endl);
+                emit signalMapShowSelectedOutline();
                 break;
 #ifndef __APPLE__
             case Qt::Key_Delete:
@@ -161,6 +162,7 @@ void OutlinesMapView::keyPressEvent(QKeyEvent* event)
                 break;
 #endif
             case Qt::Key_Left:
+                // TODO this can be signal that I already have for openning Os list
                 signalFromOutlinesMapToOutlines();
                 break;
             }
@@ -177,7 +179,7 @@ void OutlinesMapView::mouseDoubleClickEvent(QMouseEvent* event)
     Q_UNUSED(event);
 
     // double click to N opens it
-    emit signalEdit();
+    emit signalMapShowSelectedOutline();
 }
 
 void OutlinesMapView::resizeEvent(QResizeEvent* event)
diff --git a/app/src/qt/outlines_map_view.h b/app/src/qt/outlines_map_view.h
index 257bea8e..47997144 100644
--- a/app/src/qt/outlines_map_view.h
+++ b/app/src/qt/outlines_map_view.h
@@ -106,7 +106,7 @@ class OutlinesMapView : public QTableView
 
     void signalOutlineOrNoteEdit(); // O or N edit
     void signalOutlineOrNoteExternalEdit(); // O or N edit
-    void signalEdit(); // N edit
+    void signalMapShowSelectedOutline();
     void signalForget();
 };
 
diff --git a/build/Makefile b/build/Makefile
index 49f87caf..5136aba5 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -127,11 +127,16 @@ build-ci: clean
 
 
 run: ../app/mindforger
-	cd ../app && pwd && ./mindforger
+	# cd ../app && pwd && ./mindforger
+	cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer
+	# cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/computer-hw.md
+	# cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/bug-copy-image
 
 
 run-dev: build-dev
 	cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer
+	# cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/computer-hw.md
+	# cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/bug-copy-image
 
 
 #
diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h
index 6500fad3..5f847f52 100644
--- a/lib/src/config/configuration.h
+++ b/lib/src/config/configuration.h
@@ -67,6 +67,7 @@ constexpr const auto UI_THEME_NATIVE = "native";
 constexpr const auto UI_THEME_NATIVE_WITH_FIXED_FONT = "native with fixed font";
 
 constexpr const auto START_TO_DASHBOARD = "dashboard";
+constexpr const auto START_TO_OUTLINES_TREE = "outlines tree";
 constexpr const auto START_TO_OUTLINES = "outlines";
 constexpr const auto START_TO_TAGS = "tags";
 constexpr const auto START_TO_RECENT = "recent";
diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h
index 7dc23469..74ce4b18 100644
--- a/lib/src/mind/ai/llm/wingman.h
+++ b/lib/src/mind/ai/llm/wingman.h
@@ -90,20 +90,25 @@ class Wingman
  * - llama 7B
  *   - llama-2-7b.Q4_0.gguf
  * - Zephir 7B
- *   - ...
+ *   - ?.gguf
  * - Mistral 7B
- *   - ...
+ *   - ?.gguf
  *
  * Plan:
  *
  * TODO: first implement unit tests for the wingman UCs as it is in the lib/
- * TODO: then integrate wingman to UI
- *   - if GPT not available in RUNTIME, then hide/disable menu items
+ * TODO: then integrate wingman to UI (if GPT not available in RUNTIME, then hide/disable menu items)
+ *
  */
 class WingmanLlamaCpp: Wingman
 {
 public:
 };
 
+class WingmanOpenAiChatGpt: Wingman
+{
+public:
+};
+
 }
 #endif // M8R_WINGMAN_H
diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp
index d5f077e9..fca6e025 100644
--- a/lib/src/mind/mind.cpp
+++ b/lib/src/mind/mind.cpp
@@ -996,12 +996,18 @@ Outline* Mind::outlinesMapNew(string outlineKey)
         Note* n = o->getOutlineDescriptorAsNote();
         newOutlinesMap->addNote(n);
 
-        // relative key will be valid even if repository is moved to a different path
-        Link* link = new Link{
-            LINK_NAME_ASSOCIATED_OUTLINE, 
-            this->outlineMapKey2Relative(o->getKey())
-        };
-        n->addLink(link);
+        n->addLink(
+            new Link{
+                LINK_NAME_OUTLINE_KEY,
+                o->getKey()
+            }
+        );
+        n->addLink(
+            new Link{
+                LINK_NAME_OUTLINE_PATH,
+                Mind::outlineMapKey2Relative(o->getKey())
+            }
+        );
     }
 
     newOutlinesMap->setName("Notebooks Map");
@@ -1013,9 +1019,6 @@ Outline* Mind::outlinesMapNew(string outlineKey)
     return newOutlinesMap;
 }
 
-/**
- * Synchronize Outlines map parameter with mind's Outlines.
- */
 void Mind::outlinesMapSynchronize(Outline* outlinesMap)
 {
     vector osToRemove{};
@@ -1026,10 +1029,9 @@ void Mind::outlinesMapSynchronize(Outline* outlinesMap)
     MF_DEBUG("Map O links validity check:");
     vector mapOsKeys{};
     for(Note* n:outlinesMap->getNotes()) {
-        if(n->getLinks().size() > 0 
-            && n->getLinks().at(0)->getUrl().size() > 0
-        ) {
-            string oKey{n->getLinks().at(0)->getUrl()};
+        Link* oLink = n->getLinkByName(LINK_NAME_OUTLINE_KEY);
+        if(oLink) {
+            string oKey{oLink->getUrl()};
             if(findOutlineByKey(oKey)) {
                 // valid O in MF & map
                 MF_DEBUG(
@@ -1064,7 +1066,16 @@ void Mind::outlinesMapSynchronize(Outline* outlinesMap)
     for(auto mindO: getOutlines()) {
         if(find(mapOsKeys.begin(), mapOsKeys.end(), mindO->getKey()) == mapOsKeys.end()) {
             MF_DEBUG("  " << mindO->getKey() << endl);
-            osToAdd.push_back(mindO);
+
+            // TODO skip keys w/ "," ~ https://github.com/dvorka/mindforger/issues/1518 workaround
+            // TODO remove this code once #1518 is fixed
+            if(find(mindO->getKey().begin(), mindO->getKey().end(), ',') == mindO->getKey().end()) {
+                osToAdd.push_back(mindO);
+            } else {
+                MF_DEBUG("    SKIPPING key w/ ','" << endl);
+                continue;
+            }
+
         }
     }
     MF_DEBUG("ADDING mind keys to map:" << endl);
@@ -1072,6 +1083,21 @@ void Mind::outlinesMapSynchronize(Outline* outlinesMap)
         MF_DEBUG("  " << o->getKey() << endl);
         // clone O's descriptor to get N which might be deleted later
         Note* n = new Note(*o->getOutlineDescriptorAsNote());
+
+        n->clearLinks();
+        n->addLink(
+            new Link{
+                LINK_NAME_OUTLINE_KEY,
+                o->getKey()
+            }
+        );
+        n->addLink(
+            new Link{
+                LINK_NAME_OUTLINE_PATH,
+                Mind::outlineMapKey2Relative(o->getKey())
+            }
+        );
+
         outlinesMap->addNote(n , 0);
     }
 }
@@ -1087,23 +1113,29 @@ Outline* Mind::outlinesMapLearn(string outlineKey)
     MF_DEBUG("Setting map's Ns type O" << endl);
     for(auto n:outlinesMap->getNotes()) {
         MF_DEBUG(
-            "  Setting " << n->getName() 
-            << " with " << n->getLinks().size() << " link(s)"
+            "  Setting '" << n->getName()
+            << "' with " << n->getLinks().size() << " link(s)"
             << " to O" << endl
         );
         n->setType(&Outline::NOTE_4_OUTLINE_TYPE);
 
-        if(n->getLinks().size() > 0 
-            && n->getLinks().at(0)->getUrl().size() > 0
-        ) {
-            // IMPROVE find link w/ name LINK_NAME_ASSOCIATED_OUTLINE (in case there would be >1 link)
-            string relativeLink{
-                this->outlineMapKey2Absolute(n->getLinks().at(0)->getUrl())
-            };
+        Link* oMemPathLink = n->getLinkByName(LINK_NAME_OUTLINE_PATH);
+        if(oMemPathLink && oMemPathLink->getUrl().size() > 0) {
+            string oMemPath{oMemPathLink->getUrl()};
 
-            // N key is generated based on O key > keep link in "Outline" link
             n->clearLinks();
-            n->addLink(new Link(LINK_NAME_ASSOCIATED_OUTLINE, relativeLink));
+            n->addLink(
+                new Link{
+                    LINK_NAME_OUTLINE_KEY,
+                    Mind::outlineMapKey2Absolute(oMemPath)
+                }
+            );
+            n->addLink(
+                new Link{
+                    LINK_NAME_OUTLINE_PATH,
+                    oMemPath
+                }
+            );
         } else {
             MF_DEBUG("  SKIPPING N w/o link: " << n->getName() << endl);
             osToRemove.push_back(n);
@@ -1144,12 +1176,18 @@ Outline* Mind::outlinesMapGet()
         // create new Os map
         this->outlinesMap = outlinesMapNew(outlinesMapPath);
 
-        remind().getPersistence().save(this->outlinesMap);
+        outlinesMapRemember();
     }
 
     return this->outlinesMap;
 }
 
+Outline* Mind::outlinesMapRemember()
+{
+    if(this->outlinesMap) {
+        remind().getPersistence().save(this->outlinesMap);
+    }
+}
 
 Note* Mind::noteNew(
     const std::string& outlineKey,
diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h
index d7974356..f6970dcd 100644
--- a/lib/src/mind/mind.h
+++ b/lib/src/mind/mind.h
@@ -45,8 +45,12 @@ class KnowledgeGraph;
 class AutolinkingMind;
 
 constexpr auto NO_PARENT = 0xFFFF;
-// const in constexpr ensures const value
-constexpr const auto LINK_NAME_ASSOCIATED_OUTLINE = "TargetOutline";
+
+// Outline key - resolved O path which may change if the repository is moved
+constexpr const auto LINK_NAME_OUTLINE_KEY = "Outline key";
+// Outline path - relative O path which can be used to create valid absolute O path on map load
+constexpr const auto LINK_NAME_OUTLINE_PATH = "Outline path";
+// ^ const in constexpr ensures const value
 
 enum class FtsSearch {
     EXACT,
@@ -575,6 +579,10 @@ class Mind : public OntologyProvider
      * @brief Load or create Os map (tree).
      */
     Outline* outlinesMapGet();
+    /**
+     * @brief Save Os map (tree).
+     */
+    Outline* outlinesMapRemember();
 
     /*
      * NOTE MGMT
diff --git a/lib/src/model/note.cpp b/lib/src/model/note.cpp
index 0549b9bb..8a3fcc33 100644
--- a/lib/src/model/note.cpp
+++ b/lib/src/model/note.cpp
@@ -67,6 +67,12 @@ Note::Note(const Note& n)
         tags.insert(tags.end(), n.tags.begin(), n.tags.end());
     }
 
+    if(n.links.size()) {
+        for(Link* l:n.links) {
+            links.push_back(new Link(l->getName(), l->getUrl()));
+        }
+    }
+
     flags = n.flags;
 }
 
@@ -456,6 +462,17 @@ void Note::addLink(Link* link)
     }
 }
 
+Link* Note::getLinkByName(const string& name) const
+{
+    for(Link* l:this->links) {
+        if(l->getName() == name) {
+            return l;
+        }
+    }
+
+    return nullptr;
+}
+
 void Note::demote()
 {
     depth++;
diff --git a/lib/src/model/note.h b/lib/src/model/note.h
index 31710a48..382324fe 100644
--- a/lib/src/model/note.h
+++ b/lib/src/model/note.h
@@ -160,11 +160,12 @@ class Note : public ThingInTime
 
     void addLink(Link* link);
     const std::vector& getLinks() const { return links; }
+    Link* getLinkByName(const std::string& name) const;
+    size_t getLinksCount() const { return links.size(); }
     void clearLinks() { 
         for(auto l:links) { delete l; }
         links.clear(); 
     }
-    size_t getLinksCount() const { return links.size(); }
 
     void promote();
     void demote();
diff --git a/lib/test/src/markdown/markdown_test.cpp b/lib/test/src/markdown/markdown_test.cpp
index 7e890a95..791381fe 100644
--- a/lib/test/src/markdown/markdown_test.cpp
+++ b/lib/test/src/markdown/markdown_test.cpp
@@ -953,6 +953,7 @@ TEST(MarkdownParserTestCase, Links)
 }
 
 // Repro for BUG: https://github.com/dvorka/mindforger/issues/1518
+// - metadata link with "," is not parsed
 TEST(MarkdownParserTestCase, DISABLED_LinksWithParenthesis)
 {
     string repositoryPath{"/tmp"};
@@ -961,15 +962,15 @@ TEST(MarkdownParserTestCase, DISABLED_LinksWithParenthesis)
     string filePath{repositoryPath+"/"+fileName};
 
     content.assign(
-                "# Outline Name \n"
-                "O text.\n"
-                "\n"
-//                "## First Section \n"
-//                "N1 text.\n"
-                "\n"
-                "## Second Section\n"
-                "N2 text.\n"
-                "\n");
+        "# Outline Name \n"
+        "O text.\n"
+        "\n"
+        "## First Section \n"
+        "N1 text.\n"
+        "\n"
+        "## Second Section\n"
+        "N2 text.\n"
+        "\n");
     m8r::stringToFile(filePath, content);
 
     m8r::Repository* repository = m8r::RepositoryIndexer::getRepositoryForPath(repositoryPath);

From f4bbdfccdc4eb18b5d2d7007504e5c9be23caf0e Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Mon, 25 Dec 2023 10:55:14 +0100
Subject: [PATCH 054/131] Adding RC build.

---
 app/app.pro        |  6 +++++-
 build/Makefile     | 21 +++++++++++++++++++--
 lib/src/app_info.h | 12 ++++++------
 lib/src/version.h  |  2 ++
 mindforger.pro     |  1 +
 5 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/app/app.pro b/app/app.pro
index 08d50e9a..b652db04 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -31,6 +31,10 @@ mfci {
   DEFINES += DO_MF_CI
 }
 
+mfrc {
+  DEFINES += DO_MF_RC
+}
+
 # Hunspell spell check:
 # - Windows and Ubuntu Xenial require DEPRECATED Hunspell API
 # - Ubuntu Bionic and newer distros use NEW Hunspell API
@@ -133,7 +137,7 @@ mfner {
 win32 {
     INCLUDEPATH += $$PWD/../deps/zlib-win/include
     DEPENDPATH += $$PWD/../deps/zlib-win/include
-    
+
     CONFIG(release, debug|release): LIBS += -L$$PWD/../deps/zlib-win/lib/ -lzlibwapi
     else:CONFIG(debug, debug|release): LIBS += -L$$PWD/../deps/zlib-win/lib/ -lzlibwapi
 } else {
diff --git a/build/Makefile b/build/Makefile
index 5136aba5..5fe13bb5 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -114,7 +114,16 @@ build-dev:
 # TODO: build-dev-clang
 
 
-build-ci: clean
+.PHONY: build-rc
+build-rc:
+	@echo "MindForger RC build..."
+	cd .. && qmake CONFIG+=mfrc -r mindforger.pro && make -j 7
+	@echo "If RC build succeeded, then MindForger executable can be found in:\n  app/mindforger"
+	ls -al ../app/mindforger
+
+
+.PHONY: build-ci
+build-ci:
 	@echo "MindForger CI build..."
 	cd .. && qmake CONFIG+=mfci -r mindforger.pro && make -j 7
 	@echo "If CI build succeeded, then MindForger executable can be found in:\n  app/mindforger"
@@ -133,6 +142,14 @@ run: ../app/mindforger
 	# cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/bug-copy-image
 
 
+run-rc: build-rc
+	cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer
+
+
+run-ci: build-ci
+	cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer
+
+
 run-dev: build-dev
 	cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer
 	# cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/computer-hw.md
@@ -150,7 +167,7 @@ install: clean ../app/mindforger
 	~/bin/mind --version
 
 
-install-dev-local: clean build-dev
+install-dev-local: clean build-rc
 	cp -vf ../app/mindforger ~/bin
 	mv -vf ~/bin/mindforger ~/bin/mind
 	~/bin/mind --version
diff --git a/lib/src/app_info.h b/lib/src/app_info.h
index cff0e94d..e7279bef 100644
--- a/lib/src/app_info.h
+++ b/lib/src/app_info.h
@@ -1,12 +1,12 @@
-#define MINDFORGER_VERSION_MAJOR "1"
-#define MINDFORGER_VERSION_MINOR "55"
-#define MINDFORGER_VERSION_REVISION "1"
-#define MINDFORGER_VERSION_STRING "1.55.1"
-#define MINDFORGER_VERSION_DWORD 1,55,1,2
+#define MINDFORGER_VERSION_MAJOR "2"
+#define MINDFORGER_VERSION_MINOR "0"
+#define MINDFORGER_VERSION_REVISION "0"
+#define MINDFORGER_VERSION_STRING "2.0.0"
+#define MINDFORGER_VERSION_DWORD 2,0,0,2
 #define MINDFORGER_APP_NAME   "MindForger"
 #define MINDFORGER_APP_DESCRIPTION  "MindForger Thinking Notebook"
 #define MINDFORGER_APP_AUTHOR "Martin Dvorak"
 #define MINDFORGER_APP_URL "https://www.mindforger.com"
 #define MINDFORGER_APP_COMPANY   MINDFORGER_APP_NAME
 #define MINDFORGER_APP_LEGAL "\xA9 2016-2023 Martin Dvorak. All Rights Reserved"
-#define MINDFORGER_APP_EXE "mindforger.exe" 
+#define MINDFORGER_APP_EXE "mindforger.exe"
diff --git a/lib/src/version.h b/lib/src/version.h
index 0105a777..3e1d46c5 100644
--- a/lib/src/version.h
+++ b/lib/src/version.h
@@ -28,6 +28,8 @@ namespace m8r {
 
 #ifdef DO_MF_DEBUG
   #define MINDFORGER_NIGHTLY " (" __DATE__ " " __TIME__ ")"
+#elif DO_MF_RC
+  #define MINDFORGER_NIGHTLY " (RC " __DATE__ " " __TIME__ ")"
 #elif DO_MF_CI
   #define MINDFORGER_NIGHTLY " (CI " __DATE__ " " __TIME__ ")"
 #else
diff --git a/mindforger.pro b/mindforger.pro
index 43c18934..a55fd719 100644
--- a/mindforger.pro
+++ b/mindforger.pro
@@ -30,6 +30,7 @@
 #   qmake CONFIG+=mfnoccache        ... do NOT use ccache to build the project
 #   qmake CONFIG+=mfdebug           ... show debug messages + include WIP code
 #   qmake CONFIG+=mfci              ... CI build (AppVeyor, ...) w/ build info @ window title
+#   qmake CONFIG+=mfrc              ... RC build w/ build info @ window title
 #   qmake CONFIG+=mfunits           ... option to run unit tests
 #   qmake CONFIG+=mfllamacpp        ... EXPERIMENTAL option to enable wingman @ llama.cpp
 #   qmake CONFIG+=mfner             ... DEPRECATED: build project w/ NER and link dlib/MITIE

From 50a020f820fd26a59f64b2730e04f7c857b4e616 Mon Sep 17 00:00:00 2001
From: Martin Dvorak 
Date: Tue, 2 Jan 2024 19:48:47 +0100
Subject: [PATCH 055/131] WIP CLI rewrite, Makefile help generation,
 application icon.

---
 CONTRIBUTING.md                               |   4 +-
 Changelog                                     |  28 +-
 app/mf-resources.qrc                          |   9 -
 app/resources/icons/arxiv.png                 | Bin 3103 -> 0 bytes
 app/resources/icons/bard.png                  | Bin 3800 -> 0 bytes
 app/resources/icons/cpp.png                   | Bin 3820 -> 0 bytes
 app/resources/icons/duckduckgo.png            | Bin 6027 -> 0 bytes
 app/resources/icons/github.png                | Bin 4503 -> 0 bytes
 app/resources/icons/h2oai.png                 | Bin 1839 -> 0 bytes
 .../icons/{ => logo-bw}/mindforger-bw.icns    | Bin
 .../icons/{ => logo-bw}/mindforger-bw.ico     | Bin
 .../icons/{ => logo-bw}/mindforger-bw.png     | Bin
 .../{ => logo-bw}/mindforger128x128-bw.png    | Bin
 app/resources/icons/logo-genai/mindforger.ico | Bin 0 -> 67646 bytes
 app/resources/icons/logo-genai/mindforger.png | Bin 0 -> 8278 bytes
 app/resources/icons/logo-genai/mindforger.svg | 516 ++++++++++++++++++
 .../icons/{ => logo-uk}/mindforger-uk.icns    | Bin
 .../icons/{ => logo-uk}/mindforger-uk.ico     | Bin
 .../icons/{ => logo-uk}/mindforger-uk.png     | Bin
 .../{ => logo-uk}/mindforger128x128-uk.png    | Bin
 app/resources/icons/mindforger.ico            | Bin 114389 -> 67646 bytes
 app/resources/icons/mindforger.png            | Bin 7079 -> 8278 bytes
 app/resources/icons/mindforger.svg            | 516 ++++++++++++++++++
 app/resources/icons/mindforger128x128.png     | Bin 8108 -> 8278 bytes
 app/resources/icons/python.png                | Bin 6194 -> 0 bytes
 app/resources/icons/stackoverflow.png         | Bin 3152 -> 0 bytes
 app/resources/icons/wikipedia.png             | Bin 3163 -> 0 bytes
 .../qt/images/{ => bw}/mindforger-icon-bw.png | Bin
 .../qt/images/genai/mindforger-icon.png       | Bin 0 -> 8278 bytes
 app/resources/qt/images/mindforger-icon.png   | Bin 7079 -> 8278 bytes
 .../qt/images/{ => uk}/mindforger-icon-uk.png | Bin
 app/src/qt/cli_n_breadcrumbs_presenter.cpp    | 123 +++--
 app/src/qt/cli_n_breadcrumbs_presenter.h      |   6 +-
 app/src/qt/cli_n_breadcrumbs_view.cpp         | 215 ++++++--
 app/src/qt/cli_n_breadcrumbs_view.h           |  76 ++-
 .../qt/dialogs/find_outline_by_tag_dialog.cpp |  13 +-
 .../qt/dialogs/find_outline_by_tag_dialog.h   |   4 +-
 app/src/qt/dialogs/run_tool_dialog.cpp        |  15 -
 app/src/qt/left_toolbar_view.cpp              |  27 +-
 app/src/qt/left_toolbar_view.h                |   3 -
 app/src/qt/main_window_presenter.cpp          |  56 +-
 app/src/qt/main_window_presenter.h            |   9 +-
 app/src/qt/widgets/edit_tags_panel.h          |   3 +
 build/Makefile                                | 110 ++--
 lib/src/config/configuration.h                |   8 +-
 lib/src/mind/ai/llm/wingman.h                 |   5 +-
 lib/src/mind/knowledge_graph.h                |  10 +-
 lib/src/mind/mind.cpp                         |  10 +-
 48 files changed, 1457 insertions(+), 309 deletions(-)
 delete mode 100644 app/resources/icons/arxiv.png
 delete mode 100644 app/resources/icons/bard.png
 delete mode 100644 app/resources/icons/cpp.png
 delete mode 100644 app/resources/icons/duckduckgo.png
 delete mode 100644 app/resources/icons/github.png
 delete mode 100644 app/resources/icons/h2oai.png
 rename app/resources/icons/{ => logo-bw}/mindforger-bw.icns (100%)
 rename app/resources/icons/{ => logo-bw}/mindforger-bw.ico (100%)
 rename app/resources/icons/{ => logo-bw}/mindforger-bw.png (100%)
 rename app/resources/icons/{ => logo-bw}/mindforger128x128-bw.png (100%)
 create mode 100644 app/resources/icons/logo-genai/mindforger.ico
 create mode 100644 app/resources/icons/logo-genai/mindforger.png
 create mode 100644 app/resources/icons/logo-genai/mindforger.svg
 rename app/resources/icons/{ => logo-uk}/mindforger-uk.icns (100%)
 rename app/resources/icons/{ => logo-uk}/mindforger-uk.ico (100%)
 rename app/resources/icons/{ => logo-uk}/mindforger-uk.png (100%)
 rename app/resources/icons/{ => logo-uk}/mindforger128x128-uk.png (100%)
 create mode 100644 app/resources/icons/mindforger.svg
 delete mode 100644 app/resources/icons/python.png
 delete mode 100644 app/resources/icons/stackoverflow.png
 delete mode 100644 app/resources/icons/wikipedia.png
 rename app/resources/qt/images/{ => bw}/mindforger-icon-bw.png (100%)
 create mode 100644 app/resources/qt/images/genai/mindforger-icon.png
 rename app/resources/qt/images/{ => uk}/mindforger-icon-uk.png (100%)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ece8b9f6..34ad9178 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -149,8 +149,8 @@ class MyClass
 
     int field; // brief field description in the lower case
     /**
-	 * @brief Another field.
-	 *
+     * @brief Another field.
+     *
      * Field with a long description must be documented using
      * this style of the comment. The text of description to be
      * formed by sentences. Apart to that you can use any formatting
diff --git a/Changelog b/Changelog
index 939903af..7fbf5849 100644
--- a/Changelog
+++ b/Changelog
@@ -1,16 +1,28 @@
 2024-01-??  Martin Dvorak  
 
-    * Released v2.0.0 - Limbo added to the application menu View/Limbo,
-      polished Preferences (Appearance refactored to Controls; restart requirement
-      highlighted), missing OOTB Eisenhower Matrix is automatically added back
-      to the list of Organizers, up/down button in O/N preview mode to move around
-      O's Ns while presenting a N.
-      Libraries - ability to index external PDF files and generate Notebooks
-      which represent them in MindForger (update and removal of the library
-      supported as well. New left side toolbar which runs various tools
+    * Released v2.0.0 - major release which removes features which are not used
+      in practices and brings several new features.
+    * Feature: Notebook Tree view brings ability to organize Notebooks to
+      and outline.
+    * Feature: Libraries bring ability to index external PDF files and generate
+      Notebooks which represent them in MindForger (update and removal of the
+      library supported as well.
+    * Feature: New left side toolbar which runs various tools
       (like Wikipedia, arXiv, StackOverflow, ...) on phrase which is the current
       context (Notebook or Note name, selected text or text under the cursor, ...)
       in order to get more information about the phrase.
+    * Enhancement: CLI to Wingman rewrite: help, search, knowledge recherche and
+      commands.
+    * Enhancement: Limbo added to the application menu View/Limbo.
+    * Enhancement: Polished Preferences - Appearance refactored to Controls,
+      restart requirement highlighted.
+    * Enhancement: Added up and down button in O/N preview mode to move around
+      O's Ns while presenting a N.
+    * Enhancement: MindForger icon changed to GenAI style.
+    * Enhancement: CLI rewrite towards Wingman with help, search, knowledge recherche and commands.
+    * Fix: Missing OOTB Eisenhower Matrix is automatically added back to
+      the list of Organizers.
+    * Fix: Conflicting menu keyboard shortcuts resolved.
 
 2023-01-15  Martin Dvorak  
 
diff --git a/app/mf-resources.qrc b/app/mf-resources.qrc
index 2358eb23..36bc6a29 100644
--- a/app/mf-resources.qrc
+++ b/app/mf-resources.qrc
@@ -18,15 +18,6 @@
         resources/icons/flat-think.svg
         resources/icons/flat-adapt.svg
         resources/icons/flat-help.svg
-        resources/icons/arxiv.png
-        resources/icons/wikipedia.png
-        resources/icons/stackoverflow.png
-        resources/icons/duckduckgo.png
-        resources/icons/h2oai.png
-        resources/icons/github.png
-        resources/icons/bard.png
-        resources/icons/python.png
-        resources/icons/cpp.png
     
     
         resources/qt/translations/mindforger_cs.qm
diff --git a/app/resources/icons/arxiv.png b/app/resources/icons/arxiv.png
deleted file mode 100644
index 08e504b67479150d310b44750ce0f7efecb050b3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3103
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

diff --git a/app/resources/icons/bard.png b/app/resources/icons/bard.png
deleted file mode 100644
index e9250331b652919c26fbe5ae711a7b276351cfb6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3800
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�pjlW$kbX!A
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
FV1fEtXKXo
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

diff --git a/app/resources/icons/h2oai.png b/app/resources/icons/h2oai.png
deleted file mode 100644
index e6c21f6f389c40a74342d1293c4ed34b3e7dfe8c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1839
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
+
+
+
+  
+  
+  
+    
+      
+        image/svg+xml
+        
+      
+    
+  
+  
+    
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+        
+        
+      
+      
+        
+        
+      
+      
+    
+  
+  
+  
+  
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+
diff --git a/app/resources/icons/mindforger-uk.icns b/app/resources/icons/logo-uk/mindforger-uk.icns
similarity index 100%
rename from app/resources/icons/mindforger-uk.icns
rename to app/resources/icons/logo-uk/mindforger-uk.icns
diff --git a/app/resources/icons/mindforger-uk.ico b/app/resources/icons/logo-uk/mindforger-uk.ico
similarity index 100%
rename from app/resources/icons/mindforger-uk.ico
rename to app/resources/icons/logo-uk/mindforger-uk.ico
diff --git a/app/resources/icons/mindforger-uk.png b/app/resources/icons/logo-uk/mindforger-uk.png
similarity index 100%
rename from app/resources/icons/mindforger-uk.png
rename to app/resources/icons/logo-uk/mindforger-uk.png
diff --git a/app/resources/icons/mindforger128x128-uk.png b/app/resources/icons/logo-uk/mindforger128x128-uk.png
similarity index 100%
rename from app/resources/icons/mindforger128x128-uk.png
rename to app/resources/icons/logo-uk/mindforger128x128-uk.png
diff --git a/app/resources/icons/mindforger.ico b/app/resources/icons/mindforger.ico
index b4de1d24420bd201df98898b8e4dffd68fcca301..bc5968114831f654ca57b8dfb0bbcc1fd0071a5b 100644
GIT binary patch
literal 67646
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
Re1ZS~002ovPDHLkV1oHBh$;X8

diff --git a/app/resources/icons/mindforger.svg b/app/resources/icons/mindforger.svg
new file mode 100644
index 00000000..ee9582a4
--- /dev/null
+++ b/app/resources/icons/mindforger.svg
@@ -0,0 +1,516 @@
+
+
+
+
+  
+  
+  
+    
+      
+        image/svg+xml
+        
+      
+    
+  
+  
+    
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+        
+        
+      
+      
+        
+        
+      
+      
+    
+  
+  
+  
+  
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+
diff --git a/app/resources/icons/mindforger128x128.png b/app/resources/icons/mindforger128x128.png
index 2c61a4bb2fe3fd51b971a16a57336823e53695ba..460d31ba302868ee009245cb82cde7828502f0e5 100644
GIT binary patch
literal 8278
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
Qi~s-t07*qoM6N<$g25&WjsO4v

diff --git a/app/resources/icons/stackoverflow.png b/app/resources/icons/stackoverflow.png
deleted file mode 100644
index 78ca4ae013a2091a86d31c909ab3bd4c9bbb9c8a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3152
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
Re1ZS~002ovPDHLkV1oHBh$;X8

diff --git a/app/resources/qt/images/mindforger-icon-uk.png b/app/resources/qt/images/uk/mindforger-icon-uk.png
similarity index 100%
rename from app/resources/qt/images/mindforger-icon-uk.png
rename to app/resources/qt/images/uk/mindforger-icon-uk.png
diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.cpp b/app/src/qt/cli_n_breadcrumbs_presenter.cpp
index 5a0a7703..37120189 100644
--- a/app/src/qt/cli_n_breadcrumbs_presenter.cpp
+++ b/app/src/qt/cli_n_breadcrumbs_presenter.cpp
@@ -31,7 +31,7 @@ CliAndBreadcrumbsPresenter::CliAndBreadcrumbsPresenter(
     // widgets
     view->setVisible(Configuration::getInstance().isUiShowBreadcrump());
 
-    // wire signals
+    // wire signals (view events to presenter handlers)
     QObject::connect(
         view->cli, SIGNAL(returnPressed()),
         this, SLOT(executeCommand()));
@@ -40,21 +40,62 @@ CliAndBreadcrumbsPresenter::CliAndBreadcrumbsPresenter(
         this, SLOT(handleCliTextChanged(QString)));
 }
 
+
 void CliAndBreadcrumbsPresenter::handleCliTextChanged(const QString& text)
 {
     // IMPROVE remove parameter text if it's not needed
     UNUSED_ARG(text);
 
+    // TODO use status bar
+
     QString command = view->getCommand();
+    MF_DEBUG("CLI text changed to: '" << command.toStdString() << "'" << endl);
     if(command.size()) {
-        if(command.startsWith(CliAndBreadcrumbsView::CMD_TOOL)) {
+        MF_DEBUG("  handling:" << endl);
+        if(command.startsWith(CliAndBreadcrumbsView::CHAR_HELP)) {
+            MF_DEBUG("    HELP" << endl);
+            QMessageBox::information(
+                &mainPresenter->getView(),
+                tr("Wingman help"),
+                tr(
+                    // IMPROVE consider  prefix, 
separator and colors/bold + "Use the following commands to use Wingman:\n" + "\n" + "? ... help\n" + "/ ... search\n" + "@ ... knowledge recherche\n" + "> ... run a command\n" + ": ... chat with workspace, Notebook or Note\n" + "\n" + "or type full-text search phrase\n" + ) + ); + view->setCommand(""); + mainPresenter->getStatusBar()->showInfo( + tr("Wingman: ? for help, / search, @ knowledge, > command, : chat, or type FTS phrase")); + return; + } else if(command.startsWith(CliAndBreadcrumbsView::CHAR_FIND)) { + MF_DEBUG(" / HELP find" << endl); + view->updateCompleterModel(CliAndBreadcrumbsView::HELP_FIND_CMDS); + return; + } else if(command.startsWith(CliAndBreadcrumbsView::CHAR_KNOW)) { + MF_DEBUG(" @ HELP knowledge" << endl); + view->updateCompleterModel(CliAndBreadcrumbsView::HELP_KNOW_CMDS); + return; + } else if(command.startsWith(CliAndBreadcrumbsView::CHAR_CMD)) { + MF_DEBUG(" > HELP command" << endl); + view->updateCompleterModel(CliAndBreadcrumbsView::HELP_CMD_CMDS); + return; + } else if(command.startsWith(CliAndBreadcrumbsView::CHAR_KNOW)) { + MF_DEBUG(" @ EXEC" << endl); QString prefix( QString::fromStdString( command.toStdString().substr( - CliAndBreadcrumbsView::CMD_TOOL.size()-1))); + CliAndBreadcrumbsView::CHAR_KNOW.size()-1))); QString phrase{"PHRASE"}; mainPresenter->doActionOpenRunToolDialog(phrase); view->setCommand(""); + return; } else if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME)) { QString prefix( QString::fromStdString( @@ -77,78 +118,70 @@ void CliAndBreadcrumbsPresenter::handleCliTextChanged(const QString& text) outlineNamesCompletion << qs; } } - view->updateCompleterModel(&outlineNamesCompletion); + view->updateCompleterModel( + CliAndBreadcrumbsView::DEFAULT_CMDS, + &outlineNamesCompletion); } else { + // TODO NOT handled } } else { - view->updateCompleterModel(); + MF_DEBUG(" FALLBACK (default CMDs)" << endl); + view->updateCompleterModel( + CliAndBreadcrumbsView::DEFAULT_CMDS); } return; } + MF_DEBUG(" NO HANDLING (FTS phrase OR lost focus)" << endl); + return; + } else { // empty command + MF_DEBUG(" EMPTY command > NO handling" << endl); + return; } - - // fallback - view->forceFtsHistoryCompletion(); } // TODO i18n void CliAndBreadcrumbsPresenter::executeCommand() { QString command = view->getCommand(); + MF_DEBUG("CLI command EXEC: '" << command.toStdString() << "'" << endl); if(command.size()) { view->addCompleterItem(command); - if(command.startsWith(CliAndBreadcrumbsView::CMD_FTS)) { - executeFts(command); - view->showBreadcrumb(); - return; - } if(command.startsWith(CliAndBreadcrumbsView::CMD_LIST_OUTLINES)) { + MF_DEBUG(" executing: list outlines" << endl); executeListOutlines(); view->showBreadcrumb(); return; - } - if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME)) { + } else if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_TAG)) { string name = command.toStdString().substr( - CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME.size()); - unique_ptr> outlines = mind->findOutlineByNameFts(name); - if(!outlines || !outlines->size()) { - // IMPROVE memory leak if outlines && !outlines->size() - QString firstCompletion = view->getFirstCompletion(); - if(firstCompletion.size()) { - name = view->getFirstCompletion().toStdString().substr( - CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME.size() - ); - outlines = mind->findOutlineByNameFts(name); - } + CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_TAG.size()); + MF_DEBUG(" executing: find O by tag '" << name << "'" << endl); + if(name.size()) { + mainPresenter->doActionFindOutlineByTag(name); } - if(outlines && outlines->size()) { - mainPresenter->getOrloj()->showFacetOutline(outlines->front()); - // TODO efficient - mainPresenter->getStatusBar()->showInfo(tr("Notebook ")+QString::fromStdString(outlines->front()->getName())); - } else { - mainPresenter->getStatusBar()->showInfo(tr("Notebook not found: ") += QString(name.c_str())); + mainPresenter->getStatusBar()->showInfo(tr("Notebook not found - please specify tag search phrase (is empty)")); + return; + } else if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME)) { + string name = command.toStdString().substr( + CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME.size()); + MF_DEBUG(" executing: find O by name '" << name << "'" << endl); + if(name.size()) { + mainPresenter->doActionFindOutlineByName(name); } - view->showBreadcrumb(); + mainPresenter->getStatusBar()->showInfo(tr("Notebook not found - please specify name search phrase (is empty)")); + // status handling examples: + // mainPresenter->getStatusBar()->showInfo(tr("Notebook ")+QString::fromStdString(outlines->front()->getName())); + // mainPresenter->getStatusBar()->showInfo(tr("Notebook not found: ") += QString(name.c_str())); return; + } else { + // do FTS as fallback + mainPresenter->doFts(view->getCommand(), true); } - - // do FTS as fallback - mainPresenter->doFts(view->getCommand(), true); } else { mainPresenter->getStatusBar()->showError(tr("No command!")); } } -void CliAndBreadcrumbsPresenter::executeFts(QString& command) -{ - string searchedString = command.toStdString().substr( - CliAndBreadcrumbsView::CMD_FTS.size()); - if(!searchedString.empty()) { - mainPresenter->doFts(QString::fromStdString(searchedString), true); - } -} - void CliAndBreadcrumbsPresenter::executeListOutlines() { mainPresenter->getOrloj()->showFacetOutlineList(mind->getOutlines()); diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.h b/app/src/qt/cli_n_breadcrumbs_presenter.h index 82bee235..8ee47639 100644 --- a/app/src/qt/cli_n_breadcrumbs_presenter.h +++ b/app/src/qt/cli_n_breadcrumbs_presenter.h @@ -50,11 +50,13 @@ class CliAndBreadcrumbsPresenter : public QObject void executeListOutlines(); void executeListNotes(); - void executeFts(QString& command); private slots: - void executeCommand(); + /** + * @brief key pressed handler of the CLI edit line + */ void handleCliTextChanged(const QString& text); + void executeCommand(); }; } diff --git a/app/src/qt/cli_n_breadcrumbs_view.cpp b/app/src/qt/cli_n_breadcrumbs_view.cpp index 087a5c7e..3bc997e7 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.cpp +++ b/app/src/qt/cli_n_breadcrumbs_view.cpp @@ -20,22 +20,37 @@ namespace m8r { +// "Enter a prompt - \"? .\" for help, \"> .\" to chat (Alt-x), \"/ .\" run command (Ctrl-/), or type a phrase to find." +constexpr const auto CLI_HELP_SHADOW_TEXT + = "Enter a prompt, command or phrase - type ? for help."; + + CliView::CliView(CliAndBreadcrumbsView* cliAndBreadcrumps, QWidget* parent) - : QLineEdit(parent) + : QLineEdit(parent), + PALETTE_DISABLED_TEXT(this->palette()), + PALETTE_ENABLED_TEXT(this->palette()), + PALETTE_ERROR_TEXT(this->palette()) { this->cliAndBreadcrumps = cliAndBreadcrumps; -#if !defined(__APPLE__) - // changing pallette @ macOS w/ dark model @ Qt 5.15.x+ causes edit line to be unreadable - // TODO leak - QPalette* palette = new QPalette(); - palette->setColor( - QPalette::Text, + PALETTE_DISABLED_TEXT.setColor( + QPalette::Text, QColor(125, 125, 125)); - // TODO LookAndFeels::getInstance().getCliTextColor()); - setPalette(*palette); + + PALETTE_ENABLED_TEXT.setColor( + QPalette::Text, + LookAndFeels::getInstance().getCliTextColor()); + + PALETTE_ERROR_TEXT.setColor( + QPalette::Text, + QColor(125, 0, 0)); + +#if !defined(__APPLE__) + // changing pallette @ macOS w/ dark model @ Qt 5.15.x+ causes edit line to be unreadable + setPalette(PALETTE_ENABLED_TEXT); #endif - setToolTip("Run a command: Alt-x to activate, type > for available commands, type search string for FTS."); + + setToolTip(CLI_HELP_SHADOW_TEXT); } void CliView::keyPressEvent(QKeyEvent* event) @@ -51,26 +66,112 @@ void CliView::keyPressEvent(QKeyEvent* event) QLineEdit::keyPressEvent(event); } +void CliView::focusOutEvent(QFocusEvent* event) +{ + MF_DEBUG("CLI: on focus lost" << std::endl); + + if(text().size() == 0) { + setText(CLI_HELP_SHADOW_TEXT); + } + + QLineEdit::focusOutEvent(event); +} + /* * CLI and breadcrumbs view. */ -const QString CliAndBreadcrumbsView::CMD_HELP +const QStringList CliAndBreadcrumbsView::EMPTY_CMDS = QStringList(); + +// help + +const QString CliAndBreadcrumbsView::CHAR_HELP = "?"; -const QString CliAndBreadcrumbsView::CMD_FTS - = "> fts "; +const QString CliAndBreadcrumbsView::CMD_HELP_HELP + = "? ... ? for help"; +const QString CliAndBreadcrumbsView::CMD_HELP_SEARCH + = "? / to search"; +const QString CliAndBreadcrumbsView::CMD_HELP_KNOWLEDGE + = "? @ for knowledge recherche"; +const QString CliAndBreadcrumbsView::CMD_HELP_CMD + = "? > to run a command"; +const QString CliAndBreadcrumbsView::CMD_HELP_CHAT + = "? : to chat with workspace, Notebook or Note"; +const QString CliAndBreadcrumbsView::CMD_HELP_FTS + = "? full-text search phrase"; + +const QStringList CliAndBreadcrumbsView::HELP_CMDS = QStringList() + << CMD_HELP_HELP + << CMD_HELP_SEARCH + // << CMD_HELP_KNOWLEDGE + << CMD_HELP_CMD + // << CMD_HELP_CHAT + // << CMD_HELP_FTS + ; + +const QString CliAndBreadcrumbsView::CHAR_FIND + = "/"; + const QString CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME - = "> find outline by name "; + = "/ find notebook by name "; +const QString CliAndBreadcrumbsView::CMD_FIND_NOTE_BY_NAME + = "/ find note by name "; +const QString CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_TAG + = "/ find notebook by tag "; +const QString CliAndBreadcrumbsView::CMD_FIND_NOTE_BY_TAG + = "/ find note by tag "; + +const QStringList CliAndBreadcrumbsView::HELP_FIND_CMDS = QStringList() + << CMD_FIND_OUTLINE_BY_NAME + << CMD_FIND_OUTLINE_BY_TAG +// << CMD_FIND_NOTE_BY_NAME +// << CMD_FIND_NOTE_BY_TAG + ; + +const QString CliAndBreadcrumbsView::CHAR_KNOW + = "@"; + +// knowledge recherche uses current context / selected entity to lookup the knowledge +const QString CliAndBreadcrumbsView::CMD_KNOW_WIKIPEDIA + = "@wikipedia"; +const QString CliAndBreadcrumbsView::CMD_KNOW_ARXIV + = "@arxiv"; +const QString CliAndBreadcrumbsView::CMD_KNOW_STACK_OVERFLOW + = "@stackoverflow"; +const QString CliAndBreadcrumbsView::CMD_KNOW_DUCK + = "@duckduckgo"; +const QString CliAndBreadcrumbsView::CMD_KNOW_GITHUB + = "@github"; +const QString CliAndBreadcrumbsView::CMD_KNOW_BARD + = "@bard"; + +const QStringList CliAndBreadcrumbsView::HELP_KNOW_CMDS = QStringList() +// << CMD_KNOW_WIKIPEDIA +// << CMD_KNOW_ARXIV + ; + +const QString CliAndBreadcrumbsView::CHAR_CMD + = ">"; + +const QString CliAndBreadcrumbsView::CMD_HOME + = "> home"; // go to home O +const QString CliAndBreadcrumbsView::CMD_TERMINAL + = "> terminal"; const QString CliAndBreadcrumbsView::CMD_LIST_OUTLINES - = "> list outlines"; + = "> list notebooks"; + +const QStringList CliAndBreadcrumbsView::HELP_CMD_CMDS = QStringList() +// << CMD_HOME +// << CMD_TERMINAL + << CMD_LIST_OUTLINES + ; -const QString CliAndBreadcrumbsView::CMD_TOOL - = "> tool"; +const QString CliAndBreadcrumbsView::CHAR_CHAT + = ":"; // TODO migrate all commands to constants const QStringList CliAndBreadcrumbsView::DEFAULT_CMDS = QStringList() - << CMD_HELP /* << CMD_EXIT // home tools @@ -100,11 +201,8 @@ const QStringList CliAndBreadcrumbsView::DEFAULT_CMDS = QStringList() // TODO new outline // TODO new note */ - << CMD_FTS << CMD_LIST_OUTLINES << CMD_FIND_OUTLINE_BY_NAME - - << CMD_TOOL ; @@ -126,34 +224,56 @@ CliAndBreadcrumbsView::CliAndBreadcrumbsView(QWidget* parent, bool zenMode) } layout->addWidget(breadcrumbsLabel); - cli = new CliView(this, parent); - cliCompleter = new QCompleter(new QStandardItemModel{}, parent); - cliCompleter->setCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive); - cliCompleter->setCompletionMode(QCompleter::PopupCompletion); - cli->setCompleter(cliCompleter); - cli->setText("Enter a prompt - \"? .\" for help, \"/ .\" to chat (Alt-x), \"> .\" run command (Ctrl-/), or type a phrase to find."); + this->cli = new CliView(this, parent); + this->cliCompleter = new QCompleter(new QStandardItemModel{}, parent); + this->cliCompleter->setCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive); + this->cliCompleter->setCompletionMode(QCompleter::PopupCompletion); + this->cli->setCompleter(cliCompleter); + this->cli->setText(CLI_HELP_SHADOW_TEXT); layout->addWidget(cli); showBreadcrumb(); } +void CliAndBreadcrumbsView::showCli(bool selectAll) +{ + MF_DEBUG("CLI view: SHOW (select ALL = " << std::boolalpha << selectAll << ")" << std::endl); + + // if help presents, then clear it AND change color + if(cli->text().startsWith(CLI_HELP_SHADOW_TEXT)) { + cli->clear(); + } +#if !defined(__APPLE__) + setPalette(this->cli->PALETTE_ENABLED_TEXT); +#endif + + // show + show(); + cli->setFocus(); + if(selectAll) { + cli->selectAll(); + } +} + void appendToStandardModel(const QStringList& list, QStandardItemModel* completerModel) { for(const auto& i:list) { QStandardItem* item = new QStandardItem(i); // TODO icons are not shown on certain platforms (Linux/x86) -// if(i.startsWith(".")) { -// item->setIcon(QIcon(":/menu-icons/cli.svg")); -// } else { -// item->setIcon(QIcon(":/menu-icons/find.svg")); -// } + /* + if(i.startsWith(".")) { + item->setIcon(QIcon(":/menu-icons/cli.svg")); + } else { + item->setIcon(QIcon(":/menu-icons/find.svg")); + } + */ - // IMPROVE item->setToolTip("tool tip"); + // TODO IMPROVE item->setToolTip("tool tip"); completerModel->appendRow(item); } } -void CliAndBreadcrumbsView::updateCompleterModel(const QStringList* list) +void CliAndBreadcrumbsView::updateCompleterModel(const QStringList& helpList, const QStringList* list) { QStandardItemModel* completerModel=(QStandardItemModel*)cliCompleter->model(); if(completerModel==nullptr) { @@ -173,12 +293,12 @@ void CliAndBreadcrumbsView::updateCompleterModel(const QStringList* list) if(list!=nullptr) { appendToStandardModel(*list, completerModel); } - appendToStandardModel(DEFAULT_CMDS, completerModel); + appendToStandardModel(helpList, completerModel); } void CliAndBreadcrumbsView::forceFtsHistoryCompletion() { - updateCompleterModel(); + updateCompleterModel(DEFAULT_CMDS); // ensure completion is shown despite there is NO filtering character cliCompleter->complete(); @@ -237,27 +357,4 @@ void CliAndBreadcrumbsView::showBreadcrumb() } } -void CliAndBreadcrumbsView::showCli(bool selectAll) -{ - // clear help if it presents - if(cli->text().startsWith("Use ")) { - cli->setText(""); - - // TODO leak? - QPalette* palette = new QPalette(); - palette->setColor( - QPalette::Text, - LookAndFeels::getInstance().getCliTextColor()); - setPalette(*palette); - } - - show(); - cli->setFocus(); - if(selectAll) { - cli->selectAll(); - } - updateCompleterModel(); - cliCompleter->complete(); -} - } // m8r namespace diff --git a/app/src/qt/cli_n_breadcrumbs_view.h b/app/src/qt/cli_n_breadcrumbs_view.h index 36de011e..135740e5 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.h +++ b/app/src/qt/cli_n_breadcrumbs_view.h @@ -28,6 +28,9 @@ namespace m8r { class CliAndBreadcrumbsView; +/** + * @brief Custom line edit with key and color handling. + */ class CliView : public QLineEdit { Q_OBJECT @@ -35,9 +38,17 @@ class CliView : public QLineEdit private: CliAndBreadcrumbsView* cliAndBreadcrumps; +protected: + void focusOutEvent(QFocusEvent*) override; + public: + QPalette PALETTE_DISABLED_TEXT; + QPalette PALETTE_ENABLED_TEXT; + QPalette PALETTE_ERROR_TEXT; + explicit CliView(CliAndBreadcrumbsView* cliAndBreadcrumps, QWidget* parent); void keyPressEvent(QKeyEvent* event) override; + signals: void keyReleased(QKeyEvent* event); }; @@ -49,41 +60,92 @@ class CliAndBreadcrumbsView : public QWidget friend class CliAndBreadcrumbsPresenter; private: - static const QStringList DEFAULT_CMDS; - // IMPROVE horizontal container w/ buttons names and / labels to navigate easily up/down QLabel* breadcrumbsLabel; CliView* cli; QCompleter* cliCompleter; + QStringList cliCompleterHistoryList; bool zenMode; public: - static const QString CMD_HELP; + static const QStringList DEFAULT_CMDS; // TODO remove + + static const QStringList EMPTY_CMDS; + + // help + + static const QString CHAR_HELP; + + static const QString CMD_HELP_HELP; + static const QString CMD_HELP_SEARCH; + static const QString CMD_HELP_KNOWLEDGE; + static const QString CMD_HELP_CMD; + static const QString CMD_HELP_CHAT; + static const QString CMD_HELP_FTS; + + static const QStringList HELP_CMDS; + + // search + + static const QString CHAR_FIND; - static const QString CMD_FTS; static const QString CMD_FIND_OUTLINE_BY_NAME; + static const QString CMD_FIND_OUTLINE_BY_TAG; + static const QString CMD_FIND_NOTE_BY_NAME; + static const QString CMD_FIND_NOTE_BY_TAG; + + static const QStringList HELP_FIND_CMDS; + + // knowledge + + static const QString CHAR_KNOW; + + static const QString CMD_KNOW_WIKIPEDIA; + static const QString CMD_KNOW_ARXIV; + static const QString CMD_KNOW_STACK_OVERFLOW; + static const QString CMD_KNOW_DUCK; + static const QString CMD_KNOW_GITHUB; + static const QString CMD_KNOW_BARD; + + static const QStringList HELP_KNOW_CMDS; + + // command + + static const QString CHAR_CMD; + + static const QString CMD_HOME; + static const QString CMD_TERMINAL; static const QString CMD_LIST_OUTLINES; - static const QString CMD_TOOL; + static const QStringList HELP_CMD_CMDS; + + // chat + + static const QString CHAR_CHAT; public: explicit CliAndBreadcrumbsView(QWidget* parent, bool zenMode=true); + /** + * @brief Keyboard shortcut handler (Alt-x). + */ + void showCli(bool selectAll=true); + void addCompleterItem(const QString& item) { cliCompleterHistoryList.insert(0, item); } - void updateCompleterModel(const QStringList* list=nullptr); + void updateCompleterModel(const QStringList& helpList, const QStringList* list=nullptr); void forceFtsHistoryCompletion(); QString getFirstCompletion() const; void setBreadcrumbPath(const QString& path); void setCommand(const char* command); const QString getCommand() const; void show(); + void complete() { cliCompleter->complete(); } void hide(); void showBreadcrumb(); - void showCli(bool selectAll=true); }; } diff --git a/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp b/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp index e46be327..c489b7db 100644 --- a/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp +++ b/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp @@ -74,7 +74,7 @@ FindOutlineByTagDialog::FindOutlineByTagDialog(Ontology& ontology, QWidget *pare // signals QObject::connect(editTagsGroup, SIGNAL(signalTagSelectionChanged()), this, SLOT(handleTagsChanged())); - // dialog + // dialog setWindowTitle(tr("Find Notebook by Tags")); // height is set to make sure listview gets enough lines resize(fontMetrics().averageCharWidth()*55, fontMetrics().height()*30); @@ -88,7 +88,9 @@ FindOutlineByTagDialog::~FindOutlineByTagDialog() delete closeButton; } -void FindOutlineByTagDialog::show(vector& outlines, vector* tags, vector* customizedNames) +void FindOutlineByTagDialog::show( + vector& outlines, vector* tags, vector* customizedNames, const string& searchPhrase +) { choice = nullptr; // tags are changed > need to be refreshed @@ -122,7 +124,12 @@ void FindOutlineByTagDialog::show(vector& outlines, vector* editTagsGroup->slotAddTag(); } } - editTagsGroup->getLineEdit()->clear(); + + if(searchPhrase.size()) { + editTagsGroup->getLineEdit()->setText(QString::fromStdString(searchPhrase)); + } else { + editTagsGroup->getLineEdit()->clear(); + } editTagsGroup->getLineEdit()->setFocus(); QDialog::show(); } diff --git a/app/src/qt/dialogs/find_outline_by_tag_dialog.h b/app/src/qt/dialogs/find_outline_by_tag_dialog.h index b0241280..b9aa5a80 100644 --- a/app/src/qt/dialogs/find_outline_by_tag_dialog.h +++ b/app/src/qt/dialogs/find_outline_by_tag_dialog.h @@ -74,7 +74,9 @@ class FindOutlineByTagDialog : public QDialog void show( std::vector& outlines, std::vector* tags=nullptr, - std::vector* customizedNames=nullptr); + std::vector* customizedNames=nullptr, + const std::string& searchPhrase="" + ); signals: void searchFinished(); diff --git a/app/src/qt/dialogs/run_tool_dialog.cpp b/app/src/qt/dialogs/run_tool_dialog.cpp index 7d44a308..f4b6aed0 100644 --- a/app/src/qt/dialogs/run_tool_dialog.cpp +++ b/app/src/qt/dialogs/run_tool_dialog.cpp @@ -34,8 +34,6 @@ RunToolDialog::RunToolDialog(QWidget* parent) QString{TOOL_GOOGLE_SEARCH}, QString{TOOL_GH_REPOS}, QString{TOOL_GH_TOPICS}, - QString{TOOL_H2O_GPT_WEB}, - QString{TOOL_H2O_GPT_API}, QString{TOOL_WIKIPEDIA} }; @@ -113,14 +111,6 @@ QString RunToolDialog::getTemplateTextForToolName(string selectedTool) const return templateText; } else if(selectedTool == TOOL_DEEPL) { return QString{"https://www.deepl.com/en/translator"}; - } else if(selectedTool == TOOL_DOC_PYTHON) { - QString templateText{"https://docs.python.org/3.10/search.html?q="}; - templateText.append(TOOL_PHRASE); - return templateText; - } else if(selectedTool == TOOL_DOC_CPP) { - QString templateText{"https://duckduckgo.com/?sites=cppreference.com&ia=web&q="}; - templateText.append(TOOL_PHRASE); - return templateText; } else if(selectedTool == TOOL_STACK_OVERFLOW) { QString templateText{"https://stackoverflow.com/search?q="}; templateText.append(TOOL_PHRASE); @@ -147,11 +137,6 @@ QString RunToolDialog::getTemplateTextForToolName(string selectedTool) const QString temlateText{"https://www.google.com/search?q="}; temlateText.append(TOOL_PHRASE); return temlateText; - } else if(selectedTool == TOOL_H2O_GPT_API) { - // TODO: sniff HTTP traffic and use HTTP client/JSon to talk to the service - MF_DEBUG("H2O GPT API not implemented yet"); - } else if(selectedTool == TOOL_H2O_GPT_WEB) { - return QString{"https://gpt.h2o.ai/"}; } else if(selectedTool == TOOL_WIKIPEDIA) { // TODO: URL QString temlateText{"https://en.wikipedia.org/w/index.php?search="}; diff --git a/app/src/qt/left_toolbar_view.cpp b/app/src/qt/left_toolbar_view.cpp index 5f693407..b4671197 100644 --- a/app/src/qt/left_toolbar_view.cpp +++ b/app/src/qt/left_toolbar_view.cpp @@ -25,43 +25,28 @@ LeftToolbarView::LeftToolbarView(MainWindowView* mainWindowView) mainWindow{mainWindowView} { actionLeftToolbarArxiv = addAction( - QIcon(":/icons/arxiv.png"), + QIcon(":/icons/adapt.svg"), "Open arXiv and find papers related to the current context... (Alt-1)"); actionLeftToolbarWikipedia = addAction( - QIcon(":/icons/wikipedia.png"), + QIcon(":/icons/adapt.svg"), "Open Wikipedia and find entries related to the current context... (Alt-2)"); actionLeftToolbarStackOverflow = addAction( - QIcon(":/icons/stackoverflow.png"), + QIcon(":/icons/adapt.svg"), "Open StackOverflow and find entries related to the current context... (Alt-3)"); - actionLeftToolbarH2oGpt= addAction( - QIcon(":/icons/h2oai.png"), - "Open h2oGPT and chat about the current context... (Alt-4)"); - actionLeftToolbarDuckDuckGo = addAction( - QIcon(":/icons/duckduckgo.png"), + QIcon(":/icons/adapt.svg"), "Open DuckDuckGo and find entries related to the current context... (Alt-5)"); actionLeftToolbarGitHub = addAction( - QIcon(":/icons/github.png"), + QIcon(":/icons/adapt.svg"), "Open GitHub and find entries related to the current context... (Alt-6)"); actionLeftToolbarBard = addAction( - QIcon(":/icons/bard.png"), + QIcon(":/icons/adapt.svg"), "Open Bard and chat about the current context... (Alt-7)"); - - actionLeftToolbarPython = addAction( - QIcon(":/icons/python.png"), - "Open Python documentation and find entries related to the current context... (Alt-8)"); - - actionLeftToolbarCpp = addAction( - QIcon(":/icons/cpp.png"), - "Open C++ documentation and find entries related to the current context... (Alt-9)"); - - // TODO "Let chatGPT to explaine in simple terms..." - // TODO "Use Gramarly to check to grammar..." > bard/chatGPT can check grammar } LeftToolbarView::~LeftToolbarView() diff --git a/app/src/qt/left_toolbar_view.h b/app/src/qt/left_toolbar_view.h index e1d69d86..ed8688df 100644 --- a/app/src/qt/left_toolbar_view.h +++ b/app/src/qt/left_toolbar_view.h @@ -37,12 +37,9 @@ class LeftToolbarView : public QToolBar QAction* actionLeftToolbarArxiv; QAction* actionLeftToolbarWikipedia; QAction* actionLeftToolbarStackOverflow; - QAction* actionLeftToolbarH2oGpt; QAction* actionLeftToolbarDuckDuckGo; QAction* actionLeftToolbarGitHub; QAction* actionLeftToolbarBard; - QAction* actionLeftToolbarPython; - QAction* actionLeftToolbarCpp; // IMPORTANT: hide event hidden as it was causing undesired configuration // changes and toolbar hiding on Qt's spontaneous hide/show events. Citation diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 3a51f8bc..812a4180 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -196,14 +196,6 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) view.getLeftToolBar()->actionLeftToolbarStackOverflow, SIGNAL(triggered()), this, SLOT(doActionStackOverflowToolbar()) ); - QObject::connect( - new QShortcut(QKeySequence("Alt+4"), view.getOrloj()), SIGNAL(activated()), - this, SLOT(doActionH2oGptToolbar()) - ); - QObject::connect( - view.getLeftToolBar()->actionLeftToolbarH2oGpt, SIGNAL(triggered()), - this, SLOT(doActionH2oGptToolbar()) - ); QObject::connect( new QShortcut(QKeySequence("Alt+5"), view.getOrloj()), SIGNAL(activated()), this, SLOT(doActionDuckDuckGoToolbar()) @@ -228,18 +220,6 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) view.getLeftToolBar()->actionLeftToolbarBard, SIGNAL(triggered()), this, SLOT(doActionBardToolbar()) ); - QObject::connect( - new QShortcut(QKeySequence("Alt+8"), view.getOrloj()), SIGNAL(activated()), - this, SLOT(doActionPythonToolbar()) - ); - QObject::connect( - view.getLeftToolBar()->actionLeftToolbarPython, SIGNAL(triggered()), - this, SLOT(doActionPythonToolbar()) - ); - QObject::connect( - new QShortcut(QKeySequence("Alt+9"), view.getOrloj()), SIGNAL(activated()), - this, SLOT(doActionCppToolbar()) - ); */ // wire TOP toolbar signals QObject::connect( @@ -935,7 +915,7 @@ void MainWindowPresenter::slotMainToolbarVisibilityChanged(bool visibility) mdConfigRepresentation->save(config); } -void MainWindowPresenter::doActionFindOutlineByName() +void MainWindowPresenter::doActionFindOutlineByName(const std::string& phrase) { // IMPROVE rebuild model ONLY if dirty i.e. an outline name was changed on save vector os{mind->getOutlines()}; @@ -943,6 +923,9 @@ void MainWindowPresenter::doActionFindOutlineByName() vector es{os.begin(),os.end()}; findOutlineByNameDialog->show(es); + if(phrase.size()) { + findOutlineByNameDialog->setSearchedString(QString::fromStdString(phrase)); + } } void MainWindowPresenter::handleFindOutlineByName() @@ -971,14 +954,14 @@ void MainWindowPresenter::handleFindThingByName() } } -void MainWindowPresenter::doActionFindOutlineByTag() +void MainWindowPresenter::doActionFindOutlineByTag(const string& tag) { // IMPROVE rebuild model ONLY if dirty i.e. an outline name was changed on save vector os{mind->getOutlines()}; Outline::sortByName(os); vector outlines{os.begin(),os.end()}; - findOutlineByTagDialog->show(outlines); + findOutlineByTagDialog->show(outlines, nullptr, nullptr, tag); } void MainWindowPresenter::handleFindOutlineByTag() @@ -2015,12 +1998,6 @@ void MainWindowPresenter::handleRunTool() ); // RUN tool - if(selectedTool == TOOL_H2O_GPT_API) { - // TODO: sniff HTTP traffic and use HTTP client/JSon to talk to the service - MF_DEBUG("H2O GPT API not implemented yet"); - return; - } - QDesktopServices::openUrl(QUrl{command}); } @@ -2154,11 +2131,6 @@ void MainWindowPresenter::doActionStackOverflowToolbar() handleLeftToolbarAction(TOOL_STACK_OVERFLOW); } -void MainWindowPresenter::doActionH2oGptToolbar() -{ - handleLeftToolbarAction(TOOL_H2O_GPT_WEB); -} - void MainWindowPresenter::doActionDuckDuckGoToolbar() { handleLeftToolbarAction(TOOL_DUCKDUCKGO); @@ -2174,16 +2146,6 @@ void MainWindowPresenter::doActionBardToolbar() handleLeftToolbarAction(TOOL_GOOGLE_BARD); } -void MainWindowPresenter::doActionPythonToolbar() -{ - handleLeftToolbarAction(TOOL_DOC_PYTHON); -} - -void MainWindowPresenter::doActionCppToolbar() -{ - handleLeftToolbarAction(TOOL_DOC_CPP); -} - void MainWindowPresenter::handleLeftToolbarAction(string selectedTool) { // get PHRASE from the active context: @@ -2245,12 +2207,6 @@ void MainWindowPresenter::handleLeftToolbarAction(string selectedTool) // phrase replace @ template > get command, if invalid, then fallback QString command = templateText.replace(QString{TOOL_PHRASE}, phrase); MF_DEBUG("Run tool: command '" << command.toStdString() << "'" << endl); - if(selectedTool == TOOL_H2O_GPT_API) { - // TODO: sniff HTTP traffic and use HTTP client/JSon to talk to the service - MF_DEBUG("H2O GPT API not implemented yet"); - return; - } - QDesktopServices::openUrl(QUrl{command}); } diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index bfad20c9..b730923d 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -218,12 +218,12 @@ public slots: // recall void doActionFts(); void doFts(const QString& pattern, bool doSearch=false); - void doActionFindOutlineByName(); + void doActionFindOutlineByName(const std::string& phrase=""); void handleFindOutlineByName(); void handleFindThingByName(); void doActionFindNoteByName(); void handleFindNoteByName(); - void doActionFindOutlineByTag(); + void doActionFindOutlineByTag(const std::string& tag=""); void handleFindOutlineByTag(); void doActionFindNoteByTag(); void doTriggerFindNoteByTag(const m8r::Tag* tag); @@ -311,7 +311,7 @@ public slots: void doActionFormatTocWithoutTags(); void doActionFormatTimestamp(); void doActionFormatCodeBlock(); - void doActionFormatMathBlock(); + void doActionFormatMathBlock(); void doActionFormatDiagramBlock(); void doActionFormatDiagramPie(); void doActionFormatDiagramFlow(); @@ -376,12 +376,9 @@ public slots: void doActionArxivToolbar(); void doActionWikipediaToolbar(); void doActionStackOverflowToolbar(); - void doActionH2oGptToolbar(); void doActionDuckDuckGoToolbar(); void doActionGitHubToolbar(); void doActionBardToolbar(); - void doActionPythonToolbar(); - void doActionCppToolbar(); // help void doActionHelpDocumentation(); void doActionHelpWeb(); diff --git a/app/src/qt/widgets/edit_tags_panel.h b/app/src/qt/widgets/edit_tags_panel.h index efa26b59..e2ca1236 100644 --- a/app/src/qt/widgets/edit_tags_panel.h +++ b/app/src/qt/widgets/edit_tags_panel.h @@ -74,6 +74,9 @@ class EditTagsPanel : public QGroupBox ~EditTagsPanel(); QLineEdit* getLineEdit() const { return lineEdit; } + void setTagToFind(const std::string& tagAsText) { + lineEdit->setText(QString::fromStdString(tagAsText)); + } void clearTagList(); void refreshOntologyTags(); void refresh(const std::vector* noteTags); diff --git a/build/Makefile b/build/Makefile index 5fe13bb5..a59bf6c3 100644 --- a/build/Makefile +++ b/build/Makefile @@ -18,7 +18,11 @@ .DEFAULT_GOAL := help -MINDFORGER_VERSION := 1.55.1 +# +# variables +# + +MINDFORGER_VERSION := 2.0.0 MINDFORGER_RELEASE_BASE_DIR := /home/dvorka/p/mindforger/release MINDFORGER_RELEASE_DIR := $(MINDFORGER_RELEASE_BASE_DIR)/$(MINDFORGER_VERSION)-maker @@ -31,38 +35,22 @@ MF_LANG := "en" # Ubuntu distro: trusty xenial bionic focal jammy kinetic DISTRO := "bionic" + +# +# targets +# + + .PHONY: help -help: +help: ## make targets help @echo "MindForger Swiss knife help:" - @echo "clean clean build artifacts" - @echo "build production build MindForger application binary" - @echo "build-dev development build of MindForger application binary" - @echo "build-ci CI build MindForger application binary" - @echo "run run production MindForger" - @echo "run-dev run development MindForger" - @echo "l10n update and release localization strings: MF_LANG=en" - @echo "gen-lib-class generate lib C++ class skeleton: CLASS_NAME=My_Class" - @echo "gen-ui-class generate UI C++ class skeleton: CLASS_NAME=My_Class" - @echo "test-lib compile and run lib/ unit tests" - @echo "test-app compile and run app/ integration tests" - @echo "dist-all build all distributions" - @echo "dist-tarball build tarball distribution" - @echo "dist-deb build Debian distribution" - @echo "dist-rpm build .rpm package on Fedora" - @echo "dist-dmg build macOS Disk iMaGe .dmg package" - @echo "dist-debian-ppa add .deb to aptly PPA" - @echo "dist-ubuntu-deb locally build .deb for any Ubuntu version:" - @echo "dist-snap build snap distro for snapcraft.io" - @echo " DISTRO=focal" - @echo "doc-to-wiki mindforger-documentation to mindforger.wiki" - @echo "api-reference generate Doxygen documentation" - @echo "statistic show source code statistic" - @echo "git-subs-update update git submodules" - @echo "dev-install-local compile and install binary to ~/bin as MIND" + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ + | sort \ + | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' .PHONY: clean -clean: +clean: ## clean build artifacts rm -vf ../app/mindforger rm -vf ../lib/libmindforger.a rm -vf ../lib/test/src/mindforger-lib-unit-tests @@ -70,19 +58,24 @@ clean: cd ../lib/test && make clean +.PHONY: clean-app +clean-app: + rm -vf ../app/mindforger + + .PHONY: git-subs-update -git-subs-update: +git-subs-update: ## update Git submodules cd .. && git submodule update --init --recursive .PHONY: gen-lib-class -gen-lib-class: +gen-lib-class: ## generate lib C++ class skeleton: CLASS_NAME=My_Class @echo "Generating lib C++ class for name: $(CLASS_NAME)" ./make/gen-cpp-class.py $(CLASS_NAME) .PHONY: gen-ui-class -gen-ui-class: +gen-ui-class: ## generate UI C++ class skeleton: CLASS_NAME=My_Class @echo "Generating UI C++ class for name: $(CLASS_NAME)" ./make/gen-cpp-ui-class.py $(CLASS_NAME) @@ -99,12 +92,12 @@ gen-ui-class: ls -al ../app/mindforger -build: ../app/mindforger +build: clean-app ../app/mindforger ## build production MindForger application binary ls -al ../app/mindforger .PHONY: build-dev -build-dev: +build-dev: clean-app ## build development MindForger application binary @echo "Building DEV MindForger executable..." cd .. && qmake -r mindforger.pro DEFINES+=DO_MF_DEBUG && make -j 7 ; cd .. @echo "If build succeeded, then MindForger executable can be found in:\n app/mindforger" @@ -115,7 +108,7 @@ build-dev: .PHONY: build-rc -build-rc: +build-rc: clean-app ## build RC MindForger application binary @echo "MindForger RC build..." cd .. && qmake CONFIG+=mfrc -r mindforger.pro && make -j 7 @echo "If RC build succeeded, then MindForger executable can be found in:\n app/mindforger" @@ -123,7 +116,7 @@ build-rc: .PHONY: build-ci -build-ci: +build-ci: clean-app ## build CI MindForger application binary @echo "MindForger CI build..." cd .. && qmake CONFIG+=mfci -r mindforger.pro && make -j 7 @echo "If CI build succeeded, then MindForger executable can be found in:\n app/mindforger" @@ -131,26 +124,26 @@ build-ci: # -# build +# run # -run: ../app/mindforger +run: ../app/mindforger ## run production MindForger # cd ../app && pwd && ./mindforger cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer # cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/computer-hw.md # cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/bug-copy-image -run-rc: build-rc +run-rc: build-rc ## run MindForger RC build cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer -run-ci: build-ci +run-ci: build-ci ## run MindForger CI build cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer -run-dev: build-dev +run-dev: build-dev ## run MindForger development build cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/library-trainer # cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/computer-hw.md # cd ../app && pwd && ./mindforger /home/dvorka/mf-devel/bug-copy-image @@ -160,14 +153,7 @@ run-dev: build-dev # install # - -install: clean ../app/mindforger - cp -vf ../app/mindforger ~/bin - mv -vf ~/bin/mindforger ~/bin/mind - ~/bin/mind --version - - -install-dev-local: clean build-rc +install-dev-local: clean build-rc ## install MindForger RC build to ~/bin as 'mind' executable cp -vf ../app/mindforger ~/bin mv -vf ~/bin/mindforger ~/bin/mind ~/bin/mind --version @@ -179,16 +165,16 @@ install-dev-local: clean build-rc .PHONY: l10n -l10n: +l10n: ## update and release localization strings: MF_LANG=en cd make && ./l10n-update-strings.sh && ./l10n-edit-and-release.sh $(MF_LANG) .PHONY: ver-find -ver-find: +ver-find: ## pre-version update finder cd .. && git grep "1\.55" -test-lib: clean +test-lib: clean ## compile and run lib/ unit tests cd make && ./test-lib-units.sh @@ -205,14 +191,14 @@ $(MINDFORGER_RELEASE_DIR): mkdir -v $(MINDFORGER_RELEASE_DIR) || echo "$(MINDFORGER_RELEASE_DIR) already exists" -dist-tarball: dist-work-clean $(MF_MAKER_WORKING_DIR) $(MINDFORGER_RELEASE_DIR) +dist-tarball: dist-work-clean $(MF_MAKER_WORKING_DIR) $(MINDFORGER_RELEASE_DIR) ## build tarball distribution @echo "Building TARBALL distribution..." mkdir -vp $(MF_MAKER_WORKING_DIR) cp -vf ./tarball/tarball-build.sh $(MF_MAKER_WORKING_DIR) && cd $(MF_MAKER_WORKING_DIR) && ./tarball-build.sh cp -vf $(MF_MAKER_WORKING_DIR)/`cd $(MF_MAKER_WORKING_DIR) && ls -d mindforger*`/mindforger_$(MINDFORGER_VERSION)_tarball.tgz $(MINDFORGER_RELEASE_DIR) -dist-deb: dist-work-clean $(MF_MAKER_WORKING_DIR) $(MINDFORGER_RELEASE_DIR) +dist-deb: dist-work-clean $(MF_MAKER_WORKING_DIR) $(MINDFORGER_RELEASE_DIR) ## build Debian distribution @echo "Building DEB distribution..." mkdir -vp $(MF_MAKER_WORKING_DIR) cp -vf ./debian/debian-make-deb.sh $(MF_MAKER_WORKING_DIR) && cd $(MF_MAKER_WORKING_DIR) && ./debian-make-deb.sh @@ -220,7 +206,7 @@ dist-deb: dist-work-clean $(MF_MAKER_WORKING_DIR) $(MINDFORGER_RELEASE_DIR) .PHONY: dist-rpm -dist-rpm: +dist-rpm: ## build .rpm package on Fedora @echo "IMPORTANT: this target MUST be run on Fedora!" cd fedora && ./fedora-distro-setup.sh @echo "Building .rpm package..." @@ -229,18 +215,18 @@ dist-rpm: .PHONY: dist-dmg -dist-dmg: +dist-dmg: ## build macOS Disk iMaGe .dmg package @echo "Building .dmg package..." cd macos && ./mindforger-build.sh && ./dmg-package-build.sh .PHONY: dist-debian-ppa -dist-debian-ppa: +dist-debian-ppa: ## add .deb to aptly PPA cd debian && ./debian-aptly-add-deb.sh .PHONY: dist-ubuntu-deb -dist-ubuntu-deb: +dist-ubuntu-deb: ## locally build .deb for any Ubuntu version: DISTRO=bionic @echo "Building Ubuntu $(DISTRO) .deb ..." @echo "Copying latest version of .sh script to launchpad/ ..." @echo "Running .sh script ..." @@ -249,7 +235,7 @@ dist-ubuntu-deb: .PHONY: dist-snap -dist-snap: +dist-snap: ## build snap distro for snapcraft.io @echo "Building Snap ..." cd .. && make clean && cd build cp -vf snap/snapcraft.yaml .. && cd .. && snapcraft clean && snapcraft --debug @@ -266,22 +252,22 @@ dist-all-clean: rm -rvf $(MINDFORGER_RELEASE_DIR) -dist-all: dist-all-clean $(MINDFORGER_RELEASE_DIR) dist-tarball dist-deb +dist-all: dist-all-clean $(MINDFORGER_RELEASE_DIR) dist-tarball dist-deb ## build all distributions @echo "Building all $(MINDFORGER_VERSION) distributions" .PHONY: statistic -statistic: +statistic: ## show source code statistic cd make && ./statistic.sh .PHONY: doc-to-wiki -doc-to-wiki: +doc-to-wiki: ## mindforger-documentation to mindforger.wiki cd doc && ./mf-doc-to-wiki.py .PHONY: api-reference -api-reference: +api-reference: ## generate Doxygen source code documentation cd doxygen && doxygen ./mindforger.cfg # eof diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h index 5f847f52..3fb79e7c 100644 --- a/lib/src/config/configuration.h +++ b/lib/src/config/configuration.h @@ -111,12 +111,8 @@ constexpr const auto TOOL_GH_REPOS = "GitHub repositories"; constexpr const auto TOOL_GH_TOPICS = "GitHub topics"; constexpr const auto TOOL_GOOGLE_BARD = "Google Bard"; constexpr const auto TOOL_GOOGLE_SEARCH = "Google Search"; -constexpr const auto TOOL_H2O_GPT_WEB = "h2oGPT web"; -constexpr const auto TOOL_H2O_GPT_API = "h2oGPT API"; constexpr const auto TOOL_CHAT_GPT_WEB = "OpenAI chatGPT web"; constexpr const auto TOOL_WIKIPEDIA = "Wikipedia"; -constexpr const auto TOOL_DOC_PYTHON = "Python documentation"; -constexpr const auto TOOL_DOC_CPP = "C++ documentation"; // improve platform/language specific constexpr const auto DEFAULT_NEW_OUTLINE = "# New Markdown File\n\nThis is a new Markdown file created by MindForger.\n\n#Section 1\nThe first section.\n\n"; @@ -243,7 +239,7 @@ class Configuration { // configured Mind state where user wants Mind to be MindState desiredMindState; // current Mind state on the way to desired state - MindState mindState; + MindState mindState; // if count(N) > asyncMindTreshold then long-running mind computations should be run in async unsigned int asyncMindThreshold; @@ -477,7 +473,7 @@ class Configuration { void setUiEditorLiveSpellCheck(bool enable) { uiEditorLiveSpellCheck= enable; } std::string getUiEditorSpellCheckDefaultLanguage() const { return uiEditorSpellCheckLanguage; - } + } void setUiEditorSpellCheckDefaultLanguage(std::string lang) { uiEditorSpellCheckLanguage = lang; } diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h index 74ce4b18..0d5b8c7e 100644 --- a/lib/src/mind/ai/llm/wingman.h +++ b/lib/src/mind/ai/llm/wingman.h @@ -23,6 +23,9 @@ namespace m8r { +/** + * Wingman is a class that provides a set of LLM-based use cases. +*/ class Wingman { public: @@ -48,7 +51,7 @@ class Wingman void fix_grammar(std::string grammar); void fix_spelling(std::string spelling); void fix_style(std::string style); - + void translate(std::string text); void summarize(std::string text); diff --git a/lib/src/mind/knowledge_graph.h b/lib/src/mind/knowledge_graph.h index 4edd1050..cc1686b0 100644 --- a/lib/src/mind/knowledge_graph.h +++ b/lib/src/mind/knowledge_graph.h @@ -123,11 +123,11 @@ class KnowledgeGraph public: explicit KnowledgeGraph( - Mind* mind, - long unsigned mindColor=0x008C00, - long unsigned coreColor=0x000000, - long unsigned outlinesColor=0x220000, - long unsigned notesColor=0x000022); + Mind* mind, + long unsigned mindColor=0x008C00, + long unsigned coreColor=0x000000, + long unsigned outlinesColor=0x220000, + long unsigned notesColor=0x000022); KnowledgeGraph(const KnowledgeGraph&) = delete; KnowledgeGraph(const KnowledgeGraph&&) = delete; KnowledgeGraph &operator=(const KnowledgeGraph&) = delete; diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp index fca6e025..5098ae3c 100644 --- a/lib/src/mind/mind.cpp +++ b/lib/src/mind/mind.cpp @@ -977,8 +977,8 @@ string Mind::outlineMapKey2Relative(const string& outlineKey) const string Mind::outlineMapKey2Absolute(const string& outlineKey) const { string resolvedKey{ - config.getMemoryPath() - + FILE_PATH_SEPARATOR + config.getMemoryPath() + + FILE_PATH_SEPARATOR + outlineKey }; MF_DEBUG(" " << resolvedKey << endl); @@ -1051,7 +1051,7 @@ void Mind::outlinesMapSynchronize(Outline* outlinesMap) MF_DEBUG("DONE O links validity check" << endl); if(osToRemove.size()) { - MF_DEBUG("Removing Ns with INVALID O key:" << endl); + MF_DEBUG("Removing Ns with INVALID O key:" << endl); for(auto oToRemove:osToRemove) { MF_DEBUG(" " << oToRemove->getName() << endl); delete oToRemove; @@ -1143,7 +1143,7 @@ Outline* Mind::outlinesMapLearn(string outlineKey) } if(osToRemove.size()) { - MF_DEBUG("Removing Ns with MISSING relative O key:" << endl); + MF_DEBUG("Removing Ns with MISSING relative O key:" << endl); for(auto oToRemove:osToRemove) { MF_DEBUG(" " << oToRemove->getName() << endl); delete oToRemove; @@ -1187,6 +1187,8 @@ Outline* Mind::outlinesMapRemember() if(this->outlinesMap) { remind().getPersistence().save(this->outlinesMap); } + + return this->outlinesMap; } Note* Mind::noteNew( From 46ed122e883daa5166892ffda634cec2e96fe738 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Tue, 2 Jan 2024 22:29:55 +0100 Subject: [PATCH 056/131] Finishing version change 1.55.* -> 2.0.0 --- build/Makefile | 2 +- build/debian/debian-aptly-add-deb.sh | 2 +- build/debian/debian-make-deb.sh | 16 +++++++-------- build/debian/debian/changelog | 8 ++++---- build/fedora/fedora-rpm-from-deb.sh | 4 ++-- build/macos/env.sh | 4 ++-- build/snap/snapcraft.yaml | 2 +- build/tarball/tarball-build.sh | 6 +++--- build/ubuntu/debian/changelog | 4 ++-- .../ubuntu-launchpad-releases-from-beast.sh | 20 +++++++++---------- 10 files changed, 34 insertions(+), 34 deletions(-) diff --git a/build/Makefile b/build/Makefile index a59bf6c3..16765745 100644 --- a/build/Makefile +++ b/build/Makefile @@ -171,7 +171,7 @@ l10n: ## update and release localization strings: MF_LANG=en .PHONY: ver-find ver-find: ## pre-version update finder - cd .. && git grep "1\.55" + cd .. && git grep -n "1\.55" test-lib: clean ## compile and run lib/ unit tests diff --git a/build/debian/debian-aptly-add-deb.sh b/build/debian/debian-aptly-add-deb.sh index 857777ad..d9250c36 100755 --- a/build/debian/debian-aptly-add-deb.sh +++ b/build/debian/debian-aptly-add-deb.sh @@ -32,7 +32,7 @@ # See 'MindForger Release Guide#Debian and my PPA' notebook for detailed steps description... # .deb package to be added -export NEW_VERSION_NAME="1.55.1" +export NEW_VERSION_NAME="2.0.0" export NEW_RELEASE_NAME="mindforger_${NEW_VERSION_NAME}" export NEW_DEB_NAME="${NEW_RELEASE_NAME}-1_amd64.deb" # Debian release ~ aptly publish diff --git a/build/debian/debian-make-deb.sh b/build/debian/debian-make-deb.sh index 7274b6a0..a1c75374 100755 --- a/build/debian/debian-make-deb.sh +++ b/build/debian/debian-make-deb.sh @@ -41,7 +41,7 @@ fi # ############################################################################ function createChangelog() { - # Debian tooling changelog hints: + # Debian tooling changelog hints: # - signature line MUST have one whitespace prefix # - signature line MUST have double space between email and timestamp # - traling lines must have exactly one space @@ -93,7 +93,7 @@ function buildDebPackage() { # echo "This script must NOT be run if debug code is enabled - disable DO_M8R_DEBUG first" # exit 1 #fi - + # # 1) create upstream tarball # @@ -103,7 +103,7 @@ function buildDebPackage() { cd ${MFBUILD}/${MF} # copy project files to current directory cp -rvf ${MFSRC}/* ${MFSRC}/*.* . - + # 1.2) prune MindForger project source: tests, *.o/... build files, ... echo -e "\n# MF project cleanup ########################################" rm -vrf ./.git ./app/mindforger ./build ./app/test ./lib/test @@ -112,13 +112,13 @@ function buildDebPackage() { # 1.3) generate makefiles (will be used later to build binary) qmake -r mindforger.pro - + # 1.4) create tar archive createTarball # # 2) create source deb - # + # # 2.1) add Debian control files cp -rvf ${MFSRC}/build/debian/debian . createChangelog ./debian/changelog @@ -129,7 +129,7 @@ function buildDebPackage() { echo "OK: GPG agent running." else gpg-agent --daemon - fi + fi DEBEMAIL="martin.dvorak@mindforger.com" DEBFULLNAME="Martin Dvorak" @@ -142,7 +142,7 @@ function buildDebPackage() { # # 3) create source deb - # + # # 3.1) build deb # build source deb package dpkg-buildpackage -S @@ -153,7 +153,7 @@ function buildDebPackage() { # # Main # # ############################################################################ -export ARG_VERSION="1.55.0" +export ARG_VERSION="2.0.0" export ARG_BAZAAR_MSG="MindForger ${ARG_VERSION} release." # Debian releases: https://www.debian.org/releases/ diff --git a/build/debian/debian/changelog b/build/debian/debian/changelog index d59154ca..afadb9da 100644 --- a/build/debian/debian/changelog +++ b/build/debian/debian/changelog @@ -1,6 +1,6 @@ -mindforger (1.55.0-1) unstable; urgency=low - +mindforger (2.0.0-1) unstable; urgency=low + * Initial New features. - - -- Martin Dvorak (Dvorka) Sat, 1 Jan 2023 14:11:33 +0100 + + -- Martin Dvorak (Dvorka) Sat, 1 Jan 2024 14:11:33 +0100 diff --git a/build/fedora/fedora-rpm-from-deb.sh b/build/fedora/fedora-rpm-from-deb.sh index e3f2b359..cd896521 100755 --- a/build/fedora/fedora-rpm-from-deb.sh +++ b/build/fedora/fedora-rpm-from-deb.sh @@ -31,7 +31,7 @@ echo "===============================================================" if [[ -z "${1}" ]] then - export MFVERSION="1.55.0" + export MFVERSION="2.0.0" else export MFVERSION="${1}" fi @@ -68,7 +68,7 @@ cd ${MFPRJNAME} export MFRPMROOT=`pwd` # bin build -# --target=x86_64 +# --target=x86_64 # --target=i386 rpmbuild --target=x86_64 --buildroot ${MFRPMROOT}/ -bb ${MFPRJNAME}-2.spec # noarch would be for SOURCE deb diff --git a/build/macos/env.sh b/build/macos/env.sh index 50d27224..5147a6f9 100644 --- a/build/macos/env.sh +++ b/build/macos/env.sh @@ -17,14 +17,14 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -export MINDFORGER_VERSION="1.55.0" +export MINDFORGER_VERSION="2.0.0" # aligned with Ubuntu 18.4 export QT_VERSION="5.9.9" # MindForger 1.52.0 released for macOS Qt version # export QT_VERSION="5.11.0" # BUG: unable to set security - images are NOT loaded with Qt 5.15.2 -# export QT_VERSION="5.15.2" +# export QT_VERSION="5.15.2" export PATH="/Users/dvorka/Qt/${QT_VERSION}/clang_64/bin":${PATH} diff --git a/build/snap/snapcraft.yaml b/build/snap/snapcraft.yaml index 6063b7e6..53d6b43f 100644 --- a/build/snap/snapcraft.yaml +++ b/build/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: mindforger base: core18 # the base snap is the execution environment for this snap: core18 (18.04), core20 (20.04) -version: '1.55.1' # just for humans, typically '1.2+git' or '1.3.2' +version: '2.0.0' # just for humans, typically '1.2+git' or '1.3.2' summary: Thinking notebook and Markdown editor description: | Search, browse, view and edit your Markdown files. Get as much diff --git a/build/tarball/tarball-build.sh b/build/tarball/tarball-build.sh index 4ef7490c..5faf4b17 100755 --- a/build/tarball/tarball-build.sh +++ b/build/tarball/tarball-build.sh @@ -90,7 +90,7 @@ function buildGitHubTarball { #echo "This script must NOT be run if debug code is enabled - disable DO_MF_DEBUG first" #exit 1 #fi - + # # 1) create tarball # @@ -100,7 +100,7 @@ function buildGitHubTarball { cd ${MFBUILD}/${MF} # copy project files to current directory cp -rvf ${MFSRC}/* ${MFSRC}/*.* . - + # 1.2) prune MindForger project source: tests, *.o/... build files, ... echo -e "\n# MF project cleanup ########################################" rm -vrf ./.git ./app/mindforger ./build ./app/test ./lib/test @@ -119,7 +119,7 @@ function buildGitHubTarball { # # Main # # ############################################################################ -export ARG_VERSION="1.55.0" +export ARG_VERSION="2.0.0" export ARG_BAZAAR_MSG="MindForger ${ARG_VERSION} release." buildGitHubTarball "${ARG_VERSION}" "${ARG_BAZAAR_MSG}" ${1} diff --git a/build/ubuntu/debian/changelog b/build/ubuntu/debian/changelog index 36627e3d..4c4a5c2a 100644 --- a/build/ubuntu/debian/changelog +++ b/build/ubuntu/debian/changelog @@ -1,5 +1,5 @@ -mindforger (1.55.1-0ubuntu1) bionic; urgency=low +mindforger (2.0.0-0ubuntu1) bionic; urgency=low * New version. - -- Martin Dvorak (Dvorka) Sat, 1 Jan 2023 14:11:33 +0100 + -- Martin Dvorak (Dvorka) Sat, 1 Jan 2024 14:11:33 +0100 diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh b/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh index 3f0bf0ab..60098b03 100755 --- a/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh +++ b/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh @@ -103,7 +103,7 @@ function releaseForParticularUbuntuVersion() { export MFSRC=/home/dvorka/p/mindforger/git/mindforger export NOW=`date +%Y-%m-%d--%H-%M-%S` export MFBUILD=mindforger-${NOW} - + # 1) clean up echo -e "\n# Cleanup ####################################################" rm -rvf *.*~ ./debian @@ -122,7 +122,7 @@ function releaseForParticularUbuntuVersion() { echo "4.1) build MF dependencies" rm -rvf deps/cmark-gfm/build cd deps/cmark-gfm && mkdir -v build && cd build && cmake -DCMARK_TESTS=OFF -DCMARK_SHARED=OFF .. && cmake --build . && cd ../../.. - + echo "4.2) Qt: generate makefile using qmake" echo -e "\n# qmake ######################################################" cd .. @@ -133,7 +133,7 @@ function releaseForParticularUbuntuVersion() { # like this qt5-default. Instead debian/rules file exports env var w/ Qt choice # .pro file is also extended to have 'make install' target qmake -r mindforger.pro CONFIG+=mfoldhunspell - + # 5) add new version to LOCAL Bazaar echo -e "\n# bazaar add & commit #######################################" bzr add . @@ -149,8 +149,8 @@ function releaseForParticularUbuntuVersion() { echo "OK: GPG agent running." else gpg-agent --daemon - fi - + fi + # 6) build debs echo -e "\n# source & binary debs ######################################" # OPTIONAL: build .deb package (us uc tells that no GPG signing is needed) @@ -160,7 +160,7 @@ function releaseForParticularUbuntuVersion() { # 7) build binary from source deb on CLEAN system - no deps installed echo -e "\n# clean build ~ pbuilder ####################################" - cd ../build-area + cd ../build-area # IMPORTANT pbuilder's caches in /var and /home MUST be on same physical drive # BEGIN export PBUILDFOLDER=/tmp/mindforger-tmp @@ -175,10 +175,10 @@ function releaseForParticularUbuntuVersion() { echo -e "\n${UBUNTUVERSION} DRY RUN finished - exiting WITHOUT upload to Launchpad\n" exit 0 fi - + # 8) upload to Launchpad: push Bazaar and put changes echo -e "\n# bzr push .deb to Launchpad #################################" - + # from buildarea/ to ./dist cd ../${MF} echo "Before bzr push: " `pwd` @@ -203,8 +203,8 @@ then exit 1 fi -export ARG_MAJOR_VERSION=1.55. -export ARG_MINOR_VERSION=1 # minor version is incremented for every Ubuntu version +export ARG_MAJOR_VERSION=2.0. +export ARG_MINOR_VERSION=0 # minor version is incremented for every Ubuntu version export ARG_BAZAAR_MSG="MindForger ${ARG_MAJOR_VERSION}${ARG_MINOR_VERSION} release." # export DRY_RUN="true" From e93de3508937a135ba5b6f97da7b79ef4c4a5d3c Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Tue, 2 Jan 2024 22:30:29 +0100 Subject: [PATCH 057/131] Finishing version change 1.55.* -> 2.0.0 --- KNOWN_ISSUES.md | 11 ++++++++++- PAD.xml | 8 ++++---- appveyor.yml | 12 ++++++------ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index e4198e49..a15843ce 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -3,6 +3,15 @@ MindForger known issues - see [GitHub issues](https://github.com/dvorka/mindforger/issues?q=is%3Aopen+is%3Aissue+label%3A%22bug+%3Alady_beetle%3A%22) for the complete list of bugs. +# 2.0.0 + +* Autolinking can break MathJax code blocks/text integrity in Markdown text. +* Windows Server R2 2012: empty MF documentation repository in wrong location when MF is launched + at the end of installation. +* Notebook HTML export doesn't export local images: links to filesystem are kept intact, images + are not copied. +* Frontend memleaks. + # 1.55.0 * Autolinking can break MathJax code blocks/text integrity in Markdown text. @@ -78,7 +87,7 @@ for the complete list of bugs. # 1.49.0 -* Windows Server R2 2012: empty MF documentation repository in wrong location when MF is launched +* Windows Server R2 2012: empty MF documentation repository in wrong location when MF is launched at the end of installation. * macOS 10.13: WebEngine might be broken which causes HTML preview not to rendered (root cause is unclear). diff --git a/PAD.xml b/PAD.xml index 340ae0e9..d29d444f 100644 --- a/PAD.xml +++ b/PAD.xml @@ -34,10 +34,10 @@ MindForger - 1.55.1 - 03 - 07 - 2023 + 2.0.0 + 01 + 30 + 2024 diff --git a/appveyor.yml b/appveyor.yml index 5d0bd051..cb9247f3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -version: 1.55.{build} +version: 2.0.{build} skip_commits: files: @@ -36,9 +36,9 @@ platform: x64 # build Configuration, i.e. Debug, Release, etc. configuration: Release -cache: +cache: - c:\cache - - C:\Program Files\googletest-distribution + - C:\Program Files\googletest-distribution # check https://www.appveyor.com/docs/windows-images-software for updates install: @@ -47,9 +47,9 @@ install: - set PATH=%PATH%;%QT_DIR%\bin - set M8R_HOME=%APPVEYOR_BUILD_FOLDER% - if not exist c:\cache mkdir c:\cache -# on the image vcredist is in C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012 +# on the image vcredist is in C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012 - if not exist c:\cache\vcredist_x64.exe curl -LfSs -o c:\cache\vcredist_x64.exe https://aka.ms/vs/15/release/vc_redist.x64.exe - - if not exist "C:\Program Files\googletest-distribution" pushd %TEMP% && curl -LfSs -o gtest.zip https://github.com/google/googletest/archive/release-1.8.1.zip && 7z x gtest.zip && cd googletest-release-1.8.1 && mkdir build && cd build && cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_CONFIGURATION_TYPES=Debug;Release -Dgtest_build_samples=OFF -Dgtest_build_tests=OFF -Dgmock_build_tests=OFF -Dgtest_force_shared_crt=ON .. && cmake --build . --config Debug -- /m && cmake -DBUILD_TYPE=Debug -P cmake_install.cmake && popd + - if not exist "C:\Program Files\googletest-distribution" pushd %TEMP% && curl -LfSs -o gtest.zip https://github.com/google/googletest/archive/release-1.8.1.zip && 7z x gtest.zip && cd googletest-release-1.8.1 && mkdir build && cd build && cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_CONFIGURATION_TYPES=Debug;Release -Dgtest_build_samples=OFF -Dgtest_build_tests=OFF -Dgmock_build_tests=OFF -Dgtest_force_shared_crt=ON .. && cmake --build . --config Debug -- /m && cmake -DBUILD_TYPE=Debug -P cmake_install.cmake && popd before_build: - cd "%M8R_HOME%" @@ -80,7 +80,7 @@ test_script: Write-Output "Test exit code: $TestExitCode" if ($TestExitCode -ne 0) { Push-AppveyorArtifact mindforger-unit-tests.log -Type zip - throw "Exec: tests failed" + throw "Exec: tests failed" } on_finish: From 6f6002c2ec6d560e1987af3fcc97cb529d676607 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Tue, 2 Jan 2024 22:35:03 +0100 Subject: [PATCH 058/131] 2023 > 2024 (+ llama usage rollback) --- CREDITS.md | 1 - app/app.pro | 2 +- app/src/qt/assoc_leaderboard_model.cpp | 2 +- app/src/qt/assoc_leaderboard_model.h | 2 +- app/src/qt/assoc_leaderboard_presenter.cpp | 2 +- app/src/qt/assoc_leaderboard_presenter.h | 2 +- app/src/qt/assoc_leaderboard_view.cpp | 2 +- app/src/qt/assoc_leaderboard_view.h | 2 +- app/src/qt/cli_n_breadcrumbs_presenter.cpp | 2 +- app/src/qt/cli_n_breadcrumbs_presenter.h | 2 +- app/src/qt/cli_n_breadcrumbs_view.cpp | 2 +- app/src/qt/cli_n_breadcrumbs_view.h | 2 +- app/src/qt/dashboard_presenter.cpp | 2 +- app/src/qt/dashboard_presenter.h | 2 +- app/src/qt/dashboard_view.cpp | 2 +- app/src/qt/dashboard_view.h | 4 +-- app/src/qt/dialogs/add_library_dialog.cpp | 2 +- app/src/qt/dialogs/add_library_dialog.h | 2 +- app/src/qt/dialogs/configuration_dialog.cpp | 2 +- app/src/qt/dialogs/configuration_dialog.h | 2 +- app/src/qt/dialogs/export_csv_file_dialog.cpp | 2 +- app/src/qt/dialogs/export_csv_file_dialog.h | 2 +- app/src/qt/dialogs/export_file_dialog.cpp | 2 +- app/src/qt/dialogs/export_file_dialog.h | 2 +- .../qt/dialogs/find_note_by_name_dialog.cpp | 2 +- app/src/qt/dialogs/find_note_by_name_dialog.h | 2 +- .../qt/dialogs/find_note_by_tag_dialog.cpp | 4 +-- app/src/qt/dialogs/find_note_by_tag_dialog.h | 2 +- .../dialogs/find_outline_by_name_dialog.cpp | 2 +- .../qt/dialogs/find_outline_by_name_dialog.h | 2 +- .../qt/dialogs/find_outline_by_tag_dialog.cpp | 2 +- .../qt/dialogs/find_outline_by_tag_dialog.h | 2 +- app/src/qt/dialogs/fts_dialog.cpp | 2 +- app/src/qt/dialogs/fts_dialog.h | 2 +- app/src/qt/dialogs/fts_dialog_presenter.cpp | 2 +- app/src/qt/dialogs/fts_dialog_presenter.h | 2 +- app/src/qt/dialogs/insert_image_dialog.cpp | 2 +- app/src/qt/dialogs/insert_image_dialog.h | 2 +- app/src/qt/dialogs/insert_link_dialog.cpp | 2 +- app/src/qt/dialogs/insert_link_dialog.h | 2 +- .../dialogs/ner_choose_tag_types_dialog.cpp | 2 +- .../qt/dialogs/ner_choose_tag_types_dialog.h | 2 +- app/src/qt/dialogs/ner_result_dialog.cpp | 4 +-- app/src/qt/dialogs/ner_result_dialog.h | 2 +- app/src/qt/dialogs/new_file_dialog.cpp | 2 +- app/src/qt/dialogs/new_file_dialog.h | 2 +- app/src/qt/dialogs/new_repository_dialog.cpp | 2 +- app/src/qt/dialogs/new_repository_dialog.h | 2 +- app/src/qt/dialogs/note_edit_dialog.cpp | 2 +- app/src/qt/dialogs/note_edit_dialog.h | 2 +- app/src/qt/dialogs/note_new_dialog.cpp | 2 +- app/src/qt/dialogs/note_new_dialog.h | 2 +- app/src/qt/dialogs/organizer_new_dialog.cpp | 4 +-- app/src/qt/dialogs/organizer_new_dialog.h | 4 +-- .../qt/dialogs/outline_header_edit_dialog.cpp | 2 +- .../qt/dialogs/outline_header_edit_dialog.h | 2 +- app/src/qt/dialogs/outline_new_dialog.cpp | 2 +- app/src/qt/dialogs/outline_new_dialog.h | 2 +- .../refactor_note_to_outline_dialog.cpp | 2 +- .../dialogs/refactor_note_to_outline_dialog.h | 2 +- app/src/qt/dialogs/rm_library_dialog.cpp | 2 +- app/src/qt/dialogs/rm_library_dialog.h | 2 +- app/src/qt/dialogs/rows_and_depth_dialog.cpp | 2 +- app/src/qt/dialogs/rows_and_depth_dialog.h | 2 +- app/src/qt/dialogs/run_tool_dialog.cpp | 2 +- app/src/qt/dialogs/run_tool_dialog.h | 2 +- app/src/qt/dialogs/scope_dialog.cpp | 2 +- app/src/qt/dialogs/scope_dialog.h | 2 +- app/src/qt/dialogs/sync_library_dialog.cpp | 2 +- app/src/qt/dialogs/sync_library_dialog.h | 2 +- app/src/qt/dialogs/terminal_dialog.cpp | 2 +- app/src/qt/dialogs/terminal_dialog.h | 2 +- app/src/qt/exceptions.h | 2 +- app/src/qt/gear/apple_utils.h | 2 +- .../async_task_notifications_distributor.cpp | 2 +- .../async_task_notifications_distributor.h | 2 +- app/src/qt/gear/qutils.cpp | 2 +- app/src/qt/gear/qutils.h | 2 +- app/src/qt/html_delegate.cpp | 2 +- app/src/qt/html_delegate.h | 2 +- app/src/qt/i18nl10n.cpp | 2 +- app/src/qt/i18nl10n.h | 2 +- app/src/qt/kanban_column_model.cpp | 2 +- app/src/qt/kanban_column_model.h | 2 +- app/src/qt/kanban_column_presenter.cpp | 2 +- app/src/qt/kanban_column_presenter.h | 2 +- app/src/qt/kanban_column_view.cpp | 2 +- app/src/qt/kanban_column_view.h | 2 +- app/src/qt/kanban_presenter.cpp | 2 +- app/src/qt/kanban_presenter.h | 2 +- app/src/qt/kanban_view.cpp | 2 +- app/src/qt/kanban_view.h | 2 +- app/src/qt/left_toolbar_view.cpp | 2 +- app/src/qt/left_toolbar_view.h | 2 +- app/src/qt/look_n_feel.cpp | 2 +- app/src/qt/look_n_feel.h | 2 +- app/src/qt/main_menu_presenter.cpp | 2 +- app/src/qt/main_menu_presenter.h | 2 +- app/src/qt/main_menu_view.cpp | 2 +- app/src/qt/main_menu_view.h | 2 +- app/src/qt/main_toolbar_view.cpp | 2 +- app/src/qt/main_toolbar_view.h | 2 +- app/src/qt/main_window_presenter.cpp | 4 +-- app/src/qt/main_window_presenter.h | 2 +- app/src/qt/main_window_view.cpp | 2 +- app/src/qt/main_window_view.h | 2 +- app/src/qt/model_meta_definitions.h | 2 +- app/src/qt/navigator/edge.cpp | 2 +- app/src/qt/navigator/edge.h | 2 +- app/src/qt/navigator/navigator_view.cpp | 2 +- app/src/qt/navigator/navigator_view.h | 4 +-- app/src/qt/navigator/node.cpp | 2 +- app/src/qt/navigator/node.h | 2 +- app/src/qt/navigator_presenter.cpp | 2 +- app/src/qt/navigator_presenter.h | 2 +- app/src/qt/ner_leaderboard_model.cpp | 2 +- app/src/qt/ner_leaderboard_model.h | 2 +- app/src/qt/ner_leaderboard_view.cpp | 2 +- app/src/qt/ner_leaderboard_view.h | 2 +- app/src/qt/ner_main_window_worker_thread.cpp | 2 +- app/src/qt/ner_main_window_worker_thread.h | 2 +- app/src/qt/note_edit_highlighter.cpp | 2 +- app/src/qt/note_edit_highlighter.h | 2 +- app/src/qt/note_edit_presenter.cpp | 4 +-- app/src/qt/note_edit_presenter.h | 2 +- app/src/qt/note_edit_view.cpp | 2 +- app/src/qt/note_edit_view.h | 2 +- app/src/qt/note_editor_view.cpp | 4 +-- app/src/qt/note_editor_view.h | 2 +- app/src/qt/note_smart_editor.cpp | 2 +- app/src/qt/note_smart_editor.h | 2 +- app/src/qt/note_view.cpp | 2 +- app/src/qt/note_view.h | 2 +- app/src/qt/note_view_model.cpp | 2 +- app/src/qt/note_view_model.h | 2 +- app/src/qt/note_view_presenter.cpp | 4 +-- app/src/qt/note_view_presenter.h | 2 +- app/src/qt/notes_table_model.cpp | 2 +- app/src/qt/notes_table_model.h | 2 +- app/src/qt/notes_table_presenter.cpp | 2 +- app/src/qt/notes_table_presenter.h | 2 +- app/src/qt/notes_table_view.cpp | 2 +- app/src/qt/notes_table_view.h | 2 +- app/src/qt/organizer_presenter.cpp | 2 +- app/src/qt/organizer_presenter.h | 2 +- app/src/qt/organizer_quadrant_model.cpp | 2 +- app/src/qt/organizer_quadrant_model.h | 2 +- app/src/qt/organizer_quadrant_presenter.cpp | 2 +- app/src/qt/organizer_quadrant_presenter.h | 2 +- app/src/qt/organizer_quadrant_view.cpp | 2 +- app/src/qt/organizer_quadrant_view.h | 2 +- app/src/qt/organizer_view.cpp | 2 +- app/src/qt/organizer_view.h | 2 +- app/src/qt/organizers_table_model.cpp | 2 +- app/src/qt/organizers_table_model.h | 2 +- app/src/qt/organizers_table_presenter.cpp | 2 +- app/src/qt/organizers_table_presenter.h | 2 +- app/src/qt/organizers_table_view.cpp | 2 +- app/src/qt/organizers_table_view.h | 2 +- app/src/qt/orloj_presenter.cpp | 2 +- app/src/qt/orloj_presenter.h | 2 +- app/src/qt/orloj_view.cpp | 2 +- app/src/qt/orloj_view.h | 2 +- app/src/qt/outline_header_edit_presenter.cpp | 2 +- app/src/qt/outline_header_edit_presenter.h | 2 +- app/src/qt/outline_header_edit_view.cpp | 4 +-- app/src/qt/outline_header_edit_view.h | 2 +- app/src/qt/outline_header_view.cpp | 2 +- app/src/qt/outline_header_view.h | 2 +- app/src/qt/outline_header_view_model.cpp | 2 +- app/src/qt/outline_header_view_model.h | 2 +- app/src/qt/outline_header_view_presenter.cpp | 2 +- app/src/qt/outline_header_view_presenter.h | 2 +- app/src/qt/outline_tree_model.cpp | 2 +- app/src/qt/outline_tree_model.h | 2 +- app/src/qt/outline_tree_presenter.cpp | 2 +- app/src/qt/outline_tree_presenter.h | 2 +- app/src/qt/outline_tree_view.cpp | 2 +- app/src/qt/outline_tree_view.h | 2 +- app/src/qt/outline_view.cpp | 2 +- app/src/qt/outline_view.h | 2 +- app/src/qt/outline_view_presenter.cpp | 2 +- app/src/qt/outline_view_presenter.h | 2 +- app/src/qt/outline_view_splitter.cpp | 2 +- app/src/qt/outline_view_splitter.h | 2 +- app/src/qt/outlines_map_model.cpp | 2 +- app/src/qt/outlines_map_model.h | 2 +- app/src/qt/outlines_map_presenter.cpp | 2 +- app/src/qt/outlines_map_presenter.h | 2 +- app/src/qt/outlines_map_view.cpp | 2 +- app/src/qt/outlines_map_view.h | 2 +- app/src/qt/outlines_table_model.cpp | 2 +- app/src/qt/outlines_table_model.h | 2 +- app/src/qt/outlines_table_presenter.cpp | 2 +- app/src/qt/outlines_table_presenter.h | 2 +- app/src/qt/outlines_table_view.cpp | 2 +- app/src/qt/outlines_table_view.h | 2 +- app/src/qt/palette.h | 8 ++--- app/src/qt/qt_commons.h | 2 +- app/src/qt/recent_notes_table_model.cpp | 2 +- app/src/qt/recent_notes_table_model.h | 2 +- app/src/qt/recent_notes_table_presenter.cpp | 6 ++-- app/src/qt/recent_notes_table_presenter.h | 2 +- app/src/qt/recent_notes_table_view.cpp | 2 +- app/src/qt/recent_notes_table_view.h | 2 +- app/src/qt/spelling/dictionary_manager.cpp | 2 +- app/src/qt/spelling/dictionary_manager.h | 2 +- .../spelling/dictionary_provider_hunspell.cpp | 2 +- app/src/qt/status_bar_presenter.cpp | 2 +- app/src/qt/status_bar_presenter.h | 2 +- app/src/qt/status_bar_view.cpp | 2 +- app/src/qt/status_bar_view.h | 2 +- app/src/qt/tags_table_model.cpp | 2 +- app/src/qt/tags_table_model.h | 2 +- app/src/qt/tags_table_presenter.cpp | 2 +- app/src/qt/tags_table_presenter.h | 2 +- app/src/qt/tags_table_view.cpp | 2 +- app/src/qt/tags_table_view.h | 2 +- ...web_engine_page_link_navigation_policy.cpp | 2 +- .../web_engine_page_link_navigation_policy.h | 2 +- app/src/qt/widgets/edit_buttons_panel.cpp | 2 +- app/src/qt/widgets/edit_buttons_panel.h | 2 +- app/src/qt/widgets/edit_name_panel.cpp | 2 +- app/src/qt/widgets/edit_name_panel.h | 2 +- app/src/qt/widgets/edit_tags_panel.cpp | 2 +- app/src/qt/widgets/edit_tags_panel.h | 2 +- app/src/qt/widgets/importance_combo_box.cpp | 2 +- app/src/qt/widgets/importance_combo_box.h | 2 +- .../qt/widgets/labeled_edit_line_panel.cpp | 2 +- app/src/qt/widgets/labeled_edit_line_panel.h | 2 +- app/src/qt/widgets/line_number_panel.cpp | 2 +- app/src/qt/widgets/line_number_panel.h | 2 +- app/src/qt/widgets/mf_widgets.cpp | 2 +- app/src/qt/widgets/mf_widgets.h | 2 +- app/src/qt/widgets/urgency_combo_box.cpp | 2 +- app/src/qt/widgets/urgency_combo_box.h | 2 +- .../qt/widgets/view_to_edit_buttons_panel.cpp | 2 +- .../qt/widgets/view_to_edit_buttons_panel.h | 2 +- app/test/qt/mindforger-gui-tests.pro | 2 +- appveyor.yml | 2 +- build/Makefile | 2 +- build/build-win-app.bat | 4 +-- build/build-win-cmake.bat | 4 +-- build/build-win-installer.bat | 2 +- build/build-win-unit-tests.bat | 8 ++--- build/debian/debian-aptly-add-deb.sh | 2 +- build/debian/debian-make-deb.sh | 2 +- build/debian/debian-mentors-upload.sh | 2 +- build/debian/debian/copyright | 2 +- build/doc/mf-doc-to-wiki.py | 2 +- build/docker/dockerized-mindforger-run.sh | 2 +- build/docker/dockerized-mindforger-start.sh | 2 +- build/docker/mindforger/Dockerfile | 2 +- build/env.bat | 4 +-- build/fedora/fedora-distro-setup.sh | 2 +- build/fedora/fedora-rpm-from-deb.sh | 2 +- build/macos/cmark-gfm-build.sh | 2 +- build/macos/dmg-package-build.sh | 2 +- build/macos/env.sh | 2 +- build/macos/mindforger-build.sh | 2 +- build/make/check-n-fix-codestyle.py | 22 ++++++------- build/make/doc-mf-screenshot-size-window.sh | 2 +- build/make/gen-64k-lines-test-md.py | 2 +- build/make/gen-cpp-class.py | 6 ++-- build/make/gen-cpp-deletes.py | 2 +- build/make/gen-cpp-menu.py | 2 +- build/make/gen-cpp-ui-class.py | 6 ++-- build/make/gen-l10n.sh | 2 +- build/make/gen-qt-project.prefix | 2 +- build/make/gen-qt-project.sh | 2 +- build/make/l10n-edit-and-release.sh | 6 ++-- build/make/l10n-update-strings.sh | 2 +- build/make/make-demo-repo.sh | 2 +- build/make/make-mf-snapshot.sh | 2 +- build/make/make-qt-webengine.sh | 2 +- build/make/profile-gprof.sh | 2 +- build/make/replace-version-all-files.py | 10 +++--- build/make/statistic.sh | 2 +- build/make/test-all.sh | 2 +- build/make/test-autolinking.sh | 2 +- build/make/test-gui.sh | 8 ++--- build/make/test-init-mf-repo-in-tmp.sh | 2 +- build/make/test-l10n.sh | 2 +- build/make/test-lib-units.sh | 10 +++--- build/release/release-tgz-deb-rpm-exe.sh | 2 +- build/run-win-app.bat | 2 +- build/run-win-unit-tests.bat | 2 +- build/tarball/tarball-build.sh | 2 +- build/travis-ci/.travis.yml | 10 +++--- build/ubuntu/build-all-clean-system.sh | 2 +- build/ubuntu/debian/copyright | 2 +- .../ubuntu-launchpad-releases-from-beast.sh | 2 +- .../ubuntu-launchpad-releases-from-mind.sh | 32 +++++++++---------- build/ubuntu/ubuntu-pbuilder-add-distros.sh | 2 +- build/windows/build-win-installer.bat | 2 +- deps/zlib-win/include/zconf.h | 2 +- lib/lib.pro | 4 +-- lib/src/app_info.h | 2 +- lib/src/compilation.h | 2 +- lib/src/config/color.h | 2 +- lib/src/config/configuration.cpp | 2 +- lib/src/config/configuration.h | 2 +- lib/src/config/palette.cpp | 2 +- lib/src/config/palette.h | 2 +- lib/src/config/repository.cpp | 2 +- lib/src/config/repository.h | 2 +- lib/src/config/repository_configuration.cpp | 2 +- lib/src/config/repository_configuration.h | 2 +- lib/src/config/time_scope.cpp | 2 +- lib/src/config/time_scope.h | 2 +- lib/src/debug.h | 2 +- lib/src/definitions.h | 2 +- lib/src/exceptions.h | 2 +- lib/src/gear/async_utils.cpp | 2 +- lib/src/gear/async_utils.h | 2 +- lib/src/gear/datetime_utils.cpp | 2 +- lib/src/gear/datetime_utils.h | 2 +- lib/src/gear/file_utils.cpp | 2 +- lib/src/gear/file_utils.h | 2 +- lib/src/gear/hash_map.h | 2 +- lib/src/gear/lang_utils.h | 2 +- lib/src/gear/math_utils.cpp | 2 +- lib/src/gear/math_utils.h | 2 +- lib/src/gear/string_utils.cpp | 2 +- lib/src/gear/string_utils.h | 2 +- lib/src/gear/trie.cpp | 4 +-- lib/src/gear/trie.h | 2 +- lib/src/install/installer.cpp | 2 +- lib/src/install/installer.h | 2 +- lib/src/mind/ai/aa_model.cpp | 2 +- lib/src/mind/ai/aa_model.h | 2 +- lib/src/mind/ai/aa_notes_feature.cpp | 2 +- lib/src/mind/ai/aa_notes_feature.h | 2 +- lib/src/mind/ai/ai.cpp | 2 +- lib/src/mind/ai/ai.h | 2 +- lib/src/mind/ai/ai_aa.h | 2 +- lib/src/mind/ai/ai_aa_bow.cpp | 4 +-- lib/src/mind/ai/ai_aa_bow.h | 2 +- lib/src/mind/ai/ai_aa_weighted_fts.cpp | 4 +-- lib/src/mind/ai/ai_aa_weighted_fts.h | 2 +- .../mind/ai/autolinking/autolinking_mind.cpp | 2 +- .../mind/ai/autolinking/autolinking_mind.h | 2 +- ...orasick_block_autolinking_preprocessor.cpp | 2 +- ..._corasick_block_autolinking_preprocessor.h | 2 +- ...ark_trie_line_autolinking_preprocessor.cpp | 2 +- ...cmark_trie_line_autolinking_preprocessor.h | 2 +- .../naive_autolinking_preprocessor.cpp | 4 +-- .../naive_autolinking_preprocessor.h | 2 +- lib/src/mind/ai/autolinking_preprocessor.cpp | 2 +- lib/src/mind/ai/autolinking_preprocessor.h | 2 +- lib/src/mind/ai/llm/mock_wingman.cpp | 2 +- lib/src/mind/ai/llm/mock_wingman.h | 2 +- lib/src/mind/ai/llm/wingman.cpp | 2 +- lib/src/mind/ai/llm/wingman.h | 2 +- lib/src/mind/ai/nlp/bag_of_words.cpp | 2 +- lib/src/mind/ai/nlp/bag_of_words.h | 2 +- lib/src/mind/ai/nlp/char_provider.h | 2 +- .../mind/ai/nlp/common_words_blacklist.cpp | 2 +- lib/src/mind/ai/nlp/common_words_blacklist.h | 2 +- lib/src/mind/ai/nlp/lexicon.cpp | 2 +- lib/src/mind/ai/nlp/lexicon.h | 2 +- lib/src/mind/ai/nlp/markdown_tokenizer.cpp | 2 +- lib/src/mind/ai/nlp/markdown_tokenizer.h | 2 +- .../mind/ai/nlp/named_entity_recognition.cpp | 4 +-- .../mind/ai/nlp/named_entity_recognition.h | 2 +- lib/src/mind/ai/nlp/ner_named_entity.cpp | 2 +- lib/src/mind/ai/nlp/ner_named_entity.h | 2 +- lib/src/mind/ai/nlp/note_char_provider.cpp | 2 +- lib/src/mind/ai/nlp/note_char_provider.h | 2 +- lib/src/mind/ai/nlp/outline_char_provider.cpp | 2 +- lib/src/mind/ai/nlp/outline_char_provider.h | 2 +- lib/src/mind/ai/nlp/stemmer/stemmer.cpp | 2 +- lib/src/mind/ai/nlp/stemmer/stemmer.h | 2 +- lib/src/mind/ai/nlp/string_char_provider.cpp | 2 +- lib/src/mind/ai/nlp/string_char_provider.h | 2 +- lib/src/mind/ai/nlp/word_frequency_list.cpp | 2 +- lib/src/mind/ai/nlp/word_frequency_list.h | 2 +- lib/src/mind/aspect/aspect.h | 2 +- lib/src/mind/aspect/mind_scope_aspect.cpp | 2 +- lib/src/mind/aspect/mind_scope_aspect.h | 2 +- lib/src/mind/aspect/tag_scope_aspect.cpp | 2 +- lib/src/mind/aspect/tag_scope_aspect.h | 2 +- lib/src/mind/aspect/time_scope_aspect.cpp | 2 +- lib/src/mind/aspect/time_scope_aspect.h | 2 +- lib/src/mind/associated_notes.cpp | 2 +- lib/src/mind/associated_notes.h | 2 +- lib/src/mind/dikw/dikw_pyramid.cpp | 2 +- lib/src/mind/dikw/dikw_pyramid.h | 2 +- lib/src/mind/dikw/filesystem_information.cpp | 2 +- lib/src/mind/dikw/filesystem_information.h | 2 +- lib/src/mind/dikw/information.cpp | 2 +- lib/src/mind/dikw/information.h | 2 +- lib/src/mind/galaxy.cpp | 2 +- lib/src/mind/galaxy.h | 2 +- lib/src/mind/knowledge_graph.cpp | 2 +- lib/src/mind/knowledge_graph.h | 2 +- lib/src/mind/limbo.cpp | 2 +- lib/src/mind/limbo.h | 2 +- lib/src/mind/memory.cpp | 2 +- lib/src/mind/memory.h | 4 +-- lib/src/mind/memory_dwell.cpp | 2 +- lib/src/mind/memory_dwell.h | 2 +- lib/src/mind/mind.cpp | 2 +- lib/src/mind/mind.h | 6 ++-- lib/src/mind/mind_listener.h | 2 +- lib/src/mind/ontology/ontology.cpp | 2 +- lib/src/mind/ontology/ontology.h | 2 +- lib/src/mind/ontology/ontology_vocabulary.h | 2 +- lib/src/mind/ontology/taxonomy.h | 2 +- .../mind/ontology/thing_class_rel_triple.cpp | 2 +- .../mind/ontology/thing_class_rel_triple.h | 2 +- lib/src/mind/working_memory.cpp | 2 +- lib/src/mind/working_memory.h | 2 +- lib/src/model/eisenhower_matrix.cpp | 2 +- lib/src/model/eisenhower_matrix.h | 2 +- lib/src/model/kanban.cpp | 2 +- lib/src/model/kanban.h | 2 +- lib/src/model/link.cpp | 2 +- lib/src/model/link.h | 2 +- lib/src/model/note.cpp | 4 +-- lib/src/model/note.h | 6 ++-- lib/src/model/note_type.cpp | 2 +- lib/src/model/note_type.h | 2 +- lib/src/model/organizer.cpp | 4 +-- lib/src/model/organizer.h | 2 +- lib/src/model/outline.cpp | 2 +- lib/src/model/outline.h | 4 +-- lib/src/model/outline_type.cpp | 2 +- lib/src/model/outline_type.h | 2 +- lib/src/model/resource_types.h | 2 +- lib/src/model/stencil.cpp | 2 +- lib/src/model/stencil.h | 2 +- lib/src/model/tag.cpp | 2 +- lib/src/model/tag.h | 2 +- .../persistence/configuration_persistence.cpp | 2 +- .../persistence/configuration_persistence.h | 2 +- .../persistence/filesystem_persistence.cpp | 2 +- lib/src/persistence/filesystem_persistence.h | 2 +- lib/src/persistence/persistence.cpp | 2 +- lib/src/persistence/persistence.h | 4 +-- lib/src/repository_indexer.cpp | 2 +- lib/src/repository_indexer.h | 2 +- .../csv/csv_outline_representation.cpp | 2 +- .../csv/csv_outline_representation.h | 2 +- .../representations/html/html_document.cpp | 2 +- lib/src/representations/html/html_document.h | 2 +- .../html/html_outline_representation.cpp | 2 +- .../html/html_outline_representation.h | 4 +-- .../cmark_gfm_markdown_transcoder.cpp | 2 +- .../markdown/cmark_gfm_markdown_transcoder.h | 4 +-- .../markdown/markdown_ast_node.cpp | 2 +- .../markdown/markdown_ast_node.h | 2 +- .../markdown_configuration_representation.cpp | 4 +-- .../markdown_configuration_representation.h | 2 +- .../markdown/markdown_document.cpp | 2 +- .../markdown/markdown_document.h | 2 +- .../markdown_document_representation.cpp | 2 +- .../markdown_document_representation.h | 2 +- .../markdown/markdown_lexem.cpp | 2 +- .../representations/markdown/markdown_lexem.h | 2 +- .../markdown/markdown_lexer_sections.cpp | 2 +- .../markdown/markdown_lexer_sections.h | 2 +- .../markdown/markdown_note_metadata.cpp | 2 +- .../markdown/markdown_note_metadata.h | 2 +- .../markdown/markdown_outline_metadata.cpp | 2 +- .../markdown/markdown_outline_metadata.h | 2 +- .../markdown_outline_representation.cpp | 2 +- .../markdown_outline_representation.h | 2 +- .../markdown/markdown_parser_sections.cpp | 2 +- .../markdown/markdown_parser_sections.h | 2 +- ...epository_configuration_representation.cpp | 4 +-- ..._repository_configuration_representation.h | 2 +- .../markdown/markdown_section_metadata.cpp | 2 +- .../markdown/markdown_section_metadata.h | 2 +- .../markdown/markdown_transcoder.h | 4 +-- .../outline_representation.cpp | 2 +- .../representations/outline_representation.h | 2 +- .../representation_interceptor.h | 2 +- lib/src/representations/representation_type.h | 2 +- .../twiki/twiki_outline_representation.cpp | 2 +- .../twiki/twiki_outline_representation.h | 2 +- lib/src/representations/unicode.cpp | 2 +- lib/src/representations/unicode.h | 2 +- lib/src/version.h | 2 +- lib/test/benchmark/ai_benchmark.cpp | 2 +- lib/test/benchmark/html_benchmark.cpp | 4 +-- lib/test/benchmark/markdown_benchmark.cpp | 4 +-- lib/test/benchmark/trie_benchmark.cpp | 2 +- lib/test/mindforger-lib-unit-tests.pro | 2 +- lib/test/src/ai/autolinking_cmark_test.cpp | 2 +- lib/test/src/ai/autolinking_test.cpp | 2 +- lib/test/src/ai/nlp_test.cpp | 2 +- lib/test/src/config/configuration_test.cpp | 2 +- lib/test/src/gear/datetime_test.cpp | 2 +- lib/test/src/gear/file_utils_test.cpp | 2 +- lib/test/src/gear/string_utils_test.cpp | 2 +- lib/test/src/gear/trie_test.cpp | 2 +- lib/test/src/html/html_test.cpp | 4 +-- .../src/indexer/repository_indexer_test.cpp | 2 +- lib/test/src/markdown/markdown_test.cpp | 2 +- .../src/mind/filesystem_information_test.cpp | 2 +- lib/test/src/mind/fts_test.cpp | 2 +- lib/test/src/mind/memory_test.cpp | 2 +- lib/test/src/mind/mind_test.cpp | 2 +- lib/test/src/mind/note_test.cpp | 2 +- lib/test/src/mind/organizer_test.cpp | 2 +- lib/test/src/mind/outline_test.cpp | 2 +- lib/test/src/mindforger_lib_unit_tests.cpp | 2 +- lib/test/src/src.pro | 2 +- lib/test/src/test_utils.cpp | 2 +- lib/test/src/test_utils.h | 2 +- licenses/llama-cpp-license.txt | 21 ------------ mindforger.pro | 2 +- 513 files changed, 602 insertions(+), 624 deletions(-) delete mode 100644 licenses/llama-cpp-license.txt diff --git a/CREDITS.md b/CREDITS.md index 200594ad..a91314b5 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -12,7 +12,6 @@ Big thanks to 3rd party FOSS content authors: * Qt Company ([Qt](https://www.qt.io/) - lib and code) * GitHub ([CMark GFM](https://github.com/github/cmark-gfm) - Markdown rendering - lib) * Kevin Hendricks, Bjoern Jacke, Lázsló Németh ([Hunspell](https://github.com/hunspell/hunspell) - spellcheck - lib) -* Georgi Gerganov ([llama.cpp](https://github.com/ggerganov/llama.cpp) - C/C++ port of Facebook's LLaMA model) * NetBSD Foundation (strptime - Windows port - lib) * Toni Ronkko (dirent - Windows port - lib) * Microsoft (getopt - Windows port - lib) diff --git a/app/app.pro b/app/app.pro index b652db04..634ff99c 100644 --- a/app/app.pro +++ b/app/app.pro @@ -1,6 +1,6 @@ # app.pro Qt project file for MindForger Qt-based frontend # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_model.cpp b/app/src/qt/assoc_leaderboard_model.cpp index 7cb71f86..c2db3f10 100644 --- a/app/src/qt/assoc_leaderboard_model.cpp +++ b/app/src/qt/assoc_leaderboard_model.cpp @@ -1,7 +1,7 @@ /* assoc_leaderboard_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_model.h b/app/src/qt/assoc_leaderboard_model.h index b3a3a6d3..0599f5d7 100644 --- a/app/src/qt/assoc_leaderboard_model.h +++ b/app/src/qt/assoc_leaderboard_model.h @@ -1,7 +1,7 @@ /* assoc_leaderboard_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_presenter.cpp b/app/src/qt/assoc_leaderboard_presenter.cpp index 3b952c46..fc169ffe 100644 --- a/app/src/qt/assoc_leaderboard_presenter.cpp +++ b/app/src/qt/assoc_leaderboard_presenter.cpp @@ -1,7 +1,7 @@ /* assoc_leaderboard_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_presenter.h b/app/src/qt/assoc_leaderboard_presenter.h index 8cdb2116..28110f53 100644 --- a/app/src/qt/assoc_leaderboard_presenter.h +++ b/app/src/qt/assoc_leaderboard_presenter.h @@ -1,7 +1,7 @@ /* assoc_leaderboard_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_view.cpp b/app/src/qt/assoc_leaderboard_view.cpp index ac00b58b..800a3090 100644 --- a/app/src/qt/assoc_leaderboard_view.cpp +++ b/app/src/qt/assoc_leaderboard_view.cpp @@ -1,7 +1,7 @@ /* assoc_leaderboard_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/assoc_leaderboard_view.h b/app/src/qt/assoc_leaderboard_view.h index cfaf8e5d..300f1673 100644 --- a/app/src/qt/assoc_leaderboard_view.h +++ b/app/src/qt/assoc_leaderboard_view.h @@ -1,7 +1,7 @@ /* assoc_leaderboard_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.cpp b/app/src/qt/cli_n_breadcrumbs_presenter.cpp index 37120189..d4b16785 100644 --- a/app/src/qt/cli_n_breadcrumbs_presenter.cpp +++ b/app/src/qt/cli_n_breadcrumbs_presenter.cpp @@ -1,7 +1,7 @@ /* cli_n_breadcrumbs_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.h b/app/src/qt/cli_n_breadcrumbs_presenter.h index 8ee47639..dce5be4b 100644 --- a/app/src/qt/cli_n_breadcrumbs_presenter.h +++ b/app/src/qt/cli_n_breadcrumbs_presenter.h @@ -1,7 +1,7 @@ /* cli_n_breadcrumbs_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/cli_n_breadcrumbs_view.cpp b/app/src/qt/cli_n_breadcrumbs_view.cpp index 3bc997e7..17b80f52 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.cpp +++ b/app/src/qt/cli_n_breadcrumbs_view.cpp @@ -1,7 +1,7 @@ /* cli_n_breadcrumbs_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/cli_n_breadcrumbs_view.h b/app/src/qt/cli_n_breadcrumbs_view.h index 135740e5..d082bd22 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.h +++ b/app/src/qt/cli_n_breadcrumbs_view.h @@ -1,7 +1,7 @@ /* cli_n_breadcrumbs_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dashboard_presenter.cpp b/app/src/qt/dashboard_presenter.cpp index 9de6aaad..20b60065 100644 --- a/app/src/qt/dashboard_presenter.cpp +++ b/app/src/qt/dashboard_presenter.cpp @@ -1,7 +1,7 @@ /* dashboard_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dashboard_presenter.h b/app/src/qt/dashboard_presenter.h index 549c848c..6ed1f259 100644 --- a/app/src/qt/dashboard_presenter.h +++ b/app/src/qt/dashboard_presenter.h @@ -1,7 +1,7 @@ /* dashboard_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dashboard_view.cpp b/app/src/qt/dashboard_view.cpp index 9eeb3fea..9f9f846a 100644 --- a/app/src/qt/dashboard_view.cpp +++ b/app/src/qt/dashboard_view.cpp @@ -1,7 +1,7 @@ /* organizer_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dashboard_view.h b/app/src/qt/dashboard_view.h index e4d8a8ff..38ee3215 100644 --- a/app/src/qt/dashboard_view.h +++ b/app/src/qt/dashboard_view.h @@ -1,7 +1,7 @@ /* dashboard_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -36,7 +36,7 @@ class DashboardView : public QSplitter { Q_OBJECT -private: +private: // if view is width < threshold columns, then shows simplified view w/o Mind-related columns static constexpr int SIMPLIFIED_VIEW_THRESHOLD_WIDTH = 75*2; diff --git a/app/src/qt/dialogs/add_library_dialog.cpp b/app/src/qt/dialogs/add_library_dialog.cpp index b06671c2..7724f9bf 100644 --- a/app/src/qt/dialogs/add_library_dialog.cpp +++ b/app/src/qt/dialogs/add_library_dialog.cpp @@ -1,7 +1,7 @@ /* add_library_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/add_library_dialog.h b/app/src/qt/dialogs/add_library_dialog.h index 089f1847..bb0d843e 100644 --- a/app/src/qt/dialogs/add_library_dialog.h +++ b/app/src/qt/dialogs/add_library_dialog.h @@ -1,7 +1,7 @@ /* add_library_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/configuration_dialog.cpp b/app/src/qt/dialogs/configuration_dialog.cpp index be1e4602..0ea09a61 100644 --- a/app/src/qt/dialogs/configuration_dialog.cpp +++ b/app/src/qt/dialogs/configuration_dialog.cpp @@ -1,7 +1,7 @@ /* configuration_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/configuration_dialog.h b/app/src/qt/dialogs/configuration_dialog.h index 2eb4ac87..4c8d43b4 100644 --- a/app/src/qt/dialogs/configuration_dialog.h +++ b/app/src/qt/dialogs/configuration_dialog.h @@ -1,7 +1,7 @@ /* configuration_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/export_csv_file_dialog.cpp b/app/src/qt/dialogs/export_csv_file_dialog.cpp index 5a2b050e..194e330c 100644 --- a/app/src/qt/dialogs/export_csv_file_dialog.cpp +++ b/app/src/qt/dialogs/export_csv_file_dialog.cpp @@ -1,7 +1,7 @@ /* export_csv_file_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/export_csv_file_dialog.h b/app/src/qt/dialogs/export_csv_file_dialog.h index 92a670e2..c92b3704 100644 --- a/app/src/qt/dialogs/export_csv_file_dialog.h +++ b/app/src/qt/dialogs/export_csv_file_dialog.h @@ -1,7 +1,7 @@ /* export_csv_file_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/export_file_dialog.cpp b/app/src/qt/dialogs/export_file_dialog.cpp index 6f53d6f8..93b36888 100644 --- a/app/src/qt/dialogs/export_file_dialog.cpp +++ b/app/src/qt/dialogs/export_file_dialog.cpp @@ -1,7 +1,7 @@ /* export_file_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/export_file_dialog.h b/app/src/qt/dialogs/export_file_dialog.h index 8dd8520b..5c155cd5 100644 --- a/app/src/qt/dialogs/export_file_dialog.h +++ b/app/src/qt/dialogs/export_file_dialog.h @@ -1,7 +1,7 @@ /* export_file_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_note_by_name_dialog.cpp b/app/src/qt/dialogs/find_note_by_name_dialog.cpp index 3dd3522a..d81dd2d6 100644 --- a/app/src/qt/dialogs/find_note_by_name_dialog.cpp +++ b/app/src/qt/dialogs/find_note_by_name_dialog.cpp @@ -1,7 +1,7 @@ /* find_note_by_name_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_note_by_name_dialog.h b/app/src/qt/dialogs/find_note_by_name_dialog.h index 04c33432..e7edf7fe 100644 --- a/app/src/qt/dialogs/find_note_by_name_dialog.h +++ b/app/src/qt/dialogs/find_note_by_name_dialog.h @@ -1,7 +1,7 @@ /* find_note_by_name_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_note_by_tag_dialog.cpp b/app/src/qt/dialogs/find_note_by_tag_dialog.cpp index b5e4bd7c..78c90cb9 100644 --- a/app/src/qt/dialogs/find_note_by_tag_dialog.cpp +++ b/app/src/qt/dialogs/find_note_by_tag_dialog.cpp @@ -1,7 +1,7 @@ /* find_note_by_tag_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -31,7 +31,7 @@ FindNoteByTagDialog::FindNoteByTagDialog(Ontology& ontology, QWidget *parent) outlinesGroup->setTitle(tr("Notes:")); editTagsGroup->setTitle(tr("Note tags:")); switchOutlineNoteDialogsButton->setText(tr("Find Notebook")); - findButton->setText(tr("&Open Note")); + findButton->setText(tr("&Open Note")); // dialog setWindowTitle(tr("Find Note by Tags")); diff --git a/app/src/qt/dialogs/find_note_by_tag_dialog.h b/app/src/qt/dialogs/find_note_by_tag_dialog.h index 2a73f59e..01d4deea 100644 --- a/app/src/qt/dialogs/find_note_by_tag_dialog.h +++ b/app/src/qt/dialogs/find_note_by_tag_dialog.h @@ -1,7 +1,7 @@ /* find_note_by_tag_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_outline_by_name_dialog.cpp b/app/src/qt/dialogs/find_outline_by_name_dialog.cpp index d9ad288e..e5a82b52 100644 --- a/app/src/qt/dialogs/find_outline_by_name_dialog.cpp +++ b/app/src/qt/dialogs/find_outline_by_name_dialog.cpp @@ -1,7 +1,7 @@ /* find_outline_by_name_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_outline_by_name_dialog.h b/app/src/qt/dialogs/find_outline_by_name_dialog.h index 1510e237..10c049b3 100644 --- a/app/src/qt/dialogs/find_outline_by_name_dialog.h +++ b/app/src/qt/dialogs/find_outline_by_name_dialog.h @@ -1,7 +1,7 @@ /* find_outline_by_name_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp b/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp index c489b7db..c4f5b3e0 100644 --- a/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp +++ b/app/src/qt/dialogs/find_outline_by_tag_dialog.cpp @@ -1,7 +1,7 @@ /* find_outline_by_tag.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/find_outline_by_tag_dialog.h b/app/src/qt/dialogs/find_outline_by_tag_dialog.h index b9aa5a80..6e874a80 100644 --- a/app/src/qt/dialogs/find_outline_by_tag_dialog.h +++ b/app/src/qt/dialogs/find_outline_by_tag_dialog.h @@ -1,7 +1,7 @@ /* find_outline_by_tag.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/fts_dialog.cpp b/app/src/qt/dialogs/fts_dialog.cpp index 560de291..df0cc98e 100644 --- a/app/src/qt/dialogs/fts_dialog.cpp +++ b/app/src/qt/dialogs/fts_dialog.cpp @@ -1,7 +1,7 @@ /* fts_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/fts_dialog.h b/app/src/qt/dialogs/fts_dialog.h index 3fc367ab..f3d6b6e1 100644 --- a/app/src/qt/dialogs/fts_dialog.h +++ b/app/src/qt/dialogs/fts_dialog.h @@ -1,7 +1,7 @@ /* fts_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/fts_dialog_presenter.cpp b/app/src/qt/dialogs/fts_dialog_presenter.cpp index 22b9f95d..f3590333 100644 --- a/app/src/qt/dialogs/fts_dialog_presenter.cpp +++ b/app/src/qt/dialogs/fts_dialog_presenter.cpp @@ -1,7 +1,7 @@ /* fts_dialog_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/fts_dialog_presenter.h b/app/src/qt/dialogs/fts_dialog_presenter.h index 7b3e2a37..4eadd644 100644 --- a/app/src/qt/dialogs/fts_dialog_presenter.h +++ b/app/src/qt/dialogs/fts_dialog_presenter.h @@ -1,7 +1,7 @@ /* fts_dialog_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/insert_image_dialog.cpp b/app/src/qt/dialogs/insert_image_dialog.cpp index 70e9033d..a927b46a 100644 --- a/app/src/qt/dialogs/insert_image_dialog.cpp +++ b/app/src/qt/dialogs/insert_image_dialog.cpp @@ -1,7 +1,7 @@ /* insert_image_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/insert_image_dialog.h b/app/src/qt/dialogs/insert_image_dialog.h index e18d3ddc..21253c78 100644 --- a/app/src/qt/dialogs/insert_image_dialog.h +++ b/app/src/qt/dialogs/insert_image_dialog.h @@ -1,7 +1,7 @@ /* insert_image_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/insert_link_dialog.cpp b/app/src/qt/dialogs/insert_link_dialog.cpp index f576e6d6..611d9ed4 100644 --- a/app/src/qt/dialogs/insert_link_dialog.cpp +++ b/app/src/qt/dialogs/insert_link_dialog.cpp @@ -1,7 +1,7 @@ /* insert_link_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/insert_link_dialog.h b/app/src/qt/dialogs/insert_link_dialog.h index 63b41fd3..2b6ab022 100644 --- a/app/src/qt/dialogs/insert_link_dialog.h +++ b/app/src/qt/dialogs/insert_link_dialog.h @@ -1,7 +1,7 @@ /* insert_link_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp b/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp index 153511f0..fab55896 100644 --- a/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp +++ b/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp @@ -1,7 +1,7 @@ /* ner_choose_tag_types_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/ner_choose_tag_types_dialog.h b/app/src/qt/dialogs/ner_choose_tag_types_dialog.h index 15dae1a1..9c56248e 100644 --- a/app/src/qt/dialogs/ner_choose_tag_types_dialog.h +++ b/app/src/qt/dialogs/ner_choose_tag_types_dialog.h @@ -1,7 +1,7 @@ /* ner_choose_tag_types_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/ner_result_dialog.cpp b/app/src/qt/dialogs/ner_result_dialog.cpp index a3e597d1..c02862f9 100644 --- a/app/src/qt/dialogs/ner_result_dialog.cpp +++ b/app/src/qt/dialogs/ner_result_dialog.cpp @@ -1,7 +1,7 @@ /* ner_result_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -34,7 +34,7 @@ NerResultDialog::NerResultDialog(QWidget* parent) findButton = new QPushButton{tr("&Find Entity in Notes")}; findButton->setDefault(true); - findButton->setEnabled(false); + findButton->setEnabled(false); closeButton = new QPushButton{tr("&Cancel")}; diff --git a/app/src/qt/dialogs/ner_result_dialog.h b/app/src/qt/dialogs/ner_result_dialog.h index ef382525..5713251d 100644 --- a/app/src/qt/dialogs/ner_result_dialog.h +++ b/app/src/qt/dialogs/ner_result_dialog.h @@ -1,7 +1,7 @@ /* ner_result_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/new_file_dialog.cpp b/app/src/qt/dialogs/new_file_dialog.cpp index d18b895e..fa571ef9 100644 --- a/app/src/qt/dialogs/new_file_dialog.cpp +++ b/app/src/qt/dialogs/new_file_dialog.cpp @@ -1,7 +1,7 @@ /* new_file_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/new_file_dialog.h b/app/src/qt/dialogs/new_file_dialog.h index c1b6d43b..0c4857e9 100644 --- a/app/src/qt/dialogs/new_file_dialog.h +++ b/app/src/qt/dialogs/new_file_dialog.h @@ -1,7 +1,7 @@ /* new_file_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/new_repository_dialog.cpp b/app/src/qt/dialogs/new_repository_dialog.cpp index 559fca09..c271c22a 100644 --- a/app/src/qt/dialogs/new_repository_dialog.cpp +++ b/app/src/qt/dialogs/new_repository_dialog.cpp @@ -1,7 +1,7 @@ /* new_repository_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/new_repository_dialog.h b/app/src/qt/dialogs/new_repository_dialog.h index 7457a2e3..316289ba 100644 --- a/app/src/qt/dialogs/new_repository_dialog.h +++ b/app/src/qt/dialogs/new_repository_dialog.h @@ -1,7 +1,7 @@ /* new_repository_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/note_edit_dialog.cpp b/app/src/qt/dialogs/note_edit_dialog.cpp index 228c3d13..c3fd1c5b 100644 --- a/app/src/qt/dialogs/note_edit_dialog.cpp +++ b/app/src/qt/dialogs/note_edit_dialog.cpp @@ -1,7 +1,7 @@ /* note_edit_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/note_edit_dialog.h b/app/src/qt/dialogs/note_edit_dialog.h index a6467832..db407401 100644 --- a/app/src/qt/dialogs/note_edit_dialog.h +++ b/app/src/qt/dialogs/note_edit_dialog.h @@ -1,7 +1,7 @@ /* note_edit_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/note_new_dialog.cpp b/app/src/qt/dialogs/note_new_dialog.cpp index e6f2aaac..c0fda835 100644 --- a/app/src/qt/dialogs/note_new_dialog.cpp +++ b/app/src/qt/dialogs/note_new_dialog.cpp @@ -1,7 +1,7 @@ /* note_new_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/note_new_dialog.h b/app/src/qt/dialogs/note_new_dialog.h index 0c310fcb..572a6509 100644 --- a/app/src/qt/dialogs/note_new_dialog.h +++ b/app/src/qt/dialogs/note_new_dialog.h @@ -1,7 +1,7 @@ /* note_new_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/organizer_new_dialog.cpp b/app/src/qt/dialogs/organizer_new_dialog.cpp index f4c0683e..26ab28bc 100644 --- a/app/src/qt/dialogs/organizer_new_dialog.cpp +++ b/app/src/qt/dialogs/organizer_new_dialog.cpp @@ -1,7 +1,7 @@ /* new_organizer_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -142,7 +142,7 @@ OrganizerNewDialog::OrganizerNewDialog(Ontology& ontology, QWidget* parent) this, SLOT(handleChangeTypeCombo(QString)) ); - // dialog + // dialog setWindowTitle(tr("New Organizer")); // make dialog big enough (FTS dialog based size) resize(fontMetrics().averageCharWidth()*90, fontMetrics().height()*35); diff --git a/app/src/qt/dialogs/organizer_new_dialog.h b/app/src/qt/dialogs/organizer_new_dialog.h index e08b5d3f..1a4fc2d4 100644 --- a/app/src/qt/dialogs/organizer_new_dialog.h +++ b/app/src/qt/dialogs/organizer_new_dialog.h @@ -1,7 +1,7 @@ /* organizer_new_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -118,7 +118,7 @@ class OrganizerNewDialog : public QDialog std::set& getLowerRightChosenTags(std::set& tags) const { return lowerRightTags->getTagsAsStringSet(tags); } - int getFilterBy() const { + int getFilterBy() const { return this->filterByCombo->currentData().toInt(); } int getSortBy() const { diff --git a/app/src/qt/dialogs/outline_header_edit_dialog.cpp b/app/src/qt/dialogs/outline_header_edit_dialog.cpp index ab74a26a..12fcf3f3 100644 --- a/app/src/qt/dialogs/outline_header_edit_dialog.cpp +++ b/app/src/qt/dialogs/outline_header_edit_dialog.cpp @@ -1,7 +1,7 @@ /* outline_header_edit_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/outline_header_edit_dialog.h b/app/src/qt/dialogs/outline_header_edit_dialog.h index 917989bb..18e06661 100644 --- a/app/src/qt/dialogs/outline_header_edit_dialog.h +++ b/app/src/qt/dialogs/outline_header_edit_dialog.h @@ -1,7 +1,7 @@ /* outline_header_edit_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/outline_new_dialog.cpp b/app/src/qt/dialogs/outline_new_dialog.cpp index 92b6b483..9bb106a0 100644 --- a/app/src/qt/dialogs/outline_new_dialog.cpp +++ b/app/src/qt/dialogs/outline_new_dialog.cpp @@ -1,7 +1,7 @@ /* outline_new_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/outline_new_dialog.h b/app/src/qt/dialogs/outline_new_dialog.h index 1cef0eed..a1ad59dc 100644 --- a/app/src/qt/dialogs/outline_new_dialog.h +++ b/app/src/qt/dialogs/outline_new_dialog.h @@ -1,7 +1,7 @@ /* outline_new_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp b/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp index eec1c092..94ae4d26 100644 --- a/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp +++ b/app/src/qt/dialogs/refactor_note_to_outline_dialog.cpp @@ -1,7 +1,7 @@ /* refactor_note_to_outline_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/refactor_note_to_outline_dialog.h b/app/src/qt/dialogs/refactor_note_to_outline_dialog.h index f16dd119..08c13ffb 100644 --- a/app/src/qt/dialogs/refactor_note_to_outline_dialog.h +++ b/app/src/qt/dialogs/refactor_note_to_outline_dialog.h @@ -1,7 +1,7 @@ /* refactor_note_to_outline_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/rm_library_dialog.cpp b/app/src/qt/dialogs/rm_library_dialog.cpp index ee3a6706..51bec0d9 100644 --- a/app/src/qt/dialogs/rm_library_dialog.cpp +++ b/app/src/qt/dialogs/rm_library_dialog.cpp @@ -1,7 +1,7 @@ /* sync_library_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/rm_library_dialog.h b/app/src/qt/dialogs/rm_library_dialog.h index 35e84b1e..43fab3e2 100644 --- a/app/src/qt/dialogs/rm_library_dialog.h +++ b/app/src/qt/dialogs/rm_library_dialog.h @@ -1,7 +1,7 @@ /* rm_library_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/rows_and_depth_dialog.cpp b/app/src/qt/dialogs/rows_and_depth_dialog.cpp index ed9ee8c9..9a4059e1 100644 --- a/app/src/qt/dialogs/rows_and_depth_dialog.cpp +++ b/app/src/qt/dialogs/rows_and_depth_dialog.cpp @@ -1,7 +1,7 @@ /* rows_and_depth_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/rows_and_depth_dialog.h b/app/src/qt/dialogs/rows_and_depth_dialog.h index 885df06f..83c4f67a 100644 --- a/app/src/qt/dialogs/rows_and_depth_dialog.h +++ b/app/src/qt/dialogs/rows_and_depth_dialog.h @@ -1,7 +1,7 @@ /* rows_and_depth_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/run_tool_dialog.cpp b/app/src/qt/dialogs/run_tool_dialog.cpp index f4b6aed0..4a3ccb0e 100644 --- a/app/src/qt/dialogs/run_tool_dialog.cpp +++ b/app/src/qt/dialogs/run_tool_dialog.cpp @@ -1,7 +1,7 @@ /* run_tool_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/run_tool_dialog.h b/app/src/qt/dialogs/run_tool_dialog.h index 1834e4b9..b9dc5c52 100644 --- a/app/src/qt/dialogs/run_tool_dialog.h +++ b/app/src/qt/dialogs/run_tool_dialog.h @@ -1,7 +1,7 @@ /* run_tool_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/scope_dialog.cpp b/app/src/qt/dialogs/scope_dialog.cpp index 44df8404..0ba4f4a1 100644 --- a/app/src/qt/dialogs/scope_dialog.cpp +++ b/app/src/qt/dialogs/scope_dialog.cpp @@ -1,7 +1,7 @@ /* scope_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/scope_dialog.h b/app/src/qt/dialogs/scope_dialog.h index 5f8560da..ccdb9155 100644 --- a/app/src/qt/dialogs/scope_dialog.h +++ b/app/src/qt/dialogs/scope_dialog.h @@ -1,7 +1,7 @@ /* scope_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/sync_library_dialog.cpp b/app/src/qt/dialogs/sync_library_dialog.cpp index a3cd24ed..c3daee96 100644 --- a/app/src/qt/dialogs/sync_library_dialog.cpp +++ b/app/src/qt/dialogs/sync_library_dialog.cpp @@ -1,7 +1,7 @@ /* sync_library_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/sync_library_dialog.h b/app/src/qt/dialogs/sync_library_dialog.h index fc7d74c4..cba0738a 100644 --- a/app/src/qt/dialogs/sync_library_dialog.h +++ b/app/src/qt/dialogs/sync_library_dialog.h @@ -1,7 +1,7 @@ /* sync_library_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/terminal_dialog.cpp b/app/src/qt/dialogs/terminal_dialog.cpp index ac4e3227..efa733c2 100644 --- a/app/src/qt/dialogs/terminal_dialog.cpp +++ b/app/src/qt/dialogs/terminal_dialog.cpp @@ -1,7 +1,7 @@ /* terminal_dialog.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/dialogs/terminal_dialog.h b/app/src/qt/dialogs/terminal_dialog.h index a9013eb5..eb9dd9ce 100644 --- a/app/src/qt/dialogs/terminal_dialog.h +++ b/app/src/qt/dialogs/terminal_dialog.h @@ -1,7 +1,7 @@ /* terminal_dialog.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/exceptions.h b/app/src/qt/exceptions.h index fe5889e1..001c9d61 100644 --- a/app/src/qt/exceptions.h +++ b/app/src/qt/exceptions.h @@ -1,7 +1,7 @@ /* exceptions.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/apple_utils.h b/app/src/qt/gear/apple_utils.h index 7d2918ad..ede5d5be 100644 --- a/app/src/qt/gear/apple_utils.h +++ b/app/src/qt/gear/apple_utils.h @@ -1,7 +1,7 @@ /* apple_utils.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/async_task_notifications_distributor.cpp b/app/src/qt/gear/async_task_notifications_distributor.cpp index e0976ccf..17cc5876 100644 --- a/app/src/qt/gear/async_task_notifications_distributor.cpp +++ b/app/src/qt/gear/async_task_notifications_distributor.cpp @@ -1,7 +1,7 @@ /* async_task_notifications_distributor.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/async_task_notifications_distributor.h b/app/src/qt/gear/async_task_notifications_distributor.h index 1e3aedbd..e3d22ed6 100644 --- a/app/src/qt/gear/async_task_notifications_distributor.h +++ b/app/src/qt/gear/async_task_notifications_distributor.h @@ -1,7 +1,7 @@ /* async_task_notifications_distributor.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/qutils.cpp b/app/src/qt/gear/qutils.cpp index 942cbb86..50270bc8 100644 --- a/app/src/qt/gear/qutils.cpp +++ b/app/src/qt/gear/qutils.cpp @@ -1,7 +1,7 @@ /* qutils.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/gear/qutils.h b/app/src/qt/gear/qutils.h index 75acbf0b..13fcc6c5 100644 --- a/app/src/qt/gear/qutils.h +++ b/app/src/qt/gear/qutils.h @@ -1,7 +1,7 @@ /* qutils.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/html_delegate.cpp b/app/src/qt/html_delegate.cpp index 15936302..09040f6b 100644 --- a/app/src/qt/html_delegate.cpp +++ b/app/src/qt/html_delegate.cpp @@ -1,7 +1,7 @@ /* html_delegate.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/html_delegate.h b/app/src/qt/html_delegate.h index 44cb6e20..cb90bef2 100644 --- a/app/src/qt/html_delegate.h +++ b/app/src/qt/html_delegate.h @@ -1,7 +1,7 @@ /* html_delegate.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/i18nl10n.cpp b/app/src/qt/i18nl10n.cpp index dc7e05ef..bc16c9a6 100644 --- a/app/src/qt/i18nl10n.cpp +++ b/app/src/qt/i18nl10n.cpp @@ -1,7 +1,7 @@ /* i18n.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/i18nl10n.h b/app/src/qt/i18nl10n.h index 48aea4a8..d434ad7a 100644 --- a/app/src/qt/i18nl10n.h +++ b/app/src/qt/i18nl10n.h @@ -1,7 +1,7 @@ /* i18nl10n.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_model.cpp b/app/src/qt/kanban_column_model.cpp index dcb64e4f..e5aab28a 100644 --- a/app/src/qt/kanban_column_model.cpp +++ b/app/src/qt/kanban_column_model.cpp @@ -1,7 +1,7 @@ /* kanban_column_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_model.h b/app/src/qt/kanban_column_model.h index ecf8efc2..bd4eef8d 100644 --- a/app/src/qt/kanban_column_model.h +++ b/app/src/qt/kanban_column_model.h @@ -1,7 +1,7 @@ /* kanban_column_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_presenter.cpp b/app/src/qt/kanban_column_presenter.cpp index 882a80d0..54ddf756 100644 --- a/app/src/qt/kanban_column_presenter.cpp +++ b/app/src/qt/kanban_column_presenter.cpp @@ -1,7 +1,7 @@ /* kanban_column_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_presenter.h b/app/src/qt/kanban_column_presenter.h index 0f4990d9..e1ba986d 100644 --- a/app/src/qt/kanban_column_presenter.h +++ b/app/src/qt/kanban_column_presenter.h @@ -1,7 +1,7 @@ /* kanban_column_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_view.cpp b/app/src/qt/kanban_column_view.cpp index 96772f1a..181e691c 100644 --- a/app/src/qt/kanban_column_view.cpp +++ b/app/src/qt/kanban_column_view.cpp @@ -1,7 +1,7 @@ /* kanban_column_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_column_view.h b/app/src/qt/kanban_column_view.h index b8ef863a..105b1a42 100644 --- a/app/src/qt/kanban_column_view.h +++ b/app/src/qt/kanban_column_view.h @@ -1,7 +1,7 @@ /* kanban_column_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_presenter.cpp b/app/src/qt/kanban_presenter.cpp index 6bd8c1f9..d63e7596 100644 --- a/app/src/qt/kanban_presenter.cpp +++ b/app/src/qt/kanban_presenter.cpp @@ -1,7 +1,7 @@ /* kanban_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_presenter.h b/app/src/qt/kanban_presenter.h index 2603d341..9e63780e 100644 --- a/app/src/qt/kanban_presenter.h +++ b/app/src/qt/kanban_presenter.h @@ -1,7 +1,7 @@ /* kanban_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_view.cpp b/app/src/qt/kanban_view.cpp index 7e0d69f3..3868cb2d 100644 --- a/app/src/qt/kanban_view.cpp +++ b/app/src/qt/kanban_view.cpp @@ -1,7 +1,7 @@ /* kanban_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/kanban_view.h b/app/src/qt/kanban_view.h index 427ae7cb..c0822e79 100644 --- a/app/src/qt/kanban_view.h +++ b/app/src/qt/kanban_view.h @@ -1,7 +1,7 @@ /* kanban_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/left_toolbar_view.cpp b/app/src/qt/left_toolbar_view.cpp index b4671197..7e5ec487 100644 --- a/app/src/qt/left_toolbar_view.cpp +++ b/app/src/qt/left_toolbar_view.cpp @@ -1,7 +1,7 @@ /* left_toolbar_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/left_toolbar_view.h b/app/src/qt/left_toolbar_view.h index ed8688df..a45e46bc 100644 --- a/app/src/qt/left_toolbar_view.h +++ b/app/src/qt/left_toolbar_view.h @@ -1,7 +1,7 @@ /* left_toolbar_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/look_n_feel.cpp b/app/src/qt/look_n_feel.cpp index 7a6e925c..81f49ac8 100644 --- a/app/src/qt/look_n_feel.cpp +++ b/app/src/qt/look_n_feel.cpp @@ -1,7 +1,7 @@ /* look_n_feel.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/look_n_feel.h b/app/src/qt/look_n_feel.h index e5b611d6..d1917d2b 100644 --- a/app/src/qt/look_n_feel.h +++ b/app/src/qt/look_n_feel.h @@ -1,7 +1,7 @@ /* look_n_feel.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp index 800d579c..705ee1df 100644 --- a/app/src/qt/main_menu_presenter.cpp +++ b/app/src/qt/main_menu_presenter.cpp @@ -1,7 +1,7 @@ /* main_menu_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_menu_presenter.h b/app/src/qt/main_menu_presenter.h index 7702b779..d920f70b 100644 --- a/app/src/qt/main_menu_presenter.h +++ b/app/src/qt/main_menu_presenter.h @@ -1,7 +1,7 @@ /* main_menu_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index cc0f7327..c89601b6 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -1,7 +1,7 @@ /* main_menu_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h index 075e926b..aa5e238e 100644 --- a/app/src/qt/main_menu_view.h +++ b/app/src/qt/main_menu_view.h @@ -1,7 +1,7 @@ /* main_menu.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_toolbar_view.cpp b/app/src/qt/main_toolbar_view.cpp index bb1f4fff..4096eee1 100644 --- a/app/src/qt/main_toolbar_view.cpp +++ b/app/src/qt/main_toolbar_view.cpp @@ -1,7 +1,7 @@ /* main_toolbar_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_toolbar_view.h b/app/src/qt/main_toolbar_view.h index 60df32c5..bcc67d0e 100644 --- a/app/src/qt/main_toolbar_view.h +++ b/app/src/qt/main_toolbar_view.h @@ -1,7 +1,7 @@ /* main_toolbar_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 812a4180..456bdaf3 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -1,7 +1,7 @@ /* main_window_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -3854,7 +3854,7 @@ void MainWindowPresenter::doActionHelpAboutMindForger() "
Contact me at <martin.dvorak@mindforger.com>" " or see www.mindforger.com for more information." "
" - "
Copyright (C) 2016-2023 Martin Dvorak and contributors." + "
Copyright (C) 2016-2024 Martin Dvorak and contributors." }); } diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index b730923d..c0ad639e 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -1,7 +1,7 @@ /* main_window_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_window_view.cpp b/app/src/qt/main_window_view.cpp index 1aa5d343..fea8172d 100644 --- a/app/src/qt/main_window_view.cpp +++ b/app/src/qt/main_window_view.cpp @@ -1,7 +1,7 @@ /* main_window_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/main_window_view.h b/app/src/qt/main_window_view.h index 9643517c..187f9457 100644 --- a/app/src/qt/main_window_view.h +++ b/app/src/qt/main_window_view.h @@ -1,7 +1,7 @@ /* main_window_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/model_meta_definitions.h b/app/src/qt/model_meta_definitions.h index e17715c8..1e1d4e6e 100644 --- a/app/src/qt/model_meta_definitions.h +++ b/app/src/qt/model_meta_definitions.h @@ -1,7 +1,7 @@ /* model_meta_definitions.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/edge.cpp b/app/src/qt/navigator/edge.cpp index b7b90b1d..25605dcb 100644 --- a/app/src/qt/navigator/edge.cpp +++ b/app/src/qt/navigator/edge.cpp @@ -1,7 +1,7 @@ /* edge.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/edge.h b/app/src/qt/navigator/edge.h index ffc9dc40..919f3152 100644 --- a/app/src/qt/navigator/edge.h +++ b/app/src/qt/navigator/edge.h @@ -1,7 +1,7 @@ /* edge.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/navigator_view.cpp b/app/src/qt/navigator/navigator_view.cpp index 62d5c3c1..67759f0c 100644 --- a/app/src/qt/navigator/navigator_view.cpp +++ b/app/src/qt/navigator/navigator_view.cpp @@ -1,7 +1,7 @@ /* mind-navigator.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/navigator_view.h b/app/src/qt/navigator/navigator_view.h index 32414ca7..b72d3447 100644 --- a/app/src/qt/navigator/navigator_view.h +++ b/app/src/qt/navigator/navigator_view.h @@ -1,7 +1,7 @@ /* mind_navigator.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -130,7 +130,7 @@ class NavigatorView : public QGraphicsView void itemMoved(); - void iWasSelected(NavigatorNode* selectedNode); + void iWasSelected(NavigatorNode* selectedNode); void refreshOnNextTimerTick(KnowledgeSubGraph* subgraph) { std::lock_guard criticalSection{refreshMutex}; diff --git a/app/src/qt/navigator/node.cpp b/app/src/qt/navigator/node.cpp index 4478f5e0..6e17e75c 100644 --- a/app/src/qt/navigator/node.cpp +++ b/app/src/qt/navigator/node.cpp @@ -1,7 +1,7 @@ /* node.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator/node.h b/app/src/qt/navigator/node.h index bf0b146a..4155dd2b 100644 --- a/app/src/qt/navigator/node.h +++ b/app/src/qt/navigator/node.h @@ -1,7 +1,7 @@ /* node.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator_presenter.cpp b/app/src/qt/navigator_presenter.cpp index 255c89b3..c3fc29fe 100644 --- a/app/src/qt/navigator_presenter.cpp +++ b/app/src/qt/navigator_presenter.cpp @@ -1,7 +1,7 @@ /* navigator_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/navigator_presenter.h b/app/src/qt/navigator_presenter.h index ea01e48b..f337a5ed 100644 --- a/app/src/qt/navigator_presenter.h +++ b/app/src/qt/navigator_presenter.h @@ -1,7 +1,7 @@ /* navigator_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_leaderboard_model.cpp b/app/src/qt/ner_leaderboard_model.cpp index da55bea8..0fe62020 100644 --- a/app/src/qt/ner_leaderboard_model.cpp +++ b/app/src/qt/ner_leaderboard_model.cpp @@ -1,7 +1,7 @@ /* ner_leaderboard_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_leaderboard_model.h b/app/src/qt/ner_leaderboard_model.h index 908caabc..b95b2e7d 100644 --- a/app/src/qt/ner_leaderboard_model.h +++ b/app/src/qt/ner_leaderboard_model.h @@ -1,7 +1,7 @@ /* ner_leaderboard_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_leaderboard_view.cpp b/app/src/qt/ner_leaderboard_view.cpp index 3d3e93a4..0009011f 100644 --- a/app/src/qt/ner_leaderboard_view.cpp +++ b/app/src/qt/ner_leaderboard_view.cpp @@ -1,7 +1,7 @@ /* ner_leaderboard_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_leaderboard_view.h b/app/src/qt/ner_leaderboard_view.h index 56029427..3fd0d558 100644 --- a/app/src/qt/ner_leaderboard_view.h +++ b/app/src/qt/ner_leaderboard_view.h @@ -1,7 +1,7 @@ /* ner_leaderboard_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_main_window_worker_thread.cpp b/app/src/qt/ner_main_window_worker_thread.cpp index 12d9c310..99eb6eec 100644 --- a/app/src/qt/ner_main_window_worker_thread.cpp +++ b/app/src/qt/ner_main_window_worker_thread.cpp @@ -1,7 +1,7 @@ /* ner_main_window_worker_thread.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/ner_main_window_worker_thread.h b/app/src/qt/ner_main_window_worker_thread.h index 70490aac..74ce99de 100644 --- a/app/src/qt/ner_main_window_worker_thread.h +++ b/app/src/qt/ner_main_window_worker_thread.h @@ -1,7 +1,7 @@ /* ner_main_window_worker_thread.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_highlighter.cpp b/app/src/qt/note_edit_highlighter.cpp index 449ce62a..227a6569 100644 --- a/app/src/qt/note_edit_highlighter.cpp +++ b/app/src/qt/note_edit_highlighter.cpp @@ -1,7 +1,7 @@ /* note_edit_highlighter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_highlighter.h b/app/src/qt/note_edit_highlighter.h index eae6902e..cef0063c 100644 --- a/app/src/qt/note_edit_highlighter.h +++ b/app/src/qt/note_edit_highlighter.h @@ -1,7 +1,7 @@ /* note_edit_highlighter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_presenter.cpp b/app/src/qt/note_edit_presenter.cpp index 31eeab04..aa14756f 100644 --- a/app/src/qt/note_edit_presenter.cpp +++ b/app/src/qt/note_edit_presenter.cpp @@ -1,7 +1,7 @@ /* note_edit_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -63,7 +63,7 @@ void NoteEditPresenter::setNote(Note* note) string mdDescription{}; mwp->getMarkdownRepresentation()->toDescription(note, &mdDescription); - view->setNote(note, mdDescription); + view->setNote(note, mdDescription); } void NoteEditPresenter::slotKeyPressed() diff --git a/app/src/qt/note_edit_presenter.h b/app/src/qt/note_edit_presenter.h index f93b1b21..49cb2b14 100644 --- a/app/src/qt/note_edit_presenter.h +++ b/app/src/qt/note_edit_presenter.h @@ -1,7 +1,7 @@ /* note_edit_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_view.cpp b/app/src/qt/note_edit_view.cpp index c1b4d53c..49aad660 100644 --- a/app/src/qt/note_edit_view.cpp +++ b/app/src/qt/note_edit_view.cpp @@ -1,7 +1,7 @@ /* note_edit_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_edit_view.h b/app/src/qt/note_edit_view.h index 1adab4ac..cbe9bdd5 100644 --- a/app/src/qt/note_edit_view.h +++ b/app/src/qt/note_edit_view.h @@ -1,7 +1,7 @@ /* note_edit_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_editor_view.cpp b/app/src/qt/note_editor_view.cpp index 5fd415f0..a14ca196 100644 --- a/app/src/qt/note_editor_view.cpp +++ b/app/src/qt/note_editor_view.cpp @@ -1,7 +1,7 @@ /* note_editor_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -409,7 +409,7 @@ void NoteEditorView::keyPressEvent(QKeyEvent* event) break; } } else { - switch(event->key()) { + switch(event->key()) { case Qt::Key_Escape: { // completer menu not visible - exit editor ~ Cancel QMessageBox msgBox{ diff --git a/app/src/qt/note_editor_view.h b/app/src/qt/note_editor_view.h index be2be9c3..9d6e3e50 100644 --- a/app/src/qt/note_editor_view.h +++ b/app/src/qt/note_editor_view.h @@ -1,7 +1,7 @@ /* note_editor_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_smart_editor.cpp b/app/src/qt/note_smart_editor.cpp index 05407b10..20df1336 100644 --- a/app/src/qt/note_smart_editor.cpp +++ b/app/src/qt/note_smart_editor.cpp @@ -1,7 +1,7 @@ /* note_smart_editor.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_smart_editor.h b/app/src/qt/note_smart_editor.h index 95658367..f5bc37b3 100644 --- a/app/src/qt/note_smart_editor.h +++ b/app/src/qt/note_smart_editor.h @@ -1,7 +1,7 @@ /* note_smart_editor.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view.cpp b/app/src/qt/note_view.cpp index 1c0f297c..a903dc4a 100644 --- a/app/src/qt/note_view.cpp +++ b/app/src/qt/note_view.cpp @@ -1,7 +1,7 @@ /* note_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view.h b/app/src/qt/note_view.h index 75412bac..d794a8e7 100644 --- a/app/src/qt/note_view.h +++ b/app/src/qt/note_view.h @@ -1,7 +1,7 @@ /* note_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view_model.cpp b/app/src/qt/note_view_model.cpp index 1f632a1c..bb4f02f1 100644 --- a/app/src/qt/note_view_model.cpp +++ b/app/src/qt/note_view_model.cpp @@ -1,7 +1,7 @@ /* note_view_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view_model.h b/app/src/qt/note_view_model.h index cede85fe..8d655115 100644 --- a/app/src/qt/note_view_model.h +++ b/app/src/qt/note_view_model.h @@ -1,7 +1,7 @@ /* note_view_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/note_view_presenter.cpp b/app/src/qt/note_view_presenter.cpp index 746bd543..4c1f7268 100644 --- a/app/src/qt/note_view_presenter.cpp +++ b/app/src/qt/note_view_presenter.cpp @@ -1,7 +1,7 @@ /* note_view_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -148,7 +148,7 @@ void NoteViewPresenter::slotLinkClicked(const QUrl& url) } void NoteViewPresenter::slotEditNote() -{ +{ orloj->showFacetNoteEdit(this->currentNote); } diff --git a/app/src/qt/note_view_presenter.h b/app/src/qt/note_view_presenter.h index 59c7442c..d5f6635a 100644 --- a/app/src/qt/note_view_presenter.h +++ b/app/src/qt/note_view_presenter.h @@ -1,7 +1,7 @@ /* note_view_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_model.cpp b/app/src/qt/notes_table_model.cpp index bbc93bb8..68518006 100644 --- a/app/src/qt/notes_table_model.cpp +++ b/app/src/qt/notes_table_model.cpp @@ -1,7 +1,7 @@ /* notes_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_model.h b/app/src/qt/notes_table_model.h index 9f4ec8c8..228d3fea 100644 --- a/app/src/qt/notes_table_model.h +++ b/app/src/qt/notes_table_model.h @@ -1,7 +1,7 @@ /* notes_table_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_presenter.cpp b/app/src/qt/notes_table_presenter.cpp index 0a373cb0..eed8602d 100644 --- a/app/src/qt/notes_table_presenter.cpp +++ b/app/src/qt/notes_table_presenter.cpp @@ -1,7 +1,7 @@ /* notes_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_presenter.h b/app/src/qt/notes_table_presenter.h index f03fb342..0a4588db 100644 --- a/app/src/qt/notes_table_presenter.h +++ b/app/src/qt/notes_table_presenter.h @@ -1,7 +1,7 @@ /* notes_table_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_view.cpp b/app/src/qt/notes_table_view.cpp index c61c5b2a..85180b21 100644 --- a/app/src/qt/notes_table_view.cpp +++ b/app/src/qt/notes_table_view.cpp @@ -1,7 +1,7 @@ /* notes_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/notes_table_view.h b/app/src/qt/notes_table_view.h index 62b2c82f..ec0aaeaa 100644 --- a/app/src/qt/notes_table_view.h +++ b/app/src/qt/notes_table_view.h @@ -1,7 +1,7 @@ /* notes_table_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_presenter.cpp b/app/src/qt/organizer_presenter.cpp index 9c79f0d6..545020c7 100644 --- a/app/src/qt/organizer_presenter.cpp +++ b/app/src/qt/organizer_presenter.cpp @@ -1,7 +1,7 @@ /* organizer_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_presenter.h b/app/src/qt/organizer_presenter.h index b96ffed1..ee3b4b41 100644 --- a/app/src/qt/organizer_presenter.h +++ b/app/src/qt/organizer_presenter.h @@ -1,7 +1,7 @@ /* organizer_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_model.cpp b/app/src/qt/organizer_quadrant_model.cpp index a6d4f23d..ba978e7a 100644 --- a/app/src/qt/organizer_quadrant_model.cpp +++ b/app/src/qt/organizer_quadrant_model.cpp @@ -1,7 +1,7 @@ /* organizer_quadrant_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_model.h b/app/src/qt/organizer_quadrant_model.h index 893542ad..0f9201dc 100644 --- a/app/src/qt/organizer_quadrant_model.h +++ b/app/src/qt/organizer_quadrant_model.h @@ -1,7 +1,7 @@ /* organizer_quadrant_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_presenter.cpp b/app/src/qt/organizer_quadrant_presenter.cpp index 9f361ab6..d8efbc24 100644 --- a/app/src/qt/organizer_quadrant_presenter.cpp +++ b/app/src/qt/organizer_quadrant_presenter.cpp @@ -1,7 +1,7 @@ /* organizer_quadrant_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_presenter.h b/app/src/qt/organizer_quadrant_presenter.h index 31ec0153..dd9ccf30 100644 --- a/app/src/qt/organizer_quadrant_presenter.h +++ b/app/src/qt/organizer_quadrant_presenter.h @@ -1,7 +1,7 @@ /* organizer_quadrant_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_view.cpp b/app/src/qt/organizer_quadrant_view.cpp index 11483d9d..1a60b9a7 100644 --- a/app/src/qt/organizer_quadrant_view.cpp +++ b/app/src/qt/organizer_quadrant_view.cpp @@ -1,7 +1,7 @@ /* organizer_quadrant_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_quadrant_view.h b/app/src/qt/organizer_quadrant_view.h index 6fca0db0..b7962ed0 100644 --- a/app/src/qt/organizer_quadrant_view.h +++ b/app/src/qt/organizer_quadrant_view.h @@ -1,7 +1,7 @@ /* organizer_quadrant_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_view.cpp b/app/src/qt/organizer_view.cpp index aa125f02..119ac3af 100644 --- a/app/src/qt/organizer_view.cpp +++ b/app/src/qt/organizer_view.cpp @@ -1,7 +1,7 @@ /* organizer_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizer_view.h b/app/src/qt/organizer_view.h index ef8cfd1b..caadecdc 100644 --- a/app/src/qt/organizer_view.h +++ b/app/src/qt/organizer_view.h @@ -1,7 +1,7 @@ /* organizer_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_model.cpp b/app/src/qt/organizers_table_model.cpp index 4bf1cd86..e5651041 100644 --- a/app/src/qt/organizers_table_model.cpp +++ b/app/src/qt/organizers_table_model.cpp @@ -1,7 +1,7 @@ /* organizers_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_model.h b/app/src/qt/organizers_table_model.h index fd150ebc..668067e9 100644 --- a/app/src/qt/organizers_table_model.h +++ b/app/src/qt/organizers_table_model.h @@ -1,7 +1,7 @@ /* organizers_table_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_presenter.cpp b/app/src/qt/organizers_table_presenter.cpp index 59ef0737..4ba4f8a9 100644 --- a/app/src/qt/organizers_table_presenter.cpp +++ b/app/src/qt/organizers_table_presenter.cpp @@ -1,7 +1,7 @@ /* organizers_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_presenter.h b/app/src/qt/organizers_table_presenter.h index 8982832e..89aa6d78 100644 --- a/app/src/qt/organizers_table_presenter.h +++ b/app/src/qt/organizers_table_presenter.h @@ -1,7 +1,7 @@ /* organizers_table_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_view.cpp b/app/src/qt/organizers_table_view.cpp index 8bf631e3..0a7b46e8 100644 --- a/app/src/qt/organizers_table_view.cpp +++ b/app/src/qt/organizers_table_view.cpp @@ -1,7 +1,7 @@ /* organizers_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/organizers_table_view.h b/app/src/qt/organizers_table_view.h index 974412a8..0d2ea5ed 100644 --- a/app/src/qt/organizers_table_view.h +++ b/app/src/qt/organizers_table_view.h @@ -1,7 +1,7 @@ /* organizers_table_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp index 80222fbc..108138c3 100644 --- a/app/src/qt/orloj_presenter.cpp +++ b/app/src/qt/orloj_presenter.cpp @@ -1,7 +1,7 @@ /* outline_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/orloj_presenter.h b/app/src/qt/orloj_presenter.h index ee4974d7..5383d096 100644 --- a/app/src/qt/orloj_presenter.h +++ b/app/src/qt/orloj_presenter.h @@ -1,7 +1,7 @@ /* outline_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/orloj_view.cpp b/app/src/qt/orloj_view.cpp index c70f4932..a715a8f0 100644 --- a/app/src/qt/orloj_view.cpp +++ b/app/src/qt/orloj_view.cpp @@ -1,7 +1,7 @@ /* orloj_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/orloj_view.h b/app/src/qt/orloj_view.h index 72c34230..6ce5c32a 100644 --- a/app/src/qt/orloj_view.h +++ b/app/src/qt/orloj_view.h @@ -1,7 +1,7 @@ /* orloj_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_edit_presenter.cpp b/app/src/qt/outline_header_edit_presenter.cpp index fe113b4d..e0307bbc 100644 --- a/app/src/qt/outline_header_edit_presenter.cpp +++ b/app/src/qt/outline_header_edit_presenter.cpp @@ -1,7 +1,7 @@ /* outline_header_edit_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_edit_presenter.h b/app/src/qt/outline_header_edit_presenter.h index 87f1745b..442a52a3 100644 --- a/app/src/qt/outline_header_edit_presenter.h +++ b/app/src/qt/outline_header_edit_presenter.h @@ -1,7 +1,7 @@ /* outline_header_edit_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_edit_view.cpp b/app/src/qt/outline_header_edit_view.cpp index 01c34723..eb0e07af 100644 --- a/app/src/qt/outline_header_edit_view.cpp +++ b/app/src/qt/outline_header_edit_view.cpp @@ -1,7 +1,7 @@ /* outline_header_edit_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -59,7 +59,7 @@ OutlineHeaderEditView::OutlineHeaderEditView(QWidget* parent) this, SLOT(slotOpenOutlineHeaderPropertiesEditor())); new QShortcut( QKeySequence(Qt::CTRL+Qt::Key_S), - this, SLOT(slotSaveOutlineHeader())); + this, SLOT(slotSaveOutlineHeader())); QObject::connect( bottomButtonsPanel->getRememberButton(), SIGNAL(clicked()), this, SLOT(slotSaveOutlineHeader())); diff --git a/app/src/qt/outline_header_edit_view.h b/app/src/qt/outline_header_edit_view.h index fbe85cae..d6cf9720 100644 --- a/app/src/qt/outline_header_edit_view.h +++ b/app/src/qt/outline_header_edit_view.h @@ -1,7 +1,7 @@ /* outline_header_edit_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view.cpp b/app/src/qt/outline_header_view.cpp index 0fc1edc1..89156333 100644 --- a/app/src/qt/outline_header_view.cpp +++ b/app/src/qt/outline_header_view.cpp @@ -1,7 +1,7 @@ /* outline_header_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view.h b/app/src/qt/outline_header_view.h index 1a6b361b..e9f32e14 100644 --- a/app/src/qt/outline_header_view.h +++ b/app/src/qt/outline_header_view.h @@ -1,7 +1,7 @@ /* outline_header_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view_model.cpp b/app/src/qt/outline_header_view_model.cpp index 12a668b5..7f9a2008 100644 --- a/app/src/qt/outline_header_view_model.cpp +++ b/app/src/qt/outline_header_view_model.cpp @@ -1,7 +1,7 @@ /* outline_header_view_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view_model.h b/app/src/qt/outline_header_view_model.h index 30b26df3..900e945b 100644 --- a/app/src/qt/outline_header_view_model.h +++ b/app/src/qt/outline_header_view_model.h @@ -1,7 +1,7 @@ /* outline_header_view_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view_presenter.cpp b/app/src/qt/outline_header_view_presenter.cpp index d12f8ea2..895818de 100644 --- a/app/src/qt/outline_header_view_presenter.cpp +++ b/app/src/qt/outline_header_view_presenter.cpp @@ -1,7 +1,7 @@ /* outline_header_view_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_header_view_presenter.h b/app/src/qt/outline_header_view_presenter.h index b2df74a5..790d729b 100644 --- a/app/src/qt/outline_header_view_presenter.h +++ b/app/src/qt/outline_header_view_presenter.h @@ -1,7 +1,7 @@ /* outline_header_view_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_model.cpp b/app/src/qt/outline_tree_model.cpp index d135b5f0..a68be6fe 100644 --- a/app/src/qt/outline_tree_model.cpp +++ b/app/src/qt/outline_tree_model.cpp @@ -1,7 +1,7 @@ /* outline_tree_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_model.h b/app/src/qt/outline_tree_model.h index 63ad0276..1a71c301 100644 --- a/app/src/qt/outline_tree_model.h +++ b/app/src/qt/outline_tree_model.h @@ -1,7 +1,7 @@ /* outline_tree_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_presenter.cpp b/app/src/qt/outline_tree_presenter.cpp index 8db88e91..16e7d6b0 100644 --- a/app/src/qt/outline_tree_presenter.cpp +++ b/app/src/qt/outline_tree_presenter.cpp @@ -1,7 +1,7 @@ /* outline_tree_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_presenter.h b/app/src/qt/outline_tree_presenter.h index d410de7f..7e01cdb7 100644 --- a/app/src/qt/outline_tree_presenter.h +++ b/app/src/qt/outline_tree_presenter.h @@ -1,7 +1,7 @@ /* outline_tree_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_view.cpp b/app/src/qt/outline_tree_view.cpp index 97a8d5b9..c31ac27f 100644 --- a/app/src/qt/outline_tree_view.cpp +++ b/app/src/qt/outline_tree_view.cpp @@ -1,7 +1,7 @@ /* outline_tree_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_tree_view.h b/app/src/qt/outline_tree_view.h index 3af50fc4..6fb61155 100644 --- a/app/src/qt/outline_tree_view.h +++ b/app/src/qt/outline_tree_view.h @@ -1,7 +1,7 @@ /* outline_tree_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view.cpp b/app/src/qt/outline_view.cpp index a91f40bc..de2c4662 100644 --- a/app/src/qt/outline_view.cpp +++ b/app/src/qt/outline_view.cpp @@ -1,7 +1,7 @@ /* outline_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view.h b/app/src/qt/outline_view.h index 8858bf33..e85c95a9 100644 --- a/app/src/qt/outline_view.h +++ b/app/src/qt/outline_view.h @@ -1,7 +1,7 @@ /* outline_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view_presenter.cpp b/app/src/qt/outline_view_presenter.cpp index 36101a99..34b1bbc3 100644 --- a/app/src/qt/outline_view_presenter.cpp +++ b/app/src/qt/outline_view_presenter.cpp @@ -1,7 +1,7 @@ /* outline_view_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view_presenter.h b/app/src/qt/outline_view_presenter.h index c4155d6a..6d4c324e 100644 --- a/app/src/qt/outline_view_presenter.h +++ b/app/src/qt/outline_view_presenter.h @@ -1,7 +1,7 @@ /* outline_view_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view_splitter.cpp b/app/src/qt/outline_view_splitter.cpp index 1a087dc8..e6b70736 100644 --- a/app/src/qt/outline_view_splitter.cpp +++ b/app/src/qt/outline_view_splitter.cpp @@ -1,7 +1,7 @@ /* outline_view_splitter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outline_view_splitter.h b/app/src/qt/outline_view_splitter.h index 4e540af1..e8e25631 100644 --- a/app/src/qt/outline_view_splitter.h +++ b/app/src/qt/outline_view_splitter.h @@ -1,7 +1,7 @@ /* outline_view_splitter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_map_model.cpp b/app/src/qt/outlines_map_model.cpp index 4c214298..c2d0d774 100644 --- a/app/src/qt/outlines_map_model.cpp +++ b/app/src/qt/outlines_map_model.cpp @@ -1,7 +1,7 @@ /* outlines_map_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_map_model.h b/app/src/qt/outlines_map_model.h index 1f51668d..c3a23ea2 100644 --- a/app/src/qt/outlines_map_model.h +++ b/app/src/qt/outlines_map_model.h @@ -1,7 +1,7 @@ /* outlines_map_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_map_presenter.cpp b/app/src/qt/outlines_map_presenter.cpp index 1c91dc20..b62116e4 100644 --- a/app/src/qt/outlines_map_presenter.cpp +++ b/app/src/qt/outlines_map_presenter.cpp @@ -1,7 +1,7 @@ /* outlines_map_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_map_presenter.h b/app/src/qt/outlines_map_presenter.h index 0633f275..52bb582b 100644 --- a/app/src/qt/outlines_map_presenter.h +++ b/app/src/qt/outlines_map_presenter.h @@ -1,7 +1,7 @@ /* outlines_map_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_map_view.cpp b/app/src/qt/outlines_map_view.cpp index 406866b7..8e86d0aa 100644 --- a/app/src/qt/outlines_map_view.cpp +++ b/app/src/qt/outlines_map_view.cpp @@ -1,7 +1,7 @@ /* outlines_map_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_map_view.h b/app/src/qt/outlines_map_view.h index 47997144..0be06a61 100644 --- a/app/src/qt/outlines_map_view.h +++ b/app/src/qt/outlines_map_view.h @@ -1,7 +1,7 @@ /* outlines_map_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_model.cpp b/app/src/qt/outlines_table_model.cpp index 96ffacff..b408f97b 100644 --- a/app/src/qt/outlines_table_model.cpp +++ b/app/src/qt/outlines_table_model.cpp @@ -1,7 +1,7 @@ /* notes_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_model.h b/app/src/qt/outlines_table_model.h index fba84d5b..61359fea 100644 --- a/app/src/qt/outlines_table_model.h +++ b/app/src/qt/outlines_table_model.h @@ -1,7 +1,7 @@ /* outlines_table_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_presenter.cpp b/app/src/qt/outlines_table_presenter.cpp index 45024f14..18c4224d 100644 --- a/app/src/qt/outlines_table_presenter.cpp +++ b/app/src/qt/outlines_table_presenter.cpp @@ -1,7 +1,7 @@ /* outlines_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_presenter.h b/app/src/qt/outlines_table_presenter.h index 4d335183..8158f02c 100644 --- a/app/src/qt/outlines_table_presenter.h +++ b/app/src/qt/outlines_table_presenter.h @@ -1,7 +1,7 @@ /* outlines_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_view.cpp b/app/src/qt/outlines_table_view.cpp index e8a14247..0af98891 100644 --- a/app/src/qt/outlines_table_view.cpp +++ b/app/src/qt/outlines_table_view.cpp @@ -1,7 +1,7 @@ /* outlines_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/outlines_table_view.h b/app/src/qt/outlines_table_view.h index 625f12d0..5f26177c 100644 --- a/app/src/qt/outlines_table_view.h +++ b/app/src/qt/outlines_table_view.h @@ -1,7 +1,7 @@ /* outlines_table_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/palette.h b/app/src/qt/palette.h index b804cadd..49b06751 100644 --- a/app/src/qt/palette.h +++ b/app/src/qt/palette.h @@ -1,7 +1,7 @@ /* palette.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -22,9 +22,9 @@ Comments gray #777 Help green #008C00 Hover dark gray #36393D - MR blue #356AA0 + MR blue #356AA0 - Web 2.0 colors: + Web 2.0 colors: Shiny silver [#EEEEEE] Reddit white [#FFFFFF] Magnolia Mag.nolia [#F9F7ED] @@ -46,7 +46,7 @@ Basecamp Green [#6BBA70] Mozilla Blue [#3F4C6B] Digg Blue [#356AA0] - Last.fm Crimson [#D01F3C] + Last.fm Crimson [#D01F3C] */ #ifndef M8RUI_PALETTE_H #define M8RUI_PALETTE_H diff --git a/app/src/qt/qt_commons.h b/app/src/qt/qt_commons.h index 98164d2a..11a60254 100644 --- a/app/src/qt/qt_commons.h +++ b/app/src/qt/qt_commons.h @@ -1,7 +1,7 @@ /* qt_commons.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_model.cpp b/app/src/qt/recent_notes_table_model.cpp index 2d6b0a8d..a148657d 100644 --- a/app/src/qt/recent_notes_table_model.cpp +++ b/app/src/qt/recent_notes_table_model.cpp @@ -1,7 +1,7 @@ /* recent_notes_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_model.h b/app/src/qt/recent_notes_table_model.h index f7d2c982..d1ac0ba8 100644 --- a/app/src/qt/recent_notes_table_model.h +++ b/app/src/qt/recent_notes_table_model.h @@ -1,7 +1,7 @@ /* recent_notes_table_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_presenter.cpp b/app/src/qt/recent_notes_table_presenter.cpp index 4d1e90b4..228baa74 100644 --- a/app/src/qt/recent_notes_table_presenter.cpp +++ b/app/src/qt/recent_notes_table_presenter.cpp @@ -1,7 +1,7 @@ /* recent_notes_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -23,7 +23,7 @@ namespace m8r { using namespace std; RecentNotesTablePresenter::RecentNotesTablePresenter(RecentNotesTableView* view, HtmlOutlineRepresentation* htmlRepresentation) -{ +{ this->view = view; this->model = new RecentNotesTableModel(this, htmlRepresentation); this->view->setModel(this->model); @@ -46,7 +46,7 @@ void RecentNotesTablePresenter::refresh(const vector& notes) int uiLimit = Configuration::getInstance().getRecentNotesUiLimit(); for(Note* n:notes) { if(uiLimit) uiLimit--; else break; - model->addRow(n); + model->addRow(n); } } diff --git a/app/src/qt/recent_notes_table_presenter.h b/app/src/qt/recent_notes_table_presenter.h index 628d4a17..62611f97 100644 --- a/app/src/qt/recent_notes_table_presenter.h +++ b/app/src/qt/recent_notes_table_presenter.h @@ -1,7 +1,7 @@ /* recent_notes_table_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_view.cpp b/app/src/qt/recent_notes_table_view.cpp index a39787e7..757534bb 100644 --- a/app/src/qt/recent_notes_table_view.cpp +++ b/app/src/qt/recent_notes_table_view.cpp @@ -1,7 +1,7 @@ /* recent_notes_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/recent_notes_table_view.h b/app/src/qt/recent_notes_table_view.h index 9d7cae5c..b630b87b 100644 --- a/app/src/qt/recent_notes_table_view.h +++ b/app/src/qt/recent_notes_table_view.h @@ -1,7 +1,7 @@ /* recent_notes_table_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/spelling/dictionary_manager.cpp b/app/src/qt/spelling/dictionary_manager.cpp index aae9caad..b32b52e6 100644 --- a/app/src/qt/spelling/dictionary_manager.cpp +++ b/app/src/qt/spelling/dictionary_manager.cpp @@ -1,7 +1,7 @@ /*********************************************************************** * * Copyright (C) 2009, 2010, 2011, 2012, 2013 Graeme Gott - * Copyright (C) 2021-2023 Martin Dvorak + * Copyright (C) 2021-2024 Martin Dvorak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/app/src/qt/spelling/dictionary_manager.h b/app/src/qt/spelling/dictionary_manager.h index 6eacb20e..3d5796ff 100644 --- a/app/src/qt/spelling/dictionary_manager.h +++ b/app/src/qt/spelling/dictionary_manager.h @@ -1,7 +1,7 @@ /*********************************************************************** * * Copyright (C) 2009, 2010, 2011, 2012, 2013 Graeme Gott - * Copyright (C) 2021-2023 Martin Dvorak + * Copyright (C) 2021-2024 Martin Dvorak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/app/src/qt/spelling/dictionary_provider_hunspell.cpp b/app/src/qt/spelling/dictionary_provider_hunspell.cpp index 60a84bce..0bde6940 100644 --- a/app/src/qt/spelling/dictionary_provider_hunspell.cpp +++ b/app/src/qt/spelling/dictionary_provider_hunspell.cpp @@ -2,7 +2,7 @@ * * Copyright (C) 2009, 2010, 2011, 2012, 2013 Graeme Gott * Copyright (C) 2014-2020 wereturtle - * Copyright (C) 2021-2023 Martin Dvorak + * Copyright (C) 2021-2024 Martin Dvorak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/app/src/qt/status_bar_presenter.cpp b/app/src/qt/status_bar_presenter.cpp index f506a441..846b489a 100644 --- a/app/src/qt/status_bar_presenter.cpp +++ b/app/src/qt/status_bar_presenter.cpp @@ -1,7 +1,7 @@ /* status_bar_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/status_bar_presenter.h b/app/src/qt/status_bar_presenter.h index d60a8d0c..0100d71f 100644 --- a/app/src/qt/status_bar_presenter.h +++ b/app/src/qt/status_bar_presenter.h @@ -1,7 +1,7 @@ /* status_bar_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/status_bar_view.cpp b/app/src/qt/status_bar_view.cpp index 311e3e62..1d4a2eec 100644 --- a/app/src/qt/status_bar_view.cpp +++ b/app/src/qt/status_bar_view.cpp @@ -1,7 +1,7 @@ /* status_bar_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/status_bar_view.h b/app/src/qt/status_bar_view.h index b891b015..80081c8d 100644 --- a/app/src/qt/status_bar_view.h +++ b/app/src/qt/status_bar_view.h @@ -1,7 +1,7 @@ /* status_bar_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_model.cpp b/app/src/qt/tags_table_model.cpp index be4c6a66..b33d862b 100644 --- a/app/src/qt/tags_table_model.cpp +++ b/app/src/qt/tags_table_model.cpp @@ -1,7 +1,7 @@ /* tags_table_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_model.h b/app/src/qt/tags_table_model.h index 5c9e7813..eefb09c3 100644 --- a/app/src/qt/tags_table_model.h +++ b/app/src/qt/tags_table_model.h @@ -1,7 +1,7 @@ /* tags_table_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_presenter.cpp b/app/src/qt/tags_table_presenter.cpp index 2e4017f5..15761109 100644 --- a/app/src/qt/tags_table_presenter.cpp +++ b/app/src/qt/tags_table_presenter.cpp @@ -1,7 +1,7 @@ /* tags_table_presenter.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_presenter.h b/app/src/qt/tags_table_presenter.h index ad3286ee..0d51c215 100644 --- a/app/src/qt/tags_table_presenter.h +++ b/app/src/qt/tags_table_presenter.h @@ -1,7 +1,7 @@ /* tags_table_presenter.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_view.cpp b/app/src/qt/tags_table_view.cpp index 33fb0db8..e279bec5 100644 --- a/app/src/qt/tags_table_view.cpp +++ b/app/src/qt/tags_table_view.cpp @@ -1,7 +1,7 @@ /* tags_table_view.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/tags_table_view.h b/app/src/qt/tags_table_view.h index 21608053..c8067d66 100644 --- a/app/src/qt/tags_table_view.h +++ b/app/src/qt/tags_table_view.h @@ -1,7 +1,7 @@ /* tags_table_view.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/web_engine_page_link_navigation_policy.cpp b/app/src/qt/web_engine_page_link_navigation_policy.cpp index 979b62e6..1487eb85 100644 --- a/app/src/qt/web_engine_page_link_navigation_policy.cpp +++ b/app/src/qt/web_engine_page_link_navigation_policy.cpp @@ -1,7 +1,7 @@ /* web_engine_page_link_navigation_policy.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/web_engine_page_link_navigation_policy.h b/app/src/qt/web_engine_page_link_navigation_policy.h index 4005a6fd..30c4690e 100644 --- a/app/src/qt/web_engine_page_link_navigation_policy.h +++ b/app/src/qt/web_engine_page_link_navigation_policy.h @@ -1,7 +1,7 @@ /* web_engine_page_link_navigation_policy.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_buttons_panel.cpp b/app/src/qt/widgets/edit_buttons_panel.cpp index 414815bf..08b5d358 100644 --- a/app/src/qt/widgets/edit_buttons_panel.cpp +++ b/app/src/qt/widgets/edit_buttons_panel.cpp @@ -1,7 +1,7 @@ /* edit_buttons_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_buttons_panel.h b/app/src/qt/widgets/edit_buttons_panel.h index 42a8a654..cd9dbb92 100644 --- a/app/src/qt/widgets/edit_buttons_panel.h +++ b/app/src/qt/widgets/edit_buttons_panel.h @@ -1,7 +1,7 @@ /* edit_buttons_panel.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_name_panel.cpp b/app/src/qt/widgets/edit_name_panel.cpp index 4c7f930b..64ba7cce 100644 --- a/app/src/qt/widgets/edit_name_panel.cpp +++ b/app/src/qt/widgets/edit_name_panel.cpp @@ -1,7 +1,7 @@ /* edit_name_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_name_panel.h b/app/src/qt/widgets/edit_name_panel.h index 6db89a36..a580a47d 100644 --- a/app/src/qt/widgets/edit_name_panel.h +++ b/app/src/qt/widgets/edit_name_panel.h @@ -1,7 +1,7 @@ /* edit_name_panel.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_tags_panel.cpp b/app/src/qt/widgets/edit_tags_panel.cpp index 2f348784..27393d90 100644 --- a/app/src/qt/widgets/edit_tags_panel.cpp +++ b/app/src/qt/widgets/edit_tags_panel.cpp @@ -1,7 +1,7 @@ /* edit_tags_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/edit_tags_panel.h b/app/src/qt/widgets/edit_tags_panel.h index e2ca1236..d900e855 100644 --- a/app/src/qt/widgets/edit_tags_panel.h +++ b/app/src/qt/widgets/edit_tags_panel.h @@ -1,7 +1,7 @@ /* edit_tags_panel.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/importance_combo_box.cpp b/app/src/qt/widgets/importance_combo_box.cpp index 8c6681a4..45081b5f 100644 --- a/app/src/qt/widgets/importance_combo_box.cpp +++ b/app/src/qt/widgets/importance_combo_box.cpp @@ -1,7 +1,7 @@ /* importance_combo_box.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/importance_combo_box.h b/app/src/qt/widgets/importance_combo_box.h index 776e21ca..ce1071d7 100644 --- a/app/src/qt/widgets/importance_combo_box.h +++ b/app/src/qt/widgets/importance_combo_box.h @@ -1,7 +1,7 @@ /* importance_combo_box.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/labeled_edit_line_panel.cpp b/app/src/qt/widgets/labeled_edit_line_panel.cpp index 2f68cf74..6cf3fedd 100644 --- a/app/src/qt/widgets/labeled_edit_line_panel.cpp +++ b/app/src/qt/widgets/labeled_edit_line_panel.cpp @@ -1,7 +1,7 @@ /* labeled_edit_line_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/labeled_edit_line_panel.h b/app/src/qt/widgets/labeled_edit_line_panel.h index cebb693b..aeb3606b 100644 --- a/app/src/qt/widgets/labeled_edit_line_panel.h +++ b/app/src/qt/widgets/labeled_edit_line_panel.h @@ -1,7 +1,7 @@ /* labeled_edit_line_panel.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/line_number_panel.cpp b/app/src/qt/widgets/line_number_panel.cpp index bccc6069..d350bc0a 100644 --- a/app/src/qt/widgets/line_number_panel.cpp +++ b/app/src/qt/widgets/line_number_panel.cpp @@ -1,7 +1,7 @@ /* line_number_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/line_number_panel.h b/app/src/qt/widgets/line_number_panel.h index 04339d37..2e46da66 100644 --- a/app/src/qt/widgets/line_number_panel.h +++ b/app/src/qt/widgets/line_number_panel.h @@ -1,7 +1,7 @@ /* line_number_panel.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/mf_widgets.cpp b/app/src/qt/widgets/mf_widgets.cpp index dcbd58cc..7e5173e9 100644 --- a/app/src/qt/widgets/mf_widgets.cpp +++ b/app/src/qt/widgets/mf_widgets.cpp @@ -1,7 +1,7 @@ /* mf_widgets.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/mf_widgets.h b/app/src/qt/widgets/mf_widgets.h index 68bf64ce..096fc3f4 100644 --- a/app/src/qt/widgets/mf_widgets.h +++ b/app/src/qt/widgets/mf_widgets.h @@ -1,7 +1,7 @@ /* mf_widgets.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/urgency_combo_box.cpp b/app/src/qt/widgets/urgency_combo_box.cpp index d3614112..74b7cba4 100644 --- a/app/src/qt/widgets/urgency_combo_box.cpp +++ b/app/src/qt/widgets/urgency_combo_box.cpp @@ -1,7 +1,7 @@ /* urgency_combo_box.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/urgency_combo_box.h b/app/src/qt/widgets/urgency_combo_box.h index 15fcd123..7b6aa732 100644 --- a/app/src/qt/widgets/urgency_combo_box.h +++ b/app/src/qt/widgets/urgency_combo_box.h @@ -1,7 +1,7 @@ /* urgency_combo_box.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/view_to_edit_buttons_panel.cpp b/app/src/qt/widgets/view_to_edit_buttons_panel.cpp index 38e2ffc8..ccec0550 100644 --- a/app/src/qt/widgets/view_to_edit_buttons_panel.cpp +++ b/app/src/qt/widgets/view_to_edit_buttons_panel.cpp @@ -1,7 +1,7 @@ /* view_to_edit_buttons_panel.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/qt/widgets/view_to_edit_buttons_panel.h b/app/src/qt/widgets/view_to_edit_buttons_panel.h index 6577be28..03e2a12e 100644 --- a/app/src/qt/widgets/view_to_edit_buttons_panel.h +++ b/app/src/qt/widgets/view_to_edit_buttons_panel.h @@ -1,7 +1,7 @@ /* view_to_edit_buttons_panel.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/test/qt/mindforger-gui-tests.pro b/app/test/qt/mindforger-gui-tests.pro index eabd80d0..01555c61 100644 --- a/app/test/qt/mindforger-gui-tests.pro +++ b/app/test/qt/mindforger-gui-tests.pro @@ -1,6 +1,6 @@ # mindforger-gui-unit-tests.pro MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/appveyor.yml b/appveyor.yml index cb9247f3..093d523c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ # appveyor.yml AppVeyor CI configuration file for MindForger # -# Copyright (C) 2016-2023 +# Copyright (C) 2016-2024 # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/Makefile b/build/Makefile index 16765745..056b5b39 100644 --- a/build/Makefile +++ b/build/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # MindForger thinking notebook # diff --git a/build/build-win-app.bat b/build/build-win-app.bat index f2e641e7..d2e093d4 100644 --- a/build/build-win-app.bat +++ b/build/build-win-app.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2023 +rem Copyright (C) 2016-2024 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License @@ -41,7 +41,7 @@ nmake if "%ERRORLEVEL%" neq "0" goto :err echo =================================================== -echo MindForger application has been built successfully +echo MindForger application has been built successfully echo ================================================== goto :end :err diff --git a/build/build-win-cmake.bat b/build/build-win-cmake.bat index f02c2aef..6d95c455 100644 --- a/build/build-win-cmake.bat +++ b/build/build-win-cmake.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2023 +rem Copyright (C) 2016-2024 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License @@ -47,7 +47,7 @@ echo ==================================== cmake --build . --config Debug -- /m if "%ERRORLEVEL%" neq "0" goto :err echo ==================================== -echo cmark-gfm has been built successfully +echo cmark-gfm has been built successfully echo ==================================== goto :end :err diff --git a/build/build-win-installer.bat b/build/build-win-installer.bat index 9faf2d6d..f2207818 100644 --- a/build/build-win-installer.bat +++ b/build/build-win-installer.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2023 +rem Copyright (C) 2016-2024 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/build-win-unit-tests.bat b/build/build-win-unit-tests.bat index ff005a31..f9811d70 100644 --- a/build/build-win-unit-tests.bat +++ b/build/build-win-unit-tests.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2023 +rem Copyright (C) 2016-2024 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License @@ -32,17 +32,17 @@ echo ==================================== echo Generating MindForger unit test build files echo ==================================== cd "%MF_BASE%\lib\test" -qmake -r mindforger-lib-unit-tests.pro "CONFIG+=debug" "CONFIG+=mfdebug" +qmake -r mindforger-lib-unit-tests.pro "CONFIG+=debug" "CONFIG+=mfdebug" if "%ERRORLEVEL%" neq "0" goto :err echo ==================================== -echo Building MindForger unit tests +echo Building MindForger unit tests echo ==================================== nmake if "%ERRORLEVEL%" neq "0" goto :err echo ==================================== -echo MindForger unit tests has been built successfully +echo MindForger unit tests has been built successfully echo ==================================== goto :end :err diff --git a/build/debian/debian-aptly-add-deb.sh b/build/debian/debian-aptly-add-deb.sh index d9250c36..dea5c5af 100755 --- a/build/debian/debian-aptly-add-deb.sh +++ b/build/debian/debian-aptly-add-deb.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/debian/debian-make-deb.sh b/build/debian/debian-make-deb.sh index a1c75374..fbdd89b2 100755 --- a/build/debian/debian-make-deb.sh +++ b/build/debian/debian-make-deb.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/debian/debian-mentors-upload.sh b/build/debian/debian-mentors-upload.sh index 0be4e3fb..e995eacc 100755 --- a/build/debian/debian-mentors-upload.sh +++ b/build/debian/debian-mentors-upload.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/debian/debian/copyright b/build/debian/debian/copyright index a983d196..42e95756 100644 --- a/build/debian/debian/copyright +++ b/build/debian/debian/copyright @@ -3,7 +3,7 @@ Upstream-Name: mindforger Source: https://github.com/dvorka/mindforger Files: debian/* -Copyright: 2016-2023 Martin Dvorak +Copyright: 2016-2024 Martin Dvorak License: GPL-2+ MindForger is licensed under GNU GPL version 2 or any later version. . diff --git a/build/doc/mf-doc-to-wiki.py b/build/doc/mf-doc-to-wiki.py index 911b5c44..861ae26a 100755 --- a/build/doc/mf-doc-to-wiki.py +++ b/build/doc/mf-doc-to-wiki.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/docker/dockerized-mindforger-run.sh b/build/docker/dockerized-mindforger-run.sh index 9c1af5f3..16ed1dc2 100755 --- a/build/docker/dockerized-mindforger-run.sh +++ b/build/docker/dockerized-mindforger-run.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/docker/dockerized-mindforger-start.sh b/build/docker/dockerized-mindforger-start.sh index 00ad8250..0a8df823 100755 --- a/build/docker/dockerized-mindforger-start.sh +++ b/build/docker/dockerized-mindforger-start.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/docker/mindforger/Dockerfile b/build/docker/mindforger/Dockerfile index ccf2e195..653e3aea 100644 --- a/build/docker/mindforger/Dockerfile +++ b/build/docker/mindforger/Dockerfile @@ -1,6 +1,6 @@ # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/env.bat b/build/env.bat index 5d3fce75..75e7bc38 100644 --- a/build/env.bat +++ b/build/env.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2023 +rem Copyright (C) 2016-2024 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License @@ -27,7 +27,7 @@ call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary :: call Qt Development Environment Setup :: call "C:\software\Qt\5.12.0\msvc2017_64\bin\qtenv2.bat" call "C:\Qt\5.12.1\msvc2017_64\bin\qtenv2.bat" -:: set PATH to cmake and zlib +:: set PATH to cmake and zlib set "PATH=%PATH%;c:\Program Files\CMake\bin;%MF_BASE%\deps\zlib-win\lib" :: set path to Inno Setup 5 script compiler set "MF_ICSS=c:\Program Files (x86)\Inno Setup 5\ISCC.exe" diff --git a/build/fedora/fedora-distro-setup.sh b/build/fedora/fedora-distro-setup.sh index 666c64a6..3ed7bdd6 100755 --- a/build/fedora/fedora-distro-setup.sh +++ b/build/fedora/fedora-distro-setup.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/fedora/fedora-rpm-from-deb.sh b/build/fedora/fedora-rpm-from-deb.sh index cd896521..7092a7ff 100755 --- a/build/fedora/fedora-rpm-from-deb.sh +++ b/build/fedora/fedora-rpm-from-deb.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/macos/cmark-gfm-build.sh b/build/macos/cmark-gfm-build.sh index 5c5b03d3..cf510251 100755 --- a/build/macos/cmark-gfm-build.sh +++ b/build/macos/cmark-gfm-build.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/macos/dmg-package-build.sh b/build/macos/dmg-package-build.sh index 949f89b6..5ad6b1b3 100755 --- a/build/macos/dmg-package-build.sh +++ b/build/macos/dmg-package-build.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/macos/env.sh b/build/macos/env.sh index 5147a6f9..2f70c5b6 100644 --- a/build/macos/env.sh +++ b/build/macos/env.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/macos/mindforger-build.sh b/build/macos/mindforger-build.sh index 01471187..68f86ae0 100755 --- a/build/macos/mindforger-build.sh +++ b/build/macos/mindforger-build.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/check-n-fix-codestyle.py b/build/make/check-n-fix-codestyle.py index a4921a62..551ce4c5 100755 --- a/build/make/check-n-fix-codestyle.py +++ b/build/make/check-n-fix-codestyle.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -91,9 +91,9 @@ 'mindforger/licenses/hoedown-license.txt', } -COPYRIGHT_CPP = 'Copyright (C) 2016-2023 Martin Dvorak ' -COPYRIGHT_PYTHON = '# Copyright (C) 2016-2023 Martin Dvorak ' -COPYRIGHT_XML = '' +COPYRIGHT_CPP = 'Copyright (C) 2016-2024 Martin Dvorak ' +COPYRIGHT_PYTHON = '# Copyright (C) 2016-2024 Martin Dvorak ' +COPYRIGHT_XML = '' ESC_LIGHT_RED = '' ESC_LIGHT_GREEN = '' @@ -127,7 +127,7 @@ def loadFiles(self): def validate(self): self.validateFiles() self.showReport() - + def validateFiles(self): sys.stdout.write('Checking H/CPP source files') for f in self.cppFiles.keys(): @@ -151,9 +151,9 @@ def fixTrailingSpaces(self): #for f in self.pythonFiles.keys(): # self.pythonFiles[f].validate(self.report) #print '' - + def showReport(self): - reportEntries = 0 + reportEntries = 0 if len(self.report) == 0: print '\nMindForger Code Style Checker finished:' print '{} [INFO] successfuly checked with no issues{}'.format(ESC_LIGHT_GREEN, ESC_NO_COLOR) @@ -174,7 +174,7 @@ def showReport(self): else: print "{}{}:{}".format(OPTION_FILE_AS_URIS,entry.filename,problem[1]) print '{}{}{}'.format(ESC_LIGHT_RED, problem[0], ESC_NO_COLOR) - elif problem[0].startswith(' [WARNING]'): + elif problem[0].startswith(' [WARNING]'): if OPTION_GCC: print "{}{}:{}:1 {}{}{}".format( OPTION_FILE_AS_URIS, @@ -209,14 +209,14 @@ def __init__(self, filename): def addWarning(self, problem, filename, line): sys.stdout.write(ESC_YELLOW) sys.stdout.write('.') - sys.stdout.write(ESC_NO_COLOR); + sys.stdout.write(ESC_NO_COLOR); sys.stdout.flush() self.addProblem(problem, filename, line); def addError(self, problem, filename, line): sys.stdout.write(ESC_LIGHT_RED) sys.stdout.write('.') - sys.stdout.write(ESC_NO_COLOR); + sys.stdout.write(ESC_NO_COLOR); sys.stdout.flush() self.addProblem(problem, filename, line); @@ -308,7 +308,7 @@ def validateContent(self, reportEntry): ############################################################################################# -if len(sys.argv)>1: +if len(sys.argv)>1: for a in sys.argv: if '--color' == a or '-c' == a: ESC_LIGHT_RED="" diff --git a/build/make/doc-mf-screenshot-size-window.sh b/build/make/doc-mf-screenshot-size-window.sh index 18d4bf7c..6b4858f3 100755 --- a/build/make/doc-mf-screenshot-size-window.sh +++ b/build/make/doc-mf-screenshot-size-window.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-64k-lines-test-md.py b/build/make/gen-64k-lines-test-md.py index 384010cd..89b5025a 100755 --- a/build/make/gen-64k-lines-test-md.py +++ b/build/make/gen-64k-lines-test-md.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-cpp-class.py b/build/make/gen-cpp-class.py index 3e3b72fc..7ab29a52 100755 --- a/build/make/gen-cpp-class.py +++ b/build/make/gen-cpp-class.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -27,7 +27,7 @@ TEMPLATE_HEADER_FILE = """/* {}.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -65,7 +65,7 @@ class {} TEMPLATE_CPP_FILE = """/* {}.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/build/make/gen-cpp-deletes.py b/build/make/gen-cpp-deletes.py index 933a0b5e..5fa233ff 100755 --- a/build/make/gen-cpp-deletes.py +++ b/build/make/gen-cpp-deletes.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-cpp-menu.py b/build/make/gen-cpp-menu.py index a2c08f49..cd9cf93c 100755 --- a/build/make/gen-cpp-menu.py +++ b/build/make/gen-cpp-menu.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-cpp-ui-class.py b/build/make/gen-cpp-ui-class.py index e783701b..712da5df 100755 --- a/build/make/gen-cpp-ui-class.py +++ b/build/make/gen-cpp-ui-class.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -27,7 +27,7 @@ TEMPLATE_HEADER_FILE = """/* {}.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -69,7 +69,7 @@ class {} : public QObject TEMPLATE_CPP_FILE = """/* {}.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/build/make/gen-l10n.sh b/build/make/gen-l10n.sh index 24e0c503..e089206e 100755 --- a/build/make/gen-l10n.sh +++ b/build/make/gen-l10n.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-qt-project.prefix b/build/make/gen-qt-project.prefix index 60167c6a..871c4d32 100644 --- a/build/make/gen-qt-project.prefix +++ b/build/make/gen-qt-project.prefix @@ -1,6 +1,6 @@ # mindforger.pro MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/gen-qt-project.sh b/build/make/gen-qt-project.sh index 523f97dd..16961278 100755 --- a/build/make/gen-qt-project.sh +++ b/build/make/gen-qt-project.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/l10n-edit-and-release.sh b/build/make/l10n-edit-and-release.sh index dc8c5ed2..08438106 100755 --- a/build/make/l10n-edit-and-release.sh +++ b/build/make/l10n-edit-and-release.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -19,8 +19,8 @@ # Hints: # - nerd English is OOTB ~ strings in the source code -# - en ... user friendly English translation -# - cs ... user friendly Czech translation +# - en ... user friendly English translation +# - cs ... user friendly Czech translation MF_LANG="en" diff --git a/build/make/l10n-update-strings.sh b/build/make/l10n-update-strings.sh index 18e650a5..e5a75d0f 100755 --- a/build/make/l10n-update-strings.sh +++ b/build/make/l10n-update-strings.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/make-demo-repo.sh b/build/make/make-demo-repo.sh index 578a5963..4a175c8f 100755 --- a/build/make/make-demo-repo.sh +++ b/build/make/make-demo-repo.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/make-mf-snapshot.sh b/build/make/make-mf-snapshot.sh index 4bf18e9e..95dbb513 100755 --- a/build/make/make-mf-snapshot.sh +++ b/build/make/make-mf-snapshot.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/make-qt-webengine.sh b/build/make/make-qt-webengine.sh index 419e7292..c7253d62 100755 --- a/build/make/make-qt-webengine.sh +++ b/build/make/make-qt-webengine.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/profile-gprof.sh b/build/make/profile-gprof.sh index ad2fa5ae..1b0ea824 100755 --- a/build/make/profile-gprof.sh +++ b/build/make/profile-gprof.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/replace-version-all-files.py b/build/make/replace-version-all-files.py index 7234fd20..45683726 100755 --- a/build/make/replace-version-all-files.py +++ b/build/make/replace-version-all-files.py @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -61,7 +61,7 @@ def replace_version( if data and old_version and new_version: print(f"Replacing {old_version} -> {new_version} in {file_path}") - + updated_data = data.replace(old_version, new_version) with open(file_path, 'w') as file: @@ -75,7 +75,7 @@ def replace_version( def replace_files( file_paths: list, old_version: str, - new_version: str + new_version: str ): for file_path in file_paths: replace_version( @@ -96,14 +96,14 @@ def replace_files( replace_files( file_paths=SEMANTIC_VERSION_FILES, old_version=f"{old_major_version}.{old_minor_version}.0", - new_version=f"{new_major_version}.{new_minor_version}.0", + new_version=f"{new_major_version}.{new_minor_version}.0", ) # special files replacement replace_version( file_path=MINOR_VERSION_FILES[0], old_version=f"{old_major_version},{old_minor_version},0", - new_version=f"{new_major_version},{new_minor_version},0", + new_version=f"{new_major_version},{new_minor_version},0", ) # special files replacement diff --git a/build/make/statistic.sh b/build/make/statistic.sh index 4c4fc9b6..6fa89e43 100755 --- a/build/make/statistic.sh +++ b/build/make/statistic.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-all.sh b/build/make/test-all.sh index 5520fe92..5b0db175 100755 --- a/build/make/test-all.sh +++ b/build/make/test-all.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-autolinking.sh b/build/make/test-autolinking.sh index 94aca0a8..5b710a91 100755 --- a/build/make/test-autolinking.sh +++ b/build/make/test-autolinking.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-gui.sh b/build/make/test-gui.sh index ff8b46b3..0f9c0cef 100755 --- a/build/make/test-gui.sh +++ b/build/make/test-gui.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -24,7 +24,7 @@ #export OPTION_RECOMPILE=yes # recompile before running test(s) (comment this line to disable) #export OPTION_RUN_ALL_TESTS=yes # comment this line to disable export OPTION_TESTS="open-exit.sikuli" -export OPTION_TEST=open-exit.sikuli +export OPTION_TEST=open-exit.sikuli export M8R_TEST_APP_DIR="`pwd`/../../app/test/qt" export M8R_TEST_REPOSITORY="${HOME}/tmp/small-repository" @@ -55,7 +55,7 @@ then echo "Set M8R_SIKULIX_SCRIPTS_DIR env var to specify directory w/ MindForger's SikuliX scripts" exit 1 fi -if [ ${OPTION_RUN_VALGRIND} ] +if [ ${OPTION_RUN_VALGRIND} ] then export M8R_VALGRIND="valgrind --track-origins=yes --tool=memcheck --leak-check=full --show-leak-kinds=all" #export M8R_VALGRIND="valgrind -v --track-origins=yes --tool=memcheck --leak-check=full --show-leak-kinds=all" @@ -71,7 +71,7 @@ then exit 0 fi - + # Compile source w/ debug code enabled and various test libs linked to get test-ready binary # - use -g GCC option to get line information # Valgrind diff --git a/build/make/test-init-mf-repo-in-tmp.sh b/build/make/test-init-mf-repo-in-tmp.sh index 34e094fd..b51ce2b5 100755 --- a/build/make/test-init-mf-repo-in-tmp.sh +++ b/build/make/test-init-mf-repo-in-tmp.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-l10n.sh b/build/make/test-l10n.sh index 271f1667..9c196578 100755 --- a/build/make/test-l10n.sh +++ b/build/make/test-l10n.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/make/test-lib-units.sh b/build/make/test-lib-units.sh index c769deda..c78c90a6 100755 --- a/build/make/test-lib-units.sh +++ b/build/make/test-lib-units.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -136,9 +136,9 @@ then exit 1 fi -if [ ${OPTION_RUN_VALGRIND} ] +if [ ${OPTION_RUN_VALGRIND} ] then - if [ ${OPTION_RUN_GDB} ] + if [ ${OPTION_RUN_GDB} ] then export M8R_VALGRIND="valgrind --vgdb=yes --vgdb-error=0 --track-origins=yes --tool=memcheck --leak-check=full --show-leak-kinds=all" else @@ -146,8 +146,8 @@ then export M8R_VALGRIND="valgrind -v --track-origins=yes --tool=memcheck --leak-check=full --show-leak-kinds=all" fi else - export M8R_VALGRIND= - if [ ${OPTION_RUN_GDB} ] + export M8R_VALGRIND= + if [ ${OPTION_RUN_GDB} ] then export M8R_GDB="gdb --args" fi diff --git a/build/release/release-tgz-deb-rpm-exe.sh b/build/release/release-tgz-deb-rpm-exe.sh index c6e5d7c6..fefb166d 100755 --- a/build/release/release-tgz-deb-rpm-exe.sh +++ b/build/release/release-tgz-deb-rpm-exe.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/run-win-app.bat b/build/run-win-app.bat index 07c01868..6df26a74 100644 --- a/build/run-win-app.bat +++ b/build/run-win-app.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2023 +rem Copyright (C) 2016-2024 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/run-win-unit-tests.bat b/build/run-win-unit-tests.bat index fd799e12..2102775f 100644 --- a/build/run-win-unit-tests.bat +++ b/build/run-win-unit-tests.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2023 +rem Copyright (C) 2016-2024 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/build/tarball/tarball-build.sh b/build/tarball/tarball-build.sh index 5faf4b17..a6688056 100755 --- a/build/tarball/tarball-build.sh +++ b/build/tarball/tarball-build.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/travis-ci/.travis.yml b/build/travis-ci/.travis.yml index 7f04df3e..d0f64646 100644 --- a/build/travis-ci/.travis.yml +++ b/build/travis-ci/.travis.yml @@ -1,6 +1,6 @@ # .travis.yml Travis CI configuration file for MindForger # -# Copyright (C) 2014-2023 Martin Dvorak +# Copyright (C) 2014-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -17,12 +17,12 @@ os: - linux - + # Missing codecvt: upgrade from g++ 4.8 to 5 > MATRIX_EVAL sets CXX to g++-5 > qmake CONFIG and QMAKE_CXX sets it to build process matrix: include: - os: linux - addons: + addons: apt: sources: - ubuntu-toolchain-r-test @@ -40,7 +40,7 @@ dist: trusty # Travis CI provides Precise and Trusty only before_install: - sudo apt-get update -qq - "export DISPLAY=:99.0" - - "sh -e /etc/init.d/xvfb start" + - "sh -e /etc/init.d/xvfb start" - sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa - sudo apt-get update -qq - eval "${MATRIX_EVAL}" @@ -62,7 +62,7 @@ script: # make lib unit tests > run lib unit tests > make MF > install MF - cd "${M8RHOME}" - eval "${MATRIX_EVAL}" - cd deps/cmark-gfm && mkdir -v build && cd build && cmake -DCMARK_TESTS=OFF -DCMARK_SHARED=OFF .. && cmake --build . && cd ../../.. - - "echo \"M8RDEBUG: g++ compiler is set to: ${CXX}\"" + - "echo \"M8RDEBUG: g++ compiler is set to: ${CXX}\"" - cd lib/test # UNIT tests - qmake -r CONFIG+=mfnocxx CONFIG+=mfunits QMAKE_CXX=${CXX} mindforger-lib-unit-tests.pro - make diff --git a/build/ubuntu/build-all-clean-system.sh b/build/ubuntu/build-all-clean-system.sh index f3c5a8bf..b1eaeda6 100755 --- a/build/ubuntu/build-all-clean-system.sh +++ b/build/ubuntu/build-all-clean-system.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/ubuntu/debian/copyright b/build/ubuntu/debian/copyright index a983d196..42e95756 100644 --- a/build/ubuntu/debian/copyright +++ b/build/ubuntu/debian/copyright @@ -3,7 +3,7 @@ Upstream-Name: mindforger Source: https://github.com/dvorka/mindforger Files: debian/* -Copyright: 2016-2023 Martin Dvorak +Copyright: 2016-2024 Martin Dvorak License: GPL-2+ MindForger is licensed under GNU GPL version 2 or any later version. . diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh b/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh index 60098b03..5dee1e41 100755 --- a/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh +++ b/build/ubuntu/ubuntu-launchpad-releases-from-beast.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh index 423c6ef7..80ba6bc6 100755 --- a/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh +++ b/build/ubuntu/ubuntu-launchpad-releases-from-mind.sh @@ -2,7 +2,7 @@ # # MindForger knowledge management tool # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -34,7 +34,7 @@ # > builds binary .deb # ~ checks that .deb build for target Ubuntu distro is OK # > uploads signed .dsc to LaunchPad using dput -# IMPORTANT: for ^ upload .deb builds are NOT needed, only signed .dsc +# IMPORTANT: for ^ upload .deb builds are NOT needed, only signed .dsc # # Tips: # - run the script from Emacs shell to easily review and analyze @@ -62,7 +62,7 @@ # https://launchpad.net/~ultradvorka/+editpgpkeys # # SSH key configuration: -# 1. Launchpad: upload and register the key +# 1. Launchpad: upload and register the key # https://launchpad.net/~ultradvorka/+editsshkeys # ~/.ssh/id_rsa.pub # @@ -136,7 +136,7 @@ function echoStepDone { function debugExit { echo "EXITING SCRIPT: intentional development script exit" - exit 1 + exit 1 } # ######################################################################## @@ -146,9 +146,9 @@ function debugExit { function checkoutMindforger { # use `bzr` to manually check and work with Bazaar repository: # - bzr ... get help - # - bzr status + # - bzr status # - bzr commit ... commints and PUSHES changes to server - + export MFSRC=$2 # create new branch: bzr init && bzr push lp:~ultradvorka/+junk/mindforger bzr checkout lp:~ultradvorka/+junk/mindforger @@ -171,7 +171,7 @@ function checkoutMindforger { rm -rf${OPT_VERBOSE} ./deps/mitie # IMPROVE: static libraries lib*.a are NOT deleted to keep cmark-gfm dependency libs find . -type f \( -name "*moc_*.cpp" -or -name "*.o" -or -name "*.*~" -or -name ".gitignore" -or -name ".git" \) | while read F; do rm -vf $F; done - + cd .. } @@ -199,7 +199,7 @@ function createTarball { echoStep "Create TARBALL ${MF}" # .orig.tar.gz is required Debian convention TARBALL_FILE="${MF}.orig.tar.gz" - + cd .. mkdir work cd work @@ -252,11 +252,11 @@ function releaseForParticularUbuntuVersion { export MFSRC=/home/dvorka/p/mindforger/git/mindforger export NOW=`date +%Y-%m-%d--%H-%M-%S` export MFBUILD=mindforger-${NOW} - + # 1) clean up echoStep "Cleanup" rm -rvf *.*~ ./debian - + # 2) checkout MindForger from Launchpad's bazaar to work directory # (will be needed to build SOURCE .deb package) echoStep "Checkout MF from LaunchPad bazaar" @@ -279,7 +279,7 @@ function releaseForParticularUbuntuVersion { # cmark-gfm static library: ls -l deps/cmark-gfm/build/src/libcmark-gfm.a if [[ $? -eq 0 ]] ; then echo " SUCCESSFULL"; else echo " FAILED"; exit 1; fi - + # 5) generate MF Makefiles using qmake echoStep "Generate Makefiles using qmake" cd .. @@ -291,7 +291,7 @@ function releaseForParticularUbuntuVersion { # Instead debian/rules file exports env var w/ Qt choice # .pro file is also extended to have 'make install' target qmake -r mindforger.pro - + # 6) optionally PATCH source files e.g. different Ubuntu distro specific paths echoStep "Patch Makefiles - fix Qt paths for Ubuntu versions" #if [[ "xenial" = "${UBUNTUVERSION}" ]] @@ -306,7 +306,7 @@ function releaseForParticularUbuntuVersion { echo -e "\n---------------------------------------------------------------" echo -e "5.1) create TARBALL: prepare files to work/ directory" createTarball - + # 8) start GPG agent if it's NOT running # gpg-agent is a program that runs in the background (a daemon) and stores # GPG secret keys in memory. When a GPG process needs the key, it contacts @@ -318,7 +318,7 @@ function releaseForParticularUbuntuVersion { echo "OK: GPG agent running." else gpg-agent --daemon - fi + fi # 9) add new version to LOCAL Bazaar branch (which will be used for .deb build) echoStep "add & commit ${MF} prepared files to the current bazaar branch" @@ -356,7 +356,7 @@ function releaseForParticularUbuntuVersion { build_status=$? echo -e "DONE: SOURCE .deb package build on HOST system (buildarea/mindforger_...orig.tar.gz):" if [[ $build_status -eq 0 ]] ; then echo " SUCCESSFULL"; else echo " FAILED"; exit 1; fi - + # 11) build BINARY .deb from source .deb on CLEAN system to dry run build @ Launchpad echoStep "Build SIGNED BINARY .deb package from source .deb (created in previous step) on CLEAN system (FAKEROOT mounted) - this is actual deps installation, compilation and link of the executable to create .deb file with the binary, HOWEVER, the binar .deb is NOT uploaded, this steps is made just to verify that the build will NOT fail on Launchpad (for the build is used just signed .dsc file)" # Build is made using Makefile(s) generated by qmake above: @@ -400,7 +400,7 @@ function releaseForParticularUbuntuVersion { bzr push lp:~ultradvorka/+junk/mindforger if [[ ${OPT_DO_RELEASE} == "true" ]] - then + then cd .. echo "Invoking dput in: $(pwd)" ls -l ${MFRELEASE}_source.changes diff --git a/build/ubuntu/ubuntu-pbuilder-add-distros.sh b/build/ubuntu/ubuntu-pbuilder-add-distros.sh index 1f973137..9d15fbb9 100755 --- a/build/ubuntu/ubuntu-pbuilder-add-distros.sh +++ b/build/ubuntu/ubuntu-pbuilder-add-distros.sh @@ -2,7 +2,7 @@ # # MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/build/windows/build-win-installer.bat b/build/windows/build-win-installer.bat index 83a96279..5cde16f0 100644 --- a/build/windows/build-win-installer.bat +++ b/build/windows/build-win-installer.bat @@ -1,7 +1,7 @@ @echo off rem MindForger thinking notebook -rem Copyright (C) 2016-2023 +rem Copyright (C) 2016-2024 rem This program is free software; you can redistribute it and/or rem modify it under the terms of the GNU General Public License diff --git a/deps/zlib-win/include/zconf.h b/deps/zlib-win/include/zconf.h index 76a7876b..6baede84 100644 --- a/deps/zlib-win/include/zconf.h +++ b/deps/zlib-win/include/zconf.h @@ -5,7 +5,7 @@ /* * MindForger thinking notebook - * Copyright (C) 2016-2023 Martin Dvorak + * Copyright (C) 2016-2024 Martin Dvorak * * This header file has been modified for MindForger as follows: diff --git a/lib/lib.pro b/lib/lib.pro index 8f6a6da0..917942fe 100644 --- a/lib/lib.pro +++ b/lib/lib.pro @@ -1,6 +1,6 @@ # mindforger-lib.pro MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software ; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -306,7 +306,7 @@ mfner { HEADERS += \ src/mind/ai/nlp/named_entity_recognition.h \ src/mind/ai/nlp/ner_named_entity.h -} +} win32 { HEADERS += \ diff --git a/lib/src/app_info.h b/lib/src/app_info.h index e7279bef..2381bf07 100644 --- a/lib/src/app_info.h +++ b/lib/src/app_info.h @@ -8,5 +8,5 @@ #define MINDFORGER_APP_AUTHOR "Martin Dvorak" #define MINDFORGER_APP_URL "https://www.mindforger.com" #define MINDFORGER_APP_COMPANY MINDFORGER_APP_NAME -#define MINDFORGER_APP_LEGAL "\xA9 2016-2023 Martin Dvorak. All Rights Reserved" +#define MINDFORGER_APP_LEGAL "\xA9 2016-2024 Martin Dvorak. All Rights Reserved" #define MINDFORGER_APP_EXE "mindforger.exe" diff --git a/lib/src/compilation.h b/lib/src/compilation.h index faf58578..78e5c16e 100644 --- a/lib/src/compilation.h +++ b/lib/src/compilation.h @@ -1,7 +1,7 @@ /* compilation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/color.h b/lib/src/config/color.h index ba1e34e2..4febc4f3 100644 --- a/lib/src/config/color.h +++ b/lib/src/config/color.h @@ -1,7 +1,7 @@ /* color.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/configuration.cpp b/lib/src/config/configuration.cpp index 35123e5b..376f0ca3 100644 --- a/lib/src/config/configuration.cpp +++ b/lib/src/config/configuration.cpp @@ -1,7 +1,7 @@ /* configuration.cpp M8r configuration management - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h index 3fb79e7c..ba7f5b6d 100644 --- a/lib/src/config/configuration.h +++ b/lib/src/config/configuration.h @@ -1,7 +1,7 @@ /* configuration.h M8r configuration management - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/palette.cpp b/lib/src/config/palette.cpp index b0ba1c6c..afc9940d 100644 --- a/lib/src/config/palette.cpp +++ b/lib/src/config/palette.cpp @@ -1,7 +1,7 @@ /* palette.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/palette.h b/lib/src/config/palette.h index ec6f8c0b..d7aa8ee3 100644 --- a/lib/src/config/palette.h +++ b/lib/src/config/palette.h @@ -1,7 +1,7 @@ /* palette.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/repository.cpp b/lib/src/config/repository.cpp index a93df25d..520e5dba 100644 --- a/lib/src/config/repository.cpp +++ b/lib/src/config/repository.cpp @@ -1,7 +1,7 @@ /* repository.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/repository.h b/lib/src/config/repository.h index 80992692..79652f3c 100644 --- a/lib/src/config/repository.h +++ b/lib/src/config/repository.h @@ -1,7 +1,7 @@ /* repository.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/repository_configuration.cpp b/lib/src/config/repository_configuration.cpp index 537289dd..4645b078 100644 --- a/lib/src/config/repository_configuration.cpp +++ b/lib/src/config/repository_configuration.cpp @@ -1,7 +1,7 @@ /* repository_configuration.cpp M8r configuration management - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/repository_configuration.h b/lib/src/config/repository_configuration.h index 2615c659..d59e6472 100644 --- a/lib/src/config/repository_configuration.h +++ b/lib/src/config/repository_configuration.h @@ -1,7 +1,7 @@ /* repository_configuration.h M8r configuration management - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/time_scope.cpp b/lib/src/config/time_scope.cpp index 0f40023f..914e2906 100644 --- a/lib/src/config/time_scope.cpp +++ b/lib/src/config/time_scope.cpp @@ -1,7 +1,7 @@ /* time_scope.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/config/time_scope.h b/lib/src/config/time_scope.h index 1f571e3d..22654725 100644 --- a/lib/src/config/time_scope.h +++ b/lib/src/config/time_scope.h @@ -1,7 +1,7 @@ /* time_scope.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/debug.h b/lib/src/debug.h index 70fe53a9..e3b01b68 100644 --- a/lib/src/debug.h +++ b/lib/src/debug.h @@ -1,7 +1,7 @@ /* debug.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/definitions.h b/lib/src/definitions.h index 04a40668..e5b428c1 100644 --- a/lib/src/definitions.h +++ b/lib/src/definitions.h @@ -1,7 +1,7 @@ /* definitions.h MindForger type, include, ... definitions - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/exceptions.h b/lib/src/exceptions.h index a8e08648..a1ee2f65 100644 --- a/lib/src/exceptions.h +++ b/lib/src/exceptions.h @@ -1,7 +1,7 @@ /* exceptions.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/async_utils.cpp b/lib/src/gear/async_utils.cpp index 047ea1d5..391752e8 100644 --- a/lib/src/gear/async_utils.cpp +++ b/lib/src/gear/async_utils.cpp @@ -1,7 +1,7 @@ /* async_utils.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/async_utils.h b/lib/src/gear/async_utils.h index e2a4393e..66e4a5ce 100644 --- a/lib/src/gear/async_utils.h +++ b/lib/src/gear/async_utils.h @@ -1,7 +1,7 @@ /* async_utils.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/datetime_utils.cpp b/lib/src/gear/datetime_utils.cpp index d34125b3..c2026d96 100644 --- a/lib/src/gear/datetime_utils.cpp +++ b/lib/src/gear/datetime_utils.cpp @@ -1,7 +1,7 @@ /* datetime_utils.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/datetime_utils.h b/lib/src/gear/datetime_utils.h index e2f39db5..1b26f3b3 100644 --- a/lib/src/gear/datetime_utils.h +++ b/lib/src/gear/datetime_utils.h @@ -1,7 +1,7 @@ /* datetime_utils.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/file_utils.cpp b/lib/src/gear/file_utils.cpp index f43fdf22..18f538e2 100644 --- a/lib/src/gear/file_utils.cpp +++ b/lib/src/gear/file_utils.cpp @@ -1,7 +1,7 @@ /* file_utils.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/file_utils.h b/lib/src/gear/file_utils.h index 836ba870..35572f6a 100644 --- a/lib/src/gear/file_utils.h +++ b/lib/src/gear/file_utils.h @@ -1,7 +1,7 @@ /* file_utils.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/hash_map.h b/lib/src/gear/hash_map.h index 60fb0dcf..9738f92e 100644 --- a/lib/src/gear/hash_map.h +++ b/lib/src/gear/hash_map.h @@ -1,7 +1,7 @@ /* hash_map.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/lang_utils.h b/lib/src/gear/lang_utils.h index 0e5e86c1..7a9f2a6b 100644 --- a/lib/src/gear/lang_utils.h +++ b/lib/src/gear/lang_utils.h @@ -1,7 +1,7 @@ /* lang-utils.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/math_utils.cpp b/lib/src/gear/math_utils.cpp index 284dd6fa..14abbf59 100644 --- a/lib/src/gear/math_utils.cpp +++ b/lib/src/gear/math_utils.cpp @@ -1,7 +1,7 @@ /* math_utils.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/math_utils.h b/lib/src/gear/math_utils.h index e17c4240..f0580a87 100644 --- a/lib/src/gear/math_utils.h +++ b/lib/src/gear/math_utils.h @@ -1,7 +1,7 @@ /* math_utils.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/string_utils.cpp b/lib/src/gear/string_utils.cpp index 5f5876a2..31fbdee3 100644 --- a/lib/src/gear/string_utils.cpp +++ b/lib/src/gear/string_utils.cpp @@ -1,7 +1,7 @@ /* string-utils.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/string_utils.h b/lib/src/gear/string_utils.h index de3e993f..34c08ec9 100644 --- a/lib/src/gear/string_utils.h +++ b/lib/src/gear/string_utils.h @@ -1,7 +1,7 @@ /* string-utils.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/gear/trie.cpp b/lib/src/gear/trie.cpp index 49cb3701..7c3e6fcd 100644 --- a/lib/src/gear/trie.cpp +++ b/lib/src/gear/trie.cpp @@ -1,7 +1,7 @@ /* trie.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -34,7 +34,7 @@ Trie::~Trie() } void Trie::destroy(Node* n) -{ +{ for(Node* c:n->mChildren) { destroy(c); } diff --git a/lib/src/gear/trie.h b/lib/src/gear/trie.h index 1ec11ab5..a834930d 100644 --- a/lib/src/gear/trie.h +++ b/lib/src/gear/trie.h @@ -1,7 +1,7 @@ /* trie.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/install/installer.cpp b/lib/src/install/installer.cpp index 509c2020..fabda199 100644 --- a/lib/src/install/installer.cpp +++ b/lib/src/install/installer.cpp @@ -1,7 +1,7 @@ /* installer.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/install/installer.h b/lib/src/install/installer.h index b194f814..4c3e8182 100644 --- a/lib/src/install/installer.h +++ b/lib/src/install/installer.h @@ -1,7 +1,7 @@ /* installer.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/aa_model.cpp b/lib/src/mind/ai/aa_model.cpp index 141fc073..cee616f2 100644 --- a/lib/src/mind/ai/aa_model.cpp +++ b/lib/src/mind/ai/aa_model.cpp @@ -1,7 +1,7 @@ /* aa_model.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/aa_model.h b/lib/src/mind/ai/aa_model.h index 2e4cbc2c..3ea7e2f4 100644 --- a/lib/src/mind/ai/aa_model.h +++ b/lib/src/mind/ai/aa_model.h @@ -1,7 +1,7 @@ /* aa_model.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/aa_notes_feature.cpp b/lib/src/mind/ai/aa_notes_feature.cpp index 5e1fba8f..68e71396 100644 --- a/lib/src/mind/ai/aa_notes_feature.cpp +++ b/lib/src/mind/ai/aa_notes_feature.cpp @@ -1,7 +1,7 @@ /* aa_notes_feature.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/aa_notes_feature.h b/lib/src/mind/ai/aa_notes_feature.h index aa77659f..a0409c85 100644 --- a/lib/src/mind/ai/aa_notes_feature.h +++ b/lib/src/mind/ai/aa_notes_feature.h @@ -1,7 +1,7 @@ /* aa_notes_feature.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai.cpp b/lib/src/mind/ai/ai.cpp index 8cbf5641..8b2b2c2a 100644 --- a/lib/src/mind/ai/ai.cpp +++ b/lib/src/mind/ai/ai.cpp @@ -1,7 +1,7 @@ /* ai.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai.h b/lib/src/mind/ai/ai.h index 4b7ad5b4..b49c937b 100644 --- a/lib/src/mind/ai/ai.h +++ b/lib/src/mind/ai/ai.h @@ -1,7 +1,7 @@ /* ai.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai_aa.h b/lib/src/mind/ai/ai_aa.h index 13a69ecd..0e70166f 100644 --- a/lib/src/mind/ai/ai_aa.h +++ b/lib/src/mind/ai/ai_aa.h @@ -1,7 +1,7 @@ /* ai_aa.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai_aa_bow.cpp b/lib/src/mind/ai/ai_aa_bow.cpp index 03874d96..22bbf253 100644 --- a/lib/src/mind/ai/ai_aa_bow.cpp +++ b/lib/src/mind/ai/ai_aa_bow.cpp @@ -1,7 +1,7 @@ /* ai_aa_bow.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -147,7 +147,7 @@ shared_future AiAaBoW::getAssociatedNotes(const Note* note, vector p{}; p.set_value(true); return shared_future(p.get_future()); - } else { + } else { MF_DEBUG("AA.BoW: ASYNC leaderboard calculation for '" << note->getName() << "'" << endl); if(leaderboardWip.find(note) != leaderboardWip.end()) { // calculation WIP & future OWNER will update what needs to be updated -> intentionally NOT sharing futures diff --git a/lib/src/mind/ai/ai_aa_bow.h b/lib/src/mind/ai/ai_aa_bow.h index 326171c3..477c8a40 100644 --- a/lib/src/mind/ai/ai_aa_bow.h +++ b/lib/src/mind/ai/ai_aa_bow.h @@ -1,7 +1,7 @@ /* ai_aa_bow.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/ai_aa_weighted_fts.cpp b/lib/src/mind/ai/ai_aa_weighted_fts.cpp index 5c9a001e..18e8bb2c 100644 --- a/lib/src/mind/ai/ai_aa_weighted_fts.cpp +++ b/lib/src/mind/ai/ai_aa_weighted_fts.cpp @@ -1,7 +1,7 @@ /* ai_aa_weighted_fts.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -112,7 +112,7 @@ void AiAaWeightedFts::tokenizeAndStripString(string s, const bool ignoreCase, ve } vector>* AiAaWeightedFts::assessNotesWithFallback(const string& regexp, Outline* scope, const Note* self) -{ +{ vector>* result = new vector>(); if(regexp.empty()) return result; diff --git a/lib/src/mind/ai/ai_aa_weighted_fts.h b/lib/src/mind/ai/ai_aa_weighted_fts.h index bfd5825d..34906c3e 100644 --- a/lib/src/mind/ai/ai_aa_weighted_fts.h +++ b/lib/src/mind/ai/ai_aa_weighted_fts.h @@ -1,7 +1,7 @@ /* ai_aa_weighted_fts.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/autolinking_mind.cpp b/lib/src/mind/ai/autolinking/autolinking_mind.cpp index 74a99709..701b3584 100644 --- a/lib/src/mind/ai/autolinking/autolinking_mind.cpp +++ b/lib/src/mind/ai/autolinking/autolinking_mind.cpp @@ -1,7 +1,7 @@ /* autolinking_mind.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/autolinking_mind.h b/lib/src/mind/ai/autolinking/autolinking_mind.h index b436883d..2d50a106 100644 --- a/lib/src/mind/ai/autolinking/autolinking_mind.h +++ b/lib/src/mind/ai/autolinking/autolinking_mind.h @@ -1,7 +1,7 @@ /* autolinking_mind.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp index 7daac9e0..492061da 100644 --- a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp @@ -1,7 +1,7 @@ /* cmark_aho_corasick_block_autolinking_preprocessor.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h index 5a22faf3..f51dcee6 100644 --- a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h +++ b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h @@ -1,7 +1,7 @@ /* cmark_aho_corasick_block_autolinking_preprocessor.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.cpp index a28136e2..adb42f55 100644 --- a/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.cpp @@ -1,7 +1,7 @@ /* cmark_trie_line_autolinking_preprocessor.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.h b/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.h index 04e2eb42..7e976755 100644 --- a/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.h +++ b/lib/src/mind/ai/autolinking/cmark_trie_line_autolinking_preprocessor.h @@ -1,7 +1,7 @@ /* cmark_trie_line_autolinking_preprocessor.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.cpp index 73fefc05..403fb193 100644 --- a/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.cpp @@ -1,7 +1,7 @@ /* naive_autolinking_preprocessor.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -118,7 +118,7 @@ void NaiveAutolinkingPreprocessor::process(const vector& md, string &am // skip code/math/... blocks if(stringStartsWith(*l, CODE_BLOCK)) { - inCodeBlock = !inCodeBlock; + inCodeBlock = !inCodeBlock; nl->append(*l); amdl.push_back(nl); diff --git a/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.h b/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.h index 8f07fd54..74f5cd0c 100644 --- a/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.h +++ b/lib/src/mind/ai/autolinking/naive_autolinking_preprocessor.h @@ -1,7 +1,7 @@ /* naive_autolinking_preprocessor.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking_preprocessor.cpp index 0748e8df..12839fe8 100644 --- a/lib/src/mind/ai/autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking_preprocessor.cpp @@ -1,7 +1,7 @@ /* autolinking_preprocessor.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/autolinking_preprocessor.h b/lib/src/mind/ai/autolinking_preprocessor.h index db1e5513..2cb0fba7 100644 --- a/lib/src/mind/ai/autolinking_preprocessor.h +++ b/lib/src/mind/ai/autolinking_preprocessor.h @@ -1,7 +1,7 @@ /* autolinking_preprocessor.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/llm/mock_wingman.cpp b/lib/src/mind/ai/llm/mock_wingman.cpp index bccc1b5a..afe572f2 100644 --- a/lib/src/mind/ai/llm/mock_wingman.cpp +++ b/lib/src/mind/ai/llm/mock_wingman.cpp @@ -1,7 +1,7 @@ /* mock_wingman.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/llm/mock_wingman.h b/lib/src/mind/ai/llm/mock_wingman.h index b6a69bb5..6480d66f 100644 --- a/lib/src/mind/ai/llm/mock_wingman.h +++ b/lib/src/mind/ai/llm/mock_wingman.h @@ -1,7 +1,7 @@ /* mock_wingman.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/llm/wingman.cpp b/lib/src/mind/ai/llm/wingman.cpp index fdab1c66..e5b78ab8 100644 --- a/lib/src/mind/ai/llm/wingman.cpp +++ b/lib/src/mind/ai/llm/wingman.cpp @@ -1,7 +1,7 @@ /* wingman.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h index 0d5b8c7e..94e61b9c 100644 --- a/lib/src/mind/ai/llm/wingman.h +++ b/lib/src/mind/ai/llm/wingman.h @@ -1,7 +1,7 @@ /* wingman.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/bag_of_words.cpp b/lib/src/mind/ai/nlp/bag_of_words.cpp index d56fd8e4..37ccafee 100644 --- a/lib/src/mind/ai/nlp/bag_of_words.cpp +++ b/lib/src/mind/ai/nlp/bag_of_words.cpp @@ -1,7 +1,7 @@ /* bag_of_words.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/bag_of_words.h b/lib/src/mind/ai/nlp/bag_of_words.h index 3209418b..ce9ba884 100644 --- a/lib/src/mind/ai/nlp/bag_of_words.h +++ b/lib/src/mind/ai/nlp/bag_of_words.h @@ -1,7 +1,7 @@ /* bag_of_words.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/char_provider.h b/lib/src/mind/ai/nlp/char_provider.h index c602087b..f5596c1d 100644 --- a/lib/src/mind/ai/nlp/char_provider.h +++ b/lib/src/mind/ai/nlp/char_provider.h @@ -1,7 +1,7 @@ /* char_provider.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/common_words_blacklist.cpp b/lib/src/mind/ai/nlp/common_words_blacklist.cpp index 3531a7cd..fb21bfde 100644 --- a/lib/src/mind/ai/nlp/common_words_blacklist.cpp +++ b/lib/src/mind/ai/nlp/common_words_blacklist.cpp @@ -1,7 +1,7 @@ /* common_words_blacklist.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/common_words_blacklist.h b/lib/src/mind/ai/nlp/common_words_blacklist.h index 0665734f..6e8eb2b9 100644 --- a/lib/src/mind/ai/nlp/common_words_blacklist.h +++ b/lib/src/mind/ai/nlp/common_words_blacklist.h @@ -1,7 +1,7 @@ /* common_words_blacklist.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/lexicon.cpp b/lib/src/mind/ai/nlp/lexicon.cpp index 525a2fc2..b7b4b83f 100644 --- a/lib/src/mind/ai/nlp/lexicon.cpp +++ b/lib/src/mind/ai/nlp/lexicon.cpp @@ -1,7 +1,7 @@ /* lexicon.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/lexicon.h b/lib/src/mind/ai/nlp/lexicon.h index f17edb0e..cc30d39d 100644 --- a/lib/src/mind/ai/nlp/lexicon.h +++ b/lib/src/mind/ai/nlp/lexicon.h @@ -1,7 +1,7 @@ /* lexicon.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/markdown_tokenizer.cpp b/lib/src/mind/ai/nlp/markdown_tokenizer.cpp index 69e0fb5e..54f24eb9 100644 --- a/lib/src/mind/ai/nlp/markdown_tokenizer.cpp +++ b/lib/src/mind/ai/nlp/markdown_tokenizer.cpp @@ -1,7 +1,7 @@ /* markdown_tokenizer.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/markdown_tokenizer.h b/lib/src/mind/ai/nlp/markdown_tokenizer.h index 0f64f491..2274c67f 100644 --- a/lib/src/mind/ai/nlp/markdown_tokenizer.h +++ b/lib/src/mind/ai/nlp/markdown_tokenizer.h @@ -1,7 +1,7 @@ /* markdown_tokenizer.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/named_entity_recognition.cpp b/lib/src/mind/ai/nlp/named_entity_recognition.cpp index 30643744..18b9085e 100644 --- a/lib/src/mind/ai/nlp/named_entity_recognition.cpp +++ b/lib/src/mind/ai/nlp/named_entity_recognition.cpp @@ -1,7 +1,7 @@ /* named_entity_recognition.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -86,7 +86,7 @@ vector NamedEntityRecognition::tokenizeFile(const string& filename) std::vector tokens; string token; - // Read the tokens out of the file one at a time and store into tokens. + // Read the tokens out of the file one at a time and store into tokens. while(tok(token)) { tokens.push_back(token); } diff --git a/lib/src/mind/ai/nlp/named_entity_recognition.h b/lib/src/mind/ai/nlp/named_entity_recognition.h index 10501c15..ffb80ebb 100644 --- a/lib/src/mind/ai/nlp/named_entity_recognition.h +++ b/lib/src/mind/ai/nlp/named_entity_recognition.h @@ -1,7 +1,7 @@ /* named_entity_recognition.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/ner_named_entity.cpp b/lib/src/mind/ai/nlp/ner_named_entity.cpp index a99932fd..c04c4dd8 100644 --- a/lib/src/mind/ai/nlp/ner_named_entity.cpp +++ b/lib/src/mind/ai/nlp/ner_named_entity.cpp @@ -1,7 +1,7 @@ /* ner_named_entity.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/ner_named_entity.h b/lib/src/mind/ai/nlp/ner_named_entity.h index ff5e4d68..a29a940e 100644 --- a/lib/src/mind/ai/nlp/ner_named_entity.h +++ b/lib/src/mind/ai/nlp/ner_named_entity.h @@ -1,7 +1,7 @@ /* ner_named_entity.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/note_char_provider.cpp b/lib/src/mind/ai/nlp/note_char_provider.cpp index 55cb47f9..8fca90df 100644 --- a/lib/src/mind/ai/nlp/note_char_provider.cpp +++ b/lib/src/mind/ai/nlp/note_char_provider.cpp @@ -1,7 +1,7 @@ /* note_char_provider.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/note_char_provider.h b/lib/src/mind/ai/nlp/note_char_provider.h index d5c275e1..0f8e98c0 100644 --- a/lib/src/mind/ai/nlp/note_char_provider.h +++ b/lib/src/mind/ai/nlp/note_char_provider.h @@ -1,7 +1,7 @@ /* note_char_provider.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/outline_char_provider.cpp b/lib/src/mind/ai/nlp/outline_char_provider.cpp index 382fb08d..38a4c3bd 100644 --- a/lib/src/mind/ai/nlp/outline_char_provider.cpp +++ b/lib/src/mind/ai/nlp/outline_char_provider.cpp @@ -1,7 +1,7 @@ /* outline_char_provider.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/outline_char_provider.h b/lib/src/mind/ai/nlp/outline_char_provider.h index 916324da..3e41895f 100644 --- a/lib/src/mind/ai/nlp/outline_char_provider.h +++ b/lib/src/mind/ai/nlp/outline_char_provider.h @@ -1,7 +1,7 @@ /* outline_char_provider.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/stemmer/stemmer.cpp b/lib/src/mind/ai/nlp/stemmer/stemmer.cpp index 39b0f165..2af14f93 100644 --- a/lib/src/mind/ai/nlp/stemmer/stemmer.cpp +++ b/lib/src/mind/ai/nlp/stemmer/stemmer.cpp @@ -1,7 +1,7 @@ /* stemmer.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/stemmer/stemmer.h b/lib/src/mind/ai/nlp/stemmer/stemmer.h index f3847a4f..fbe9f911 100644 --- a/lib/src/mind/ai/nlp/stemmer/stemmer.h +++ b/lib/src/mind/ai/nlp/stemmer/stemmer.h @@ -1,7 +1,7 @@ /* stemmer.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/string_char_provider.cpp b/lib/src/mind/ai/nlp/string_char_provider.cpp index 732f2f92..fb7e3f8d 100644 --- a/lib/src/mind/ai/nlp/string_char_provider.cpp +++ b/lib/src/mind/ai/nlp/string_char_provider.cpp @@ -1,7 +1,7 @@ /* string_char_provider.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/string_char_provider.h b/lib/src/mind/ai/nlp/string_char_provider.h index 0eabc7e7..4bc673f3 100644 --- a/lib/src/mind/ai/nlp/string_char_provider.h +++ b/lib/src/mind/ai/nlp/string_char_provider.h @@ -1,7 +1,7 @@ /* string_char_provider.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/word_frequency_list.cpp b/lib/src/mind/ai/nlp/word_frequency_list.cpp index cd527400..0968b612 100644 --- a/lib/src/mind/ai/nlp/word_frequency_list.cpp +++ b/lib/src/mind/ai/nlp/word_frequency_list.cpp @@ -1,7 +1,7 @@ /* word_frequency_list.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ai/nlp/word_frequency_list.h b/lib/src/mind/ai/nlp/word_frequency_list.h index bc13ff17..08a616c8 100644 --- a/lib/src/mind/ai/nlp/word_frequency_list.h +++ b/lib/src/mind/ai/nlp/word_frequency_list.h @@ -1,7 +1,7 @@ /* word_frequency_list.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/aspect.h b/lib/src/mind/aspect/aspect.h index 1daf35ef..60a6b54e 100644 --- a/lib/src/mind/aspect/aspect.h +++ b/lib/src/mind/aspect/aspect.h @@ -1,7 +1,7 @@ /* aspect.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/mind_scope_aspect.cpp b/lib/src/mind/aspect/mind_scope_aspect.cpp index cee95e66..99f42f22 100644 --- a/lib/src/mind/aspect/mind_scope_aspect.cpp +++ b/lib/src/mind/aspect/mind_scope_aspect.cpp @@ -1,7 +1,7 @@ /* mind_scope_aspect.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/mind_scope_aspect.h b/lib/src/mind/aspect/mind_scope_aspect.h index 261bfdf6..a05c1a98 100644 --- a/lib/src/mind/aspect/mind_scope_aspect.h +++ b/lib/src/mind/aspect/mind_scope_aspect.h @@ -1,7 +1,7 @@ /* mind_scope_aspect.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/tag_scope_aspect.cpp b/lib/src/mind/aspect/tag_scope_aspect.cpp index f9b782c9..ea885ecc 100644 --- a/lib/src/mind/aspect/tag_scope_aspect.cpp +++ b/lib/src/mind/aspect/tag_scope_aspect.cpp @@ -1,7 +1,7 @@ /* tag_scope_aspect.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/tag_scope_aspect.h b/lib/src/mind/aspect/tag_scope_aspect.h index 5459d3db..93fbd407 100644 --- a/lib/src/mind/aspect/tag_scope_aspect.h +++ b/lib/src/mind/aspect/tag_scope_aspect.h @@ -1,7 +1,7 @@ /* tag_scope_aspect.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/time_scope_aspect.cpp b/lib/src/mind/aspect/time_scope_aspect.cpp index ac29377e..e5039d54 100644 --- a/lib/src/mind/aspect/time_scope_aspect.cpp +++ b/lib/src/mind/aspect/time_scope_aspect.cpp @@ -1,7 +1,7 @@ /* forget_aspect.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/aspect/time_scope_aspect.h b/lib/src/mind/aspect/time_scope_aspect.h index 9200eee5..6849cfb6 100644 --- a/lib/src/mind/aspect/time_scope_aspect.h +++ b/lib/src/mind/aspect/time_scope_aspect.h @@ -1,7 +1,7 @@ /* time_scope_aspect.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/associated_notes.cpp b/lib/src/mind/associated_notes.cpp index 98bf10e0..e87587bb 100644 --- a/lib/src/mind/associated_notes.cpp +++ b/lib/src/mind/associated_notes.cpp @@ -1,7 +1,7 @@ /* associated_notes.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/associated_notes.h b/lib/src/mind/associated_notes.h index 0d904ba0..4b7e806e 100644 --- a/lib/src/mind/associated_notes.h +++ b/lib/src/mind/associated_notes.h @@ -1,7 +1,7 @@ /* associated_notes.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/dikw_pyramid.cpp b/lib/src/mind/dikw/dikw_pyramid.cpp index 53f6a1ba..9f36b151 100644 --- a/lib/src/mind/dikw/dikw_pyramid.cpp +++ b/lib/src/mind/dikw/dikw_pyramid.cpp @@ -1,7 +1,7 @@ /* dikw_pyramid.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/dikw_pyramid.h b/lib/src/mind/dikw/dikw_pyramid.h index a34bf3f2..1165fda3 100644 --- a/lib/src/mind/dikw/dikw_pyramid.h +++ b/lib/src/mind/dikw/dikw_pyramid.h @@ -1,7 +1,7 @@ /* dikw_pyramid.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/filesystem_information.cpp b/lib/src/mind/dikw/filesystem_information.cpp index 0fcd774a..05611c8d 100644 --- a/lib/src/mind/dikw/filesystem_information.cpp +++ b/lib/src/mind/dikw/filesystem_information.cpp @@ -1,7 +1,7 @@ /* filesystem_information.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/filesystem_information.h b/lib/src/mind/dikw/filesystem_information.h index 37ec3323..e9291478 100644 --- a/lib/src/mind/dikw/filesystem_information.h +++ b/lib/src/mind/dikw/filesystem_information.h @@ -1,7 +1,7 @@ /* filesystem_information.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/information.cpp b/lib/src/mind/dikw/information.cpp index 77b3b656..eb953657 100644 --- a/lib/src/mind/dikw/information.cpp +++ b/lib/src/mind/dikw/information.cpp @@ -1,7 +1,7 @@ /* information.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/dikw/information.h b/lib/src/mind/dikw/information.h index f0af23b1..9f1a3311 100644 --- a/lib/src/mind/dikw/information.h +++ b/lib/src/mind/dikw/information.h @@ -1,7 +1,7 @@ /* information.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/galaxy.cpp b/lib/src/mind/galaxy.cpp index a075b802..cb7276f6 100644 --- a/lib/src/mind/galaxy.cpp +++ b/lib/src/mind/galaxy.cpp @@ -1,7 +1,7 @@ /* galaxy.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/galaxy.h b/lib/src/mind/galaxy.h index 7c2ee8ba..f7572509 100644 --- a/lib/src/mind/galaxy.h +++ b/lib/src/mind/galaxy.h @@ -1,7 +1,7 @@ /* galaxy.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/knowledge_graph.cpp b/lib/src/mind/knowledge_graph.cpp index c888793c..a75992fc 100644 --- a/lib/src/mind/knowledge_graph.cpp +++ b/lib/src/mind/knowledge_graph.cpp @@ -1,7 +1,7 @@ /* knowledge_graph.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/knowledge_graph.h b/lib/src/mind/knowledge_graph.h index cc1686b0..52a53309 100644 --- a/lib/src/mind/knowledge_graph.h +++ b/lib/src/mind/knowledge_graph.h @@ -1,7 +1,7 @@ /* knowledge_graph.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/limbo.cpp b/lib/src/mind/limbo.cpp index ff809842..1c78379c 100644 --- a/lib/src/mind/limbo.cpp +++ b/lib/src/mind/limbo.cpp @@ -1,7 +1,7 @@ /* limbo.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/limbo.h b/lib/src/mind/limbo.h index 32997aba..f028676c 100644 --- a/lib/src/mind/limbo.h +++ b/lib/src/mind/limbo.h @@ -1,7 +1,7 @@ /* limbo.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/memory.cpp b/lib/src/mind/memory.cpp index f95c313f..d58c26ae 100644 --- a/lib/src/mind/memory.cpp +++ b/lib/src/mind/memory.cpp @@ -1,7 +1,7 @@ /* memory.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/memory.h b/lib/src/mind/memory.h index 2239ea52..42f190a5 100644 --- a/lib/src/mind/memory.h +++ b/lib/src/mind/memory.h @@ -1,7 +1,7 @@ /* memory.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -53,7 +53,7 @@ class Memory */ bool aware; - /** + /** * @brief Cache outlines in memory. * * If FALSE, then outlines are always loaded from diff --git a/lib/src/mind/memory_dwell.cpp b/lib/src/mind/memory_dwell.cpp index 8cd24518..2af986f9 100644 --- a/lib/src/mind/memory_dwell.cpp +++ b/lib/src/mind/memory_dwell.cpp @@ -1,7 +1,7 @@ /* memory_dwell.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/memory_dwell.h b/lib/src/mind/memory_dwell.h index 587b94b8..17e70294 100644 --- a/lib/src/mind/memory_dwell.h +++ b/lib/src/mind/memory_dwell.h @@ -1,7 +1,7 @@ /* memory_dwell.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp index 5098ae3c..fa812255 100644 --- a/lib/src/mind/mind.cpp +++ b/lib/src/mind/mind.cpp @@ -1,7 +1,7 @@ /* mind.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h index f6970dcd..d725222e 100644 --- a/lib/src/mind/mind.h +++ b/lib/src/mind/mind.h @@ -1,7 +1,7 @@ /* mind.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -163,7 +163,7 @@ class Mind : public OntologyProvider /** * Outline map is an Outline used to organize Outlines into the tree. * Notes in the Outline map: - * + * * - has exactly one link which points to the Outline they represent * - Outline link is *relative* on the filesystem and absolute (resolved) in runtime */ @@ -396,7 +396,7 @@ class Mind : public OntologyProvider // >> temporary note of Outline type (never saved), cannot be created by user void getOutlineNames(std::vector& names) const; void getOutlineKeys(std::vector& keys) const; - + /* * SCOPING */ diff --git a/lib/src/mind/mind_listener.h b/lib/src/mind/mind_listener.h index 8b97eb4e..390ddf19 100644 --- a/lib/src/mind/mind_listener.h +++ b/lib/src/mind/mind_listener.h @@ -1,7 +1,7 @@ /* mind_listener.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/ontology.cpp b/lib/src/mind/ontology/ontology.cpp index 058f0eb1..009f50fc 100644 --- a/lib/src/mind/ontology/ontology.cpp +++ b/lib/src/mind/ontology/ontology.cpp @@ -1,7 +1,7 @@ /* ontology.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/ontology.h b/lib/src/mind/ontology/ontology.h index 72029fb7..5c3e6e75 100644 --- a/lib/src/mind/ontology/ontology.h +++ b/lib/src/mind/ontology/ontology.h @@ -1,7 +1,7 @@ /* ontology.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/ontology_vocabulary.h b/lib/src/mind/ontology/ontology_vocabulary.h index b0bdfbc7..c66b120c 100644 --- a/lib/src/mind/ontology/ontology_vocabulary.h +++ b/lib/src/mind/ontology/ontology_vocabulary.h @@ -1,7 +1,7 @@ /* ontology_map.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/taxonomy.h b/lib/src/mind/ontology/taxonomy.h index ac2d3a68..4a1527b7 100644 --- a/lib/src/mind/ontology/taxonomy.h +++ b/lib/src/mind/ontology/taxonomy.h @@ -1,7 +1,7 @@ /* taxonomy.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/thing_class_rel_triple.cpp b/lib/src/mind/ontology/thing_class_rel_triple.cpp index 8400a2d2..3fa704b4 100644 --- a/lib/src/mind/ontology/thing_class_rel_triple.cpp +++ b/lib/src/mind/ontology/thing_class_rel_triple.cpp @@ -1,7 +1,7 @@ /* thing.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/ontology/thing_class_rel_triple.h b/lib/src/mind/ontology/thing_class_rel_triple.h index 446b2df5..71250ea8 100644 --- a/lib/src/mind/ontology/thing_class_rel_triple.h +++ b/lib/src/mind/ontology/thing_class_rel_triple.h @@ -1,7 +1,7 @@ /* thing_class_rel_triple.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/working_memory.cpp b/lib/src/mind/working_memory.cpp index 5d2eb656..92b2de1e 100644 --- a/lib/src/mind/working_memory.cpp +++ b/lib/src/mind/working_memory.cpp @@ -1,7 +1,7 @@ /* working_memory.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/mind/working_memory.h b/lib/src/mind/working_memory.h index 00e2b16e..6eabed7f 100644 --- a/lib/src/mind/working_memory.h +++ b/lib/src/mind/working_memory.h @@ -1,7 +1,7 @@ /* working_memory.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/eisenhower_matrix.cpp b/lib/src/model/eisenhower_matrix.cpp index 25835e21..a7887fa6 100644 --- a/lib/src/model/eisenhower_matrix.cpp +++ b/lib/src/model/eisenhower_matrix.cpp @@ -1,7 +1,7 @@ /* eisenhower_matrix.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/eisenhower_matrix.h b/lib/src/model/eisenhower_matrix.h index 86562988..2f3be4b4 100644 --- a/lib/src/model/eisenhower_matrix.h +++ b/lib/src/model/eisenhower_matrix.h @@ -1,7 +1,7 @@ /* eisenhower_matrix.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/kanban.cpp b/lib/src/model/kanban.cpp index 71459e8a..83c6b737 100644 --- a/lib/src/model/kanban.cpp +++ b/lib/src/model/kanban.cpp @@ -1,7 +1,7 @@ /* kanban.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/kanban.h b/lib/src/model/kanban.h index 3d865a0b..fb507c58 100644 --- a/lib/src/model/kanban.h +++ b/lib/src/model/kanban.h @@ -1,7 +1,7 @@ /* kanban.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/link.cpp b/lib/src/model/link.cpp index 10d89883..ad43af20 100644 --- a/lib/src/model/link.cpp +++ b/lib/src/model/link.cpp @@ -1,7 +1,7 @@ /* link.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/link.h b/lib/src/model/link.h index 16846fb1..1422ffc9 100644 --- a/lib/src/model/link.h +++ b/lib/src/model/link.h @@ -1,7 +1,7 @@ /* link.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/note.cpp b/lib/src/model/note.cpp index 8a3fcc33..321f98b2 100644 --- a/lib/src/model/note.cpp +++ b/lib/src/model/note.cpp @@ -1,7 +1,7 @@ /* note.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -296,7 +296,7 @@ const vector& Note::getDescription() const } string Note::getDescriptionAsString(const std::string& separator) const -{ +{ // IMPROVE cache narrowed description for performance & return it by reference string result{}; if(description.size()) { diff --git a/lib/src/model/note.h b/lib/src/model/note.h index 382324fe..c994b0ed 100644 --- a/lib/src/model/note.h +++ b/lib/src/model/note.h @@ -1,7 +1,7 @@ /* note.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -162,9 +162,9 @@ class Note : public ThingInTime const std::vector& getLinks() const { return links; } Link* getLinkByName(const std::string& name) const; size_t getLinksCount() const { return links.size(); } - void clearLinks() { + void clearLinks() { for(auto l:links) { delete l; } - links.clear(); + links.clear(); } void promote(); diff --git a/lib/src/model/note_type.cpp b/lib/src/model/note_type.cpp index cef050ae..155492e3 100644 --- a/lib/src/model/note_type.cpp +++ b/lib/src/model/note_type.cpp @@ -1,7 +1,7 @@ /* note_type.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/note_type.h b/lib/src/model/note_type.h index 8b41dbc8..8d8f47f8 100644 --- a/lib/src/model/note_type.h +++ b/lib/src/model/note_type.h @@ -1,7 +1,7 @@ /* note_type.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/organizer.cpp b/lib/src/model/organizer.cpp index ddc104b0..5d752b24 100644 --- a/lib/src/model/organizer.cpp +++ b/lib/src/model/organizer.cpp @@ -1,7 +1,7 @@ /* organizer.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -58,7 +58,7 @@ Organizer::Organizer(const Organizer& o) organizerType{o.organizerType}, filterBy{o.getFilterBy()}, modified{o.modified} -{ +{ this->tagsUrQuadrant = o.tagsUrQuadrant; this->tagsUlQuadrant = o.tagsUlQuadrant; this->tagsLrQuadrant = o.tagsLlQuadrant; diff --git a/lib/src/model/organizer.h b/lib/src/model/organizer.h index de57e9a9..9cb76265 100644 --- a/lib/src/model/organizer.h +++ b/lib/src/model/organizer.h @@ -1,7 +1,7 @@ /* organizer.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/outline.cpp b/lib/src/model/outline.cpp index 9853a026..9767edfc 100644 --- a/lib/src/model/outline.cpp +++ b/lib/src/model/outline.cpp @@ -1,7 +1,7 @@ /* outline.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/outline.h b/lib/src/model/outline.h index b3051f5d..81955499 100644 --- a/lib/src/model/outline.h +++ b/lib/src/model/outline.h @@ -1,7 +1,7 @@ /* outline.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -260,7 +260,7 @@ class Outline : public ThingInTime size_t getNotesCount() const; void setNotes(const std::vector& notes); void sortNotesByRead(); - void addNote(Note*); + void addNote(Note*); /** * @brief Clone Note including its children. * diff --git a/lib/src/model/outline_type.cpp b/lib/src/model/outline_type.cpp index 4d5004bc..6a63d1b4 100644 --- a/lib/src/model/outline_type.cpp +++ b/lib/src/model/outline_type.cpp @@ -1,7 +1,7 @@ /* outline_type.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/outline_type.h b/lib/src/model/outline_type.h index 6d07a281..5306ecef 100644 --- a/lib/src/model/outline_type.h +++ b/lib/src/model/outline_type.h @@ -1,7 +1,7 @@ /* outline_type.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/resource_types.h b/lib/src/model/resource_types.h index 02b99e80..ef52a802 100644 --- a/lib/src/model/resource_types.h +++ b/lib/src/model/resource_types.h @@ -1,7 +1,7 @@ /* resource_types.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/stencil.cpp b/lib/src/model/stencil.cpp index 11ff5c69..e43c82ba 100644 --- a/lib/src/model/stencil.cpp +++ b/lib/src/model/stencil.cpp @@ -1,7 +1,7 @@ /* concept_stencil.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/stencil.h b/lib/src/model/stencil.h index 9b8fa7a9..93e99df8 100644 --- a/lib/src/model/stencil.h +++ b/lib/src/model/stencil.h @@ -1,7 +1,7 @@ /* concept_stencil.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/tag.cpp b/lib/src/model/tag.cpp index b5813042..b64d5623 100644 --- a/lib/src/model/tag.cpp +++ b/lib/src/model/tag.cpp @@ -1,7 +1,7 @@ /* tag.cpp MindForger application entry point - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/model/tag.h b/lib/src/model/tag.h index 93b4b1df..b069db85 100644 --- a/lib/src/model/tag.h +++ b/lib/src/model/tag.h @@ -1,7 +1,7 @@ /* tag.h MindForger application entry point - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/configuration_persistence.cpp b/lib/src/persistence/configuration_persistence.cpp index e02fad19..c71bb13e 100644 --- a/lib/src/persistence/configuration_persistence.cpp +++ b/lib/src/persistence/configuration_persistence.cpp @@ -1,7 +1,7 @@ /* configuration_persistence.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/configuration_persistence.h b/lib/src/persistence/configuration_persistence.h index 985bbc14..0f497dc5 100644 --- a/lib/src/persistence/configuration_persistence.h +++ b/lib/src/persistence/configuration_persistence.h @@ -1,7 +1,7 @@ /* configuration_persistence.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/filesystem_persistence.cpp b/lib/src/persistence/filesystem_persistence.cpp index b12b1448..bbf46850 100644 --- a/lib/src/persistence/filesystem_persistence.cpp +++ b/lib/src/persistence/filesystem_persistence.cpp @@ -1,7 +1,7 @@ /* filesystem_persistence.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/filesystem_persistence.h b/lib/src/persistence/filesystem_persistence.h index 2f3ea14d..d0173acf 100644 --- a/lib/src/persistence/filesystem_persistence.h +++ b/lib/src/persistence/filesystem_persistence.h @@ -1,7 +1,7 @@ /* filesystem_persistence.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/persistence.cpp b/lib/src/persistence/persistence.cpp index a83b6c7e..7f3a8457 100644 --- a/lib/src/persistence/persistence.cpp +++ b/lib/src/persistence/persistence.cpp @@ -1,7 +1,7 @@ /* persistence.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/persistence/persistence.h b/lib/src/persistence/persistence.h index 3379e3c4..86c2f750 100644 --- a/lib/src/persistence/persistence.h +++ b/lib/src/persistence/persistence.h @@ -1,7 +1,7 @@ /* persistence.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -37,7 +37,7 @@ class Persistence { const std::string& extension) = 0; virtual void load(Stencil* stencil) = 0; virtual bool isWriteable(const std::string& outlineKey) = 0; - virtual void save(Outline* outline) = 0; + virtual void save(Outline* outline) = 0; virtual void saveAsHtml(Outline* outline, const std::string& fileName) = 0; }; diff --git a/lib/src/repository_indexer.cpp b/lib/src/repository_indexer.cpp index a113f584..2a477bda 100644 --- a/lib/src/repository_indexer.cpp +++ b/lib/src/repository_indexer.cpp @@ -1,7 +1,7 @@ /* repository_indexer.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/repository_indexer.h b/lib/src/repository_indexer.h index 5144d0a8..807360bb 100644 --- a/lib/src/repository_indexer.h +++ b/lib/src/repository_indexer.h @@ -1,7 +1,7 @@ /* repository_indexer.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/csv/csv_outline_representation.cpp b/lib/src/representations/csv/csv_outline_representation.cpp index 47d56b87..ffbfe1a6 100644 --- a/lib/src/representations/csv/csv_outline_representation.cpp +++ b/lib/src/representations/csv/csv_outline_representation.cpp @@ -1,7 +1,7 @@ /* csv_outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/csv/csv_outline_representation.h b/lib/src/representations/csv/csv_outline_representation.h index 916f1aed..0adef823 100644 --- a/lib/src/representations/csv/csv_outline_representation.h +++ b/lib/src/representations/csv/csv_outline_representation.h @@ -1,7 +1,7 @@ /* csv_outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/html/html_document.cpp b/lib/src/representations/html/html_document.cpp index 3e7314cb..d3e30522 100644 --- a/lib/src/representations/html/html_document.cpp +++ b/lib/src/representations/html/html_document.cpp @@ -1,7 +1,7 @@ /* html_document.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/html/html_document.h b/lib/src/representations/html/html_document.h index ad2af47c..234f36ef 100644 --- a/lib/src/representations/html/html_document.h +++ b/lib/src/representations/html/html_document.h @@ -1,7 +1,7 @@ /* html_document.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/html/html_outline_representation.cpp b/lib/src/representations/html/html_outline_representation.cpp index c26554b6..ba9062c3 100644 --- a/lib/src/representations/html/html_outline_representation.cpp +++ b/lib/src/representations/html/html_outline_representation.cpp @@ -1,7 +1,7 @@ /* html_outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/html/html_outline_representation.h b/lib/src/representations/html/html_outline_representation.h index cb157712..0e5efa1e 100644 --- a/lib/src/representations/html/html_outline_representation.h +++ b/lib/src/representations/html/html_outline_representation.h @@ -1,7 +1,7 @@ /* html_outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -79,7 +79,7 @@ class HtmlOutlineRepresentation Configuration& config; HtmlExportColorsRepresentation exportColors; - HtmlColorsRepresentation& lf; + HtmlColorsRepresentation& lf; MarkdownOutlineRepresentation markdownRepresentation; MarkdownTranscoder* markdownTranscoder; diff --git a/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.cpp b/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.cpp index 496d3e18..0046cdb7 100644 --- a/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.cpp +++ b/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.cpp @@ -1,7 +1,7 @@ /* cmark_gfm_markdown_transcoder.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.h b/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.h index c66cfc3b..adbe396b 100644 --- a/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.h +++ b/lib/src/representations/markdown/cmark_gfm_markdown_transcoder.h @@ -1,7 +1,7 @@ /* cmark_gfm_markdown_transcoder.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -33,7 +33,7 @@ namespace m8r { enum class CmarkGfmOption { // TODO VH: complete this - + }; /** diff --git a/lib/src/representations/markdown/markdown_ast_node.cpp b/lib/src/representations/markdown/markdown_ast_node.cpp index 405ed254..3e8d1573 100644 --- a/lib/src/representations/markdown/markdown_ast_node.cpp +++ b/lib/src/representations/markdown/markdown_ast_node.cpp @@ -1,7 +1,7 @@ /* markdown_ast_node.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_ast_node.h b/lib/src/representations/markdown/markdown_ast_node.h index 0d8d862b..8bc7165c 100644 --- a/lib/src/representations/markdown/markdown_ast_node.h +++ b/lib/src/representations/markdown/markdown_ast_node.h @@ -1,7 +1,7 @@ /* markdown_ast_node.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_configuration_representation.cpp b/lib/src/representations/markdown/markdown_configuration_representation.cpp index 050e4238..4d12e580 100644 --- a/lib/src/representations/markdown/markdown_configuration_representation.cpp +++ b/lib/src/representations/markdown/markdown_configuration_representation.cpp @@ -1,7 +1,7 @@ /* markdown_configuration_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -72,7 +72,7 @@ constexpr const auto CONFIG_SETTING_REPOSITORY_LABEL = "* Repository: "; MarkdownConfigurationRepresentation::MarkdownConfigurationRepresentation() : mdRepositoryCfgRepresentation{} -{ +{ } MarkdownConfigurationRepresentation::~MarkdownConfigurationRepresentation() diff --git a/lib/src/representations/markdown/markdown_configuration_representation.h b/lib/src/representations/markdown/markdown_configuration_representation.h index 92894552..a9ce3c1d 100644 --- a/lib/src/representations/markdown/markdown_configuration_representation.h +++ b/lib/src/representations/markdown/markdown_configuration_representation.h @@ -1,7 +1,7 @@ /* markdown_configuration_representation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_document.cpp b/lib/src/representations/markdown/markdown_document.cpp index c8dc5c14..d24a69f9 100644 --- a/lib/src/representations/markdown/markdown_document.cpp +++ b/lib/src/representations/markdown/markdown_document.cpp @@ -1,7 +1,7 @@ /* markdown.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_document.h b/lib/src/representations/markdown/markdown_document.h index 493fe480..dbc23e8c 100644 --- a/lib/src/representations/markdown/markdown_document.h +++ b/lib/src/representations/markdown/markdown_document.h @@ -1,7 +1,7 @@ /* markdown.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_document_representation.cpp b/lib/src/representations/markdown/markdown_document_representation.cpp index 97d57ab3..e3d9f499 100644 --- a/lib/src/representations/markdown/markdown_document_representation.cpp +++ b/lib/src/representations/markdown/markdown_document_representation.cpp @@ -1,7 +1,7 @@ /* markdown_document_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_document_representation.h b/lib/src/representations/markdown/markdown_document_representation.h index 35ff3cf1..603f4306 100644 --- a/lib/src/representations/markdown/markdown_document_representation.h +++ b/lib/src/representations/markdown/markdown_document_representation.h @@ -1,7 +1,7 @@ /* markdown_document_representation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_lexem.cpp b/lib/src/representations/markdown/markdown_lexem.cpp index 2c25ce4a..68f83292 100644 --- a/lib/src/representations/markdown/markdown_lexem.cpp +++ b/lib/src/representations/markdown/markdown_lexem.cpp @@ -1,7 +1,7 @@ /* markdown_lexem.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_lexem.h b/lib/src/representations/markdown/markdown_lexem.h index fd2528bc..8d06295a 100644 --- a/lib/src/representations/markdown/markdown_lexem.h +++ b/lib/src/representations/markdown/markdown_lexem.h @@ -1,7 +1,7 @@ /* markdown_lexem.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_lexer_sections.cpp b/lib/src/representations/markdown/markdown_lexer_sections.cpp index 251dabdb..71503b6b 100644 --- a/lib/src/representations/markdown/markdown_lexer_sections.cpp +++ b/lib/src/representations/markdown/markdown_lexer_sections.cpp @@ -1,7 +1,7 @@ /* markdown_lexer-sections.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_lexer_sections.h b/lib/src/representations/markdown/markdown_lexer_sections.h index 0d70431b..53ccc721 100644 --- a/lib/src/representations/markdown/markdown_lexer_sections.h +++ b/lib/src/representations/markdown/markdown_lexer_sections.h @@ -1,7 +1,7 @@ /* markdown_lexer_sections.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_note_metadata.cpp b/lib/src/representations/markdown/markdown_note_metadata.cpp index 7ea8b45a..c3e6d1fe 100644 --- a/lib/src/representations/markdown/markdown_note_metadata.cpp +++ b/lib/src/representations/markdown/markdown_note_metadata.cpp @@ -1,7 +1,7 @@ /* markdown_note_metadata.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_note_metadata.h b/lib/src/representations/markdown/markdown_note_metadata.h index e7ffc93e..a19788a6 100644 --- a/lib/src/representations/markdown/markdown_note_metadata.h +++ b/lib/src/representations/markdown/markdown_note_metadata.h @@ -1,7 +1,7 @@ /* markdown_note_metadata.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_outline_metadata.cpp b/lib/src/representations/markdown/markdown_outline_metadata.cpp index ffb5216c..2fc5b461 100644 --- a/lib/src/representations/markdown/markdown_outline_metadata.cpp +++ b/lib/src/representations/markdown/markdown_outline_metadata.cpp @@ -1,7 +1,7 @@ /* markdown_outline_metadata.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_outline_metadata.h b/lib/src/representations/markdown/markdown_outline_metadata.h index e2ca0a00..20a06520 100644 --- a/lib/src/representations/markdown/markdown_outline_metadata.h +++ b/lib/src/representations/markdown/markdown_outline_metadata.h @@ -1,7 +1,7 @@ /* markdown_outline_metadata.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_outline_representation.cpp b/lib/src/representations/markdown/markdown_outline_representation.cpp index 973be8ba..25171cac 100644 --- a/lib/src/representations/markdown/markdown_outline_representation.cpp +++ b/lib/src/representations/markdown/markdown_outline_representation.cpp @@ -1,7 +1,7 @@ /* markdown_outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_outline_representation.h b/lib/src/representations/markdown/markdown_outline_representation.h index 4a601c38..9fa23a49 100644 --- a/lib/src/representations/markdown/markdown_outline_representation.h +++ b/lib/src/representations/markdown/markdown_outline_representation.h @@ -1,7 +1,7 @@ /* markdown_outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_parser_sections.cpp b/lib/src/representations/markdown/markdown_parser_sections.cpp index a08549d3..25648f55 100644 --- a/lib/src/representations/markdown/markdown_parser_sections.cpp +++ b/lib/src/representations/markdown/markdown_parser_sections.cpp @@ -1,7 +1,7 @@ /* markdown_parser_sections.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_parser_sections.h b/lib/src/representations/markdown/markdown_parser_sections.h index b3e7ca0e..5948c46f 100644 --- a/lib/src/representations/markdown/markdown_parser_sections.h +++ b/lib/src/representations/markdown/markdown_parser_sections.h @@ -1,7 +1,7 @@ /* markdown_parser_sections.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp index b41dd6c3..f050f0d6 100644 --- a/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp +++ b/lib/src/representations/markdown/markdown_repository_configuration_representation.cpp @@ -1,7 +1,7 @@ /* markdown_configuration_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -42,7 +42,7 @@ using namespace std; MarkdownRepositoryConfigurationRepresentation ::MarkdownRepositoryConfigurationRepresentation() -{ +{ } MarkdownRepositoryConfigurationRepresentation diff --git a/lib/src/representations/markdown/markdown_repository_configuration_representation.h b/lib/src/representations/markdown/markdown_repository_configuration_representation.h index 9caba46a..fad92e56 100644 --- a/lib/src/representations/markdown/markdown_repository_configuration_representation.h +++ b/lib/src/representations/markdown/markdown_repository_configuration_representation.h @@ -1,7 +1,7 @@ /* markdown_configuration_representation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_section_metadata.cpp b/lib/src/representations/markdown/markdown_section_metadata.cpp index 05451180..e68d9c0b 100644 --- a/lib/src/representations/markdown/markdown_section_metadata.cpp +++ b/lib/src/representations/markdown/markdown_section_metadata.cpp @@ -1,7 +1,7 @@ /* markdown_section_metadata.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_section_metadata.h b/lib/src/representations/markdown/markdown_section_metadata.h index 390cad78..b7953961 100644 --- a/lib/src/representations/markdown/markdown_section_metadata.h +++ b/lib/src/representations/markdown/markdown_section_metadata.h @@ -1,7 +1,7 @@ /* markdown_section_metadata.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/markdown/markdown_transcoder.h b/lib/src/representations/markdown/markdown_transcoder.h index 11728b6e..f6305f86 100644 --- a/lib/src/representations/markdown/markdown_transcoder.h +++ b/lib/src/representations/markdown/markdown_transcoder.h @@ -1,7 +1,7 @@ /* markdown_transcoder.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -57,7 +57,7 @@ enum MdToHtmlOption * to HTML and other representations. */ class MarkdownTranscoder -{ +{ public: explicit MarkdownTranscoder() {} MarkdownTranscoder(const MarkdownTranscoder&) = delete; diff --git a/lib/src/representations/outline_representation.cpp b/lib/src/representations/outline_representation.cpp index 086c06b8..420b5da0 100644 --- a/lib/src/representations/outline_representation.cpp +++ b/lib/src/representations/outline_representation.cpp @@ -1,7 +1,7 @@ /* outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/outline_representation.h b/lib/src/representations/outline_representation.h index e2cbf5f2..5f2e5b58 100644 --- a/lib/src/representations/outline_representation.h +++ b/lib/src/representations/outline_representation.h @@ -1,7 +1,7 @@ /* outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/representation_interceptor.h b/lib/src/representations/representation_interceptor.h index 72afef71..5baec7e5 100644 --- a/lib/src/representations/representation_interceptor.h +++ b/lib/src/representations/representation_interceptor.h @@ -1,7 +1,7 @@ /* representation_interceptor.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/representation_type.h b/lib/src/representations/representation_type.h index d5a29838..17e2ba90 100644 --- a/lib/src/representations/representation_type.h +++ b/lib/src/representations/representation_type.h @@ -1,7 +1,7 @@ /* representation_type.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/twiki/twiki_outline_representation.cpp b/lib/src/representations/twiki/twiki_outline_representation.cpp index f5a87f34..b4674851 100644 --- a/lib/src/representations/twiki/twiki_outline_representation.cpp +++ b/lib/src/representations/twiki/twiki_outline_representation.cpp @@ -1,7 +1,7 @@ /* twiki_outline_representation.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/twiki/twiki_outline_representation.h b/lib/src/representations/twiki/twiki_outline_representation.h index 2fd7fa16..413ce7df 100644 --- a/lib/src/representations/twiki/twiki_outline_representation.h +++ b/lib/src/representations/twiki/twiki_outline_representation.h @@ -1,7 +1,7 @@ /* twiki_outline_representation.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/unicode.cpp b/lib/src/representations/unicode.cpp index 6c387a04..7c08e950 100644 --- a/lib/src/representations/unicode.cpp +++ b/lib/src/representations/unicode.cpp @@ -1,7 +1,7 @@ /* unicode.cpp MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/representations/unicode.h b/lib/src/representations/unicode.h index e86ec658..1eee63ce 100644 --- a/lib/src/representations/unicode.h +++ b/lib/src/representations/unicode.h @@ -1,7 +1,7 @@ /* unicode.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/src/version.h b/lib/src/version.h index 3e1d46c5..48ab3189 100644 --- a/lib/src/version.h +++ b/lib/src/version.h @@ -1,7 +1,7 @@ /* version.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/benchmark/ai_benchmark.cpp b/lib/test/benchmark/ai_benchmark.cpp index 0b5a211c..19d89856 100644 --- a/lib/test/benchmark/ai_benchmark.cpp +++ b/lib/test/benchmark/ai_benchmark.cpp @@ -1,7 +1,7 @@ /* ai_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/benchmark/html_benchmark.cpp b/lib/test/benchmark/html_benchmark.cpp index c2bb4caf..a9b261ba 100644 --- a/lib/test/benchmark/html_benchmark.cpp +++ b/lib/test/benchmark/html_benchmark.cpp @@ -1,7 +1,7 @@ /* markdown_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -37,7 +37,7 @@ extern char* getMindforgerGitHomePath(); // 2018/03/18 110MiB (100x1.1MiB) MDs 2 HTML converted in 2496.91ms ~ AVG: 2.49691ms TEST(HtmlBenchmark, DISABLED_Outline) -{ +{ string fileName{"/lib/test/resources/benchmark-repository/memory/meta.md"}; fileName.insert(0, getMindforgerGitHomePath()); diff --git a/lib/test/benchmark/markdown_benchmark.cpp b/lib/test/benchmark/markdown_benchmark.cpp index 8d2e403c..aa2dfd20 100644 --- a/lib/test/benchmark/markdown_benchmark.cpp +++ b/lib/test/benchmark/markdown_benchmark.cpp @@ -1,7 +1,7 @@ /* markdown_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -44,7 +44,7 @@ extern char* getMindforgerGitHomePath(); // 2018/03/02 100x = 2.460ms (120MiB) TEST(MarkdownParserBenchmark, DISABLED_ParserMeta) -{ +{ unique_ptr fileName = unique_ptr(new string{"/lib/test/resources/benchmark-repository/memory/meta.md"}); fileName.get()->insert(0, getMindforgerGitHomePath()); diff --git a/lib/test/benchmark/trie_benchmark.cpp b/lib/test/benchmark/trie_benchmark.cpp index 20271910..877de726 100644 --- a/lib/test/benchmark/trie_benchmark.cpp +++ b/lib/test/benchmark/trie_benchmark.cpp @@ -1,7 +1,7 @@ /* trie_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/mindforger-lib-unit-tests.pro b/lib/test/mindforger-lib-unit-tests.pro index 400b0a3b..b70ce89f 100644 --- a/lib/test/mindforger-lib-unit-tests.pro +++ b/lib/test/mindforger-lib-unit-tests.pro @@ -1,6 +1,6 @@ # mindforger-lib-unit-tests.pro Qt project file for MindForger # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/test/src/ai/autolinking_cmark_test.cpp b/lib/test/src/ai/autolinking_cmark_test.cpp index 9c1f1347..e147c79a 100644 --- a/lib/test/src/ai/autolinking_cmark_test.cpp +++ b/lib/test/src/ai/autolinking_cmark_test.cpp @@ -1,7 +1,7 @@ /* autolinkin_cmark_test.cpp MindForger application test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/ai/autolinking_test.cpp b/lib/test/src/ai/autolinking_test.cpp index 12352068..52eed98f 100644 --- a/lib/test/src/ai/autolinking_test.cpp +++ b/lib/test/src/ai/autolinking_test.cpp @@ -1,7 +1,7 @@ /* autolinkin_test.cpp MindForger application test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/ai/nlp_test.cpp b/lib/test/src/ai/nlp_test.cpp index 4e798db9..1b8a731f 100644 --- a/lib/test/src/ai/nlp_test.cpp +++ b/lib/test/src/ai/nlp_test.cpp @@ -1,7 +1,7 @@ /* nlp_test.cpp MindForger application test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/config/configuration_test.cpp b/lib/test/src/config/configuration_test.cpp index 98f9dc37..9ec72e5f 100644 --- a/lib/test/src/config/configuration_test.cpp +++ b/lib/test/src/config/configuration_test.cpp @@ -1,7 +1,7 @@ /* configuration_test.cpp MindForger configuration test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/gear/datetime_test.cpp b/lib/test/src/gear/datetime_test.cpp index 8d1581b6..2ef5ad2a 100644 --- a/lib/test/src/gear/datetime_test.cpp +++ b/lib/test/src/gear/datetime_test.cpp @@ -1,7 +1,7 @@ /* datetime_test.cpp MindForger application test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/gear/file_utils_test.cpp b/lib/test/src/gear/file_utils_test.cpp index cdb50f8e..e4b8b605 100644 --- a/lib/test/src/gear/file_utils_test.cpp +++ b/lib/test/src/gear/file_utils_test.cpp @@ -1,7 +1,7 @@ /* file_utils_test.cpp MindForger application test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/gear/string_utils_test.cpp b/lib/test/src/gear/string_utils_test.cpp index 757a4366..2d418e00 100644 --- a/lib/test/src/gear/string_utils_test.cpp +++ b/lib/test/src/gear/string_utils_test.cpp @@ -1,7 +1,7 @@ /* string_utils_test.cpp MindForger application test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/gear/trie_test.cpp b/lib/test/src/gear/trie_test.cpp index a9ce2d1b..5b8b52e6 100644 --- a/lib/test/src/gear/trie_test.cpp +++ b/lib/test/src/gear/trie_test.cpp @@ -1,7 +1,7 @@ /* trie_test.cpp MindForger application test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/html/html_test.cpp b/lib/test/src/html/html_test.cpp index 3781f97c..9b0bc281 100644 --- a/lib/test/src/html/html_test.cpp +++ b/lib/test/src/html/html_test.cpp @@ -1,7 +1,7 @@ /* markdown_benchmark.cpp MindForger markdown test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -37,7 +37,7 @@ using namespace std; extern char* getMindforgerGitHomePath(); TEST(HtmlTestCase, Outline) -{ +{ string fileName{"/lib/test/resources/benchmark-repository/memory/meta.md"}; fileName.insert(0, getMindforgerGitHomePath()); diff --git a/lib/test/src/indexer/repository_indexer_test.cpp b/lib/test/src/indexer/repository_indexer_test.cpp index 09ce744b..fdcb2c98 100644 --- a/lib/test/src/indexer/repository_indexer_test.cpp +++ b/lib/test/src/indexer/repository_indexer_test.cpp @@ -1,7 +1,7 @@ /* repository_indexer_test.cpp MindForger indexer test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/markdown/markdown_test.cpp b/lib/test/src/markdown/markdown_test.cpp index 791381fe..1c1f829e 100644 --- a/lib/test/src/markdown/markdown_test.cpp +++ b/lib/test/src/markdown/markdown_test.cpp @@ -1,7 +1,7 @@ /* markdown_test.cpp MindForger markdown test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/filesystem_information_test.cpp b/lib/test/src/mind/filesystem_information_test.cpp index 2e8cb3f5..46c61843 100644 --- a/lib/test/src/mind/filesystem_information_test.cpp +++ b/lib/test/src/mind/filesystem_information_test.cpp @@ -1,7 +1,7 @@ /* filesystem_information_test.cpp MindForger fullt text search test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/fts_test.cpp b/lib/test/src/mind/fts_test.cpp index fecabd95..7e3559d6 100644 --- a/lib/test/src/mind/fts_test.cpp +++ b/lib/test/src/mind/fts_test.cpp @@ -1,7 +1,7 @@ /* fts_test.cpp MindForger fullt text search test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/memory_test.cpp b/lib/test/src/mind/memory_test.cpp index d502da1d..c4847ea7 100644 --- a/lib/test/src/mind/memory_test.cpp +++ b/lib/test/src/mind/memory_test.cpp @@ -1,7 +1,7 @@ /* memory_test.cpp MindForger memory test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/mind_test.cpp b/lib/test/src/mind/mind_test.cpp index df4d73c1..65aed000 100644 --- a/lib/test/src/mind/mind_test.cpp +++ b/lib/test/src/mind/mind_test.cpp @@ -1,7 +1,7 @@ /* mind_test.cpp MindForger mind test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/note_test.cpp b/lib/test/src/mind/note_test.cpp index c75e53a9..5483c538 100644 --- a/lib/test/src/mind/note_test.cpp +++ b/lib/test/src/mind/note_test.cpp @@ -1,7 +1,7 @@ /* note_test.cpp MindForger test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/organizer_test.cpp b/lib/test/src/mind/organizer_test.cpp index 67403803..51209dda 100644 --- a/lib/test/src/mind/organizer_test.cpp +++ b/lib/test/src/mind/organizer_test.cpp @@ -1,7 +1,7 @@ /* organizer_test.cpp MindForger test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mind/outline_test.cpp b/lib/test/src/mind/outline_test.cpp index 38e0f350..d0e8c84a 100644 --- a/lib/test/src/mind/outline_test.cpp +++ b/lib/test/src/mind/outline_test.cpp @@ -1,7 +1,7 @@ /* outline_test.cpp MindForger test - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/mindforger_lib_unit_tests.cpp b/lib/test/src/mindforger_lib_unit_tests.cpp index 840ba6f3..ac0417e2 100644 --- a/lib/test/src/mindforger_lib_unit_tests.cpp +++ b/lib/test/src/mindforger_lib_unit_tests.cpp @@ -1,7 +1,7 @@ /* mindforger_lib_unit_tests.cpp MindForger library unit tests - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/src.pro b/lib/test/src/src.pro index 850fbf37..3811230b 100644 --- a/lib/test/src/src.pro +++ b/lib/test/src/src.pro @@ -1,6 +1,6 @@ # mindforger-lib-unit-tests.pro MindForger thinking notebook # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software ; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/test/src/test_utils.cpp b/lib/test/src/test_utils.cpp index 972adeb3..eb16b348 100644 --- a/lib/test/src/test_utils.cpp +++ b/lib/test/src/test_utils.cpp @@ -1,7 +1,7 @@ /* test_gear.cpp MindForger test utils and gears - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/lib/test/src/test_utils.h b/lib/test/src/test_utils.h index 8df32246..c8a2f464 100644 --- a/lib/test/src/test_utils.h +++ b/lib/test/src/test_utils.h @@ -1,7 +1,7 @@ /* test_gear.h MindForger thinking notebook - Copyright (C) 2016-2023 Martin Dvorak + Copyright (C) 2016-2024 Martin Dvorak This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/licenses/llama-cpp-license.txt b/licenses/llama-cpp-license.txt deleted file mode 100644 index 76f67efd..00000000 --- a/licenses/llama-cpp-license.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Georgi Gerganov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/mindforger.pro b/mindforger.pro index a55fd719..9f0f6f94 100644 --- a/mindforger.pro +++ b/mindforger.pro @@ -1,6 +1,6 @@ # mindforger.pro Qt project file for MindForger # -# Copyright (C) 2016-2023 Martin Dvorak +# Copyright (C) 2016-2024 Martin Dvorak # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License From 31dee0cc8eba17d76bafed344d6c8ecff09999da Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 5 Jan 2024 07:55:23 +0100 Subject: [PATCH 059/131] Adding emojis dialog which resolves #1226 --- app/src/qt/cli_n_breadcrumbs_presenter.cpp | 70 ++++++++++++++-------- app/src/qt/cli_n_breadcrumbs_view.cpp | 9 ++- app/src/qt/cli_n_breadcrumbs_view.h | 1 + app/src/qt/main_menu_presenter.cpp | 4 ++ app/src/qt/main_menu_view.cpp | 12 +++- app/src/qt/main_menu_view.h | 1 + app/src/qt/main_window_presenter.cpp | 45 ++++++++++++++ app/src/qt/main_window_presenter.h | 1 + 8 files changed, 114 insertions(+), 29 deletions(-) diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.cpp b/app/src/qt/cli_n_breadcrumbs_presenter.cpp index d4b16785..46ba4823 100644 --- a/app/src/qt/cli_n_breadcrumbs_presenter.cpp +++ b/app/src/qt/cli_n_breadcrumbs_presenter.cpp @@ -59,15 +59,23 @@ void CliAndBreadcrumbsPresenter::handleCliTextChanged(const QString& text) tr("Wingman help"), tr( // IMPROVE consider prefix,
separator and colors/bold - "Use the following commands to use Wingman:\n" - "\n" - "? ... help\n" - "/ ... search\n" - "@ ... knowledge recherche\n" - "> ... run a command\n" - ": ... chat with workspace, Notebook or Note\n" - "\n" - "or type full-text search phrase\n" + "" + "Use the following commands:" + "
" + "
? ... help" + "
/ ... search" + "
@ ... knowledge recherche" + "
> ... run a command" + "
: ... chat with workspace, Notebook or Note" + "
  ... or type full-text search phrase" + "
" + "
Examples:" + "
" + "
/ find notebook by name My Name" + "
@ arxiv Knowledge management" + "
> emoji" + "
: explain in simple terms SELECTED" + "
" ) ); view->setCommand(""); @@ -76,25 +84,21 @@ void CliAndBreadcrumbsPresenter::handleCliTextChanged(const QString& text) return; } else if(command.startsWith(CliAndBreadcrumbsView::CHAR_FIND)) { MF_DEBUG(" / HELP find" << endl); - view->updateCompleterModel(CliAndBreadcrumbsView::HELP_FIND_CMDS); + if(command.size()<=2) { + view->updateCompleterModel(CliAndBreadcrumbsView::HELP_FIND_CMDS); + } return; } else if(command.startsWith(CliAndBreadcrumbsView::CHAR_KNOW)) { MF_DEBUG(" @ HELP knowledge" << endl); - view->updateCompleterModel(CliAndBreadcrumbsView::HELP_KNOW_CMDS); + if(command.size()<=2) { + view->updateCompleterModel(CliAndBreadcrumbsView::HELP_KNOW_CMDS); + } return; } else if(command.startsWith(CliAndBreadcrumbsView::CHAR_CMD)) { MF_DEBUG(" > HELP command" << endl); - view->updateCompleterModel(CliAndBreadcrumbsView::HELP_CMD_CMDS); - return; - } else if(command.startsWith(CliAndBreadcrumbsView::CHAR_KNOW)) { - MF_DEBUG(" @ EXEC" << endl); - QString prefix( - QString::fromStdString( - command.toStdString().substr( - CliAndBreadcrumbsView::CHAR_KNOW.size()-1))); - QString phrase{"PHRASE"}; - mainPresenter->doActionOpenRunToolDialog(phrase); - view->setCommand(""); + if(command.size()<=2) { + view->updateCompleterModel(CliAndBreadcrumbsView::HELP_CMD_CMDS); + } return; } else if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME)) { QString prefix( @@ -152,14 +156,19 @@ void CliAndBreadcrumbsPresenter::executeCommand() executeListOutlines(); view->showBreadcrumb(); return; + } else if(command.startsWith(CliAndBreadcrumbsView::CMD_EMOJIS)) { + MF_DEBUG(" executing: emojis" << endl); + mainPresenter->doActionEmojisDialog(); + return; } else if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_TAG)) { string name = command.toStdString().substr( CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_TAG.size()); MF_DEBUG(" executing: find O by tag '" << name << "'" << endl); if(name.size()) { mainPresenter->doActionFindOutlineByTag(name); + } else { + mainPresenter->getStatusBar()->showInfo(tr("Notebook not found - please specify tag search phrase (is empty)")); } - mainPresenter->getStatusBar()->showInfo(tr("Notebook not found - please specify tag search phrase (is empty)")); return; } else if(command.startsWith(CliAndBreadcrumbsView::CMD_FIND_OUTLINE_BY_NAME)) { string name = command.toStdString().substr( @@ -167,12 +176,25 @@ void CliAndBreadcrumbsPresenter::executeCommand() MF_DEBUG(" executing: find O by name '" << name << "'" << endl); if(name.size()) { mainPresenter->doActionFindOutlineByName(name); + } else { + mainPresenter->getStatusBar()->showInfo(tr("Notebook not found - please specify name search phrase (is empty)")); } - mainPresenter->getStatusBar()->showInfo(tr("Notebook not found - please specify name search phrase (is empty)")); // status handling examples: // mainPresenter->getStatusBar()->showInfo(tr("Notebook ")+QString::fromStdString(outlines->front()->getName())); // mainPresenter->getStatusBar()->showInfo(tr("Notebook not found: ") += QString(name.c_str())); return; + } else if(command.startsWith(CliAndBreadcrumbsView::CMD_KNOW_WIKIPEDIA)) { + string name = command.toStdString().substr( + CliAndBreadcrumbsView::CMD_KNOW_WIKIPEDIA.size()); + MF_DEBUG(" executing: knowledge recherche of '" << name << "' @ wikipedia" << endl); + if(name.size()) { + QString phrase=QString::fromStdString(name); + // TODO choose tool + mainPresenter->doActionOpenRunToolDialog(phrase); + } else { + mainPresenter->getStatusBar()->showInfo(tr("Please specify a search phrase - it cannot be empty")); + } + return; } else { // do FTS as fallback mainPresenter->doFts(view->getCommand(), true); diff --git a/app/src/qt/cli_n_breadcrumbs_view.cpp b/app/src/qt/cli_n_breadcrumbs_view.cpp index 17b80f52..dbcaa7e8 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.cpp +++ b/app/src/qt/cli_n_breadcrumbs_view.cpp @@ -147,15 +147,17 @@ const QString CliAndBreadcrumbsView::CMD_KNOW_BARD = "@bard"; const QStringList CliAndBreadcrumbsView::HELP_KNOW_CMDS = QStringList() -// << CMD_KNOW_WIKIPEDIA -// << CMD_KNOW_ARXIV - ; +// << CMD_KNOW_WIKIPEDIA +// << CMD_KNOW_ARXIV + ; const QString CliAndBreadcrumbsView::CHAR_CMD = ">"; const QString CliAndBreadcrumbsView::CMD_HOME = "> home"; // go to home O +const QString CliAndBreadcrumbsView::CMD_EMOJIS + = "> emojis"; const QString CliAndBreadcrumbsView::CMD_TERMINAL = "> terminal"; const QString CliAndBreadcrumbsView::CMD_LIST_OUTLINES @@ -164,6 +166,7 @@ const QString CliAndBreadcrumbsView::CMD_LIST_OUTLINES const QStringList CliAndBreadcrumbsView::HELP_CMD_CMDS = QStringList() // << CMD_HOME // << CMD_TERMINAL + << CMD_EMOJIS << CMD_LIST_OUTLINES ; diff --git a/app/src/qt/cli_n_breadcrumbs_view.h b/app/src/qt/cli_n_breadcrumbs_view.h index d082bd22..f7f83a45 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.h +++ b/app/src/qt/cli_n_breadcrumbs_view.h @@ -116,6 +116,7 @@ class CliAndBreadcrumbsView : public QWidget static const QString CHAR_CMD; static const QString CMD_HOME; + static const QString CMD_EMOJIS; static const QString CMD_TERMINAL; static const QString CMD_LIST_OUTLINES; diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp index 705ee1df..43f721db 100644 --- a/app/src/qt/main_menu_presenter.cpp +++ b/app/src/qt/main_menu_presenter.cpp @@ -74,6 +74,10 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp) view->actionMindPreferences, SIGNAL(triggered()), mwp, SLOT(doActionMindPreferences()) ); + QObject::connect( + view->actionViewEmojis, SIGNAL(triggered()), + mwp, SLOT(doActionEmojisDialog()) + ); QObject::connect( view->actionViewTerminal, SIGNAL(triggered()), mwp, SLOT(doActionViewTerminal()) diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index c89601b6..bc3e1f0f 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -275,7 +275,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionViewDwell->setStatusTip(tr("Open memory dwell...")); actionViewDwell->setEnabled(false); - actionViewCli = new QAction(QIcon(":/menu-icons/cli.svg"), tr("&CLI"), mainWindow); + actionViewCli = new QAction(QIcon(":/menu-icons/cli.svg"), tr("&Wingman"), mainWindow); actionViewCli->setShortcut(QKeySequence(Qt::ALT+Qt::Key_X)); actionViewCli->setStatusTip(tr("Activate command line interface...")); @@ -286,6 +286,13 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) tr("Run simple command line from current MindForger workspace...") ); + actionViewEmojis = new QAction( + QIcon(":/menu-icons/bug.svg"), tr("Emo&jis"), mainWindow + ); + actionViewEmojis->setStatusTip( + tr("Open dialog with emoji characters to be copy/pasted to names, descriptions and text...") + ); + actionViewRecentNotes = new QAction( QIcon(":/menu-icons/open-recent.svg"), tr("&Recent Notes"), @@ -343,6 +350,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) menuView->addAction(actionViewTags); menuView->addAction(actionViewNavigator); menuView->addAction(actionViewCli); + menuView->addAction(actionViewEmojis); menuView->addAction(actionViewTerminal); #ifdef MF_WIP menuView->addAction(actionViewStencils); @@ -1023,7 +1031,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionHelpCheckForUpdates = new QAction(QIcon(":/menu-icons/download.svg"), tr("&Check for Updates"), mainWindow); actionHelpCheckForUpdates->setStatusTip(tr("Check for MindForger updates")); - actionHelpAboutQt = new QAction(QIcon(":/menu-icons/about_qt.svg"), tr("&About Qt"), mainWindow); + actionHelpAboutQt = new QAction(QIcon(":/menu-icons/about_qt.svg"), tr("About &Qt"), mainWindow); actionHelpAboutQt->setStatusTip(tr("About Qt...")); actionHelpAbout = new QAction(QIcon(":/menu-icons/write.svg"), tr("&About MindForger"), mainWindow); diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h index aa5e238e..5a122fab 100644 --- a/app/src/qt/main_menu_view.h +++ b/app/src/qt/main_menu_view.h @@ -120,6 +120,7 @@ class MainMenuView : public QObject QAction* actionViewDwell; QAction* actionViewStencils; QAction* actionViewCli; + QAction* actionViewEmojis; QAction* actionViewTerminal; QAction* actionViewRecentNotes; QAction* actionViewLimbo; diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 456bdaf3..494226c6 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -3829,6 +3829,51 @@ void MainWindowPresenter::doActionHelpCheckForUpdates() ); } +void MainWindowPresenter::doActionEmojisDialog() +{ + // IMPROVE load emojis from the main MF configuration file + QMessageBox::information( + &view, + QString{tr("Emojis")}, + QString{ + "" + "Copy character from below and paste it to the text:" + "
" + "
Emoji:" + "
🐞 ⛑ ❗ ❌" + "
🔴 🔵 🚫 🎯" + "
🙂 🥶 🥰 🐻 🤖 💩 👻 ☠️" + "
🦑 🐙 👾" + "
💪 👍 🤞 🤙 👌 🙏 🤦" + "
🛠 🔧" + "
📡 🌊 🚀 🎖" + "
📣 📢 🏁 🚧 🚩 💣 💯 🖼️" + "
" + "
Greek alphabet:" + "
Α α, Β β, Γ γ, Δ δ, Ε ε," + "
Ζ ζ, Η η, Θ θ, Ι ι, Κ κ," + "
Λ λ, Μ μ, Ν ν, Ξ ξ, Ο ο," + "
Π π, Ρ ρ, Σ σ/ς, Τ τ, Υ υ," + "
Φ φ, Χ χ, Ψ ψ, Ω ω" + "
" + "
Special:" + "
✔ ♥ ⦀" + "
" + "
Math and statistics:" + "
x̄" + "
" + "
Physics:" + "
°" + "
" + "
More special unicode characters:" + "" + }); +} + + void MainWindowPresenter::doActionHelpAboutMindForger() { // IMPROVE move this to view: remove this method and route signal to MainWindowView diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index c0ad639e..b34ddb71 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -388,6 +388,7 @@ public slots: void doActionHelpDiagrams(); void doActionHelpReportBug(); void doActionHelpCheckForUpdates(); + void doActionEmojisDialog(); void doActionHelpAboutMindForger(); void slotHandleFts(); From 3dbf65dd0c4b07324e1920f0620d090abebb7797 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 5 Jan 2024 07:59:46 +0100 Subject: [PATCH 060/131] Adding more emojis #1226 --- app/src/qt/main_window_presenter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 494226c6..e953c28c 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -3840,13 +3840,13 @@ void MainWindowPresenter::doActionEmojisDialog() "Copy character from below and paste it to the text:" "
" "
Emoji:" - "
🐞 ⛑ ❗ ❌" - "
🔴 🔵 🚫 🎯" - "
🙂 🥶 🥰 🐻 🤖 💩 👻 ☠️" + "
🐞 🎉 ⛑ ❗ ❌" + "
🔴 🔵 🚫 🎯 ⚽" + "
🙂 😃 🥶 🥰 🐻 🤖 💩 👻 ☠️" "
🦑 🐙 👾" "
💪 👍 🤞 🤙 👌 🙏 🤦" "
🛠 🔧" - "
📡 🌊 🚀 🎖" + "
📡 🌊 🚀 🎖🍔" "
📣 📢 🏁 🚧 🚩 💣 💯 🖼️" "
" "
Greek alphabet:" From ab38554c72ff5b49a153020f7e286f99440dc31b Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 5 Jan 2024 08:59:40 +0100 Subject: [PATCH 061/131] Makefile to use all cores on build --- build/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build/Makefile b/build/Makefile index 056b5b39..a89c5a67 100644 --- a/build/Makefile +++ b/build/Makefile @@ -87,7 +87,7 @@ gen-ui-class: ## generate UI C++ class skeleton: CLASS_NAME=My_Class ../app/mindforger: @echo "Building PRODUCTION MindForger executable..." - cd .. && qmake -r mindforger.pro && make -j 7 ; cd .. + cd .. && qmake -r mindforger.pro && make -j ; cd .. @echo "If build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger @@ -99,7 +99,7 @@ build: clean-app ../app/mindforger ## build production MindForger application bi .PHONY: build-dev build-dev: clean-app ## build development MindForger application binary @echo "Building DEV MindForger executable..." - cd .. && qmake -r mindforger.pro DEFINES+=DO_MF_DEBUG && make -j 7 ; cd .. + cd .. && qmake -r mindforger.pro DEFINES+=DO_MF_DEBUG && make -j ; cd .. @echo "If build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger @@ -110,7 +110,7 @@ build-dev: clean-app ## build development MindForger application binary .PHONY: build-rc build-rc: clean-app ## build RC MindForger application binary @echo "MindForger RC build..." - cd .. && qmake CONFIG+=mfrc -r mindforger.pro && make -j 7 + cd .. && qmake CONFIG+=mfrc -r mindforger.pro && make -j @echo "If RC build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger @@ -118,7 +118,7 @@ build-rc: clean-app ## build RC MindForger application binary .PHONY: build-ci build-ci: clean-app ## build CI MindForger application binary @echo "MindForger CI build..." - cd .. && qmake CONFIG+=mfci -r mindforger.pro && make -j 7 + cd .. && qmake CONFIG+=mfci -r mindforger.pro && make -j @echo "If CI build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger From 97a881d1e6f5bd19e4d94b07becfcb724d62d6d1 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 5 Jan 2024 20:39:09 +0100 Subject: [PATCH 062/131] Various menu and Makefile fixes. --- .../qt/translations/mindforger_cs.ts | 1093 ++++++++-------- .../qt/translations/mindforger_en.qm | Bin 2655 -> 2655 bytes .../qt/translations/mindforger_en.ts | 1097 +++++++++-------- .../qt/translations/mindforger_nerd_cs.ts | 1093 ++++++++-------- .../qt/translations/mindforger_nerd_en.ts | 1093 ++++++++-------- .../qt/translations/mindforger_zh_cn.ts | 1093 ++++++++-------- app/src/qt/cli_n_breadcrumbs_presenter.cpp | 2 +- app/src/qt/main_menu_presenter.cpp | 2 +- app/src/qt/main_menu_view.cpp | 14 +- app/src/qt/main_menu_view.h | 2 +- build/Makefile | 17 +- 11 files changed, 2990 insertions(+), 2516 deletions(-) diff --git a/app/resources/qt/translations/mindforger_cs.ts b/app/resources/qt/translations/mindforger_cs.ts index aef925c8..a861d97c 100644 --- a/app/resources/qt/translations/mindforger_cs.ts +++ b/app/resources/qt/translations/mindforger_cs.ts @@ -55,20 +55,20 @@ - + Unsupported Knowledge Tool - - + + Empty Phrase - - + + Phrase to search/explain/process is empty. @@ -230,17 +230,37 @@ Choose new library source: m8r::CliAndBreadcrumbsPresenter - - Notebook + + Wingman help - - Notebook not found: + + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> - + + Wingman: ? for help, / search, @ knowledge, > command, : chat, or type FTS phrase + + + + + Notebook not found - please specify tag search phrase (is empty) + + + + + Notebook not found - please specify name search phrase (is empty) + + + + + Please specify a search phrase - it cannot be empty + + + + No command! @@ -301,32 +321,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -334,47 +354,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -382,37 +402,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -420,22 +440,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -443,12 +463,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -456,57 +476,57 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File @@ -1066,7 +1086,7 @@ Choose new library source: - + &Forget @@ -1215,12 +1235,12 @@ Choose new library source: - + Note&books Tree - + Show tree of Notebooks... @@ -1254,11 +1274,6 @@ Choose new library source: Open memory dwell... - - - &CLI - - Ter&minal @@ -1270,255 +1285,255 @@ Choose new library source: - + &Recent Notes - + View recently modified Notes... - + &Stencils - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - + Ho&isting - + D&istraction Free - + Toggle distraction free mode - + &Fullscreen - + Toggle fullscreen - + &View - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + N&avigate - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - - - - + + + + &Edit @@ -1553,586 +1568,665 @@ Choose new library source: - + &Library Documents - + List Library documents... - + + &Wingman + + + + + Emo&jis + + + + + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... + + + + Li&mbo - + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + + &Promote + + + + + Promote Notebook + + + + + De&mote + + + + + Demote Notebook + + + + + Move to &First + + + + + Move the Notebook to be the first child of its parent + + + + + Move &Up + + + + + Move the Notebook up + + + + + Move Do&wn + + + + + Move the Notebook down + + + + + Move to &Last + + + + + Move the Notebook to be the last child of its parent + + + + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - + &Swap Name/Description Focus - + Swap focus of N title and description editors - + Find Knowledge Ctrl+/ - + Run an external tool to find, explain, process text under the cursor - + Complete Link Ctrl+L - + Sp&ell Check - + Spell check Notebook or Note description - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + &Strikethrough - + Format text as strikethrough - + + About &Qt + + + + &Keyboard - + Format text as keyboard input - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + Format text block as source code - + Block &Quote - + Format text block as blockquote - + Timestam&p - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format - - - - + + + + &New - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Make &Home - + Import - - + + Make &Stencil - - + + Copy the current Notebook as to Stencil - - + C&lone - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo - + E&xport - + &Forget Del - + Forget Note @@ -2142,12 +2236,12 @@ Choose new library source: - + Toggle tag indicating whether to use the current Notebook as home - + &Import @@ -2202,77 +2296,78 @@ Choose new library source: - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + E&xtract - + Create new Note from the text selected in the current Note... - + + &Clone @@ -2313,282 +2408,277 @@ Choose new library source: - + Make a copy of the Note to this or other Notebook... - + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + Toggle word wrap mode - + Complete word being written by finding link to Notebook or Note - + &Math - + Format text as math (MathJax) - + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - + integrals - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - + &dot - + &overrightarrow - + &cup - + &cap - + &empty set - + &in - + &not in - + T&able of Contents - + Insert current date and time - + Format text block as math (MathJax) - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Ima&ge - + Insert table... - + &Documentation - + F1 - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - - &About Qt - - - - + About Qt... - + &About MindForger - + About MindForger... - + &Help @@ -2654,44 +2744,44 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn Markdown File - + Learn @@ -2707,54 +2797,54 @@ Choose new library source: - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note @@ -2764,565 +2854,570 @@ Choose new library source: - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + + Emojis + + + + About MindForger @@ -3954,64 +4049,64 @@ Choose new library source: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4477,32 +4572,32 @@ Referenced documents will NOT be deleted. m8r::RunToolDialog - + Phrase: - + Knowledge source: - + Template: - + &Get - + &Cancel - + Get Knowledge diff --git a/app/resources/qt/translations/mindforger_en.qm b/app/resources/qt/translations/mindforger_en.qm index 7536dc9bab3f434ca59b9b2e1e16f242c8d4319b..f7791fe070ed046919383fa2d2b2b1d8bfd815f2 100644 GIT binary patch delta 30 mcmcaFa$jV_945|ihJ1!1hHM74$xE5cnB5rEHs51vWCsA2rwIW7 delta 30 mcmcaFa$jV_941aRhH!>_h9ZXS$xE5cnAI5EHs51vWCsA0Q3(M6 diff --git a/app/resources/qt/translations/mindforger_en.ts b/app/resources/qt/translations/mindforger_en.ts index 3ec6ee79..1957a6c0 100644 --- a/app/resources/qt/translations/mindforger_en.ts +++ b/app/resources/qt/translations/mindforger_en.ts @@ -55,20 +55,20 @@ - + Unsupported Knowledge Tool - - + + Empty Phrase - - + + Phrase to search/explain/process is empty. @@ -230,17 +230,37 @@ Choose new library source: m8r::CliAndBreadcrumbsPresenter - - Notebook + + Wingman help - - Notebook not found: + + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> - + + Wingman: ? for help, / search, @ knowledge, > command, : chat, or type FTS phrase + + + + + Notebook not found - please specify tag search phrase (is empty) + + + + + Notebook not found - please specify name search phrase (is empty) + + + + + Please specify a search phrase - it cannot be empty + + + + No command! @@ -302,32 +322,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -335,47 +355,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -383,37 +403,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -421,22 +441,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -444,12 +464,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -457,57 +477,57 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File @@ -1019,7 +1039,7 @@ Choose new library source: &Mind - &Workspace + Work&space @@ -1086,7 +1106,7 @@ Choose new library source: - + &Forget &Deprecate @@ -1220,7 +1240,7 @@ Choose new library source: &Recall - &Find + F&ind @@ -1243,12 +1263,12 @@ Choose new library source: - + Note&books Tree - + Show tree of Notebooks... @@ -1282,11 +1302,6 @@ Choose new library source: Open memory dwell... - - - &CLI - - Ter&minal @@ -1298,270 +1313,270 @@ Choose new library source: - + &Recent Notes - + View recently modified Notes... - + &Stencils - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - + Ho&isting - + D&istraction Free - + Toggle distraction free mode - + &Fullscreen - + Toggle fullscreen - + &View - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + N&avigate - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - - - - + + + + &Edit @@ -1596,606 +1611,685 @@ Choose new library source: - + &Library Documents - + List Library documents... - + + &Wingman + + + + + Emo&jis + + + + + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... + + + + Li&mbo - + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + + &Promote + + + + + Promote Notebook + + + + + De&mote + + + + + Demote Notebook + + + + + Move to &First + + + + + Move the Notebook to be the first child of its parent + + + + + Move &Up + + + + + Move the Notebook up + + + + + Move Do&wn + + + + + Move the Notebook down + + + + + Move to &Last + + + + + Move the Notebook to be the last child of its parent + + + + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - + &Swap Name/Description Focus - + Swap focus of N title and description editors - + Find Knowledge Ctrl+/ - + Run an external tool to find, explain, process text under the cursor - + Complete Link Ctrl+L - + Sp&ell Check - + Spell check Notebook or Note description - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + &Math - + Format text as math (MathJax) - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + &Strikethrough - + Format text as strikethrough - + + About &Qt + + + + &Keyboard - + Format text as keyboard input - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + T&able of Contents - + Insert current date and time - + Format text block as source code - + Format text block as math (MathJax) - + Block &Quote - + Format text block as blockquote - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format - - - - + + + + &New - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Make &Home - + Import - - + + Make &Stencil - - + + Copy the current Notebook as to Stencil - - + C&lone - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo Delete Notebook and move it Limbo - + E&xport - + &Forget Del Delete Del - + Forget Note Delete Note @@ -2205,12 +2299,12 @@ Choose new library source: &Open - + Toggle tag indicating whether to use the current Notebook as home - + &Import @@ -2265,77 +2359,78 @@ Choose new library source: - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S Save Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + E&xtract - + Create new Note from the text selected in the current Note... - + + &Clone @@ -2376,247 +2471,242 @@ Choose new library source: - + Make a copy of the Note to this or other Notebook... - + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Toggle word wrap mode - + Complete word being written by finding link to Notebook or Note - + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - + integrals - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - + &dot - + &overrightarrow - + &cup - + &cap - + &empty set - + &in - + &not in - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Timestam&p - + Ima&ge - + Insert table... - + &Documentation - + F1 - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - - &About Qt - - - - + About Qt... - + &About MindForger - + About MindForger... - + &Help @@ -2682,34 +2772,34 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again @@ -2718,12 +2808,12 @@ Choose new library source: Open Directory or MindForger Repository - + Learn Markdown File Open Markdown File - + Learn Open @@ -2739,54 +2829,54 @@ Choose new library source: - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note @@ -2796,565 +2886,570 @@ Choose new library source: - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook Deprecate Notebook - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note Delete Note - + Please select a Note to forget. Please select a Note to delete. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + + Emojis + + + + About MindForger @@ -3986,64 +4081,64 @@ Choose new library source: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4509,32 +4604,32 @@ Referenced documents will NOT be deleted. m8r::RunToolDialog - + Phrase: - + Knowledge source: - + Template: - + &Get - + &Cancel - + Get Knowledge diff --git a/app/resources/qt/translations/mindforger_nerd_cs.ts b/app/resources/qt/translations/mindforger_nerd_cs.ts index c3846f16..0cbcb038 100644 --- a/app/resources/qt/translations/mindforger_nerd_cs.ts +++ b/app/resources/qt/translations/mindforger_nerd_cs.ts @@ -55,20 +55,20 @@ - + Unsupported Knowledge Tool - - + + Empty Phrase - - + + Phrase to search/explain/process is empty. @@ -230,17 +230,37 @@ Choose new library source: m8r::CliAndBreadcrumbsPresenter - - Notebook + + Wingman help - - Notebook not found: + + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> - + + Wingman: ? for help, / search, @ knowledge, > command, : chat, or type FTS phrase + + + + + Notebook not found - please specify tag search phrase (is empty) + + + + + Notebook not found - please specify name search phrase (is empty) + + + + + Please specify a search phrase - it cannot be empty + + + + No command! @@ -309,32 +329,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -342,47 +362,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -390,37 +410,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -428,22 +448,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -451,12 +471,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -464,57 +484,57 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File @@ -1027,10 +1047,10 @@ Choose new library source: - - - - + + + + &New &Nový @@ -1060,7 +1080,7 @@ Choose new library source: - + &Forget Zapomeň @@ -1124,17 +1144,12 @@ Choose new library source: - - &CLI - - - - + &Recent Notes - + &Stencils @@ -1189,509 +1204,509 @@ Choose new library source: - + &Library Documents - + List Library documents... - + Li&mbo - + Toggle distraction free mode - + &Fullscreen - + &View - + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - + Find Knowledge Ctrl+/ - + Run an external tool to find, explain, process text under the cursor - + Complete Link Ctrl+L - + Sp&ell Check - + Spell check Notebook or Note description - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - - - - + + + + &Edit - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + &Strikethrough - + Format text as strikethrough - + &Keyboard - + Format text as keyboard input - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + Format text block as source code - + Block &Quote - + Format text block as blockquote - + Timestam&p - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format &Formát - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Import - - + + Copy the current Notebook as to Stencil - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo - + &Forget Del - + Forget Note - + Make a copy of the Note to this or other Notebook... - + Make &Home @@ -1797,12 +1812,12 @@ Choose new library source: - + Note&books Tree - + Show tree of Notebooks... @@ -1832,94 +1847,93 @@ Choose new library source: - + View recently modified Notes... - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - + Ho&isting - + D&istraction Free - + Toggle fullscreen - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + Toggle tag indicating whether to use the current Notebook as home - - + + Make &Stencil - - + C&lone - + E&xport E&xport - + &Import @@ -1974,162 +1988,163 @@ Choose new library source: - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - + E&xtract - + Create new Note from the text selected in the current Note... - + + &Clone @@ -2169,6 +2184,11 @@ Choose new library source: Re-learn recently opened MindForger workspaces, Markdown directories or files + + + &Wingman + + Ter&minal @@ -2180,427 +2200,497 @@ Choose new library source: - + + Emo&jis + + + + + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... + + + + N&avigate - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + + &Promote + + + + + Promote Notebook + + + + + De&mote + + + + + Demote Notebook + + + + + Move to &First + + + + + Move the Notebook to be the first child of its parent + + + + + Move &Up + + + + + Move the Notebook up + + + + + Move Do&wn + + + + + Move the Notebook down + + + + + Move to &Last + + + + + Move the Notebook to be the last child of its parent + + + + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + Toggle word wrap mode - + &Swap Name/Description Focus - + Swap focus of N title and description editors - + Complete word being written by finding link to Notebook or Note - + &Math - + Format text as math (MathJax) - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - + integrals - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - + &dot - + &overrightarrow - + &cup - + &cap - + &empty set - + &in - + &not in - + T&able of Contents - + Insert current date and time - + + About &Qt + + + + Format text block as math (MathJax) - + Ima&ge - + Insert table... - + &Documentation - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - - &About Qt - - - - + About Qt... - + &About MindForger - + About MindForger... O aplikaci MindForger - + &Help - + F1 @@ -2666,66 +2756,66 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn - + Full-text Search - - - + + + Note - - + + Note not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name - - + + New Note - + Failed to create new Note! - + Hyperlink %1 clicked... @@ -2735,195 +2825,195 @@ Choose new library source: - + Autolinked Notebooks and Notes - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Learn Markdown File - + Notebook Full-text Search - + Note Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Find Note by Name in Notebook - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + Edit Notebook - + Please open an Notebook to edit. - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Notebook can be forgotten only when viewed. - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - + Find Note by Tags in Notebook @@ -2939,402 +3029,407 @@ Choose new library source: - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Thing not found - - + + Find Note by Tags - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Home tag toggled/removed - Notebook '%1' is no longer home - - + + Forget Notebook - + Do you really want to deprecate ' - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + + Emojis + + + + About MindForger @@ -3966,64 +4061,64 @@ Choose new library source: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4489,32 +4584,32 @@ Referenced documents will NOT be deleted. m8r::RunToolDialog - + Phrase: - + Knowledge source: - + Template: - + &Get - + &Cancel - + Get Knowledge diff --git a/app/resources/qt/translations/mindforger_nerd_en.ts b/app/resources/qt/translations/mindforger_nerd_en.ts index b39a40c4..2e640f96 100644 --- a/app/resources/qt/translations/mindforger_nerd_en.ts +++ b/app/resources/qt/translations/mindforger_nerd_en.ts @@ -55,20 +55,20 @@ - + Unsupported Knowledge Tool - - + + Empty Phrase - - + + Phrase to search/explain/process is empty. @@ -230,17 +230,37 @@ Choose new library source: m8r::CliAndBreadcrumbsPresenter - - Notebook + + Wingman help - - Notebook not found: + + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> - + + Wingman: ? for help, / search, @ knowledge, > command, : chat, or type FTS phrase + + + + + Notebook not found - please specify tag search phrase (is empty) + + + + + Notebook not found - please specify name search phrase (is empty) + + + + + Please specify a search phrase - it cannot be empty + + + + No command! @@ -301,32 +321,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -334,47 +354,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -382,37 +402,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -420,22 +440,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -443,12 +463,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -456,57 +476,57 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File @@ -1019,10 +1039,10 @@ Choose new library source: - - - - + + + + &New @@ -1048,7 +1068,7 @@ Choose new library source: - + &Forget @@ -1108,17 +1128,12 @@ Choose new library source: - - &CLI - - - - + &Recent Notes - + &Stencils @@ -1173,509 +1188,509 @@ Choose new library source: - + &Library Documents - + List Library documents... - + Li&mbo - + Toggle distraction free mode - + &Fullscreen - + &View - + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - + Find Knowledge Ctrl+/ - + Run an external tool to find, explain, process text under the cursor - + Complete Link Ctrl+L - + Sp&ell Check - + Spell check Notebook or Note description - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - - - - + + + + &Edit - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + &Strikethrough - + Format text as strikethrough - + &Keyboard - + Format text as keyboard input - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + Format text block as source code - + Block &Quote - + Format text block as blockquote - + Timestam&p - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Import - - + + Copy the current Notebook as to Stencil - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo - + &Forget Del - + Forget Note - + Make a copy of the Note to this or other Notebook... - + Make &Home @@ -1781,12 +1796,12 @@ Choose new library source: - + Note&books Tree - + Show tree of Notebooks... @@ -1816,94 +1831,93 @@ Choose new library source: - + View recently modified Notes... - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - + Ho&isting - + D&istraction Free - + Toggle fullscreen - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + Toggle tag indicating whether to use the current Notebook as home - - + + Make &Stencil - - + C&lone - + E&xport - + &Import @@ -1958,162 +1972,163 @@ Choose new library source: - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - + E&xtract - + Create new Note from the text selected in the current Note... - + + &Clone @@ -2153,6 +2168,11 @@ Choose new library source: Re-learn recently opened MindForger workspaces, Markdown directories or files + + + &Wingman + + Ter&minal @@ -2164,427 +2184,497 @@ Choose new library source: - + + Emo&jis + + + + + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... + + + + N&avigate - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + + &Promote + + + + + Promote Notebook + + + + + De&mote + + + + + Demote Notebook + + + + + Move to &First + + + + + Move the Notebook to be the first child of its parent + + + + + Move &Up + + + + + Move the Notebook up + + + + + Move Do&wn + + + + + Move the Notebook down + + + + + Move to &Last + + + + + Move the Notebook to be the last child of its parent + + + + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + Toggle word wrap mode - + &Swap Name/Description Focus - + Swap focus of N title and description editors - + Complete word being written by finding link to Notebook or Note - + &Math - + Format text as math (MathJax) - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - + integrals - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - + &dot - + &overrightarrow - + &cup - + &cap - + &empty set - + &in - + &not in - + T&able of Contents - + Insert current date and time - + + About &Qt + + + + Format text block as math (MathJax) - + Ima&ge - + Insert table... - + &Documentation - + F1 - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - - &About Qt - - - - + About Qt... - + &About MindForger - + About MindForger... - + &Help @@ -2650,66 +2740,66 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn - + Full-text Search - - - + + + Note - - + + Note not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name - - + + New Note - + Failed to create new Note! - + Hyperlink %1 clicked... @@ -2719,195 +2809,195 @@ Choose new library source: - + Autolinked Notebooks and Notes - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Learn Markdown File - + Notebook Full-text Search - + Note Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Find Note by Name in Notebook - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + Edit Notebook - + Please open an Notebook to edit. - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Notebook can be forgotten only when viewed. - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - + Find Note by Tags in Notebook @@ -2923,402 +3013,407 @@ Choose new library source: - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Thing not found - - + + Find Note by Tags - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Home tag toggled/removed - Notebook '%1' is no longer home - - + + Forget Notebook - + Do you really want to deprecate ' - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + + Emojis + + + + About MindForger @@ -3950,64 +4045,64 @@ Choose new library source: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4473,32 +4568,32 @@ Referenced documents will NOT be deleted. m8r::RunToolDialog - + Phrase: - + Knowledge source: - + Template: - + &Get - + &Cancel - + Get Knowledge diff --git a/app/resources/qt/translations/mindforger_zh_cn.ts b/app/resources/qt/translations/mindforger_zh_cn.ts index 0f4de728..f775fb8a 100644 --- a/app/resources/qt/translations/mindforger_zh_cn.ts +++ b/app/resources/qt/translations/mindforger_zh_cn.ts @@ -55,20 +55,20 @@ - + Unsupported Knowledge Tool - - + + Empty Phrase - - + + Phrase to search/explain/process is empty. @@ -230,17 +230,37 @@ Choose new library source: m8r::CliAndBreadcrumbsPresenter - - Notebook + + Wingman help - - Notebook not found: + + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> - + + Wingman: ? for help, / search, @ knowledge, > command, : chat, or type FTS phrase + + + + + Notebook not found - please specify tag search phrase (is empty) + + + + + Notebook not found - please specify name search phrase (is empty) + + + + + Please specify a search phrase - it cannot be empty + + + + No command! @@ -302,32 +322,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -335,47 +355,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -383,37 +403,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -421,22 +441,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -444,12 +464,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -457,57 +477,57 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File @@ -1086,7 +1106,7 @@ Choose new library source: - + &Forget &Deprecate @@ -1243,12 +1263,12 @@ Choose new library source: - + Note&books Tree - + Show tree of Notebooks... @@ -1282,11 +1302,6 @@ Choose new library source: Open memory dwell... - - - &CLI - - Ter&minal @@ -1298,270 +1313,270 @@ Choose new library source: - + &Recent Notes - + View recently modified Notes... - + &Stencils - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - + Ho&isting - + D&istraction Free - + Toggle distraction free mode - + &Fullscreen - + Toggle fullscreen - + &View - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + N&avigate - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - - - - + + + + &Edit @@ -1596,606 +1611,685 @@ Choose new library source: - + &Library Documents - + List Library documents... - + + &Wingman + + + + + Emo&jis + + + + + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... + + + + Li&mbo - + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + + &Promote + + + + + Promote Notebook + + + + + De&mote + + + + + Demote Notebook + + + + + Move to &First + + + + + Move the Notebook to be the first child of its parent + + + + + Move &Up + + + + + Move the Notebook up + + + + + Move Do&wn + + + + + Move the Notebook down + + + + + Move to &Last + + + + + Move the Notebook to be the last child of its parent + + + + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - + &Swap Name/Description Focus - + Swap focus of N title and description editors - + Find Knowledge Ctrl+/ - + Run an external tool to find, explain, process text under the cursor - + Complete Link Ctrl+L - + Sp&ell Check - + Spell check Notebook or Note description - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + &Math - + Format text as math (MathJax) - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + &Strikethrough - + Format text as strikethrough - + + About &Qt + + + + &Keyboard - + Format text as keyboard input - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + T&able of Contents - + Insert current date and time - + Format text block as source code - + Format text block as math (MathJax) - + Block &Quote - + Format text block as blockquote - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format - - - - + + + + &New - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Make &Home - + Import - - + + Make &Stencil - - + + Copy the current Notebook as to Stencil - - + C&lone - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo Delete Notebook and move it Limbo - + E&xport - + &Forget Del Delete Del - + Forget Note Delete Note @@ -2205,12 +2299,12 @@ Choose new library source: &Open - + Toggle tag indicating whether to use the current Notebook as home - + &Import @@ -2265,77 +2359,78 @@ Choose new library source: - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S Save Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + E&xtract - + Create new Note from the text selected in the current Note... - + + &Clone @@ -2376,247 +2471,242 @@ Choose new library source: - + Make a copy of the Note to this or other Notebook... - + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Toggle word wrap mode - + Complete word being written by finding link to Notebook or Note - + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - + integrals - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - + &dot - + &overrightarrow - + &cup - + &cap - + &empty set - + &in - + &not in - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Timestam&p - + Ima&ge - + Insert table... - + &Documentation - + F1 - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - - &About Qt - - - - + About Qt... - + &About MindForger - + About MindForger... - + &Help @@ -2682,34 +2772,34 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again @@ -2718,12 +2808,12 @@ Choose new library source: Open Directory or MindForger Repository - + Learn Markdown File Open Markdown File - + Learn Open @@ -2739,54 +2829,54 @@ Choose new library source: - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note @@ -2796,565 +2886,570 @@ Choose new library source: - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook Deprecate Notebook - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note Delete Note - + Please select a Note to forget. Please select a Note to delete. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + + Emojis + + + + About MindForger @@ -3986,64 +4081,64 @@ Choose new library source: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4509,32 +4604,32 @@ Referenced documents will NOT be deleted. m8r::RunToolDialog - + Phrase: - + Knowledge source: - + Template: - + &Get - + &Cancel - + Get Knowledge diff --git a/app/src/qt/cli_n_breadcrumbs_presenter.cpp b/app/src/qt/cli_n_breadcrumbs_presenter.cpp index 46ba4823..0c527e0a 100644 --- a/app/src/qt/cli_n_breadcrumbs_presenter.cpp +++ b/app/src/qt/cli_n_breadcrumbs_presenter.cpp @@ -67,7 +67,7 @@ void CliAndBreadcrumbsPresenter::handleCliTextChanged(const QString& text) "
@ ... knowledge recherche" "
> ... run a command" "
: ... chat with workspace, Notebook or Note" - "
  ... or type full-text search phrase" + "
  ... or full-text search phrase" "
" "
Examples:" "
" diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp index 43f721db..5dd8c1f6 100644 --- a/app/src/qt/main_menu_presenter.cpp +++ b/app/src/qt/main_menu_presenter.cpp @@ -75,7 +75,7 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp) mwp, SLOT(doActionMindPreferences()) ); QObject::connect( - view->actionViewEmojis, SIGNAL(triggered()), + view->actionFormatEmojis, SIGNAL(triggered()), mwp, SLOT(doActionEmojisDialog()) ); QObject::connect( diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index bc3e1f0f..ee761eea 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -286,13 +286,6 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) tr("Run simple command line from current MindForger workspace...") ); - actionViewEmojis = new QAction( - QIcon(":/menu-icons/bug.svg"), tr("Emo&jis"), mainWindow - ); - actionViewEmojis->setStatusTip( - tr("Open dialog with emoji characters to be copy/pasted to names, descriptions and text...") - ); - actionViewRecentNotes = new QAction( QIcon(":/menu-icons/open-recent.svg"), tr("&Recent Notes"), @@ -350,7 +343,6 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) menuView->addAction(actionViewTags); menuView->addAction(actionViewNavigator); menuView->addAction(actionViewCli); - menuView->addAction(actionViewEmojis); menuView->addAction(actionViewTerminal); #ifdef MF_WIP menuView->addAction(actionViewStencils); @@ -982,6 +974,11 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionFormatHr = new QAction(tr("&Horizontal ruler"), mainWindow); actionFormatHr->setStatusTip(tr("Horizontal ruler")); + actionFormatEmojis = new QAction(tr("Emo&jis"), mainWindow); + actionFormatEmojis->setStatusTip( + tr("Open dialog with emoji characters to be copy/pasted to names, descriptions and text...") + ); + menuFormat->addAction(actionFormatBold); menuFormat->addAction(actionFormatItalic); menuFormat->addAction(actionFormatCode); @@ -998,6 +995,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) menuFormat->addMenu(submenuFormatMathJax); menuFormat->addAction(actionFormatTimestamp); menuFormat->addAction(actionFormatHr); + menuFormat->addAction(actionFormatEmojis); menuFormat->addSeparator(); menuFormat->addAction(actionFormatLink); menuFormat->addAction(actionFormatImage); diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h index 5a122fab..f5bf7230 100644 --- a/app/src/qt/main_menu_view.h +++ b/app/src/qt/main_menu_view.h @@ -120,7 +120,6 @@ class MainMenuView : public QObject QAction* actionViewDwell; QAction* actionViewStencils; QAction* actionViewCli; - QAction* actionViewEmojis; QAction* actionViewTerminal; QAction* actionViewRecentNotes; QAction* actionViewLimbo; @@ -260,6 +259,7 @@ class MainMenuView : public QObject QAction* actionFormatImage; QAction* actionFormatTable; QAction* actionFormatHr; + QAction* actionFormatEmojis; QAction* actionFormatTimestamp; // menu: Help diff --git a/build/Makefile b/build/Makefile index a89c5a67..c069b94e 100644 --- a/build/Makefile +++ b/build/Makefile @@ -34,7 +34,8 @@ CLASS_NAME := "New_Class" MF_LANG := "en" # Ubuntu distro: trusty xenial bionic focal jammy kinetic DISTRO := "bionic" - +# CPU cores thant can be used to build the project +CPU_CORES := 7 # # targets @@ -87,7 +88,7 @@ gen-ui-class: ## generate UI C++ class skeleton: CLASS_NAME=My_Class ../app/mindforger: @echo "Building PRODUCTION MindForger executable..." - cd .. && qmake -r mindforger.pro && make -j ; cd .. + cd .. && qmake -r mindforger.pro && make -j $(CPU_CORES) ; cd .. @echo "If build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger @@ -99,7 +100,7 @@ build: clean-app ../app/mindforger ## build production MindForger application bi .PHONY: build-dev build-dev: clean-app ## build development MindForger application binary @echo "Building DEV MindForger executable..." - cd .. && qmake -r mindforger.pro DEFINES+=DO_MF_DEBUG && make -j ; cd .. + cd .. && qmake -r mindforger.pro DEFINES+=DO_MF_DEBUG && make -j $(CPU_CORES) ; cd .. @echo "If build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger @@ -110,7 +111,7 @@ build-dev: clean-app ## build development MindForger application binary .PHONY: build-rc build-rc: clean-app ## build RC MindForger application binary @echo "MindForger RC build..." - cd .. && qmake CONFIG+=mfrc -r mindforger.pro && make -j + cd .. && qmake CONFIG+=mfrc -r mindforger.pro && make -j $(CPU_CORES) @echo "If RC build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger @@ -118,7 +119,7 @@ build-rc: clean-app ## build RC MindForger application binary .PHONY: build-ci build-ci: clean-app ## build CI MindForger application binary @echo "MindForger CI build..." - cd .. && qmake CONFIG+=mfci -r mindforger.pro && make -j + cd .. && qmake CONFIG+=mfci -r mindforger.pro && make -j $(CPU_CORES) @echo "If CI build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger @@ -164,8 +165,8 @@ install-dev-local: clean build-rc ## install MindForger RC build to ~/bin as 'mi # -.PHONY: l10n -l10n: ## update and release localization strings: MF_LANG=en +.PHONY: localization +localization: ## update and release localization strings: MF_LANG=en cd make && ./l10n-update-strings.sh && ./l10n-edit-and-release.sh $(MF_LANG) @@ -266,7 +267,7 @@ doc-to-wiki: ## mindforger-documentation to mindforger.wiki cd doc && ./mf-doc-to-wiki.py -.PHONY: api-reference +.PHONY: doc-api-reference api-reference: ## generate Doxygen source code documentation cd doxygen && doxygen ./mindforger.cfg From ac49b6da00dc04eb397dfe3aa3882d0cd2b8b891 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 5 Jan 2024 21:17:43 +0100 Subject: [PATCH 063/131] Improving Makefile to full build MF distro to locally install in ~/bin --- build/Makefile | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/build/Makefile b/build/Makefile index c069b94e..a0a18298 100644 --- a/build/Makefile +++ b/build/Makefile @@ -66,9 +66,19 @@ clean-app: .PHONY: git-subs-update git-subs-update: ## update Git submodules + @echo "Initializing sub-modules with cmark-gfm and other dependencies..." cd .. && git submodule update --init --recursive +../deps/cmark-gfm/build: git-subs-update + @echo "Building cmark-gfm and other dependencies..." + cd ../deps/cmark-gfm \ + && mkdir -p build && cd build \ + && cmake -DCMARK_TESTS=OFF -DCMARK_SHARED=OFF .. \ + && cmake --build . \ + ; cd ../../../build + + .PHONY: gen-lib-class gen-lib-class: ## generate lib C++ class skeleton: CLASS_NAME=My_Class @echo "Generating lib C++ class for name: $(CLASS_NAME)" @@ -86,9 +96,14 @@ gen-ui-class: ## generate UI C++ class skeleton: CLASS_NAME=My_Class # -../app/mindforger: +../Makefile: + @echo "Generating Makefile..." + cd .. && qmake -r mindforger.pro ; cd build + + +../app/mindforger: ../Makefile @echo "Building PRODUCTION MindForger executable..." - cd .. && qmake -r mindforger.pro && make -j $(CPU_CORES) ; cd .. + cd .. && make -j $(CPU_CORES) ; cd build @echo "If build succeeded, then MindForger executable can be found in:\n app/mindforger" ls -al ../app/mindforger @@ -154,7 +169,7 @@ run-dev: build-dev ## run MindForger development build # install # -install-dev-local: clean build-rc ## install MindForger RC build to ~/bin as 'mind' executable +install-dev-local: ../deps/cmark-gfm/build ../Makefile ../lib/tests/Makefile clean build-rc ## install MindForger RC build to ~/bin as 'mind' executable cp -vf ../app/mindforger ~/bin mv -vf ~/bin/mindforger ~/bin/mind ~/bin/mind --version @@ -175,6 +190,11 @@ ver-find: ## pre-version update finder cd .. && git grep -n "1\.55" +../lib/tests/Makefile: + @echo "Generating lib test Makefile..." + cd ../lib/test && qmake -r mindforger-lib-unit-tests.pro ; cd ../../build + + test-lib: clean ## compile and run lib/ unit tests cd make && ./test-lib-units.sh From eccc00240ccdd964f75dc78cd4b5522991ab3182 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 5 Jan 2024 21:43:58 +0100 Subject: [PATCH 064/131] Adding orange coloring of WIP todo items. --- app/src/qt/look_n_feel.cpp | 3 ++- app/src/qt/look_n_feel.h | 2 ++ app/src/qt/note_edit_highlighter.cpp | 7 ++++++- app/src/qt/note_edit_highlighter.h | 2 ++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/qt/look_n_feel.cpp b/app/src/qt/look_n_feel.cpp index 81f49ac8..104579ac 100644 --- a/app/src/qt/look_n_feel.cpp +++ b/app/src/qt/look_n_feel.cpp @@ -102,7 +102,8 @@ void LookAndFeels::setDarkTheme() editorLink.setRgb(0x00,0xFF,0xFF); editorList.setRgb(0x00,0x99,0x00); editorTaskDone.setRgb(0x00,0x99,0x00); - editorTaskWip.setRgb(0x99,0x00,0x00); + editorTaskWip.setRgb(0xFF,0xA5,0x00); + editorTaskTodo.setRgb(0x99,0x00,0x00); editorCodeblock.setRgb(0x99,0x99,0x99); editorHtmlTag.setRgb(0xAA,0x00,0xAA); editorHtmlEntity.setRgb(0xAA,0x00,0xAA); diff --git a/app/src/qt/look_n_feel.h b/app/src/qt/look_n_feel.h index d1917d2b..f8311f9e 100644 --- a/app/src/qt/look_n_feel.h +++ b/app/src/qt/look_n_feel.h @@ -82,6 +82,7 @@ class LookAndFeels : public HtmlColorsRepresentation QColor editorList; QColor editorTaskDone; QColor editorTaskWip; + QColor editorTaskTodo; QColor editorHtmlTag; QColor editorHtmlEntity; QColor editorHtmlAttrName; @@ -148,6 +149,7 @@ class LookAndFeels : public HtmlColorsRepresentation QColor& getEditorList() { return editorList; } QColor& getEditorTaskDone() { return editorTaskDone; } QColor& getEditorTaskWip() { return editorTaskWip; } + QColor& getEditorTaskTodo() { return editorTaskTodo; } QColor& getEditorCodeblock() { return editorCodeblock; } QColor& getEditorHtmlTag() { return editorHtmlTag; } QColor& getEditorHtmlEntity() { return editorHtmlEntity; } diff --git a/app/src/qt/note_edit_highlighter.cpp b/app/src/qt/note_edit_highlighter.cpp index 227a6569..c0f05b54 100644 --- a/app/src/qt/note_edit_highlighter.cpp +++ b/app/src/qt/note_edit_highlighter.cpp @@ -65,7 +65,8 @@ NoteEditHighlighter::NoteEditHighlighter(QPlainTextEdit* noteEditorView) addRegex(UnorderedList, "^(:? )*[\\*\\+\\-] "); addRegex(OrderedList, "^(:? )*\\d\\d?\\. "); addRegex(TaskDoneItem, "^(:? )*[\\*\\+\\-] \\[x\\]"); - addRegex(TaskWipItem, "^(:? )*[\\*\\+\\-] \\[ \\]"); + addRegex(TaskWipItem, "^(:? )*[\\*\\+\\-] \\[w\\]"); + addRegex(TaskTodoItem, "^(:? )*[\\*\\+\\-] \\[ \\]"); // formats boldFormat.setForeground(lookAndFeels.getEditorBold()); @@ -80,6 +81,7 @@ NoteEditHighlighter::NoteEditHighlighter(QPlainTextEdit* noteEditorView) listFormat.setForeground(lookAndFeels.getEditorList()); taskDoneFormat.setForeground(lookAndFeels.getEditorTaskDone()); taskWipFormat.setForeground(lookAndFeels.getEditorTaskWip()); + taskTodoFormat.setForeground(lookAndFeels.getEditorTaskTodo()); codeBlockFormat.setForeground(lookAndFeels.getEditorCodeblock()); mathBlockFormat.setForeground(lookAndFeels.getEditorCodeblock()); @@ -205,6 +207,9 @@ void NoteEditHighlighter::highlightPatterns(const QString& text) case TaskDoneItem: setFormat(index, length, taskDoneFormat); break; + case TaskTodoItem: + setFormat(index, length, taskTodoFormat); + break; case TaskWipItem: setFormat(index, length, taskWipFormat); break; diff --git a/app/src/qt/note_edit_highlighter.h b/app/src/qt/note_edit_highlighter.h index cef0063c..fa414560 100644 --- a/app/src/qt/note_edit_highlighter.h +++ b/app/src/qt/note_edit_highlighter.h @@ -45,6 +45,7 @@ class NoteEditHighlighter : public QSyntaxHighlighter UnorderedList, TaskDoneItem, TaskWipItem, + TaskTodoItem, OrderedList, HtmlTag, @@ -79,6 +80,7 @@ class NoteEditHighlighter : public QSyntaxHighlighter QTextCharFormat listFormat; QTextCharFormat taskDoneFormat; QTextCharFormat taskWipFormat; + QTextCharFormat taskTodoFormat; QTextCharFormat codeBlockFormat; QTextCharFormat mathBlockFormat; From 53032fcb3df8e6b6086b6b7d4b717f38f1b6081b Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 5 Jan 2024 21:48:39 +0100 Subject: [PATCH 065/131] Fixing accelerators in format for swap. --- app/src/qt/main_menu_view.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index ee761eea..b1ca15c0 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -757,7 +757,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionEditWordWrap = new QAction(QIcon(":/menu-icons/word-wrap.svg"), tr("&Word Wrap"), mainWindow); actionEditWordWrap->setStatusTip(tr("Toggle word wrap mode")); - actionEditNameDescFocusSwap = new QAction(QIcon(":/menu-icons/up.svg"), tr("&Swap Name/Description Focus"), mainWindow); + actionEditNameDescFocusSwap = new QAction(QIcon(":/menu-icons/up.svg"), tr("Swap Nam&e/Description Focus"), mainWindow); actionEditNameDescFocusSwap->setStatusTip(tr("Swap focus of N title and description editors")); actionEditExtract = new QAction(QIcon(":/menu-icons/cut.svg"), tr("E&xtract"), mainWindow); @@ -769,7 +769,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionEditComplete = new QAction(QIcon(":/menu-icons/link.svg"), tr("Complete Link\tCtrl+L"), mainWindow); actionEditComplete->setStatusTip(tr("Complete word being written by finding link to Notebook or Note")); - actionEditSpellCheck = new QAction(QIcon(":/menu-icons/paste.svg"), tr("Sp&ell Check"), mainWindow); + actionEditSpellCheck = new QAction(QIcon(":/menu-icons/paste.svg"), tr("&Spell Check"), mainWindow); actionEditSpellCheck->setStatusTip(tr("Spell check Notebook or Note description")); menuEdit = qMenuBar->addMenu(tr("&Edit")); From b1498484e8c7575368e4981e14243d080e79adfb Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 5 Jan 2024 22:15:37 +0100 Subject: [PATCH 066/131] Blacklisting http and https in autolinking. --- lib/src/mind/ai/autolinking/autolinking_mind.cpp | 9 +++++++++ ...cmark_aho_corasick_block_autolinking_preprocessor.cpp | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/src/mind/ai/autolinking/autolinking_mind.cpp b/lib/src/mind/ai/autolinking/autolinking_mind.cpp index 701b3584..c2b595b1 100644 --- a/lib/src/mind/ai/autolinking/autolinking_mind.cpp +++ b/lib/src/mind/ai/autolinking/autolinking_mind.cpp @@ -76,6 +76,15 @@ void AutolinkingMind::updateTrieIndex() addThingToTrie(n); } + // remove functional blacklist + vector blacklist = { + "http", + "https", + }; + for_each(blacklist.begin(), blacklist.end(), [this](const string& s) { + trie->removeWord(s); + }); + // IMPROVE: add also tags #ifdef DO_MF_DEBUG diff --git a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp index 492061da..16012c37 100644 --- a/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp +++ b/lib/src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp @@ -269,7 +269,8 @@ void injectThingsLinks(cmark_node* srcNode, Mind& mind) * Preprocessor. */ -const string CmarkAhoCorasickBlockAutolinkingPreprocessor::TRAILING_CHARS = string{" \t,:;.!?<>{}&()-+/*\\_=%~#$^[]'\""}; +const string CmarkAhoCorasickBlockAutolinkingPreprocessor::TRAILING_CHARS + = string{" \t,:;.!?<>{}&()-+/*\\_=%~#$^[]'\""}; CmarkAhoCorasickBlockAutolinkingPreprocessor::CmarkAhoCorasickBlockAutolinkingPreprocessor(Mind& mind) : AutolinkingPreprocessor{mind} From 78cdeec49e6cac508a94c4311b8b415147a6fb35 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sat, 6 Jan 2024 08:24:43 +0100 Subject: [PATCH 067/131] Adding insert link dialog keyboard accelerators. --- app/src/qt/dialogs/insert_link_dialog.cpp | 8 ++++---- app/src/qt/main_menu_view.cpp | 8 ++++---- .../mind/ai/autolinking/autolinking_mind.cpp | 17 +++++++++-------- lib/src/mind/ai/autolinking/autolinking_mind.h | 1 + 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/qt/dialogs/insert_link_dialog.cpp b/app/src/qt/dialogs/insert_link_dialog.cpp index 611d9ed4..14a42e3b 100644 --- a/app/src/qt/dialogs/insert_link_dialog.cpp +++ b/app/src/qt/dialogs/insert_link_dialog.cpp @@ -31,10 +31,10 @@ InsertLinkDialog::InsertLinkDialog(QWidget* parent) pathLabel = new QLabel{tr("Notebook, Note, file path or web address:")}; pathEdit = new QLineEdit{}; - findOutlineButton = new QPushButton{tr("Notebook")}; - findNoteButton = new QPushButton{tr("Note")}; - findFileButton = new QPushButton{tr("File")}; - findDirectoryButton = new QPushButton{tr("Directory")}; + findOutlineButton = new QPushButton{tr("Note&book")}; + findNoteButton = new QPushButton{tr("&Note")}; + findFileButton = new QPushButton{tr("&File")}; + findDirectoryButton = new QPushButton{tr("&Directory")}; copyToRepoCheckBox = new QCheckBox{tr("copy link target to workspace")}; copyToRepoCheckBox->setChecked(true); diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index b1ca15c0..e01dfe7e 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -909,7 +909,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) submenuFormatMathJax->addSeparator(); actionFormatMathInt = new QAction(tr("&integral"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathInt); - actionFormatMathIiint = new QAction(tr("integrals"), mainWindow); + actionFormatMathIiint = new QAction(tr("in&tegrals"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathIiint); submenuFormatMathJax->addSeparator(); actionFormatMathAlpha = new QAction(tr("&alpha"), mainWindow); @@ -925,18 +925,18 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) submenuFormatMathJax->addAction(actionFormatMathBar); actionFormatMathHat = new QAction(tr("&hat"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathHat); - actionFormatMathDot = new QAction(tr("&dot"), mainWindow); + actionFormatMathDot = new QAction(tr("dot"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathDot); actionFormatMathOverrightarrow = new QAction(tr("&overrightarrow"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathOverrightarrow); submenuFormatMathJax->addSeparator(); actionFormatMathCup = new QAction(tr("&cup"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathCup); - actionFormatMathCap = new QAction(tr("&cap"), mainWindow); + actionFormatMathCap = new QAction(tr("ca&p"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathCap); actionFormatMathEmptyset = new QAction(tr("&empty set"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathEmptyset); - actionFormatMathIn = new QAction(tr("&in"), mainWindow); + actionFormatMathIn = new QAction(tr("in"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathIn); actionFormatMathNotin = new QAction(tr("¬ in"), mainWindow); submenuFormatMathJax->addAction(actionFormatMathNotin); diff --git a/lib/src/mind/ai/autolinking/autolinking_mind.cpp b/lib/src/mind/ai/autolinking/autolinking_mind.cpp index c2b595b1..5dbd992f 100644 --- a/lib/src/mind/ai/autolinking/autolinking_mind.cpp +++ b/lib/src/mind/ai/autolinking/autolinking_mind.cpp @@ -26,6 +26,8 @@ namespace m8r { using namespace std; +const vector AutolinkingMind::excludedWords({"http", "https"}); + AutolinkingMind::AutolinkingMind(Mind& mind) : mind{mind}, trie{nullptr} @@ -76,20 +78,19 @@ void AutolinkingMind::updateTrieIndex() addThingToTrie(n); } - // remove functional blacklist - vector blacklist = { - "http", - "https", - }; - for_each(blacklist.begin(), blacklist.end(), [this](const string& s) { + // remove excluded words whose autolinking breaks + // Markdown structure (like e.g. http:// in links) + for(const string& s:this->excludedWords) { trie->removeWord(s); - }); + } // IMPROVE: add also tags #ifdef DO_MF_DEBUG auto end = chrono::high_resolution_clock::now(); - MF_DEBUG("[Autolinking] trie w/ " << size << " things updated in: " << chrono::duration_cast(end-begin).count()/1000000.0 << "ms" << endl); + MF_DEBUG( + "[Autolinking] trie w/ " << size << " things updated in: " + << chrono::duration_cast(end-begin).count()/1000000.0 << "ms" << endl); #endif } diff --git a/lib/src/mind/ai/autolinking/autolinking_mind.h b/lib/src/mind/ai/autolinking/autolinking_mind.h index 2d50a106..2a3f89cb 100644 --- a/lib/src/mind/ai/autolinking/autolinking_mind.h +++ b/lib/src/mind/ai/autolinking/autolinking_mind.h @@ -42,6 +42,7 @@ class AutolinkingMind Trie* trie; + static const std::vector excludedWords; public: explicit AutolinkingMind(Mind& mind); AutolinkingMind(const AutolinkingMind&) = delete; From 887f33d06a30de6940b41bae18561c7c58ab9eba Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sat, 6 Jan 2024 08:47:52 +0100 Subject: [PATCH 068/131] Clearing CLI of focus get. --- app/src/qt/cli_n_breadcrumbs_view.cpp | 11 +++++++++++ app/src/qt/cli_n_breadcrumbs_view.h | 3 ++- app/src/qt/main_toolbar_view.cpp | 7 ++++--- app/src/qt/main_toolbar_view.h | 1 - app/src/qt/main_window_presenter.cpp | 1 - 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/app/src/qt/cli_n_breadcrumbs_view.cpp b/app/src/qt/cli_n_breadcrumbs_view.cpp index dbcaa7e8..7f300b04 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.cpp +++ b/app/src/qt/cli_n_breadcrumbs_view.cpp @@ -66,6 +66,17 @@ void CliView::keyPressEvent(QKeyEvent* event) QLineEdit::keyPressEvent(event); } +void CliView::focusInEvent(QFocusEvent* event) +{ + MF_DEBUG("CLI: on focus acquired" << std::endl); + + if(text() == CLI_HELP_SHADOW_TEXT) { + clear(); + } + + QLineEdit::focusInEvent(event); +} + void CliView::focusOutEvent(QFocusEvent* event) { MF_DEBUG("CLI: on focus lost" << std::endl); diff --git a/app/src/qt/cli_n_breadcrumbs_view.h b/app/src/qt/cli_n_breadcrumbs_view.h index f7f83a45..ed95a4af 100644 --- a/app/src/qt/cli_n_breadcrumbs_view.h +++ b/app/src/qt/cli_n_breadcrumbs_view.h @@ -39,7 +39,8 @@ class CliView : public QLineEdit CliAndBreadcrumbsView* cliAndBreadcrumps; protected: - void focusOutEvent(QFocusEvent*) override; + virtual void focusInEvent(QFocusEvent*) override; + virtual void focusOutEvent(QFocusEvent*) override; public: QPalette PALETTE_DISABLED_TEXT; diff --git a/app/src/qt/main_toolbar_view.cpp b/app/src/qt/main_toolbar_view.cpp index 4096eee1..7aababc8 100644 --- a/app/src/qt/main_toolbar_view.cpp +++ b/app/src/qt/main_toolbar_view.cpp @@ -25,9 +25,10 @@ MainToolbarView::MainToolbarView(MainWindowView* mainWindowView) { // TOOLBAR: L&F driven toolbar icons - dark vs. light - actionFindFts = addAction( - QIcon(":/icons/find-fts.svg"), - "Full-text search"); + // REMOVED: button preceding the CLI + //actionFindFts = addAction( + // QIcon(":/icons/find-fts.svg"), + // "Full-text search"); cli = new CliAndBreadcrumbsView{this}; addWidget(cli); diff --git a/app/src/qt/main_toolbar_view.h b/app/src/qt/main_toolbar_view.h index bcc67d0e..c712ef89 100644 --- a/app/src/qt/main_toolbar_view.h +++ b/app/src/qt/main_toolbar_view.h @@ -53,7 +53,6 @@ class MainToolbarView : public QToolBar QAction* actionViewNavigator; QAction* actionViewTags; QAction* actionViewRecentNotes; - QAction* actionFindFts; QAction* actionHomeOutline; QAction* actionThink; QAction* actionScope; diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index e953c28c..efa7bebe 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -243,7 +243,6 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) QObject::connect(view.getToolBar()->actionViewNavigator, SIGNAL(triggered()), this, SLOT(doActionViewKnowledgeGraphNavigator())); QObject::connect(view.getToolBar()->actionViewTags, SIGNAL(triggered()), this, SLOT(doActionViewTagCloud())); QObject::connect(view.getToolBar()->actionViewRecentNotes, SIGNAL(triggered()), this, SLOT(doActionViewRecentNotes())); - QObject::connect(view.getToolBar()->actionFindFts, SIGNAL(triggered()), this, SLOT(doActionFts())); QObject::connect(view.getToolBar()->actionHomeOutline, SIGNAL(triggered()), this, SLOT(doActionViewHome())); QObject::connect(view.getToolBar()->actionThink, SIGNAL(triggered()), this, SLOT(doActionMindToggleThink())); QObject::connect(view.getToolBar()->actionScope, SIGNAL(triggered()), this, SLOT(doActionMindTimeTagScope())); From e57b64d9cd9195758c8463105a076b85132ce808 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sat, 6 Jan 2024 13:40:19 +0100 Subject: [PATCH 069/131] Adding selection of Os in O tree by "find O by name" --- app/src/qt/main_window_presenter.cpp | 9 ++++++++- app/src/qt/outlines_map_model.cpp | 19 +++++++++++++++++-- app/src/qt/outlines_map_model.h | 1 + app/src/qt/outlines_map_presenter.cpp | 6 +++--- app/src/qt/outlines_map_presenter.h | 2 +- lib/src/mind/mind.h | 6 ------ lib/src/model/note.h | 6 ++++++ 7 files changed, 36 insertions(+), 13 deletions(-) diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index efa7bebe..d6e96874 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -930,7 +930,14 @@ void MainWindowPresenter::doActionFindOutlineByName(const std::string& phrase) void MainWindowPresenter::handleFindOutlineByName() { if(findOutlineByNameDialog->getChoice()) { - orloj->showFacetOutline((Outline*)findOutlineByNameDialog->getChoice()); + Outline* o = (Outline*)findOutlineByNameDialog->getChoice(); + if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) { + orloj->getOutlinesMap()->selectRowByOutlineKey(o->getKey()); + return; + } else { + orloj->showFacetOutline(o); + } + // IMPROVE make this more efficient statusBar->showInfo(QString(tr("Notebook "))+QString::fromStdString(findOutlineByNameDialog->getChoice()->getName())); } else { diff --git a/app/src/qt/outlines_map_model.cpp b/app/src/qt/outlines_map_model.cpp index c2d0d774..d94d608b 100644 --- a/app/src/qt/outlines_map_model.cpp +++ b/app/src/qt/outlines_map_model.cpp @@ -110,9 +110,24 @@ int OutlinesMapModel::insertNote(Note* note) int OutlinesMapModel::getRowByNote(const Note* note) { - for(int row = 0; rowdata().value() == note) { - return row; + return row; + } + } + return NO_INDEX; +} + +int OutlinesMapModel::getRowByOutlineKey(const string& outlineKey) +{ + for(int row = 0; rowdata().value(); + Link* oLink = n->getLinkByName(LINK_NAME_OUTLINE_KEY); + if(oLink) { + string oKey{oLink->getUrl()}; + if(oKey == outlineKey) { + return row; + } } } return NO_INDEX; diff --git a/app/src/qt/outlines_map_model.h b/app/src/qt/outlines_map_model.h index c3a23ea2..2412b7ad 100644 --- a/app/src/qt/outlines_map_model.h +++ b/app/src/qt/outlines_map_model.h @@ -50,6 +50,7 @@ class OutlinesMapModel : public QStandardItemModel void addNote(Note* note); int insertNote(Note* note); int getRowByNote(const Note* note); + int getRowByOutlineKey(const std::string& outlineKey); void refresh(Note* note) { refresh(note, noselection); } void refresh(Note* note, int row, bool set=false); void refresh(Note* note, QModelIndexList selection); diff --git a/app/src/qt/outlines_map_presenter.cpp b/app/src/qt/outlines_map_presenter.cpp index b62116e4..02a3e2a9 100644 --- a/app/src/qt/outlines_map_presenter.cpp +++ b/app/src/qt/outlines_map_presenter.cpp @@ -167,10 +167,10 @@ void OutlinesMapPresenter::clearSelection() view->clearSelection(); } -void OutlinesMapPresenter::selectRowByNote(const Note* note) +void OutlinesMapPresenter::selectRowByOutlineKey(const string& outlineKey) { - if(note) { - int row = model->getRowByNote(note); + if(outlineKey.size()) { + int row = model->getRowByOutlineKey(outlineKey); if(row >= 0) { view->selectRow(row); view->scrollTo(model->index(row, 0)); diff --git a/app/src/qt/outlines_map_presenter.h b/app/src/qt/outlines_map_presenter.h index 52bb582b..158d43cb 100644 --- a/app/src/qt/outlines_map_presenter.h +++ b/app/src/qt/outlines_map_presenter.h @@ -99,7 +99,7 @@ class OutlinesMapPresenter : public QObject void clearSelection(); void focus() { view->setFocus(); } - void selectRowByNote(const Note* note); + void selectRowByOutlineKey(const std::string &outlineKey); int getCurrentRow() const; Note* getCurrentNote() const; diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h index d725222e..1cfe6bdc 100644 --- a/lib/src/mind/mind.h +++ b/lib/src/mind/mind.h @@ -46,12 +46,6 @@ class AutolinkingMind; constexpr auto NO_PARENT = 0xFFFF; -// Outline key - resolved O path which may change if the repository is moved -constexpr const auto LINK_NAME_OUTLINE_KEY = "Outline key"; -// Outline path - relative O path which can be used to create valid absolute O path on map load -constexpr const auto LINK_NAME_OUTLINE_PATH = "Outline path"; -// ^ const in constexpr ensures const value - enum class FtsSearch { EXACT, IGNORE_CASE, diff --git a/lib/src/model/note.h b/lib/src/model/note.h index c994b0ed..4364faec 100644 --- a/lib/src/model/note.h +++ b/lib/src/model/note.h @@ -34,6 +34,12 @@ namespace m8r { class Outline; +// Outline key - resolved O path which may change if the repository is moved +constexpr const auto LINK_NAME_OUTLINE_KEY = "Outline key"; +// Outline path - relative O path which can be used to create valid absolute O path on map load +constexpr const auto LINK_NAME_OUTLINE_PATH = "Outline path"; +// ^ const in constexpr ensures const value + /** * @brief Note - a thought. * From e56f7c600bb86e55a8a4f460485dc64ece91e12d Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sat, 6 Jan 2024 13:54:10 +0100 Subject: [PATCH 070/131] Refresh O tree (Os which were changed by other views). --- lib/src/mind/mind.cpp | 15 +++++++++++---- lib/src/mind/mind.h | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp index fa812255..5c02ea11 100644 --- a/lib/src/mind/mind.cpp +++ b/lib/src/mind/mind.cpp @@ -1032,12 +1032,19 @@ void Mind::outlinesMapSynchronize(Outline* outlinesMap) Link* oLink = n->getLinkByName(LINK_NAME_OUTLINE_KEY); if(oLink) { string oKey{oLink->getUrl()}; - if(findOutlineByKey(oKey)) { + Outline* o = findOutlineByKey(oKey); + if(o) { // valid O in MF & map MF_DEBUG( " VALID : " << n->getName() << endl << " " << oKey << endl ); + // refresh N representing O (name, timestamps, ... may be changed by other views) + n->setName(o->getName()); + n->setModified(o->getModified()); + n->setModifiedPretty(); + n->setRead(o->getRead()); + n->setReadPretty(); mapOsKeys.push_back(oKey); } else { MF_DEBUG(" INVALID (no O for link): " << n->getName() << endl); @@ -1433,18 +1440,18 @@ unique_ptr> Mind::findOutlineByNameFts(const string& pattern) c return result; } -bool Mind::findOutlineByKey(const string& key) const +Outline* Mind::findOutlineByKey(const string& key) const { if(key.size()) { vector outlines = memory.getOutlines(); for(Outline* outline:outlines) { if(key.compare(outline->getKey()) == 0) { - return true; + return outline; } } } - return false; + return nullptr; } } /* namespace */ diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h index 1cfe6bdc..72479c83 100644 --- a/lib/src/mind/mind.h +++ b/lib/src/mind/mind.h @@ -381,7 +381,7 @@ class Mind : public OntologyProvider */ std::unique_ptr> findOutlineByNameFts(const std::string& pattern) const; //std::vector* findNoteByNameFts(const std::string& pattern) const; - bool findOutlineByKey(const std::string& key) const; + Outline* findOutlineByKey(const std::string& key) const; std::vector* findNoteFts( const std::string& pattern, const FtsSearch mode = FtsSearch::EXACT, From 0b0d21fdc942e70ef79ded9bba5eb18941e7af01 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 7 Jan 2024 07:55:04 +0100 Subject: [PATCH 071/131] Wingman: adding cURL, adding Wingman dialog skeleton #1514 --- .github/workflows/build_ubuntu.yml | 6 +- CREDITS.md | 1 + app/app.pro | 2 + app/mf-resources.qrc | 2 + .../menu-icons/light_wingman-gray.svg | 117 ++++++++++++ .../menu-icons/light_wingman-green.svg | 117 ++++++++++++ app/src/qt/dialogs/terminal_dialog.cpp | 2 + app/src/qt/dialogs/wingman_dialog.cpp | 177 ++++++++++++++++++ app/src/qt/dialogs/wingman_dialog.h | 96 ++++++++++ app/src/qt/main_menu_presenter.cpp | 66 +++---- app/src/qt/main_menu_view.cpp | 21 ++- app/src/qt/main_menu_view.h | 4 +- app/src/qt/main_window_presenter.cpp | 13 ++ app/src/qt/main_window_presenter.h | 4 + build/debian/debian/control | 2 +- build/snap/snapcraft.yaml | 1 + build/travis-ci/.travis.yml | 1 + build/ubuntu/build-all-clean-system.sh | 2 +- build/ubuntu/debian/control | 2 +- lib/src/debug.h | 1 + licenses/curl-license.txt | 11 ++ 21 files changed, 591 insertions(+), 57 deletions(-) create mode 100644 app/resources/menu-icons/light_wingman-gray.svg create mode 100644 app/resources/menu-icons/light_wingman-green.svg create mode 100644 app/src/qt/dialogs/wingman_dialog.cpp create mode 100644 app/src/qt/dialogs/wingman_dialog.h create mode 100644 licenses/curl-license.txt diff --git a/.github/workflows/build_ubuntu.yml b/.github/workflows/build_ubuntu.yml index fa6dff8e..2626f49e 100644 --- a/.github/workflows/build_ubuntu.yml +++ b/.github/workflows/build_ubuntu.yml @@ -4,14 +4,14 @@ on: [push] jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 with: submodules: recursive - name: Install packages - run: sudo apt-get update && sudo apt-get install -y build-essential zlib1g-dev libhunspell-dev libqt5webkit5-dev qttools5-dev-tools qt5-default ccache + run: sudo apt-get update && sudo apt-get install -y build-essential zlib1g-dev libcurl4-gnutls-dev libhunspell-dev libqt5webkit5-dev qttools5-dev-tools qt5-default ccache - name: Build dependency - cmark-gfm run: cd deps/cmark-gfm && mkdir -v build && cd build && cmake -DCMARK_TESTS=OFF -DCMARK_SHARED=OFF .. && cmake --build . @@ -23,7 +23,7 @@ jobs: run: export M8R_GIT_PATH=`pwd` && cd build/make && M8R_CPU_CORES=4 ./test-lib-units.sh - name: Run QMake to build application - run: pwd ; qmake -r "CONFIG+=mfci" mindforger.pro + run: pwd ; qmake -r "CONFIG+=mfci" mindforger.pro - name: Run Make to build application run: make -j 4 diff --git a/CREDITS.md b/CREDITS.md index a91314b5..a267c852 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -12,6 +12,7 @@ Big thanks to 3rd party FOSS content authors: * Qt Company ([Qt](https://www.qt.io/) - lib and code) * GitHub ([CMark GFM](https://github.com/github/cmark-gfm) - Markdown rendering - lib) * Kevin Hendricks, Bjoern Jacke, Lázsló Németh ([Hunspell](https://github.com/hunspell/hunspell) - spellcheck - lib) +* Daniel Stenberg ([cURL](https://curl.se) - libcurl with GnuTLS flavor) * NetBSD Foundation (strptime - Windows port - lib) * Toni Ronkko (dirent - Windows port - lib) * Microsoft (getopt - Windows port - lib) diff --git a/app/app.pro b/app/app.pro index 634ff99c..9c54351b 100644 --- a/app/app.pro +++ b/app/app.pro @@ -290,6 +290,7 @@ HEADERS += \ src/qt/dialogs/organizer_new_dialog.h \ src/qt/dialogs/rm_library_dialog.h \ src/qt/dialogs/run_tool_dialog.h \ + src/qt/dialogs/wingman_dialog.h \ src/qt/dialogs/sync_library_dialog.h \ src/qt/dialogs/terminal_dialog.h \ src/qt/kanban_column_model.h \ @@ -421,6 +422,7 @@ SOURCES += \ src/qt/dialogs/organizer_new_dialog.cpp \ src/qt/dialogs/rm_library_dialog.cpp \ src/qt/dialogs/run_tool_dialog.cpp \ + src/qt/dialogs/wingman_dialog.cpp \ src/qt/dialogs/sync_library_dialog.cpp \ src/qt/dialogs/terminal_dialog.cpp \ src/qt/kanban_column_model.cpp \ diff --git a/app/mf-resources.qrc b/app/mf-resources.qrc index 36bc6a29..7466dece 100644 --- a/app/mf-resources.qrc +++ b/app/mf-resources.qrc @@ -48,6 +48,8 @@ resources/menu-icons/light_go-home.svg resources/menu-icons/light_tag.svg resources/menu-icons/light_tools-report-bug.svg + resources/menu-icons/light_wingman-green.svg + resources/menu-icons/light_wingman-gray.svg resources/menu-icons/light_view-fullscreen.svg resources/menu-icons/light_view-preview.svg resources/menu-icons/light_view-refresh.svg diff --git a/app/resources/menu-icons/light_wingman-gray.svg b/app/resources/menu-icons/light_wingman-gray.svg new file mode 100644 index 00000000..c1b064c0 --- /dev/null +++ b/app/resources/menu-icons/light_wingman-gray.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/app/resources/menu-icons/light_wingman-green.svg b/app/resources/menu-icons/light_wingman-green.svg new file mode 100644 index 00000000..938ea899 --- /dev/null +++ b/app/resources/menu-icons/light_wingman-green.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/app/src/qt/dialogs/terminal_dialog.cpp b/app/src/qt/dialogs/terminal_dialog.cpp index efa733c2..d7187ebe 100644 --- a/app/src/qt/dialogs/terminal_dialog.cpp +++ b/app/src/qt/dialogs/terminal_dialog.cpp @@ -25,6 +25,8 @@ using namespace std; TerminalDialog::TerminalDialog(QWidget* parent) : QDialog(parent) { + setWindowTitle(tr("Terminal")); + cmdEdit = new MyLineEdit(this, this); cmdCompleter = new QCompleter(new QStandardItemModel(cmdEdit), this); diff --git a/app/src/qt/dialogs/wingman_dialog.cpp b/app/src/qt/dialogs/wingman_dialog.cpp new file mode 100644 index 00000000..3fc23ed7 --- /dev/null +++ b/app/src/qt/dialogs/wingman_dialog.cpp @@ -0,0 +1,177 @@ +/* + wingman_dialog.cpp MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "wingman_dialog.h" + +namespace m8r { + +using namespace std; + +const vector WingmanDialog::outlinePrompts( + { + QString{"http"}, + QString{"https"} + } +); + +WingmanDialog::WingmanDialog(QWidget* parent) + : QDialog(parent) +{ + // UI + setWindowTitle(tr("Wingman")); + + phraseLabel = new QLabel{tr("Entity:"), parent}; + phraseEdit = new QLineEdit{parent}; + // TODO O, N, text ~ get prefix in + + toolLabel = new QLabel{tr("Predefined prompts:"), parent}; + toolCombo = new QComboBox{this}; + for(QString toolName:outlinePrompts) { + toolCombo->addItem(toolName); + } + + // TODO change of the tool changes the template + + templateLabel = new QLabel{tr("Template:"), parent}; + templateEdit = new QLineEdit{parent}; + + // IMPROVE disable/enable find button if text/path is valid: freedom vs validation + runButton = new QPushButton{tr("&Get")}; + runButton->setDefault(true); + closeButton = new QPushButton{tr("&Cancel")}; + + // signals + QObject::connect( + closeButton, SIGNAL(clicked()), + this, SLOT(close())); + + // assembly + QVBoxLayout* mainLayout = new QVBoxLayout{}; + mainLayout->addWidget(phraseLabel); + mainLayout->addWidget(phraseEdit); + mainLayout->addWidget(toolLabel); + mainLayout->addWidget(toolCombo); + mainLayout->addWidget(templateLabel); + mainLayout->addWidget(templateEdit); + + QHBoxLayout* buttonLayout = new QHBoxLayout{}; + buttonLayout->addStretch(1); + buttonLayout->addWidget(closeButton); + buttonLayout->addWidget(runButton); + buttonLayout->addStretch(); + + mainLayout->addLayout(buttonLayout); + setLayout(mainLayout); + + // signals + QObject::connect( + toolCombo, SIGNAL(currentIndexChanged(QString)), + this, SLOT(handleChangeToolCombo(QString)) + ); + + // dialog + resize(fontMetrics().averageCharWidth()*55, height()); + setModal(true); +} + +WingmanDialog::~WingmanDialog() +{ +} + +void WingmanDialog::initForMode(WingmanDialogModes mode) +{ + this->mode=mode; + + switch(mode) { + case WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE: + phraseLabel->setText(tr("Outline:")); + break; + case WingmanDialogModes::WINGMAN_DIALOG_MODE_NOTE: + phraseLabel->setText(tr("Note:")); + break; + case WingmanDialogModes::WINGMAN_DIALOG_MODE_TEXT: + phraseLabel->setText(tr("Text:")); + break; + } +} + +void WingmanDialog::show() +{ + QDialog::show(); +} + +QString WingmanDialog::getTemplateTextForToolName(string selectedTool) const +{ + if(selectedTool == TOOL_ARXIV) { + QString templateText{"https://arxiv.org/search/?query="}; + templateText.append(TOOL_PHRASE); + return templateText; + } else if(selectedTool == TOOL_DEEPL) { + return QString{"https://www.deepl.com/en/translator"}; + } else if(selectedTool == TOOL_STACK_OVERFLOW) { + QString templateText{"https://stackoverflow.com/search?q="}; + templateText.append(TOOL_PHRASE); + return templateText; + } else if(selectedTool == TOOL_DUCKDUCKGO) { + QString templateText{"https://www.duckduckgo.com/?q="}; + templateText.append(TOOL_PHRASE); + return templateText; + } else if(selectedTool == TOOL_GH_TOPICS) { + // TODO fix search URL + QString templateText{"https://www.github.com/search?q="}; + templateText.append(TOOL_PHRASE); + return templateText; + } else if(selectedTool == TOOL_GH_REPOS) { + // TODO fix search URL + QString templateText{"https://www.github.com/search?q="}; + templateText.append(TOOL_PHRASE); + return templateText; + } else if(selectedTool == TOOL_CHAT_GPT_WEB) { + return QString{"https://chat.openai.com/"}; + } else if(selectedTool == TOOL_GOOGLE_BARD) { + return QString{"https://bard.google.com/chat"}; + } else if(selectedTool == TOOL_GOOGLE_SEARCH) { + QString temlateText{"https://www.google.com/search?q="}; + temlateText.append(TOOL_PHRASE); + return temlateText; + } else if(selectedTool == TOOL_WIKIPEDIA) { + // TODO: URL + QString temlateText{"https://en.wikipedia.org/w/index.php?search="}; + temlateText.append(TOOL_PHRASE); + return temlateText; + } + + string msg{ + "Tool '" + selectedTool + "' to search/explain/process " + "the phrase is not supported."}; + QMessageBox msgBox{ + QMessageBox::Critical, + QObject::tr("Unsupported Knowledge Tool"), + QObject::tr(msg.c_str()), + }; + + return QString{}; +} + +void WingmanDialog::handleChangeToolCombo(const QString& text) { + MF_DEBUG("Tool changed: " << text.toStdString() << endl); + + this->templateEdit->setText(getTemplateTextForToolName(text.toStdString())); +} + +} // m8r namespace diff --git a/app/src/qt/dialogs/wingman_dialog.h b/app/src/qt/dialogs/wingman_dialog.h new file mode 100644 index 00000000..9edf2613 --- /dev/null +++ b/app/src/qt/dialogs/wingman_dialog.h @@ -0,0 +1,96 @@ +/* + wingman_dialog.h MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef M8RUI_WINGMAN_DIALOG_H +#define M8RUI_WINGMAN_DIALOG_H + +#include + +#include "../../lib/src/config/configuration.h" + +namespace m8r { + +enum WingmanDialogModes { + WINGMAN_DIALOG_MODE_OUTLINE, + WINGMAN_DIALOG_MODE_NOTE, + WINGMAN_DIALOG_MODE_TEXT +}; + +class WingmanDialog : public QDialog +{ + Q_OBJECT + +private: + + static const std::vector outlinePrompts; + + WingmanDialogModes mode; + + std::vector promptsOutline; + std::vector promptsNote; + std::vector promptsText; + + QLabel* phraseLabel; + QLineEdit* phraseEdit; + + QLabel* toolLabel; + QComboBox* toolCombo; + + QLabel* templateLabel; + QLineEdit* templateEdit; + + QPushButton* runButton; + QPushButton* closeButton; + +public: + explicit WingmanDialog(QWidget* parent); + WingmanDialog(const WingmanDialog&) = delete; + WingmanDialog(const WingmanDialog&&) = delete; + WingmanDialog& operator =(const WingmanDialog&) = delete; + WingmanDialog& operator =(const WingmanDialog&&) = delete; + ~WingmanDialog(); + + void initForMode(WingmanDialogModes mode); + + void show(); + + QString getTemplateTextForToolName(std::string selectedTool) const; + + QPushButton* getRunButton() const { return runButton; } + QString getSelectedTool() const { + return this->toolCombo->itemText( + this->toolCombo->currentIndex() + ); + } + QString getTemplateText() const { + return this->templateEdit->text(); + } + QString getPhraseText() const { return phraseEdit->text(); } + void setPhraseText(QString phrase) { + this->phraseEdit->setText(phrase); + } + void setTemplateText(QString templateText) { + this->templateEdit->setText(templateText); + } + +private slots: + void handleChangeToolCombo(const QString& text); +}; + +} +#endif // M8RUI_WINGMAN_DIALOG_H diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp index 5dd8c1f6..7b519ced 100644 --- a/app/src/qt/main_menu_presenter.cpp +++ b/app/src/qt/main_menu_presenter.cpp @@ -29,75 +29,52 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp) // menu: mind QObject::connect( view->actionMindNewRepository, SIGNAL(triggered()), - mwp, SLOT(doActionMindNewRepository()) - ); + mwp, SLOT(doActionMindNewRepository())); QObject::connect( view->actionMindNewFile, SIGNAL(triggered()), - mwp, SLOT(doActionMindNewFile()) - ); + mwp, SLOT(doActionMindNewFile())); + QObject::connect( + view->actionMindWingman, SIGNAL(triggered()), + mwp, SLOT(doActionWingman())); QObject::connect( view->actionMindThink, SIGNAL(triggered()), - mwp, SLOT(doActionMindToggleThink()) - ); + mwp, SLOT(doActionMindToggleThink())); QObject::connect( view->actionMindAutolink, SIGNAL(triggered()), - mwp, SLOT(doActionMindToggleAutolink()) - ); + mwp, SLOT(doActionMindToggleAutolink())); QObject::connect( view->actionMindLearnDirectory, SIGNAL(triggered()), - mwp, SLOT(doActionMindLearnRepository()) - ); + mwp, SLOT(doActionMindLearnRepository())); QObject::connect( view->actionMindLearnRepository, SIGNAL(triggered()), - mwp, SLOT(doActionMindLearnRepository()) - ); + mwp, SLOT(doActionMindLearnRepository())); QObject::connect( view->actionMindLearnFile, SIGNAL(triggered()), - mwp, SLOT(doActionMindLearnFile()) - ); + mwp, SLOT(doActionMindLearnFile())); for(auto& r:config.getRepositories()) { view->submenuMindRelearn->addFile(QString::fromStdString(r.first)); } QObject::connect( view->submenuMindRelearn, SIGNAL(recentFileTriggered(QString)), - mwp, SLOT(doActionMindRelearn(QString)) - ); + mwp, SLOT(doActionMindRelearn(QString))); QObject::connect( view->actionMindScope, SIGNAL(triggered()), - mwp, SLOT(doActionMindTimeTagScope()) - ); + mwp, SLOT(doActionMindTimeTagScope())); QObject::connect( view->actionMindRemember, SIGNAL(triggered()), - mwp, SLOT(doActionMindRemember()) - ); + mwp, SLOT(doActionMindRemember())); QObject::connect( view->actionMindPreferences, SIGNAL(triggered()), - mwp, SLOT(doActionMindPreferences()) - ); - QObject::connect( - view->actionFormatEmojis, SIGNAL(triggered()), - mwp, SLOT(doActionEmojisDialog()) - ); - QObject::connect( - view->actionViewTerminal, SIGNAL(triggered()), - mwp, SLOT(doActionViewTerminal()) - ); - QObject::connect( - view->actionViewLimbo, SIGNAL(triggered()), - mwp, SLOT(doActionViewLimbo()) - ); + mwp, SLOT(doActionMindPreferences())); QObject::connect( view->actionMindSnapshot, SIGNAL(triggered()), - mwp, SLOT(doActionMindSnapshot()) - ); + mwp, SLOT(doActionMindSnapshot())); QObject::connect( view->actionMindExportCsv, SIGNAL(triggered()), - mwp, SLOT(doActionMindCsvExport()) - ); + mwp, SLOT(doActionMindCsvExport())); QObject::connect( view->actionExit, SIGNAL(triggered()), - mwp, SLOT(doActionExit()) - ); + mwp, SLOT(doActionExit())); #ifdef DO_MF_DEBUG QObject::connect(view->actionMindHack, SIGNAL(triggered()), mwp, SLOT(doActionMindHack())); #endif @@ -116,6 +93,12 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp) #endif // menu: view + QObject::connect( + view->actionViewTerminal, SIGNAL(triggered()), + mwp, SLOT(doActionViewTerminal())); + QObject::connect( + view->actionViewLimbo, SIGNAL(triggered()), + mwp, SLOT(doActionViewLimbo())); QObject::connect(view->actionViewDashboard, SIGNAL(triggered()), mwp, SLOT(doActionViewDashboard())); QObject::connect(view->actionViewHome, SIGNAL(triggered()), mwp, SLOT(doActionViewHome())); QObject::connect(view->actionViewOrganizers, SIGNAL(triggered()), mwp, SLOT(doActionViewOrganizers())); @@ -265,6 +248,9 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp) mwp, SLOT(doActionSpellCheck())); // menu: format + QObject::connect( + view->actionFormatEmojis, SIGNAL(triggered()), + mwp, SLOT(doActionEmojisDialog())); QObject::connect(view->actionFormatBold, SIGNAL(triggered()), mwp, SLOT(doActionFormatBold())); QObject::connect(view->actionFormatItalic, SIGNAL(triggered()), mwp, SLOT(doActionFormatItalic())); QObject::connect(view->actionFormatCode, SIGNAL(triggered()), mwp, SLOT(doActionFormatCode())); diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index e01dfe7e..45914d95 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -103,6 +103,10 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionMindAutolink->setVisible(false); #endif + actionMindWingman = new QAction(QIcon(":/menu-icons/wingman-green.svg"), tr("&Wingman"), mainWindow); + actionMindWingman->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_Slash)); + actionMindWingman->setStatusTip(tr("Activate wingman...")); + // scope ... don't show any N/O older than 1Y/3M/... actionMindScope = new QAction(QIcon(":/menu-icons/filter.svg"), tr("S&cope"), mainWindow); actionMindScope->setStatusTip(tr("Don't show Notebooks and Notes older than...")); @@ -144,18 +148,19 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) menuMind->addMenu(submenuMindNew); menuMind->addMenu(submenuMindLearn); menuMind->addMenu(submenuMindRelearn); - menuMind->addAction(actionMindScope); - menuMind->addAction(actionMindThink); - menuMind->addAction(actionMindAutolink); menuMind->addAction(actionMindRemember); #ifdef MF_WIP menuMind->addAction(actionMindSnapshot); + menuMind->addAction(actionMindForget); #endif + menuMind->addSeparator(); + menuMind->addAction(actionMindThink); + menuMind->addAction(actionMindAutolink); + menuMind->addAction(actionMindWingman); + menuMind->addAction(actionMindScope); + menuMind->addSeparator(); menuMind->addAction(actionMindPreferences); -#ifdef MF_WIP - menuMind->addAction(actionMindForget); menuMind->addSeparator(); -#endif menuMind->addMenu(submenuMindExport); menuMind->addSeparator(); menuMind->addAction(actionExit); @@ -275,7 +280,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionViewDwell->setStatusTip(tr("Open memory dwell...")); actionViewDwell->setEnabled(false); - actionViewCli = new QAction(QIcon(":/menu-icons/cli.svg"), tr("&Wingman"), mainWindow); + actionViewCli = new QAction(QIcon(":/menu-icons/cli.svg"), tr("&CLI"), mainWindow); actionViewCli->setShortcut(QKeySequence(Qt::ALT+Qt::Key_X)); actionViewCli->setStatusTip(tr("Activate command line interface...")); @@ -308,7 +313,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionViewLimbo->setEnabled(true); actionViewHoist = new QAction( - QIcon(":/menu-icons/hoisting.svg"), tr("Ho&isting"), mainWindow); + QIcon(":/menu-icons/hoisting.svg"), tr("Ho&ist"), mainWindow); actionViewHoist->setCheckable(true); actionViewHoist->setChecked(false); actionViewHoist->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_I)); diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h index f5bf7230..5f135055 100644 --- a/app/src/qt/main_menu_view.h +++ b/app/src/qt/main_menu_view.h @@ -48,9 +48,6 @@ class MainMenuView : public QObject QMenu* menuMind; QMenu* menuFind; QMenu* menuView; -#ifdef MF_WIP_KNOW - QMenu* menuKnowledge; -#endif QMenu* menuNavigator; QMenu* menuLibrary; #ifdef MF_WIP @@ -81,6 +78,7 @@ class MainMenuView : public QObject QAction* actionMindRemember; QAction* actionMindThink; QAction* actionMindAutolink; + QAction* actionMindWingman; QAction* actionMindScope; QAction* actionMindForget; QAction* actionMindSnapshot; diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index d6e96874..c10598f0 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -57,6 +57,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) syncLibraryDialog = new SyncLibraryDialog{&view}; rmLibraryDialog = new RemoveLibraryDialog(&view); runToolDialog = new RunToolDialog{&view}; + wingmanDialog = new WingmanDialog{&view}; scopeDialog = new ScopeDialog{mind->getOntology(), &view}; newOrganizerDialog = new OrganizerNewDialog{mind->getOntology(), &view}; newOutlineDialog = new OutlineNewDialog{ @@ -2216,6 +2217,18 @@ void MainWindowPresenter::handleLeftToolbarAction(string selectedTool) QDesktopServices::openUrl(QUrl{command}); } +void MainWindowPresenter::doActionWingman() +{ + MF_DEBUG("SIGNAL handled: WINGMAN dialog..."); + this->wingmanDialog->initForMode(WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE); + this->wingmanDialog->show(); +} + +void MainWindowPresenter::handlActionWingman() +{ + +} + void MainWindowPresenter::doActionOutlineOrNoteNew() { if(orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE_HEADER) diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index b34ddb71..58279199 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -41,6 +41,7 @@ #include "dialogs/sync_library_dialog.h" #include "dialogs/rm_library_dialog.h" #include "dialogs/run_tool_dialog.h" +#include "dialogs/wingman_dialog.h" #include "dialogs/organizer_new_dialog.h" #include "dialogs/outline_new_dialog.h" #include "dialogs/note_new_dialog.h" @@ -126,6 +127,7 @@ class MainWindowPresenter : public QObject SyncLibraryDialog* syncLibraryDialog; RemoveLibraryDialog* rmLibraryDialog; RunToolDialog* runToolDialog; + WingmanDialog* wingmanDialog; ScopeDialog* scopeDialog; OrganizerNewDialog* newOrganizerDialog; OutlineNewDialog* newOutlineDialog; @@ -373,6 +375,8 @@ public slots: void doActionSpellCheck(); // tools toolbar void handleLeftToolbarAction(std::string selectedTool); + void doActionWingman(); + void handlActionWingman(); void doActionArxivToolbar(); void doActionWikipediaToolbar(); void doActionStackOverflowToolbar(); diff --git a/build/debian/debian/control b/build/debian/debian/control index 4fb01a25..185e5f6e 100644 --- a/build/debian/debian/control +++ b/build/debian/debian/control @@ -2,7 +2,7 @@ Source: mindforger Section: utils Priority: optional Maintainer: Martin Dvorak -Build-Depends: debhelper (>= 8.0.0), build-essential, ccache, zlib1g-dev, libhunspell-dev, qt5-qmake, qtbase5-dev, libqt5webkit5-dev +Build-Depends: debhelper (>= 8.0.0), build-essential, ccache, zlib1g-dev, libcurl4-gnutls-dev, libhunspell-dev, qt5-qmake, qtbase5-dev, libqt5webkit5-dev Standards-Version: 3.9.5 Homepage: https://github.com/dvorka/mindforger Vcs-Git: https://github.com/dvorka/mindforger.git diff --git a/build/snap/snapcraft.yaml b/build/snap/snapcraft.yaml index 53d6b43f..6133dc09 100644 --- a/build/snap/snapcraft.yaml +++ b/build/snap/snapcraft.yaml @@ -21,6 +21,7 @@ parts: - libx11-xcb1 # fixes could not find or load the Qt platform plugin "xcb" in "" - zlib1g-dev - ccache + - libcurl4-gnutls-dev - libhunspell-dev - build-essential - qtbase5-dev diff --git a/build/travis-ci/.travis.yml b/build/travis-ci/.travis.yml index d0f64646..42333233 100644 --- a/build/travis-ci/.travis.yml +++ b/build/travis-ci/.travis.yml @@ -48,6 +48,7 @@ before_install: install: - sudo apt-get install -qq qtbase5-dev libqt5webkit5-dev - sudo apt-get install -qq qt5-default qttools5-dev-tools + - sudo apt-get install -qq libcurl4-gnutls-dev - sudo apt-get install -qq libhunspell-dev - sudo apt-get install -qq ccache - sudo apt-get install -qq libgtest-dev diff --git a/build/ubuntu/build-all-clean-system.sh b/build/ubuntu/build-all-clean-system.sh index b1eaeda6..43e2f88b 100755 --- a/build/ubuntu/build-all-clean-system.sh +++ b/build/ubuntu/build-all-clean-system.sh @@ -29,7 +29,7 @@ git submodule init git submodule update # deps install -sudo apt-get install build-essential zlib1g-dev libhunspell-dev libqt5webkit5-dev qttools5-dev-tools qt5-default ccache +sudo apt-get install build-essential zlib1g-dev libcurl4-gnutls-dev libhunspell-dev libqt5webkit5-dev qttools5-dev-tools qt5-default ccache # deps build cd ${SCRIPT_HOME}/../../deps/cmark-gfm diff --git a/build/ubuntu/debian/control b/build/ubuntu/debian/control index 6a7ce1cc..5c296633 100644 --- a/build/ubuntu/debian/control +++ b/build/ubuntu/debian/control @@ -2,7 +2,7 @@ Source: mindforger Section: utils Priority: optional Maintainer: Martin Dvorak -Build-Depends: debhelper (>= 8.0.0), build-essential, ccache, qt5-qmake, zlib1g-dev, libhunspell-dev (>=1.6), qtbase5-dev, libqt5webkit5-dev +Build-Depends: debhelper (>= 8.0.0), build-essential, ccache, qt5-qmake, zlib1g-dev, libcurl4-gnutls-dev, libhunspell-dev (>=1.6), qtbase5-dev, libqt5webkit5-dev Standards-Version: 3.9.5 Homepage: https://github.com/dvorka/mindforger Vcs-Git: https://github.com/dvorka/mindforger.git diff --git a/lib/src/debug.h b/lib/src/debug.h index e3b01b68..8622963b 100644 --- a/lib/src/debug.h +++ b/lib/src/debug.h @@ -40,6 +40,7 @@ // show WIP features #define MF_WIP + #define MF_WIP_WINGMAN // future timestamps check #define MF_ASSERT_WHERE " (" << __FILE__ << ":" << __LINE__ << ")" diff --git a/licenses/curl-license.txt b/licenses/curl-license.txt new file mode 100644 index 00000000..bf89364a --- /dev/null +++ b/licenses/curl-license.txt @@ -0,0 +1,11 @@ +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2023, Daniel Stenberg, daniel@haxx.se, and many contributors, see the THANKS file. + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. From 0f791b77164633695acb7c1bfa7b9f2460cbbea5 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Mon, 8 Jan 2024 09:05:38 +0100 Subject: [PATCH 072/131] WIP: Wingman summarization #1514 --- app/src/qt/dialogs/wingman_dialog.cpp | 201 +++++++++++++---------- app/src/qt/dialogs/wingman_dialog.h | 58 +++---- app/src/qt/main_window_presenter.cpp | 80 ++++++++- app/src/qt/main_window_presenter.h | 2 +- lib/lib.pro | 6 +- lib/src/mind/ai/llm/llamacpp_wingman.cpp | 31 ++++ lib/src/mind/ai/llm/llamacpp_wingman.h | 49 ++++++ lib/src/mind/ai/llm/mock_wingman.cpp | 12 ++ lib/src/mind/ai/llm/mock_wingman.h | 9 +- lib/src/mind/ai/llm/openai_wingman.cpp | 79 +++++++++ lib/src/mind/ai/llm/openai_wingman.h | 50 ++++++ lib/src/mind/ai/llm/wingman.cpp | 9 +- lib/src/mind/ai/llm/wingman.h | 92 ++--------- lib/src/mind/mind.cpp | 10 +- lib/src/mind/mind.h | 12 ++ 15 files changed, 499 insertions(+), 201 deletions(-) create mode 100644 lib/src/mind/ai/llm/llamacpp_wingman.cpp create mode 100644 lib/src/mind/ai/llm/llamacpp_wingman.h create mode 100644 lib/src/mind/ai/llm/openai_wingman.cpp create mode 100644 lib/src/mind/ai/llm/openai_wingman.h diff --git a/app/src/qt/dialogs/wingman_dialog.cpp b/app/src/qt/dialogs/wingman_dialog.cpp index 3fc23ed7..54bd3c0c 100644 --- a/app/src/qt/dialogs/wingman_dialog.cpp +++ b/app/src/qt/dialogs/wingman_dialog.cpp @@ -24,8 +24,44 @@ using namespace std; const vector WingmanDialog::outlinePrompts( { - QString{"http"}, - QString{"https"} + QString{"Summarize."}, + QString{"Generate tags from the text."}, + QString{"Find persons."}, + QString{"Find locations."}, + QString{"Find organizations."}, + QString{"Chat with the content."}, + } +); +const vector WingmanDialog::notePrompts( + { + QString{"Summarize."}, + QString{"Shorten."}, + QString{"Explain #NAME like I'm 5."}, + QString{"Generate tags."}, + QString{"Fix grammar."}, + QString{"Rewrite formally."}, + QString{"Rewrite informally."}, + QString{"Rewrite to be funny."}, + QString{"Chat with the content."}, + // other UCs: + // - simplify + // - beautify + // - translate + // - fix spelling + // - fix style + // - create plan ... + } +); +const vector WingmanDialog::textPrompts( + { + QString{"Complete the text."}, + QString{"Complete the last text line."}, + QString{"Explain like I'm 5."}, + QString{"Fix grammar."}, + QString{"Generate tags."}, + QString{"Rewrite formally."}, + QString{"Rewrite informally."}, + QString{"Rewrite to Kafka style."}, } ); @@ -35,23 +71,63 @@ WingmanDialog::WingmanDialog(QWidget* parent) // UI setWindowTitle(tr("Wingman")); - phraseLabel = new QLabel{tr("Entity:"), parent}; - phraseEdit = new QLineEdit{parent}; - // TODO O, N, text ~ get prefix in + preludeLabel = new QLabel{ + tr("Ask Wingman a predefined prompt or type your own phrase."), + parent + }; - toolLabel = new QLabel{tr("Predefined prompts:"), parent}; - toolCombo = new QComboBox{this}; + // GROUP: prompts + QGroupBox* promptsGroup = new QGroupBox{tr("Prompt"), this}; + QVBoxLayout* promptsLayout = new QVBoxLayout{this}; + + predefinedPromptsLabel = new QLabel{tr("Predefined:"), parent}; + predefinedPromptsCombo = new QComboBox{this}; for(QString toolName:outlinePrompts) { - toolCombo->addItem(toolName); + predefinedPromptsCombo->addItem(toolName); } - // TODO change of the tool changes the template - - templateLabel = new QLabel{tr("Template:"), parent}; - templateEdit = new QLineEdit{parent}; + promptLabel = new QLabel{tr("Your:"), parent}; + promptEdit = new QLineEdit{parent}; + promptEdit->setToolTip( + tr("Type in your prompt like: 'Translate the following text to Spanish: #CONTENT.")); + + promptsLayout->addWidget(predefinedPromptsLabel); + promptsLayout->addWidget(predefinedPromptsCombo); + promptsLayout->addWidget(promptLabel); + promptsLayout->addWidget(promptEdit); + promptsGroup->setLayout(promptsLayout); + + // GROUP: content + QGroupBox* contentGroup = new QGroupBox{tr("Context"), this}; + QVBoxLayout* contentLayout = new QVBoxLayout{this}; + + contextTypeLabel = new QLabel{tr("Type:"), parent}; + contextTypeEdit = new QLineEdit{parent}; + contextTypeEdit->setReadOnly(true); + + contextNameLabel = new QLabel{tr("Name (#NAME):"), parent}; + contextNameEdit = new QLineEdit{parent}; + contextNameEdit->setReadOnly(true); + + contextLabel = new QLabel{tr("Text (#TEXT):"), parent}; + contextEdit = new QLineEdit{parent}; + contextEdit->setReadOnly(true); + + postmortemLabel = new QLabel{ + tr("Use #NAME or #TEXT to include it to your prompt."), + parent}; + + contentLayout->addWidget(contextTypeLabel); + contentLayout->addWidget(contextTypeEdit); + contentLayout->addWidget(contextNameLabel); + contentLayout->addWidget(contextNameEdit); + contentLayout->addWidget(contextLabel); + contentLayout->addWidget(contextEdit); + contentLayout->addWidget(postmortemLabel); + contentGroup->setLayout(contentLayout); // IMPROVE disable/enable find button if text/path is valid: freedom vs validation - runButton = new QPushButton{tr("&Get")}; + runButton = new QPushButton{tr("&Ask Wingman")}; runButton->setDefault(true); closeButton = new QPushButton{tr("&Cancel")}; @@ -62,12 +138,6 @@ WingmanDialog::WingmanDialog(QWidget* parent) // assembly QVBoxLayout* mainLayout = new QVBoxLayout{}; - mainLayout->addWidget(phraseLabel); - mainLayout->addWidget(phraseEdit); - mainLayout->addWidget(toolLabel); - mainLayout->addWidget(toolCombo); - mainLayout->addWidget(templateLabel); - mainLayout->addWidget(templateEdit); QHBoxLayout* buttonLayout = new QHBoxLayout{}; buttonLayout->addStretch(1); @@ -75,15 +145,11 @@ WingmanDialog::WingmanDialog(QWidget* parent) buttonLayout->addWidget(runButton); buttonLayout->addStretch(); + mainLayout->addWidget(promptsGroup); + mainLayout->addWidget(contentGroup); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); - // signals - QObject::connect( - toolCombo, SIGNAL(currentIndexChanged(QString)), - this, SLOT(handleChangeToolCombo(QString)) - ); - // dialog resize(fontMetrics().averageCharWidth()*55, height()); setModal(true); @@ -91,6 +157,24 @@ WingmanDialog::WingmanDialog(QWidget* parent) WingmanDialog::~WingmanDialog() { + delete preludeLabel; + + delete predefinedPromptsLabel; + delete predefinedPromptsCombo; + delete promptLabel; + delete promptEdit; + + delete contextTypeLabel; + delete contextTypeEdit; + delete contextNameLabel; + delete contextNameEdit; + delete contextLabel; + delete contextEdit; + + delete postmortemLabel; + + delete runButton; + delete closeButton; } void WingmanDialog::initForMode(WingmanDialogModes mode) @@ -99,13 +183,15 @@ void WingmanDialog::initForMode(WingmanDialogModes mode) switch(mode) { case WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE: - phraseLabel->setText(tr("Outline:")); + contextTypeEdit->setText(tr("outline")); + contextEdit->setText(tr("")); break; case WingmanDialogModes::WINGMAN_DIALOG_MODE_NOTE: - phraseLabel->setText(tr("Note:")); + contextTypeEdit->setText(tr("note")); + contextEdit->setText(tr("")); break; case WingmanDialogModes::WINGMAN_DIALOG_MODE_TEXT: - phraseLabel->setText(tr("Text:")); + contextEdit->setText(tr("")); break; } } @@ -115,63 +201,4 @@ void WingmanDialog::show() QDialog::show(); } -QString WingmanDialog::getTemplateTextForToolName(string selectedTool) const -{ - if(selectedTool == TOOL_ARXIV) { - QString templateText{"https://arxiv.org/search/?query="}; - templateText.append(TOOL_PHRASE); - return templateText; - } else if(selectedTool == TOOL_DEEPL) { - return QString{"https://www.deepl.com/en/translator"}; - } else if(selectedTool == TOOL_STACK_OVERFLOW) { - QString templateText{"https://stackoverflow.com/search?q="}; - templateText.append(TOOL_PHRASE); - return templateText; - } else if(selectedTool == TOOL_DUCKDUCKGO) { - QString templateText{"https://www.duckduckgo.com/?q="}; - templateText.append(TOOL_PHRASE); - return templateText; - } else if(selectedTool == TOOL_GH_TOPICS) { - // TODO fix search URL - QString templateText{"https://www.github.com/search?q="}; - templateText.append(TOOL_PHRASE); - return templateText; - } else if(selectedTool == TOOL_GH_REPOS) { - // TODO fix search URL - QString templateText{"https://www.github.com/search?q="}; - templateText.append(TOOL_PHRASE); - return templateText; - } else if(selectedTool == TOOL_CHAT_GPT_WEB) { - return QString{"https://chat.openai.com/"}; - } else if(selectedTool == TOOL_GOOGLE_BARD) { - return QString{"https://bard.google.com/chat"}; - } else if(selectedTool == TOOL_GOOGLE_SEARCH) { - QString temlateText{"https://www.google.com/search?q="}; - temlateText.append(TOOL_PHRASE); - return temlateText; - } else if(selectedTool == TOOL_WIKIPEDIA) { - // TODO: URL - QString temlateText{"https://en.wikipedia.org/w/index.php?search="}; - temlateText.append(TOOL_PHRASE); - return temlateText; - } - - string msg{ - "Tool '" + selectedTool + "' to search/explain/process " - "the phrase is not supported."}; - QMessageBox msgBox{ - QMessageBox::Critical, - QObject::tr("Unsupported Knowledge Tool"), - QObject::tr(msg.c_str()), - }; - - return QString{}; -} - -void WingmanDialog::handleChangeToolCombo(const QString& text) { - MF_DEBUG("Tool changed: " << text.toStdString() << endl); - - this->templateEdit->setText(getTemplateTextForToolName(text.toStdString())); -} - } // m8r namespace diff --git a/app/src/qt/dialogs/wingman_dialog.h b/app/src/qt/dialogs/wingman_dialog.h index 9edf2613..808ee86f 100644 --- a/app/src/qt/dialogs/wingman_dialog.h +++ b/app/src/qt/dialogs/wingman_dialog.h @@ -38,21 +38,27 @@ class WingmanDialog : public QDialog private: static const std::vector outlinePrompts; + static const std::vector notePrompts; + static const std::vector textPrompts; WingmanDialogModes mode; - std::vector promptsOutline; - std::vector promptsNote; - std::vector promptsText; + QLabel* preludeLabel; - QLabel* phraseLabel; - QLineEdit* phraseEdit; + QLabel* predefinedPromptsLabel; + QComboBox* predefinedPromptsCombo; - QLabel* toolLabel; - QComboBox* toolCombo; + QLabel* promptLabel; + QLineEdit* promptEdit; - QLabel* templateLabel; - QLineEdit* templateEdit; + QLabel* contextTypeLabel; + QLineEdit* contextTypeEdit; + QLabel* contextNameLabel; + QLineEdit* contextNameEdit; + QLabel* contextLabel; + QLineEdit* contextEdit; + + QLabel* postmortemLabel; QPushButton* runButton; QPushButton* closeButton; @@ -65,31 +71,25 @@ class WingmanDialog : public QDialog WingmanDialog& operator =(const WingmanDialog&&) = delete; ~WingmanDialog(); - void initForMode(WingmanDialogModes mode); - - void show(); - - QString getTemplateTextForToolName(std::string selectedTool) const; - - QPushButton* getRunButton() const { return runButton; } - QString getSelectedTool() const { - return this->toolCombo->itemText( - this->toolCombo->currentIndex() - ); + void clear() { + this->promptEdit->clear(); + this->contextNameEdit->clear(); + this->contextEdit->clear(); } - QString getTemplateText() const { - return this->templateEdit->text(); + void initForMode(WingmanDialogModes mode); + void setPromptText(QString phrase) { + this->promptEdit->setText(phrase); } - QString getPhraseText() const { return phraseEdit->text(); } - void setPhraseText(QString phrase) { - this->phraseEdit->setText(phrase); + void setContextNameText(QString contentName) { + this->contextNameEdit->setText(contentName); } - void setTemplateText(QString templateText) { - this->templateEdit->setText(templateText); + void setContextText(QString content) { + this->contextEdit->setText(content); } -private slots: - void handleChangeToolCombo(const QString& text); + void show(); + + QPushButton* getRunButton() const { return runButton; } }; } diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index c10598f0..39c3dfa3 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -101,6 +101,9 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) handleMindPreferences(); // wire signals + QObject::connect( + wingmanDialog->getRunButton(), SIGNAL(clicked()), + this, SLOT(handleActionWingman())); QObject::connect( runToolDialog->getRunButton(), SIGNAL(clicked()), this, SLOT(handleRunTool())); @@ -2153,6 +2156,7 @@ void MainWindowPresenter::doActionBardToolbar() handleLeftToolbarAction(TOOL_GOOGLE_BARD); } +// TODO remove when code reused by Wingman and @ CLI void MainWindowPresenter::handleLeftToolbarAction(string selectedTool) { // get PHRASE from the active context: @@ -2220,13 +2224,87 @@ void MainWindowPresenter::handleLeftToolbarAction(string selectedTool) void MainWindowPresenter::doActionWingman() { MF_DEBUG("SIGNAL handled: WINGMAN dialog..."); + // get PHRASE from the active context: + // - N editor: get word under cursor OR selected text + // - N tree: get N name + // - O tree: get O name + // - ... + QString phrase; + if(orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_NOTE)) { + phrase = orloj->getNoteEdit()->getView()->getNoteEditor()->getToolPhrase(); + } else if( + orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE) + || orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE_HEADER) + ) { + Outline* o = orloj->getOutlineView()->getCurrentOutline(); + if(o) { + phrase = QString::fromStdString(o->getName()); + } + } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_NOTE)) { + Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote(); + if(note) { + phrase = QString::fromStdString(note->getName()); + } + } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_OUTLINE_HEADER)) { + phrase = orloj->getOutlineHeaderEdit()->getView()->getHeaderEditor()->getToolPhrase(); + } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_LIST_OUTLINES)) { + int row = orloj->getOutlinesTable()->getCurrentRow(); + if(row != OutlinesTablePresenter::NO_ROW) { + QStandardItem* item + = orloj->getOutlinesTable()->getModel()->item(row); + if(item) { + Outline* outline = item->data(Qt::UserRole + 1).value(); + phrase = QString::fromStdString(outline->getName()); + } + } + } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) { + int row = orloj->getOutlinesMap()->getCurrentRow(); + if(row != OutlinesTablePresenter::NO_ROW) { + QStandardItem* item + = orloj->getOutlinesMap()->getModel()->item(row); + if(item) { + Note* note = item->data(Qt::UserRole + 1).value(); + phrase = QString::fromStdString(note->getName()); + } + } + } + + if(phrase.length() == 0) { + QMessageBox msgBox{ + QMessageBox::Critical, + QObject::tr("Empty Phrase"), + QObject::tr("Phrase to search/explain/process is empty.") + }; + msgBox.exec(); + return; + } + + // TODO set type determined ^ this->wingmanDialog->initForMode(WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE); + // TODO set context name e.g. N name + // TODO set context (actual text to be used in prompt) e.g. N description + + + // TODO rename content to context + this->wingmanDialog->setContextNameText(phrase); this->wingmanDialog->show(); } -void MainWindowPresenter::handlActionWingman() +void MainWindowPresenter::handleActionWingman() { + MF_DEBUG("SIGNAL handled: WINGMAN dialog..." << endl); + + string wingmanAnswer{}; + + // TODO get and resolve prompt + + // TODO this->wingmanDialog->getPrompt(); + mind->wingmanSummarize( + "FOO text", + wingmanAnswer + ); + TODO continue here } void MainWindowPresenter::doActionOutlineOrNoteNew() diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index 58279199..c67f192b 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -376,7 +376,7 @@ public slots: // tools toolbar void handleLeftToolbarAction(std::string selectedTool); void doActionWingman(); - void handlActionWingman(); + void handleActionWingman(); void doActionArxivToolbar(); void doActionWikipediaToolbar(); void doActionStackOverflowToolbar(); diff --git a/lib/lib.pro b/lib/lib.pro index 917942fe..a44412d0 100644 --- a/lib/lib.pro +++ b/lib/lib.pro @@ -113,8 +113,9 @@ SOURCES += \ src/config/repository_configuration.cpp \ src/gear/async_utils.cpp \ src/gear/math_utils.cpp \ - src/mind/ai/llm/mock_wingman.cpp \ src/mind/ai/llm/wingman.cpp \ + src/mind/ai/llm/mock_wingman.cpp \ + src/mind/ai/llm/openai_wingman.cpp \ src/mind/dikw/dikw_pyramid.cpp \ src/mind/dikw/filesystem_information.cpp \ src/mind/dikw/information.cpp \ @@ -230,8 +231,9 @@ HEADERS += \ ./src/gear/math_utils.h \ ./src/mind/dikw/dikw_pyramid.h \ ./src/mind/dikw/filesystem_information.h \ - src/mind/ai/llm/mock_wingman.h \ src/mind/ai/llm/wingman.h \ + src/mind/ai/llm/mock_wingman.h \ + src/mind/ai/llm/openai_wingman.h \ src/mind/dikw/information.h \ src/model/eisenhower_matrix.h \ src/model/kanban.h \ diff --git a/lib/src/mind/ai/llm/llamacpp_wingman.cpp b/lib/src/mind/ai/llm/llamacpp_wingman.cpp new file mode 100644 index 00000000..1afe0bb5 --- /dev/null +++ b/lib/src/mind/ai/llm/llamacpp_wingman.cpp @@ -0,0 +1,31 @@ +/* + llamacpp_wingman.cpp MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "llamacpp_wingman.h" + +namespace m8r { + +LlamaCppWingman::LlamaCppWingman() +{ +} + +LlamaCppWingman::~LlamaCppWingman() +{ +} + +} // m8r namespace diff --git a/lib/src/mind/ai/llm/llamacpp_wingman.h b/lib/src/mind/ai/llm/llamacpp_wingman.h new file mode 100644 index 00000000..492f7f00 --- /dev/null +++ b/lib/src/mind/ai/llm/llamacpp_wingman.h @@ -0,0 +1,49 @@ +/* + llamacpp_wingman.h MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef M8R_LLAMACPP_WINGMAN_H +#define M8R_LLAMACPP_WINGMAN_H + +namespace m8r { + +/** + * llama.cpp Wingman implementation. + * + * LLM models to use: + * + * - llama 7B + * - llama-2-7b.Q4_0.gguf + * - Zephir 7B + * - ?.gguf + * - Mistral 7B + * - ?.gguf + * + */ +class LlamaCppWingman +{ +public: + explicit LlamaCppWingman(); + LlamaCppWingman(const LlamaCppWingman&) = delete; + LlamaCppWingman(const LlamaCppWingman&&) = delete; + LlamaCppWingman& operator =(const LlamaCppWingman&) = delete; + LlamaCppWingman& operator =(const LlamaCppWingman&&) = delete; + ~LlamaCppWingman(); +}; + +} +#endif // M8R_LLAMACPP_WINGMAN_H diff --git a/lib/src/mind/ai/llm/mock_wingman.cpp b/lib/src/mind/ai/llm/mock_wingman.cpp index afe572f2..f977bf23 100644 --- a/lib/src/mind/ai/llm/mock_wingman.cpp +++ b/lib/src/mind/ai/llm/mock_wingman.cpp @@ -20,7 +20,10 @@ namespace m8r { +using namespace std; + MockWingman::MockWingman() + : Wingman(WingmanLlmProviders::WINGMAN_PROVIDER_MOCK) { } @@ -28,4 +31,13 @@ MockWingman::~MockWingman() { } +void MockWingman::summarize(const string& text, string& summary) +{ + MF_DEBUG("MockWingman::summarize() text:" << text << endl); + + summary = "This is a MOCK summary of the text: '"+text+"'."; + + MF_DEBUG("MockWingman::summarize() summary:" << summary << endl); +} + } // m8r namespace diff --git a/lib/src/mind/ai/llm/mock_wingman.h b/lib/src/mind/ai/llm/mock_wingman.h index 6480d66f..3cdd3455 100644 --- a/lib/src/mind/ai/llm/mock_wingman.h +++ b/lib/src/mind/ai/llm/mock_wingman.h @@ -19,9 +19,14 @@ #ifndef M8R_MOCK_WINGMAN_H #define M8R_MOCK_WINGMAN_H +#include "wingman.h" + namespace m8r { -class MockWingman +/** + * Mock Wingman implementation. + */ +class MockWingman: Wingman { public: explicit MockWingman(); @@ -30,6 +35,8 @@ class MockWingman MockWingman& operator =(const MockWingman&) = delete; MockWingman& operator =(const MockWingman&&) = delete; ~MockWingman(); + + virtual void summarize(const std::string& text, std::string& summary) override; }; } diff --git a/lib/src/mind/ai/llm/openai_wingman.cpp b/lib/src/mind/ai/llm/openai_wingman.cpp new file mode 100644 index 00000000..496d8791 --- /dev/null +++ b/lib/src/mind/ai/llm/openai_wingman.cpp @@ -0,0 +1,79 @@ +/* + openai_wingman.cpp MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "openai_wingman.h" + +namespace m8r { + +using namespace std; + +/* + * cURL callback for writing data to string. + */ + +static size_t WriteCallback( + void* contents, size_t size, size_t nmemb, void* userp +) { + ((std::string*)userp)->append((char*)contents, size * nmemb); + + return size * nmemb; +} + +/* + * OpenAi Wingman class implementation. + */ + +OpenAiWingman::OpenAiWingman() + : Wingman(WingmanLlmProviders::WINGMAN_PROVIDER_OPENAI) +{ +} + +OpenAiWingman::~OpenAiWingman() +{ +} + +void OpenAiWingman::curlGet(string& url, string& readBuffer) +{ + CURL* curl; + CURLcode res; + + curl = curl_easy_init(); + if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); + + // https://curl.se/libcurl/c/curl_easy_perform.html + res = curl_easy_perform(curl); + + curl_easy_cleanup(curl); + MF_DEBUG("Wingman::curlGet() result:" << res << endl); + MF_DEBUG("Wingman::curlGet() response:" << readBuffer << endl); + } +} + +void OpenAiWingman::summarize(const string& text, string& summary) +{ + MF_DEBUG("OpenAiWingman::summarize() text:" << text << endl); + + summary = "This is a OPENAI summary of the text: '"+text+"'."; + + MF_DEBUG("OpenAiWingman::summarize() summary:" << summary << endl); +} + +} // m8r namespace diff --git a/lib/src/mind/ai/llm/openai_wingman.h b/lib/src/mind/ai/llm/openai_wingman.h new file mode 100644 index 00000000..6dd58aa9 --- /dev/null +++ b/lib/src/mind/ai/llm/openai_wingman.h @@ -0,0 +1,50 @@ +/* + openai_wingman.h MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef M8R_OPENAI_WINGMAN_H +#define M8R_OPENAI_WINGMAN_H + +#include + +#include "curl/curl.h" + +#include "wingman.h" + +namespace m8r { + +/** + * OpenAI Wingman implementation. + */ +class OpenAiWingman: Wingman +{ +private: + void curlGet(std::string& url, std::string& readBuffer); + +public: + explicit OpenAiWingman(); + OpenAiWingman(const OpenAiWingman&) = delete; + OpenAiWingman(const OpenAiWingman&&) = delete; + OpenAiWingman& operator =(const OpenAiWingman&) = delete; + OpenAiWingman& operator =(const OpenAiWingman&&) = delete; + ~OpenAiWingman(); + + virtual void summarize(const std::string& text, std::string& summary) override; +}; + +} +#endif // M8R_OPENAI_WINGMAN_H diff --git a/lib/src/mind/ai/llm/wingman.cpp b/lib/src/mind/ai/llm/wingman.cpp index e5b78ab8..5bdc8154 100644 --- a/lib/src/mind/ai/llm/wingman.cpp +++ b/lib/src/mind/ai/llm/wingman.cpp @@ -20,8 +20,15 @@ namespace m8r { -Wingman::Wingman() +using namespace std; + +/* + * Wingman class implementation. + */ + +Wingman::Wingman(WingmanLlmProviders llmProvider) { + this->llmProvider = llmProvider; } Wingman::~Wingman() diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h index 94e61b9c..8e5a0ab6 100644 --- a/lib/src/mind/ai/llm/wingman.h +++ b/lib/src/mind/ai/llm/wingman.h @@ -21,96 +21,32 @@ #include +#include "../../../debug.h" + namespace m8r { +enum WingmanLlmProviders { + WINGMAN_PROVIDER_MOCK, + WINGMAN_PROVIDER_OPENAI, +}; + /** * Wingman is a class that provides a set of LLM-based use cases. -*/ + */ class Wingman { +private: + WingmanLlmProviders llmProvider; + public: - explicit Wingman(); + explicit Wingman(WingmanLlmProviders llmProvider); Wingman(const Wingman&) = delete; Wingman(const Wingman&&) = delete; Wingman& operator =(const Wingman&) = delete; Wingman& operator =(const Wingman&&) = delete; - ~Wingman(); - - // Set LLM provider: chatGPT, h2oGPT(e), HF, ... - arg w/ interface > implementation - void setLlmProvider(); - - // use cases - void ask(std::string question); - void ask(std::string question, std::string context); - void ask(std::string question, std::string context, std::string style); - void ask(std::string question, std::string context, std::string style, std::string domain); - // ... - - void explain(std::string term); - - void fix_grammar(std::string grammar); - void fix_spelling(std::string spelling); - void fix_style(std::string style); - - void translate(std::string text); - - void summarize(std::string text); - - void beautify(std::string text); - void beautify(std::string text, std::string style); - void beautify(std::string text, std::string style, std::string domain); - void beautify(std::string text, std::string style, std::string domain, std::string topic); - // ... + virtual ~Wingman(); - void simplify(std::string text); - void simplify(std::string text, std::string style); - void simplify(std::string text, std::string style, std::string domain); - // ... - - void generate(std::string text); - void generate(std::string text, std::string context); - void generate(std::string text, std::string context, std::string style); - void generate(std::string text, std::string context, std::string style, std::string domain); - void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic); - void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author); - void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author, std::string emotion); - void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author, std::string emotion, std::string intent); - void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author, std::string emotion, std::string intent, std::string audience); - void generate(std::string text, std::string context, std::string style, std::string domain, std::string topic, std::string author, std::string emotion, std::string intent, std::string audience, std::string purpose); - - // other use cases - void fix_source(std::string source); - void fix_bug(std::string bug); - void create_plan(std::string plan); -}; - - -/** - * llama.cpp wingman implementation. - * - * LLM models to use: - * - * - llama 7B - * - llama-2-7b.Q4_0.gguf - * - Zephir 7B - * - ?.gguf - * - Mistral 7B - * - ?.gguf - * - * Plan: - * - * TODO: first implement unit tests for the wingman UCs as it is in the lib/ - * TODO: then integrate wingman to UI (if GPT not available in RUNTIME, then hide/disable menu items) - * - */ -class WingmanLlamaCpp: Wingman -{ -public: -}; - -class WingmanOpenAiChatGpt: Wingman -{ -public: + virtual void summarize(const std::string& text, std::string& summary) = 0; }; } diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp index 5c02ea11..1b596a63 100644 --- a/lib/src/mind/mind.cpp +++ b/lib/src/mind/mind.cpp @@ -51,7 +51,8 @@ Mind::Mind(Configuration &configuration) tagsScopeAspect{ontology}, scopeAspect{timeScopeAspect, tagsScopeAspect} { - ai = new Ai{memory,*this}; + ai = new Ai{memory, *this}; + wingman = (Wingman*)new MockWingman{}; deleteWatermark = 0; activeProcesses = 0; associationsSemaphore = 0; @@ -73,6 +74,7 @@ Mind::Mind(Configuration &configuration) Mind::~Mind() { delete ai; + delete wingman; delete knowledgeGraph; delete mdConfigRepresentation; delete autoInterceptor; @@ -1454,4 +1456,10 @@ Outline* Mind::findOutlineByKey(const string& key) const return nullptr; } +void Mind::wingmanSummarize(const string& text, string& summary) +{ + MF_DEBUG("MIND: Wingman summarizing: '" << text << "'" << endl); + wingman->summarize(text, summary); +} + } /* namespace */ diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h index 72479c83..1ee217ed 100644 --- a/lib/src/mind/mind.h +++ b/lib/src/mind/mind.h @@ -28,6 +28,8 @@ #include "memory.h" #include "knowledge_graph.h" #include "ai/ai.h" +#include "ai/llm/wingman.h" +#include "ai/llm/mock_wingman.h" #include "associated_notes.h" #include "ontology/thing_class_rel_triple.h" #include "aspect/mind_scope_aspect.h" @@ -195,6 +197,11 @@ class Mind : public OntologyProvider */ Ai* ai; + /** + * Wingman + */ + Wingman* wingman; + /** * @brief Knowledge graph mind representation. */ @@ -679,6 +686,11 @@ class Mind : public OntologyProvider */ void noteOnRename(const std::string& oldName, const std::string& newName); + /* + * WINGMAN + */ + void wingmanSummarize(const std::string& text, std::string& summary); + /* * DIAGNOSTICS */ From 247d099128c795c955a4954322a403e3aef8fc4a Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Mon, 8 Jan 2024 20:45:43 +0100 Subject: [PATCH 073/131] Fixing unbound dialog label @ Wingman dialog. --- app/src/qt/dialogs/wingman_dialog.cpp | 6 +++++- app/src/qt/main_window_presenter.cpp | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/qt/dialogs/wingman_dialog.cpp b/app/src/qt/dialogs/wingman_dialog.cpp index 54bd3c0c..8fb2df1a 100644 --- a/app/src/qt/dialogs/wingman_dialog.cpp +++ b/app/src/qt/dialogs/wingman_dialog.cpp @@ -72,7 +72,10 @@ WingmanDialog::WingmanDialog(QWidget* parent) setWindowTitle(tr("Wingman")); preludeLabel = new QLabel{ - tr("Ask Wingman a predefined prompt or type your own phrase."), + tr( + "Wingman can run a predefined or custom prompt." + "
" + ), parent }; @@ -145,6 +148,7 @@ WingmanDialog::WingmanDialog(QWidget* parent) buttonLayout->addWidget(runButton); buttonLayout->addStretch(); + mainLayout->addWidget(preludeLabel); mainLayout->addWidget(promptsGroup); mainLayout->addWidget(contentGroup); mainLayout->addLayout(buttonLayout); diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 39c3dfa3..7ac6e9f7 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -2304,7 +2304,7 @@ void MainWindowPresenter::handleActionWingman() wingmanAnswer ); - TODO continue here + // TODO TODO TODO continue here } void MainWindowPresenter::doActionOutlineOrNoteNew() From e9e0dc7030a590b57fe610b80d3c9e4e8edaffbd Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Mon, 8 Jan 2024 20:58:47 +0100 Subject: [PATCH 074/131] Manually merging master to the development branch. --- .github/workflows/build_ubuntu.yml | 2 +- README.md | 12 +- build/Makefile | 60 ++++++- build/debian/debian-ppa-aptly-build.sh | 229 +++++++++++++++++++++++++ build/debian/index-all-ppas.html | 24 +++ build/debian/index-ppa.html | 34 ++++ 6 files changed, 352 insertions(+), 9 deletions(-) create mode 100755 build/debian/debian-ppa-aptly-build.sh create mode 100644 build/debian/index-all-ppas.html create mode 100644 build/debian/index-ppa.html diff --git a/.github/workflows/build_ubuntu.yml b/.github/workflows/build_ubuntu.yml index 2626f49e..6bc16bfc 100644 --- a/.github/workflows/build_ubuntu.yml +++ b/.github/workflows/build_ubuntu.yml @@ -17,7 +17,7 @@ jobs: run: cd deps/cmark-gfm && mkdir -v build && cd build && cmake -DCMARK_TESTS=OFF -DCMARK_SHARED=OFF .. && cmake --build . - name: Build test dependency - Google Test Framework - run: sudo apt-get install -y libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && sudo mv -v libg* /usr/lib + run: sudo apt-get install -y libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && sudo mv -v lib/libg* /usr/lib - name: Build lib and run unit tests using Google Test Framework run: export M8R_GIT_PATH=`pwd` && cd build/make && M8R_CPU_CORES=4 ./test-lib-units.sh diff --git a/README.md b/README.md index ec588869..cf1ef850 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,10 @@ follow on Twitter -Are you **drowning** in **information**, but **starving** for **knowledge**? Where do you keep your **private remarks** -like ideas, personal plans, gift tips, how-tos, dreams, business vision, finance strategy, auto -coaching notes? Loads of documents, sketches and remarks spread around the file system, cloud, -web and Post-it notes? Are you afraid of your knowledge **privacy**? Are you able to **find** them once you create them? +Are you **drowning** in **information**, but **starving** for **knowledge**? Where do you keep your **private remarks** +like ideas, personal plans, gift tips, how-tos, dreams, business vision, finance strategy, auto +coaching notes? Loads of documents, sketches and remarks spread around the file system, cloud, +web and Post-it notes? Are you afraid of your knowledge **privacy**? Are you able to **find** them once you create them? Do you know how are they mutually **related** when you read or write them? No? https://www.mindforger.com @@ -21,7 +21,7 @@ https://www.mindforger.com ## Markdown Editor ![MindForger](http://www.mindforger.com/github/github-markdown-ide.png?) -MindForger is open, free, well performing Markdown editor which respects your privacy and enables security. +MindForger is open, free, well performing Markdown editor which respects your privacy and enables security. ## Thinking Notebook ![MindForger](http://www.mindforger.com/github/github-thinking-notebook.png) @@ -34,7 +34,7 @@ Install: * [macOS](https://github.com/dvorka/mindforger/wiki/Installation#macos) * [Windows](https://github.com/dvorka/mindforger/wiki/Installation#windows) * [Ubuntu](https://github.com/dvorka/mindforger/wiki/Installation#ubuntu) -* [Debian](https://github.com/dvorka/mindforger/wiki/Installation#windows) +* [Debian](https://github.com/dvorka/mindforger/wiki/Installation#debian) * [Fedora](https://github.com/dvorka/mindforger/wiki/Installation#fedora) * [FreeBSD](https://github.com/dvorka/mindforger/wiki/Installation#freebsd) * [Arch Linux](https://github.com/dvorka/mindforger/wiki/Installation#arch-linux) diff --git a/build/Makefile b/build/Makefile index a0a18298..82fb4b2a 100644 --- a/build/Makefile +++ b/build/Makefile @@ -169,6 +169,12 @@ run-dev: build-dev ## run MindForger development build # install # + +.PHONY: devenv-debian +devenv-debian: + sudo apt-get install build-essential zlib1g-dev libcurl4-gnutls-dev libhunspell-dev libqt5webkit5-dev qttools5-dev-tools ccache cmake debhelper + + install-dev-local: ../deps/cmark-gfm/build ../Makefile ../lib/tests/Makefile clean build-rc ## install MindForger RC build to ~/bin as 'mind' executable cp -vf ../app/mindforger ~/bin mv -vf ~/bin/mindforger ~/bin/mind @@ -241,9 +247,59 @@ dist-dmg: ## build macOS Disk iMaGe .dmg package cd macos && ./mindforger-build.sh && ./dmg-package-build.sh +# +# Debian +# +# MindForger PPA: https://www.mindforger.com/debian is managed by aptly +# +# - information about MindForger's Debian PPAs can be found in +# https://www.mindforger.com/debian/index.html +# +# - aptly CANNOT be used to build one PPA for all Debian releases +# therefore every release has it's own PPA +# +# - the structure looks like this (from deprecated debian/ to new debian-ppa/): +# +# https://www.mindforger.com/debian-ppa/ +# stretch/ +# dists/ ... export from ~/.aptly/public +# pool/ +# index.html ... created by me w/ how to set it up +# ... +# trixie/ +# dists/ ... export from ~/.aptly/public +# pool/ +# index.html ... created by me w/ how to set it up +# +# - source Debian packages for every version (which are used by aptly) +# are stored in +# +# ~/p/mindforger/debian/aptly/ +# hstr/ +# 9-stretch/ +# ... +# 13-trixie/ +# mindforger/ +# 9-stretch/ +# mindforger-*.*.*.deb +# ... +# 13-trixie/ +# mindforger-*.*.*.deb +# +# - Makefile targets below are used to manage Debian PPAs and generate them +# + +# future repos : trixie-main +# CURRENT repos : bookworm-main, bullseye-main, buster-main, stretch-main +# obsolete repos: jessie-main + .PHONY: dist-debian-ppa -dist-debian-ppa: ## add .deb to aptly PPA - cd debian && ./debian-aptly-add-deb.sh +dist-debian-aptly-create-ppa: ## create Debian PPA for current Debian release: DISTRO=bullseye + cd ./build/debian && ./debian-ppa-aptly-build.sh + +# +# ^ Debian +# .PHONY: dist-ubuntu-deb diff --git a/build/debian/debian-ppa-aptly-build.sh b/build/debian/debian-ppa-aptly-build.sh new file mode 100755 index 00000000..b07ec64e --- /dev/null +++ b/build/debian/debian-ppa-aptly-build.sh @@ -0,0 +1,229 @@ +#!/bin/bash +# +# MindForger knowledge management tool +# +# Copyright (C) 2016-2023 Martin Dvorak +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + + +# +# This script builds MindForger/HSTR Debian PPA for a particular Debian release. +# - it adds all .deb pacakges in given directory to aptly repository. +# +# Usage: +# +# MF_DEBIAN_DISTRO_DIR=... MF_DEBIAN_RELEASE=... ./debian-aptly-add-deb.sh +# +# Example: +# +# MF_DEBIAN_DEB_DIR=~/p/mindforger/debian/aptly/mindforger/12-bookworm \ +# MF_DEBIAN_RELEASE=bookworm \ +# ./debian-release-aptly-build.sh +# +# aptly abstractions hierarchy: +# +# - repository +# - packages +# ^ snapshots +# ^ publish +# +# See 'MindForger Release Guide#Debian and my PPA' notebook for detailed steps description. + +export MF_IN_DEB_PACKAGES_DIR="/home/dvorka/p/mindforger/debian/aptly" +# ^ must have the following structure: +#. +#├── hstr +#│ └── 09-stretch +#│ ├── hstr_1.27.0-1_amd64.deb +#│ ├── hstr_2.0.0-1_amd64.deb +#│ └── hstr_2.4.0-1_amd64.deb +#└── mindforger +# ├── 09-stretch +# │ ├── mindforger_1.42.0-1_amd64.deb +# │ ├── ... +# │ └── mindforger_1.53.0-1_amd64.deb +# ├── ... +# └── 13-trixie +# └── mindforger_1.54.0-1_amd64.deb +# +export MF_OUT_PPA_ALL_DEBIAN_RELEASES_DIR="/home/dvorka/p/mindforger/debian/debian-ppa.mindforger.com" +# ^ PPAs for all releases side-by-side + + + +# Add ONE .deb package to aptly repository: +# +# Parameters: +# $1 - MF version e.g. 1.55.0 +# $2 - Debian release e.g. stretch +# +function add_deb { + NEW_MF_VERSION=${1} + NEW_DEBIAN_RELEASE=${2} + + export NEW_MF_RELEASE_NAME="mindforger_${NEW_MF_VERSION}" + export NEW_DEB_NAME="${NEW_MF_RELEASE_NAME}-1_amd64.deb" + + export MY_APTLY_PATH="/home/dvorka/.aptly" + export MY_APTLY_UPLOAD_PATH="${MY_APTLY_PATH}/public" + export MY_APTLY_VERSION="$(aptly version)" + # PPA REPOSITORY name (aptly can manage multiple - this identifier) + export MY_APTLY_REPO_NAME="${NEW_DEBIAN_RELEASE}-main" + # PPA repository SNAPSHOT is entity which is published + #export MY_APTLY_SNAPSHOT_NAME="$(aptly snapshot list --raw)" + export MY_APTLY_SNAPSHOT_NAME="${NEW_DEBIAN_RELEASE}-snapshot" + # PUBLISH of repository snapshot is stored to ~/.aptly/public so that it can be uploaded + #export MY_APTLY_PUBLISH="$(aptly publish list)" + #export MY_APTLY_PUBLISH_NAME="$(aptly publish list --raw | while read A B; do echo ${B}; done)" + export MY_APTLY_PUBLISH_NAME="${NEW_DEBIAN_RELEASE}-publish" + + echo + echo "= Local aptly repository overview: ====================================" + # echo " ${MY_APTLY_VERSION}" + echo " aptly repository path: ${MY_APTLY_PATH}" + echo " aptly config path : ${MY_APTLY_PATH}.config" + echo "New snapshot:" + echo " Debian release : ${NEW_DEBIAN_RELEASE}" + echo " MF release : ${NEW_MF_VERSION}" + echo " .deb file : ${NEW_DEB_NAME}" + echo " publish name : ${MY_APTLY_PUBLISH_NAME}" + echo " snapshot name : ${MY_APTLY_SNAPSHOT_NAME}" + echo " repository name : ${MY_APTLY_REPO_NAME}" + echo "# BEFORE repos ========================================================" + aptly repo list + echo "# BEFORE repo =========================================================" + aptly repo create "${MY_APTLY_REPO_NAME}" + aptly repo show -with-packages "${MY_APTLY_REPO_NAME}" + echo "# BEFORE snapshots ====================================================" + aptly snapshot list + echo "# BEFORE snapshot =====================================================" + aptly snapshot show -with-packages "${MY_APTLY_SNAPSHOT_NAME}" + echo "# BEFORE publishes ====================================================" + aptly publish list + echo "# BEFORE publish ======================================================" + aptly publish show "${MY_APTLY_PUBLISH_NAME}" + echo "> RUN >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + echo + + # checks + if [[ ! -f "${NEW_DEB_NAME}" ]] + then + echo "Error: File with package to be released not found: ${NEW_DEB_NAME}" + exit 1 + fi + + #echo "STEP: .aptly/ backup:" + #export timestamp=`date +%Y-%m-%d--%H-%M-%S` + #tar zcf ~/p/mindforger/debian/aptly/backup-aptly-${timestamp}.tgz ~/.aptly + #echo "DONE: backup" + + echo "STEP: drop publish > snapshot > repo" + aptly publish drop ${NEW_DEBIAN_RELEASE} + aptly snapshot drop ${MY_APTLY_SNAPSHOT_NAME} + + echo "STEP: add .deb to repo > snapshot > publish" + # aptly repo edit -distribution="${NEW_DEBIAN_RELEASE}" "${MY_APTLY_REPO_NAME}" + aptly repo add ${MY_APTLY_REPO_NAME} ${NEW_DEB_NAME} + aptly snapshot create ${MY_APTLY_SNAPSHOT_NAME} from repo ${MY_APTLY_REPO_NAME} + aptly publish snapshot -distribution=${NEW_DEBIAN_RELEASE} ${MY_APTLY_SNAPSHOT_NAME} + echo "DONE: add .deb" + + # upload + #echo -e "\n${MY_APTLY_UPLOAD_PATH} can be UPLOADED to www.mindforger.com/debian:" + #tree ${MY_APTLY_UPLOAD_PATH} + + # copy it to ALL Debian releases dir + export MY_PPA_DISTR_DIR="${MF_OUT_PPA_ALL_DEBIAN_RELEASES_DIR}/${NEW_DEBIAN_RELEASE}" + rm -rvf ${MY_PPA_DISTR_DIR} + mkdir -pv ${MY_PPA_DISTR_DIR} + cp -vrf ${MY_APTLY_UPLOAD_PATH}/* ${MY_PPA_DISTR_DIR} + # ensure index.html for the Debian release + echo "STEP: create index.html for the Debian release" + cat ./index-ppa.html | sed -e "s/DISTRO/${NEW_DEBIAN_RELEASE}/g" > "${MY_PPA_DISTR_DIR}/index.html" + + tree ${MF_OUT_PPA_ALL_DEBIAN_RELEASES_DIR} +} + +function add_debian_release { + export MF_DEBIAN_RELEASE_DIR=${1} + export MF_DEBIAN_RELEASE=${2} + + find ${MF_DEBIAN_RELEASE_DIR} -name "*.deb" | while read P + do + export MF_DEB_FILE_NAME=$(basename ${P}) + + echo ${MF_DEB_FILE_NAME} | tr "_" " " | while read A B C + do + echo $B | tr "-" " " | while read X Y + do + echo $X + done + done | while read MF_RELEASE_VERSION + do + echo "Debinan release: ${MF_DEBIAN_RELEASE}" + echo "Input file : ${P}" + echo ".deb file name : ${MF_DEB_FILE_NAME}" + echo "MF version : ${MF_RELEASE_VERSION}" + + # prepare .deb file to the current directory + rm -f ${MF_DEB_FILE_NAME} + cp -f ${P} . + + # add .deb to repo + add_deb ${MF_RELEASE_VERSION} ${MF_DEBIAN_RELEASE} + + # cleanup + rm -f ${MF_DEB_FILE_NAME} + done + done +} + +# +# MAIN +# + +# purge debian-ppa.mindforger.com +rm -rvf "${MF_OUT_PPA_ALL_DEBIAN_RELEASES_DIR}" + +# FOR every Debian release in the input directory +find "${MF_IN_DEB_PACKAGES_DIR}/mindforger" -maxdepth 1 -mindepth 1 -type d | while read MF_DEBIAN_RELEASE_DIR +do + export MF_DEBIAN_RELEASE=$(basename ${MF_DEBIAN_RELEASE_DIR} | tr "-" " " | while read A B; do echo ${B}; done) + echo "Debinan release: ${MF_DEBIAN_RELEASE}" + echo "Input dir : ${MF_DEBIAN_RELEASE_DIR}" + + export MY_APTLY_REPO_NAME="${MF_DEBIAN_RELEASE}-main" + export MY_APTLY_SNAPSHOT_NAME="${MF_DEBIAN_RELEASE}-snapshot" + + echo "STEP: DROP it all: snapshots, publishes, repos" + aptly publish drop ${MF_DEBIAN_RELEASE} + aptly snapshot drop ${MY_APTLY_SNAPSHOT_NAME} + aptly repo drop ${MY_APTLY_REPO_NAME} + aptly repo drop "bookworm-main" + aptly repo drop "jessie-main" + + add_debian_release ${MF_DEBIAN_RELEASE_DIR} ${MF_DEBIAN_RELEASE} + + # purge aptly and start over + aptly publish drop ${MF_DEBIAN_RELEASE} + aptly snapshot drop ${MY_APTLY_SNAPSHOT_NAME} + aptly repo drop ${MY_APTLY_REPO_NAME} +done + +# HTML w/ links to for all Debian releases +cp -vf ./index-all-ppas.html "${MF_OUT_PPA_ALL_DEBIAN_RELEASES_DIR}/index.html" + +# eof diff --git a/build/debian/index-all-ppas.html b/build/debian/index-all-ppas.html new file mode 100644 index 00000000..b7131e42 --- /dev/null +++ b/build/debian/index-all-ppas.html @@ -0,0 +1,24 @@ + + + + MindForger Debian PPA repositories + + +

MindForger provides Debian PPA repositories

+ +

MindForger provides Debian PPA repositories for the following + Debian releases: + +

+ + There is not one repository for all Debian releases, + but per-Debian release repository. +

+ + + diff --git a/build/debian/index-ppa.html b/build/debian/index-ppa.html new file mode 100644 index 00000000..153796eb --- /dev/null +++ b/build/debian/index-ppa.html @@ -0,0 +1,34 @@ + + + + MindForger Debian "DISTRO" PPA repository + + +

MindForger Debian "DISTRO" PPA repository

+ +

This is Personal Package Archive (PPA) + for MindForger. +

+

To install programs from this PPA add new repository + to /etc/apt/sources.list as follows:

+

+ +
+      echo "deb http://www.mindforger.com/debian-ppa/DISTRO DISTRO main" | sudo tee /etc/apt/sources.list.d/mindforger.list      
+    
+ +

... and import key that is used to sign the release:

+ +
+      $ wget -qO - http://www.mindforger.com/gpgpubkey.txt | sudo apt-key add -
+    
+ +

After that you can install MindForger as any other software package:

+ +
+      $ sudo apt update
+      $ sudo apt install mindforger
+    
+ + + From 1374a2691844d61562695a6e61c4080b02cc7f8d Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Mon, 8 Jan 2024 22:11:47 +0100 Subject: [PATCH 075/131] Removing dashboard view which resolves #1521 --- Changelog | 7 +- app/app.pro | 4 - .../qt/translations/mindforger_cs.ts | 1342 +++++++++-------- .../qt/translations/mindforger_en.ts | 1342 +++++++++-------- .../qt/translations/mindforger_nerd_cs.ts | 1336 ++++++++-------- .../qt/translations/mindforger_nerd_en.ts | 1336 ++++++++-------- .../qt/translations/mindforger_zh_cn.ts | 1342 +++++++++-------- app/src/qt/dashboard/dashboardlet_welcome.cpp | 6 - app/src/qt/dashboard_presenter.cpp | 143 -- app/src/qt/dashboard_presenter.h | 81 - app/src/qt/dashboard_view.cpp | 105 -- app/src/qt/dashboard_view.h | 79 - app/src/qt/dialogs/configuration_dialog.cpp | 3 - app/src/qt/main_menu_presenter.cpp | 9 - app/src/qt/main_menu_presenter.h | 1 - app/src/qt/main_menu_view.cpp | 9 - app/src/qt/main_menu_view.h | 1 - app/src/qt/main_toolbar_view.cpp | 11 - app/src/qt/main_toolbar_view.h | 7 - app/src/qt/main_window_presenter.cpp | 22 +- app/src/qt/main_window_presenter.h | 3 +- app/src/qt/orloj_presenter.cpp | 109 +- app/src/qt/orloj_presenter.h | 12 +- app/src/qt/orloj_view.cpp | 9 - app/src/qt/orloj_view.h | 8 - lib/src/config/configuration.h | 1 - 26 files changed, 3573 insertions(+), 3755 deletions(-) delete mode 100644 app/src/qt/dashboard/dashboardlet_welcome.cpp delete mode 100644 app/src/qt/dashboard_presenter.cpp delete mode 100644 app/src/qt/dashboard_presenter.h delete mode 100644 app/src/qt/dashboard_view.cpp delete mode 100644 app/src/qt/dashboard_view.h diff --git a/Changelog b/Changelog index 7fbf5849..82e8085c 100644 --- a/Changelog +++ b/Changelog @@ -1,12 +1,12 @@ -2024-01-?? Martin Dvorak +2024-02-?? Martin Dvorak * Released v2.0.0 - major release which removes features which are not used in practices and brings several new features. * Feature: Notebook Tree view brings ability to organize Notebooks to and outline. * Feature: Libraries bring ability to index external PDF files and generate - Notebooks which represent them in MindForger (update and removal of the - library supported as well. + Notebooks which represent them in MindForger. Synchronization and removal + of the library supported as well. * Feature: New left side toolbar which runs various tools (like Wikipedia, arXiv, StackOverflow, ...) on phrase which is the current context (Notebook or Note name, selected text or text under the cursor, ...) @@ -23,6 +23,7 @@ * Fix: Missing OOTB Eisenhower Matrix is automatically added back to the list of Organizers. * Fix: Conflicting menu keyboard shortcuts resolved. + * Deprecation: dashboard view removed. 2023-01-15 Martin Dvorak diff --git a/app/app.pro b/app/app.pro index 9c54351b..f3df8237 100644 --- a/app/app.pro +++ b/app/app.pro @@ -326,8 +326,6 @@ HEADERS += \ src/qt/navigator_presenter.h \ src/qt/main_toolbar_view.h \ src/qt/dialogs/export_file_dialog.h \ - src/qt/dashboard_view.h \ - src/qt/dashboard_presenter.h \ src/qt/widgets/edit_buttons_panel.h \ src/qt/widgets/edit_name_panel.h \ src/qt/widgets/view_to_edit_buttons_panel.h \ @@ -454,8 +452,6 @@ SOURCES += \ src/qt/navigator_presenter.cpp \ src/qt/main_toolbar_view.cpp \ src/qt/dialogs/export_file_dialog.cpp \ - src/qt/dashboard_view.cpp \ - src/qt/dashboard_presenter.cpp \ src/qt/widgets/edit_buttons_panel.cpp \ src/qt/widgets/edit_name_panel.cpp \ src/qt/widgets/view_to_edit_buttons_panel.cpp \ diff --git a/app/resources/qt/translations/mindforger_cs.ts b/app/resources/qt/translations/mindforger_cs.ts index a861d97c..18de91a1 100644 --- a/app/resources/qt/translations/mindforger_cs.ts +++ b/app/resources/qt/translations/mindforger_cs.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -60,15 +60,17 @@ - - + + + Empty Phrase - - + + + Phrase to search/explain/process is empty. @@ -236,7 +238,7 @@ Choose new library source: - <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> @@ -321,32 +323,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -354,47 +356,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -402,37 +404,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -440,22 +442,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -463,12 +465,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -476,69 +478,61 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File - - m8r::DashboardPresenter - - - Do first - - - m8r::EditButtonsPanel @@ -941,22 +935,22 @@ Choose new library source: - Notebook + Note&book - Note + &Note - File + &File - Directory + &Directory @@ -1075,28 +1069,28 @@ Choose new library source: - + S&cope - + Don't show Notebooks and Notes older than... - - + + &Forget - + Limbo vs erase memory... - + Retain @@ -1105,1128 +1099,1143 @@ Choose new library source: &Preferences - + Adapt Mind by setting your preferences... - + E&xit - + Leave application - + &Full-text Search - + Note full-text search - + Recall Note&book by Name - + Find Notebook by name - + Recall &Note by Name - + Find Note by name - + Find Notebook by tags - + Find Note by tags - + Recall Library &Doc by Name - + Find Document by name - + Recall &Persons - + Find persons using Named-entity recognition (NER) - + Recall &Locations - + Find locations using Named-entity recognition (NER) - + Recall Organizations - + Find organizations using Named-entity recognition (NER) - + Recall Other Entities - + Find miscellaneous entities using Named-entity recognition (NER) - + &Recall - - Dashboard - - - - + Open Home Notebook... - + N&otebooks - + Show list of Notebooks... - + Note&books Tree - + Show tree of Notebooks... - + &Tags - + Open Tag cloud... - + Knowledge Graph &Navigator - + Open knowledge graph Navigator... - + &Memory Dwell - + Open memory dwell... - + Ter&minal - + Run simple command line from current MindForger workspace... - + &Recent Notes - + View recently modified Notes... - + &Stencils - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - - Ho&isting - - - - + D&istraction Free - + Toggle distraction free mode - + &Fullscreen - + Toggle fullscreen - + &View - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + N&avigate - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - - - - + + + + &Edit - + Create backup archive of the current workspace and store it in home directory - + Recall Note by T&ags - + Flashcard &Decks - + Show list of flashcard decks... - + Organiz&ers - + Open Eisenhower matrix and Kanban organizers... - + &Library Documents - + List Library documents... - + &Wingman - + Emo&jis - + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... - + Li&mbo - + + Activate wingman... + + + + + &CLI + + + + + Ho&ist + + + + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + &Promote - + Promote Notebook - + De&mote - + Demote Notebook - + Move to &First - + Move the Notebook to be the first child of its parent - + Move &Up - + Move the Notebook up - + Move Do&wn - + Move the Notebook down - + Move to &Last - + Move the Notebook to be the last child of its parent - + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - - &Swap Name/Description Focus - - - - + Swap focus of N title and description editors - + Find Knowledge Ctrl+/ - + Run an external tool to find, explain, process text under the cursor - + Complete Link Ctrl+L - - Sp&ell Check - - - - + Spell check Notebook or Note description - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + + in&tegrals + + + + + dot + + + + + ca&p + + + + + in + + + + &Strikethrough - + Format text as strikethrough - + About &Qt - + &Keyboard - + Format text as keyboard input - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + Format text block as source code - + Block &Quote - + Format text block as blockquote - + Timestam&p - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format - - - - + + + + &New - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Make &Home - + Import - - + + Make &Stencil - - + + Copy the current Notebook as to Stencil - + C&lone - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo - + E&xport - + &Forget Del - + Forget Note @@ -2236,12 +2245,12 @@ Choose new library source: - + Toggle tag indicating whether to use the current Notebook as home - + &Import @@ -2261,113 +2270,108 @@ Choose new library source: - + A&dapt - + &CSV - + Export all Notebooks/Markdown files as a single CSV file - + Recall Notebook by Ta&gs - - Open Dashboard... - - - - + &Home Notebook - + Activate command line interface... - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + E&xtract - + Create new Note from the text selected in the current Note... - - + + &Clone @@ -2408,277 +2412,267 @@ Choose new library source: - + Make a copy of the Note to this or other Notebook... - + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + Toggle word wrap mode - + + Swap Nam&e/Description Focus + + + + Complete word being written by finding link to Notebook or Note - + + &Spell Check + + + + &Math - + Format text as math (MathJax) - + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - - integrals - - - - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - - &dot - - - - + &overrightarrow - + &cup - - &cap - - - - + &empty set - - &in - - - - + &not in - + T&able of Contents - + Insert current date and time - + Format text block as math (MathJax) - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Ima&ge - + Insert table... - + &Documentation - + F1 - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - + About Qt... - + &About MindForger - + About MindForger... - + &Help @@ -2691,52 +2685,42 @@ Choose new library source: - + New Notebook - + Open directory with Markdowns or Workspace - + Open Markdown file - View Dashboard - - - - - View Eisenhower Matrix - - - - View Eisenhower Matrices - + View Notebooks - + View Knowledge Graph Navigator - + View Tags - + View Recent Notes @@ -2744,680 +2728,680 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn Markdown File - + Learn - + Export Notebook to HTML - - + + Export - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note - + Export Memory to CSV - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + Emojis - + About MindForger @@ -4039,74 +4023,74 @@ Choose new library source: m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4705,7 +4689,12 @@ notes. Feel free to deprecate such notebook(s) yourself. m8r::TerminalDialog - + + Terminal + + + + Terminal Command Error @@ -4748,6 +4737,99 @@ notes. Feel free to deprecate such notebook(s) yourself. + + m8r::WingmanDialog + + + Wingman + + + + + Wingman can run a predefined or custom prompt.<br> + + + + + Prompt + + + + + Predefined: + + + + + Your: + + + + + Type in your prompt like: 'Translate the following text to Spanish: #CONTENT. + + + + + Context + + + + + Type: + + + + + Name (#NAME): + + + + + Text (#TEXT): + + + + + Use #NAME or #TEXT to include it to your prompt. + + + + + &Ask Wingman + + + + + &Cancel + + + + + outline + + + + + <Notebook document> + + + + + note + + + + + <Note description> + + + + + <selected / current text> + + + main diff --git a/app/resources/qt/translations/mindforger_en.ts b/app/resources/qt/translations/mindforger_en.ts index 1957a6c0..8df1290a 100644 --- a/app/resources/qt/translations/mindforger_en.ts +++ b/app/resources/qt/translations/mindforger_en.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -60,15 +60,17 @@ - - + + + Empty Phrase - - + + + Phrase to search/explain/process is empty. @@ -236,7 +238,7 @@ Choose new library source: - <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> @@ -322,32 +324,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -355,47 +357,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -403,37 +405,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -441,22 +443,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -464,12 +466,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -477,69 +479,61 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File - - m8r::DashboardPresenter - - - Do first - - - m8r::EditButtonsPanel @@ -949,22 +943,22 @@ Choose new library source: - Notebook + Note&book - Note + &Note - File + &File - Directory + &Directory @@ -1095,28 +1089,28 @@ Choose new library source: - + S&cope - + Don't show Notebooks and Notes older than... - - + + &Forget &Deprecate - + Limbo vs erase memory... - + Retain Reta&in @@ -1125,47 +1119,47 @@ Choose new library source: &Preferences - + Adapt Mind by setting your preferences... - + E&xit - + Leave application - + &Full-text Search - + Note full-text search - + Recall Note&book by Name Find Note&book by Name - + Find Notebook by name - + Recall &Note by Name Find &Note by Name - + Find Note by name @@ -1174,7 +1168,7 @@ Choose new library source: Find Notebook by T&ags - + Find Notebook by tags @@ -1183,1113 +1177,1128 @@ Choose new library source: Find Note by &Tags - + Find Note by tags - + Recall Library &Doc by Name Find Library &Doc by Name - + Find Document by name - + Recall &Persons Find &Persons - + Find persons using Named-entity recognition (NER) - + Recall &Locations Find &Locations - + Find locations using Named-entity recognition (NER) - + Recall Organizations Find Organizations - + Find organizations using Named-entity recognition (NER) - + Recall Other Entities Find Other Entities - + Find miscellaneous entities using Named-entity recognition (NER) - + &Recall F&ind - - Dashboard - - - - + Open Home Notebook... - + N&otebooks - + Show list of Notebooks... - + Note&books Tree - + Show tree of Notebooks... - + &Tags - + Open Tag cloud... - + Knowledge Graph &Navigator - + Open knowledge graph Navigator... - + &Memory Dwell - + Open memory dwell... - + Ter&minal - + Run simple command line from current MindForger workspace... - + &Recent Notes - + View recently modified Notes... - + &Stencils - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - - Ho&isting - - - - + D&istraction Free - + Toggle distraction free mode - + &Fullscreen - + Toggle fullscreen - + &View - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + N&avigate - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - - - - + + + + &Edit - + Create backup archive of the current workspace and store it in home directory - + Recall Note by T&ags Find Note by T&ags - + Flashcard &Decks - + Show list of flashcard decks... - + Organiz&ers - + Open Eisenhower matrix and Kanban organizers... - + &Library Documents - + List Library documents... - + &Wingman - + Emo&jis - + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... - + Li&mbo - + + Activate wingman... + + + + + &CLI + + + + + Ho&ist + + + + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + &Promote - + Promote Notebook - + De&mote - + Demote Notebook - + Move to &First - + Move the Notebook to be the first child of its parent - + Move &Up - + Move the Notebook up - + Move Do&wn - + Move the Notebook down - + Move to &Last - + Move the Notebook to be the last child of its parent - + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - - &Swap Name/Description Focus - - - - + Swap focus of N title and description editors - + Find Knowledge Ctrl+/ - + Run an external tool to find, explain, process text under the cursor - + Complete Link Ctrl+L - - Sp&ell Check - - - - + Spell check Notebook or Note description - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + &Math - + Format text as math (MathJax) - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + + in&tegrals + + + + + dot + + + + + ca&p + + + + + in + + + + &Strikethrough - + Format text as strikethrough - + About &Qt - + &Keyboard - + Format text as keyboard input - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + T&able of Contents - + Insert current date and time - + Format text block as source code - + Format text block as math (MathJax) - + Block &Quote - + Format text block as blockquote - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format - - - - + + + + &New - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Make &Home - + Import - - + + Make &Stencil - - + + Copy the current Notebook as to Stencil - + C&lone - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo Delete Notebook and move it Limbo - + E&xport - + &Forget Del Delete Del - + Forget Note Delete Note @@ -2299,12 +2308,12 @@ Choose new library source: &Open - + Toggle tag indicating whether to use the current Notebook as home - + &Import @@ -2324,113 +2333,108 @@ Choose new library source: - + A&dapt &Preferences - + &CSV - + Export all Notebooks/Markdown files as a single CSV file - + Recall Notebook by Ta&gs Find Notebook by Ta&gs - - Open Dashboard... - - - - + &Home Notebook - + Activate command line interface... - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S Save Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + E&xtract - + Create new Note from the text selected in the current Note... - - + + &Clone @@ -2471,242 +2475,232 @@ Choose new library source: - + Make a copy of the Note to this or other Notebook... - + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Toggle word wrap mode - + + Swap Nam&e/Description Focus + + + + Complete word being written by finding link to Notebook or Note - + + &Spell Check + + + + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - - integrals - - - - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - - &dot - - - - + &overrightarrow - + &cup - - &cap - - - - + &empty set - - &in - - - - + &not in - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Timestam&p - + Ima&ge - + Insert table... - + &Documentation - + F1 - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - + About Qt... - + &About MindForger - + About MindForger... - + &Help @@ -2719,52 +2713,42 @@ Choose new library source: - + New Notebook - + Open directory with Markdowns or Workspace - + Open Markdown file - View Dashboard - - - - - View Eisenhower Matrix - - - - View Eisenhower Matrices - + View Notebooks - + View Knowledge Graph Navigator - + View Tags - + View Recent Notes @@ -2772,34 +2756,34 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again @@ -2808,648 +2792,648 @@ Choose new library source: Open Directory or MindForger Repository - + Learn Markdown File Open Markdown File - + Learn Open - + Export Notebook to HTML - - + + Export - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note - + Export Memory to CSV - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook Deprecate Notebook - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note Delete Note - + Please select a Note to forget. Please select a Note to delete. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + Emojis - + About MindForger @@ -4071,74 +4055,74 @@ Choose new library source: m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4737,7 +4721,12 @@ notes. Feel free to deprecate such notebook(s) yourself. m8r::TerminalDialog - + + Terminal + + + + Terminal Command Error @@ -4780,6 +4769,99 @@ notes. Feel free to deprecate such notebook(s) yourself. + + m8r::WingmanDialog + + + Wingman + + + + + Wingman can run a predefined or custom prompt.<br> + + + + + Prompt + + + + + Predefined: + + + + + Your: + + + + + Type in your prompt like: 'Translate the following text to Spanish: #CONTENT. + + + + + Context + + + + + Type: + + + + + Name (#NAME): + + + + + Text (#TEXT): + + + + + Use #NAME or #TEXT to include it to your prompt. + + + + + &Ask Wingman + + + + + &Cancel + + + + + outline + + + + + <Notebook document> + + + + + note + + + + + <Note description> + + + + + <selected / current text> + + + main diff --git a/app/resources/qt/translations/mindforger_nerd_cs.ts b/app/resources/qt/translations/mindforger_nerd_cs.ts index 0cbcb038..e04e1e30 100644 --- a/app/resources/qt/translations/mindforger_nerd_cs.ts +++ b/app/resources/qt/translations/mindforger_nerd_cs.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -60,15 +60,17 @@ - - + + + Empty Phrase - - + + + Phrase to search/explain/process is empty. @@ -236,7 +238,7 @@ Choose new library source: - <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> @@ -329,32 +331,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -362,47 +364,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -410,37 +412,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -448,22 +450,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -471,12 +473,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -484,69 +486,61 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File - - m8r::DashboardPresenter - - - Do first - - - m8r::EditButtonsPanel @@ -949,22 +943,22 @@ Choose new library source: - Notebook + Note&book - Note + &Note - File + &File - Directory + &Directory @@ -1047,10 +1041,10 @@ Choose new library source: - - - - + + + + &New &Nový @@ -1065,7 +1059,7 @@ Choose new library source: - + &Recall @@ -1079,28 +1073,28 @@ Choose new library source: Spi - - + + &Forget Zapomeň - + Limbo vs erase memory... - + Adapt Mind by setting your preferences... - + E&xit Konec - + Leave application @@ -1110,27 +1104,27 @@ Choose new library source: &Mysl - + &Full-text Search - + Note full-text search - + Recall &Note by Name - + Find Note by name - + Find Note by tags @@ -1139,574 +1133,589 @@ Choose new library source: Domů - + &Memory Dwell - + &Recent Notes - + &Stencils - + Don't show Notebooks and Notes older than... - + + Activate wingman... + + + + Create backup archive of the current workspace and store it in home directory - + Find Notebook by name - + Find Notebook by tags - + Recall Note by T&ags - + Flashcard &Decks - + Show list of flashcard decks... - + Organiz&ers - + Open Eisenhower matrix and Kanban organizers... - + N&otebooks - + &Library Documents - + List Library documents... - + + &CLI + + + + Li&mbo - + + Ho&ist + + + + Toggle distraction free mode - + &Fullscreen - + &View - + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - - Find Knowledge Ctrl+/ + + Swap Nam&e/Description Focus - - Run an external tool to find, explain, process text under the cursor + + Find Knowledge Ctrl+/ - - Complete Link Ctrl+L + + Run an external tool to find, explain, process text under the cursor - - Sp&ell Check + + Complete Link Ctrl+L - + Spell check Notebook or Note description - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - - - - + + + + &Edit - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + &Strikethrough - + Format text as strikethrough - + &Keyboard - + Format text as keyboard input - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + Format text block as source code - + Block &Quote - + Format text block as blockquote - + Timestam&p - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format &Formát - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Import - - + + Copy the current Notebook as to Stencil - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo - + &Forget Del - + Forget Note - + Make a copy of the Note to this or other Notebook... - + Make &Home @@ -1732,208 +1741,198 @@ Choose new library source: - + S&cope - + Retain - + Recall Note&book by Name - + Recall Library &Doc by Name - + Find Document by name - + Recall &Persons - + Find persons using Named-entity recognition (NER) - + Recall &Locations - + Find locations using Named-entity recognition (NER) - + Recall Organizations - + Find organizations using Named-entity recognition (NER) - + Recall Other Entities - + Find miscellaneous entities using Named-entity recognition (NER) - - Dashboard - - - - + Open Home Notebook... - + Show list of Notebooks... - + Note&books Tree - + Show tree of Notebooks... - + &Tags - + Open Tag cloud... - + Knowledge Graph &Navigator - + Open knowledge graph Navigator... - + Open memory dwell... - + View recently modified Notes... - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - - Ho&isting - - - - + D&istraction Free - + Toggle fullscreen - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + Toggle tag indicating whether to use the current Notebook as home - - + + Make &Stencil - + C&lone - + E&xport E&xport - + &Import @@ -1953,198 +1952,193 @@ Choose new library source: - + A&dapt - + &CSV - + Export all Notebooks/Markdown files as a single CSV file - + Recall Notebook by Ta&gs - - Open Dashboard... - - - - + &Home Notebook - + Activate command line interface... - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - + E&xtract - + Create new Note from the text selected in the current Note... - - + + &Clone @@ -2185,512 +2179,512 @@ Choose new library source: - + &Wingman - + Ter&minal - + Run simple command line from current MindForger workspace... - + Emo&jis - + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... - + N&avigate - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + &Promote - + Promote Notebook - + De&mote - + Demote Notebook - + Move to &First - + Move the Notebook to be the first child of its parent - + Move &Up - + Move the Notebook up - + Move Do&wn - + Move the Notebook down - + Move to &Last - + Move the Notebook to be the last child of its parent - + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + Toggle word wrap mode - - &Swap Name/Description Focus + + Swap focus of N title and description editors - Swap focus of N title and description editors + Complete word being written by finding link to Notebook or Note - - Complete word being written by finding link to Notebook or Note + + &Spell Check - + &Math - + Format text as math (MathJax) - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - - integrals - - - - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - - &dot - - - - + &overrightarrow - + &cup - - &cap + + &empty set - - &empty set + + &not in - &in + T&able of Contents - - &not in + + Insert current date and time - - T&able of Contents + + About &Qt - - Insert current date and time + + Format text block as math (MathJax) - - About &Qt + + in&tegrals - - Format text block as math (MathJax) + + dot - + + ca&p + + + + + in + + + + Ima&ge - + Insert table... - + &Documentation - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - + About Qt... - + &About MindForger - + About MindForger... O aplikaci MindForger - + &Help - + F1 @@ -2703,52 +2697,42 @@ Choose new library source: - + New Notebook - + Open directory with Markdowns or Workspace - + Open Markdown file - View Dashboard - - - - - View Eisenhower Matrix - - - - View Eisenhower Matrices - + View Notebooks - + View Knowledge Graph Navigator - + View Tags - + View Recent Notes @@ -2756,680 +2740,680 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn - + Full-text Search - - - + + + Note - - + + Note not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name - - + + New Note - + Failed to create new Note! - + Hyperlink %1 clicked... - + Export Memory to CSV - + Autolinked Notebooks and Notes - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Learn Markdown File - + Notebook Full-text Search - + Note Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Find Note by Name in Notebook - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + Edit Notebook - + Please open an Notebook to edit. - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Notebook can be forgotten only when viewed. - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - + Find Note by Tags in Notebook - + Export Notebook to HTML - - + + Export - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Thing not found - - + + Find Note by Tags - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Home tag toggled/removed - Notebook '%1' is no longer home - - + + Forget Notebook - + Do you really want to deprecate ' - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + Emojis - + About MindForger @@ -4051,74 +4035,74 @@ Choose new library source: m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4717,7 +4701,12 @@ notes. Feel free to deprecate such notebook(s) yourself. m8r::TerminalDialog - + + Terminal + + + + Terminal Command Error @@ -4760,6 +4749,99 @@ notes. Feel free to deprecate such notebook(s) yourself. + + m8r::WingmanDialog + + + Wingman + + + + + Wingman can run a predefined or custom prompt.<br> + + + + + Prompt + + + + + Predefined: + + + + + Your: + + + + + Type in your prompt like: 'Translate the following text to Spanish: #CONTENT. + + + + + Context + + + + + Type: + + + + + Name (#NAME): + + + + + Text (#TEXT): + + + + + Use #NAME or #TEXT to include it to your prompt. + + + + + &Ask Wingman + + + + + &Cancel + + + + + outline + + + + + <Notebook document> + + + + + note + + + + + <Note description> + + + + + <selected / current text> + + + main diff --git a/app/resources/qt/translations/mindforger_nerd_en.ts b/app/resources/qt/translations/mindforger_nerd_en.ts index 2e640f96..fbc1211e 100644 --- a/app/resources/qt/translations/mindforger_nerd_en.ts +++ b/app/resources/qt/translations/mindforger_nerd_en.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -60,15 +60,17 @@ - - + + + Empty Phrase - - + + + Phrase to search/explain/process is empty. @@ -236,7 +238,7 @@ Choose new library source: - <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> @@ -321,32 +323,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -354,47 +356,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -402,37 +404,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -440,22 +442,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -463,12 +465,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -476,69 +478,61 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File - - m8r::DashboardPresenter - - - Do first - - - m8r::EditButtonsPanel @@ -941,22 +935,22 @@ Choose new library source: - Notebook + Note&book - Note + &Note - File + &File - Directory + &Directory @@ -1039,10 +1033,10 @@ Choose new library source: - - - - + + + + &New @@ -1057,7 +1051,7 @@ Choose new library source: - + &Recall @@ -1067,28 +1061,28 @@ Choose new library source: - - + + &Forget - + Limbo vs erase memory... - + Adapt Mind by setting your preferences... - + E&xit - + Leave application @@ -1098,599 +1092,614 @@ Choose new library source: &Mind - + &Full-text Search - + Note full-text search - + Recall &Note by Name - + Find Note by name - + Find Note by tags - + &Memory Dwell - + &Recent Notes - + &Stencils - + Don't show Notebooks and Notes older than... - + + Activate wingman... + + + + Create backup archive of the current workspace and store it in home directory - + Find Notebook by name - + Find Notebook by tags - + Recall Note by T&ags - + Flashcard &Decks - + Show list of flashcard decks... - + Organiz&ers - + Open Eisenhower matrix and Kanban organizers... - + N&otebooks - + &Library Documents - + List Library documents... - + + &CLI + + + + Li&mbo - + + Ho&ist + + + + Toggle distraction free mode - + &Fullscreen - + &View - + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - - Find Knowledge Ctrl+/ + + Swap Nam&e/Description Focus - - Run an external tool to find, explain, process text under the cursor + + Find Knowledge Ctrl+/ - - Complete Link Ctrl+L + + Run an external tool to find, explain, process text under the cursor - - Sp&ell Check + + Complete Link Ctrl+L - + Spell check Notebook or Note description - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - - - - + + + + &Edit - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + &Strikethrough - + Format text as strikethrough - + &Keyboard - + Format text as keyboard input - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + Format text block as source code - + Block &Quote - + Format text block as blockquote - + Timestam&p - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Import - - + + Copy the current Notebook as to Stencil - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo - + &Forget Del - + Forget Note - + Make a copy of the Note to this or other Notebook... - + Make &Home @@ -1716,208 +1725,198 @@ Choose new library source: - + S&cope - + Retain - + Recall Note&book by Name - + Recall Library &Doc by Name - + Find Document by name - + Recall &Persons - + Find persons using Named-entity recognition (NER) - + Recall &Locations - + Find locations using Named-entity recognition (NER) - + Recall Organizations - + Find organizations using Named-entity recognition (NER) - + Recall Other Entities - + Find miscellaneous entities using Named-entity recognition (NER) - - Dashboard - - - - + Open Home Notebook... - + Show list of Notebooks... - + Note&books Tree - + Show tree of Notebooks... - + &Tags - + Open Tag cloud... - + Knowledge Graph &Navigator - + Open knowledge graph Navigator... - + Open memory dwell... - + View recently modified Notes... - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - - Ho&isting - - - - + D&istraction Free - + Toggle fullscreen - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + Toggle tag indicating whether to use the current Notebook as home - - + + Make &Stencil - + C&lone - + E&xport - + &Import @@ -1937,198 +1936,193 @@ Choose new library source: - + A&dapt - + &CSV - + Export all Notebooks/Markdown files as a single CSV file - + Recall Notebook by Ta&gs - - Open Dashboard... - - - - + &Home Notebook - + Activate command line interface... - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - + E&xtract - + Create new Note from the text selected in the current Note... - - + + &Clone @@ -2169,512 +2163,512 @@ Choose new library source: - + &Wingman - + Ter&minal - + Run simple command line from current MindForger workspace... - + Emo&jis - + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... - + N&avigate - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + &Promote - + Promote Notebook - + De&mote - + Demote Notebook - + Move to &First - + Move the Notebook to be the first child of its parent - + Move &Up - + Move the Notebook up - + Move Do&wn - + Move the Notebook down - + Move to &Last - + Move the Notebook to be the last child of its parent - + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + Toggle word wrap mode - - &Swap Name/Description Focus + + Swap focus of N title and description editors - Swap focus of N title and description editors + Complete word being written by finding link to Notebook or Note - - Complete word being written by finding link to Notebook or Note + + &Spell Check - + &Math - + Format text as math (MathJax) - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - - integrals - - - - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - - &dot - - - - + &overrightarrow - + &cup - - &cap + + &empty set - - &empty set + + &not in - &in + T&able of Contents - - &not in + + Insert current date and time - - T&able of Contents + + About &Qt - - Insert current date and time + + Format text block as math (MathJax) - - About &Qt + + in&tegrals - - Format text block as math (MathJax) + + dot - + + ca&p + + + + + in + + + + Ima&ge - + Insert table... - + &Documentation - + F1 - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - + About Qt... - + &About MindForger - + About MindForger... - + &Help @@ -2687,52 +2681,42 @@ Choose new library source: - + New Notebook - + Open directory with Markdowns or Workspace - + Open Markdown file - View Dashboard - - - - - View Eisenhower Matrix - - - - View Eisenhower Matrices - + View Notebooks - + View Knowledge Graph Navigator - + View Tags - + View Recent Notes @@ -2740,680 +2724,680 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Cannot start sleeping - please wait until dreaming finishes and then try again - + Learn - + Full-text Search - - - + + + Note - - + + Note not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name - - + + New Note - + Failed to create new Note! - + Hyperlink %1 clicked... - + Export Memory to CSV - + Autolinked Notebooks and Notes - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Learn Markdown File - + Notebook Full-text Search - + Note Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Find Note by Name in Notebook - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + Edit Notebook - + Please open an Notebook to edit. - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Notebook can be forgotten only when viewed. - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - + Find Note by Tags in Notebook - + Export Notebook to HTML - - + + Export - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Thing not found - - + + Find Note by Tags - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Home tag toggled/removed - Notebook '%1' is no longer home - - + + Forget Notebook - + Do you really want to deprecate ' - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note - + Please select a Note to forget. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + Emojis - + About MindForger @@ -4035,74 +4019,74 @@ Choose new library source: m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4701,7 +4685,12 @@ notes. Feel free to deprecate such notebook(s) yourself. m8r::TerminalDialog - + + Terminal + + + + Terminal Command Error @@ -4744,6 +4733,99 @@ notes. Feel free to deprecate such notebook(s) yourself. + + m8r::WingmanDialog + + + Wingman + + + + + Wingman can run a predefined or custom prompt.<br> + + + + + Prompt + + + + + Predefined: + + + + + Your: + + + + + Type in your prompt like: 'Translate the following text to Spanish: #CONTENT. + + + + + Context + + + + + Type: + + + + + Name (#NAME): + + + + + Text (#TEXT): + + + + + Use #NAME or #TEXT to include it to your prompt. + + + + + &Ask Wingman + + + + + &Cancel + + + + + outline + + + + + <Notebook document> + + + + + note + + + + + <Note description> + + + + + <selected / current text> + + + main diff --git a/app/resources/qt/translations/mindforger_zh_cn.ts b/app/resources/qt/translations/mindforger_zh_cn.ts index f775fb8a..6be03d65 100644 --- a/app/resources/qt/translations/mindforger_zh_cn.ts +++ b/app/resources/qt/translations/mindforger_zh_cn.ts @@ -4,53 +4,53 @@ QObject - + Save Note - + Do you want to save changes? - + Discard changes - + &Discard changes - - + + Autosave - + Do not ask & autosave - + Continue editing - + Continue &editing - + Save - + &Save @@ -60,15 +60,17 @@ - - + + + Empty Phrase - - + + + Phrase to search/explain/process is empty. @@ -236,7 +238,7 @@ Choose new library source: - <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or type full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> + <html>Use the following commands:<br><br>? ... help<br>/ ... search<br>@ ... knowledge recherche<br>> ... run a command<br>: ... chat with workspace, Notebook or Note<br>&nbsp;&nbsp;... or full-text search phrase<br><br>Examples:<br><br>/ find notebook by name My Name<br>@ arxiv Knowledge management<br>> emoji<br>: explain in simple terms SELECTED<br> @@ -322,32 +324,32 @@ Choose new library source: - + show toolbar - + I don't need buttons - I know all keyboard shortcuts! - + nerd terminology - + Controls - + Startup - + Appearance @@ -355,47 +357,47 @@ Choose new library source: m8r::ConfigurationDialog::EditorTab - + Editor key binding - + Editor font - + Spell check dictionaries <a href='https://github.com/dvorka/mindforger/wiki/Installation#spell-check'>configuration documentation</a> - + live spell check - + TABs as SPACEs - + autosave Note on editor close - + TAB width - + External editor command - + Editor @@ -403,37 +405,37 @@ Choose new library source: m8r::ConfigurationDialog::MarkdownTab - + syntax highlighting - + autocomplete text - + autocomplete lists, blocks and {([`_ characters - + SPACE-based # in section escaping (HTML otherwise) - + Rendering - + Autocompletion - + Escaping @@ -441,22 +443,22 @@ Choose new library source: m8r::ConfigurationDialog::MindTab - + save reads metadata - + Async refresh interval (1 - 10.000ms) - + Persistence - + Notifications @@ -464,12 +466,12 @@ Choose new library source: m8r::ConfigurationDialog::NavigatorTab - + Max graph nodes (150 by default) - + Knowledge Graph Navigator @@ -477,69 +479,61 @@ Choose new library source: m8r::ConfigurationDialog::ViewerTab - + HTML Viewer - + Viewer theme CSS - + HTML zoom (100 is 100%, Ctrl + mouse wheel) - + source code syntax highlighting support - + math support - + whole notebook preview - + double click HTML preview to edit - + Diagram support - + Find Custom CSS File - + HTML Viewer CSS - + Choose CSS File - - m8r::DashboardPresenter - - - Do first - - - m8r::EditButtonsPanel @@ -949,22 +943,22 @@ Choose new library source: - Notebook + Note&book - Note + &Note - File + &File - Directory + &Directory @@ -1095,28 +1089,28 @@ Choose new library source: - + S&cope - + Don't show Notebooks and Notes older than... - - + + &Forget &Deprecate - + Limbo vs erase memory... - + Retain Reta&in @@ -1125,47 +1119,47 @@ Choose new library source: &Preferences - + Adapt Mind by setting your preferences... - + E&xit - + Leave application - + &Full-text Search - + Note full-text search - + Recall Note&book by Name Find Note&book by Name - + Find Notebook by name - + Recall &Note by Name Find &Note by Name - + Find Note by name @@ -1174,7 +1168,7 @@ Choose new library source: Find Notebook by T&ags - + Find Notebook by tags @@ -1183,1113 +1177,1128 @@ Choose new library source: Find Note by &Tags - + Find Note by tags - + Recall Library &Doc by Name - + Find Document by name - + Recall &Persons Find &Persons - + Find persons using Named-entity recognition (NER) - + Recall &Locations Find &Locations - + Find locations using Named-entity recognition (NER) - + Recall Organizations Find Organizations - + Find organizations using Named-entity recognition (NER) - + Recall Other Entities Find Other Entities - + Find miscellaneous entities using Named-entity recognition (NER) - + &Recall F&ind - - Dashboard - - - - + Open Home Notebook... - + N&otebooks - + Show list of Notebooks... - + Note&books Tree - + Show tree of Notebooks... - + &Tags - + Open Tag cloud... - + Knowledge Graph &Navigator - + Open knowledge graph Navigator... - + &Memory Dwell - + Open memory dwell... - + Ter&minal - + Run simple command line from current MindForger workspace... - + &Recent Notes - + View recently modified Notes... - + &Stencils - + List Notebook and Note stencils... - + List forgotten Notebooks and Notes... - - Ho&isting - - - - + D&istraction Free - + Toggle distraction free mode - + &Fullscreen - + Toggle fullscreen - + &View - + Str&etch edges e | mouse wheel - + Stretch knowledge graph edges - + &Sh&rink edge E | mouse wheel - + Shring knowledge graph edges - + Zoom &in z - + Zoom in knowledge graph - + Zoom &out Z - + Zoom out knowledge graph - + &Shuffle Space - + Shuffle knowledge graph - + N&avigate - + Lib&rary - + &New library - + Add path to the directory with documents (PDF, txt, HTML)... - + &Update library - + Synchronize library source directory with MindForger notebook(s) which representlibrary resources... - + &Delete library - + Delete all Notebooks representing the library resources... - + &Edit ⌘↩ - + &Edit Alt-Enter - + Move Notebook/Note to Previous Column/Quadrant ⌘[ - + Move Notebook/Note to Next Column/Quadrant ⌘] - + Focus to Previous Column/Quadrant ⇧⇥ - + Focus to Next Column/Quadrant ⇥ - + &HTML - + Export Notebook to a file in HTML format - + &TWiki - + Import Notebook from an external TWiki file and restart MindForger - + Search Note text - + Find Next Ctrl+F - + Search Note text again - + &Undo Ctrl+Z - + Undo - + &Redo Ctrl+Shift+Z - + Redo - + Cu&t Ctrl+X - + Cut - + &Copy Ctrl+C - + Copy - + &Paste Ctrl+V - + Paste - - - - + + + + &Edit - + Create backup archive of the current workspace and store it in home directory - + Recall Note by T&ags - + Flashcard &Decks - + Show list of flashcard decks... - + Organiz&ers - + Open Eisenhower matrix and Kanban organizers... - + &Library Documents - + List Library documents... - + &Wingman - + Emo&jis - + Open dialog with emoji characters to be copy/pasted to names, descriptions and text... - + Li&mbo - + + Activate wingman... + + + + + &CLI + + + + + Ho&ist + + + + Str&etch edges - + &Sh&rink edge - + Flash&cards - + &Organizer - + Create new Organizer to prioritize your knowledge in Eisenhower Matrix style - + Edit current Organizer - you can also double click view to open the editor - + Make copy of the current Organizer - + &Delete - + Delete Organizer without undo - - + + Move Notebook/Note to &Previous Column/Quadrant Ctrl+Left - + Move Notebook/Note to previous column or quadrant... - - + + Move Notebook/Note to Ne&xt Column/Quadrant Ctrl+Right - + Move Notebook/Note to next column or quadrant... - + Move focus to previous column or quandrant... - + Move focus to next column or quandrant... - + Note&book - + E&xamine - + Turn Notebook to deck of flashcard and start active recall testing... - + &Promote - + Promote Notebook - + De&mote - + Demote Notebook - + Move to &First - + Move the Notebook to be the first child of its parent - + Move &Up - + Move the Notebook up - + Move Do&wn - + Move the Notebook down - + Move to &Last - + Move the Notebook to be the last child of its parent - + E&xternal Editor Edit Ctrl+X - + Edit current Note in an external editor - use Preferences to configure the editor - + &Forget Ctrl+D - + Save and Leave Ctrl+L - + Move to F&irst Ctrl+Shift+Up - + Move the Note to be the first child of its parent - + Move &Up Ctrl+Up - + Move the Note up - + Move Do&wn Ctrl+Down - + Move the Note down - + Move to &Last Ctrl+Shift+Down - + Move the Note to be the last child of its parent - + Move to Notebook Ctrl+R - + &Move to Notebook - + Move the current Note to another Notebook... - + &Find Ctrl+Shift+F - + &Live Preview - + Toggle live HTML preview - + &Word Wrap - - &Swap Name/Description Focus - - - - + Swap focus of N title and description editors - + Find Knowledge Ctrl+/ - + Run an external tool to find, explain, process text under the cursor - + Complete Link Ctrl+L - - Sp&ell Check - - - - + Spell check Notebook or Note description - + &Bold - + Format text as bold - + &Italic - + Format text as italic - + &Code - + Format text as inlined source code - + &Math - + Format text as math (MathJax) - + Comment - + Add comment to hide text in rendered HTML - + Lis&ts - + &Bulleted List - + &Numbered List - + &Task List - + Task List &Item - + Bl&ocks - + &Code Block - + &Math Block - + &Diagram Block - + Format code block as diagram (Mermaid) - + Diagrams - + &Flowchart - + Insert flowchart Mermaid diagram skeleton - + &Sequence Diagram - + Insert sequence Mermaid diagram skeleton - + &Class Diagram - + Insert class Mermaid diagram skeleton - + St&ate Diagram - + Insert state Mermaid diagram skeleton - + &Gantt Diagram - + Insert Gantt Mermaid diagram skeleton - + &Pie Diagram - + Insert pie Mermaid chart skeleton - + + in&tegrals + + + + + dot + + + + + ca&p + + + + + in + + + + &Strikethrough - + Format text as strikethrough - + About &Qt - + &Keyboard - + Format text as keyboard input - + Math cheatsheet - + Open MathJax quick reference - + Math live preview - + Open MathJax live demo - + Mermaid dia&grams documentation - + Open Mermaid diagrams documentation - + Format block as bulleted list - + Format block as numbered list - - + + Format block as task list - + T&able of Contents - + Insert current date and time - + Format text block as source code - + Format text block as math (MathJax) - + Block &Quote - + Format text block as blockquote - + &Link - + Insert link to a document, image or file - + Insert image - + Tabl&es - + &Horizontal ruler - + Horizontal ruler - + &Format - - - - + + + + &New - + Create new Notebook to form new ideas, principles, combinations or applications - + Edit current Notebook - you can also double click view to open the editor - + Make &Home - + Import - - + + Make &Stencil - - + + Copy the current Notebook as to Stencil - + C&lone - + Make copy of the current Notebook - + Forget Notebook and move it to Limbo Delete Notebook and move it Limbo - + E&xport - + &Forget Del Delete Del - + Forget Note Delete Note @@ -2299,12 +2308,12 @@ Choose new library source: &Open - + Toggle tag indicating whether to use the current Notebook as home - + &Import @@ -2324,113 +2333,108 @@ Choose new library source: - + A&dapt &Preferences - + &CSV - + Export all Notebooks/Markdown files as a single CSV file - + Recall Notebook by Ta&gs Find Notebook by Ta&gs - - Open Dashboard... - - - - + &Home Notebook - + Activate command line interface... - + Create new Note to form new ideas, principles, combinations and applications - + Hoist/de-hoist Note to focus on Note being viewed or edited - + &Edit Ctrl+E - + Edit current Note - you can also double click view to open the editor - + Remember Ctrl+S Save Ctrl+S - + Save Note being edited - + Leave Alt+Left - + Save leave editor of Note being changed - + &Promote Ctrl+Left - + Promote Note - + &Demote Ctrl+Right - + Demote Note - + E&xtract - + Create new Note from the text selected in the current Note... - - + + &Clone @@ -2471,242 +2475,232 @@ Choose new library source: - + Make a copy of the Note to this or other Notebook... - + Export Note to an external file in a supported format - + Import Note from an external file in a supported format - + &Note - + Toggle word wrap mode - + + Swap Nam&e/Description Focus + + + + Complete word being written by finding link to Notebook or Note - + + &Spell Check + + + + MathJa&x - + &text - + &fraction - + &sum - + s&quare root - + &integral - - integrals - - - - + &alpha - + &beta - + &Gama - + &Delta - + &bar - + &hat - - &dot - - - - + &overrightarrow - + &cup - - &cap - - - - + &empty set - - &in - - - - + &not in - + With&out tags - + Insert Notebook's table of contents without tags - + &With tags - + Insert Notebook's table of contents with tags - + Timestam&p - + Ima&ge - + Insert table... - + &Documentation - + F1 - + Open MindForger documentation - + &Web - + Open MindForger web - + &Markdown tutorial - + Open Markdown tutorial - + Report &Bug or Request Feature - + Report bug or suggest an enhancement - + &Check for Updates - + Check for MindForger updates - + About Qt... - + &About MindForger - + About MindForger... - + &Help @@ -2719,52 +2713,42 @@ Choose new library source: - + New Notebook - + Open directory with Markdowns or Workspace - + Open Markdown file - View Dashboard - - - - - View Eisenhower Matrix - - - - View Eisenhower Matrices - + View Notebooks - + View Knowledge Graph Navigator - + View Tags - + View Recent Notes @@ -2772,34 +2756,34 @@ Choose new library source: m8r::MainWindowPresenter - + Cannot think - either Mind already dreaming or repository too big - + Hyperlink %1 clicked... - + Link target not found for relative link %1 - + New Markdown File Error - - - + + + Specified file path already exists! - + Cannot start sleeping - please wait until dreaming finishes and then try again @@ -2808,648 +2792,648 @@ Choose new library source: Open Directory or MindForger Repository - + Learn Markdown File Open Markdown File - + Learn Open - + Export Notebook to HTML - - + + Export - + Autolinked Notebooks and Notes - + Notebook Full-text Search - + Note Full-text Search - + Full-text Search - - - - + + + + Notebook - - + + Notebook not found - + Find Note by Tags in Notebook - - + + Find Note by Tags - - - + + + Note - + Export Memory to CSV - + Thing not found - - + + Note not found - + Refactored Note to Notebook ' - + Target Notebook not found - + Refactor Note - + Note to be refactored not specified! - + Find Note by Name in Notebook - + Find Note by Name - - - - + + + + Initializing NER and predicting... - - - - + + + + NER - - - - + + + + Memory NER not implemented yet. - + Recognizing named entities... - + Initializing NER and recognizing named entities... - + Initializing (the first run only) NER and predicting... - - + + Named-entity Recognition - + NER predicition finished - + No named entities recognized. - + image - + Given path '%1' doesn't exist - target will not be copied, but link will be created - + Saving pasted image data to file: '%1' - + HTML Note preview flickering can be eliminated by disabling math and diagrams in Preferences menu - + Edit Notebook - + Please open an Notebook to edit. - - + + New Note - + Failed to create new Note! - - + + Clone Notebook - + Failed to clone Notebook! - + Please open and Notebook to be cloned. - + Home tag toggled/removed - Notebook '%1' is no longer home - + Notebook '%1' successfully marked as home - + Make Notebook home - + Notebook can be marked as home only when viewed. - - + + Forget Notebook Deprecate Notebook - + Library already indexed - use 'Update library' action to synchronize documents. - + Unable to index documents on library path - either memory directory doesn't exist or not in MindForger workspace mode. - + Library synchronization - + There are no libraries - nothing to synchronize. - + Library deletion - + There are no libraries - nothing to delete. - + Delete Library - + Do you really want to delete Notebooks which represent the library documents? - + Do you really want to forget ' - + ' Notebook? - + Cannot think - either Mind already dreaming or workspace too big - - + + New Workspace Error - + Specified workspace path already exists! - + Failed to create empty workspace! - + ERROR: workspace created, but attempt to copy documentation and/or stencils failed - + Learn Directory or MindForger Workspace - + This is neither valid MindForger/Markdown workspace nor file. - + Home Notebook not set - use menu 'Notebooks/Make Home' - + File copied to workspace path '%1' - + 🔒 Notebook Write Error - + Notebook file is read-only and cannot be written: '%1' - + Do you really want to deprecate ' - + Notebook can be forgotten only when viewed. - - - + + + Export Error - + Unable to find Notebook to export! - + Import TWiki File - + Open and view a Notebook to create new Note. - + Edit Note - - + + Please select a Note to edit in the Notebook. - - + + Edit Note with External Editor Error - + External editor command is not configured in preferences (Editor tab). - - + + Edit Note with External Editor - + Running command: '%1' - + Running command: '%1'. Close external editor to return control back to MindForger. - + Delete Note - + Do you really want to delete note ' - + ' along with its child notes? - + Forget Note Delete Note - + Please select a Note to forget. Please select a Note to delete. - - - + + + Extract Note - + Please select a text to extract. - + Failed to extract new Note! - + Please select a Note, edit it and select a text to extract. - - - + + + Clone Note - + Do you want to clone Note ' - + ' including its child notes?'? - + Failed to clone Note! - + Please select a Note to be cloned. - + Moved Note '%1' to be the first child - - - - + + + + Move Note - - - - + + + + Please select a Note to be moved. - + Moved up Note '%1' - + Moved down Note '%1' - + Moved Note '%1' to be the last child - + Promoted Note '%1' - + Promote Note - + Please select a Note to be promoted. - + Demoted Note '%1' - + Demote Note - + Please select a Note to be demoted. - - - + + + Add Library Error - + Library directory doesn't exist! - + Organizer Update Error - + Eisenhower Matrix organizer is built-in and cannot be edited - please create or update a custom organizer. - + Organizer Clone Error - + Eisenhower Matrix organizer is built-in and cannot be cloned - please create or update a custom organizer. - + Forget Organizer - + ' Organizer? - + Delete Organizer - + Eisenhower Matrix is built-in and cannot be deleted - only custom organizers can. - + View Limbo - + Limbo directory with deleted Notebooks is available in the MindForger workspace, not if a Markdown is edited or a directory with markdowns is opened. - + Emojis - + About MindForger @@ -4071,74 +4055,74 @@ Choose new library source: m8r::OrlojPresenter - + Eisenhower Matrix: - + Kanban: - + Organizer: ' - + Selected Organizer not found! - + No Organizer selected! - - - + + + Selected Notebook not found! - - - + + + No Notebook selected! - + Selected Tag not found! - - + + No Tag selected! - + Note '%1' %2 - - + + Note - + Selected Notebook/Note not found! - - + + No Note selected! @@ -4737,7 +4721,12 @@ notes. Feel free to deprecate such notebook(s) yourself. m8r::TerminalDialog - + + Terminal + + + + Terminal Command Error @@ -4780,6 +4769,99 @@ notes. Feel free to deprecate such notebook(s) yourself. + + m8r::WingmanDialog + + + Wingman + + + + + Wingman can run a predefined or custom prompt.<br> + + + + + Prompt + + + + + Predefined: + + + + + Your: + + + + + Type in your prompt like: 'Translate the following text to Spanish: #CONTENT. + + + + + Context + + + + + Type: + + + + + Name (#NAME): + + + + + Text (#TEXT): + + + + + Use #NAME or #TEXT to include it to your prompt. + + + + + &Ask Wingman + + + + + &Cancel + + + + + outline + + + + + <Notebook document> + + + + + note + + + + + <Note description> + + + + + <selected / current text> + + + main diff --git a/app/src/qt/dashboard/dashboardlet_welcome.cpp b/app/src/qt/dashboard/dashboardlet_welcome.cpp deleted file mode 100644 index a63ee5f3..00000000 --- a/app/src/qt/dashboard/dashboardlet_welcome.cpp +++ /dev/null @@ -1,6 +0,0 @@ -/* -#include -QTextBrowser *tb = new QTextBrowser(this); -tb->setOpenExternalLinks(true); -tb->setHtml(htmlString); - */ diff --git a/app/src/qt/dashboard_presenter.cpp b/app/src/qt/dashboard_presenter.cpp deleted file mode 100644 index 20b60065..00000000 --- a/app/src/qt/dashboard_presenter.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - dashboard_presenter.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "dashboard_presenter.h" - -namespace m8r { - -using namespace std; - -DashboardPresenter::DashboardPresenter(DashboardView* view, OrlojPresenter* orloj) - : config(Configuration::getInstance()) -{ - this->view = view; - - doFirstDashboardletPresenter = new OrganizerQuadrantPresenter( - view->getDoFirstDashboardlet(), - orloj, - tr("Do first") - ); - outlinesDashboardletPresenter = new OutlinesTablePresenter( - view->getOutlinesDashboardlet(), - orloj->getMainPresenter()->getHtmlRepresentation() - ); - navigatorDashboardletPresenter = new NavigatorPresenter( - view->getNavigatorDashboardlet(), - this, - orloj->getMind()->getKnowledgeGraph() - ); - recentDashboardletPresenter = new RecentNotesTablePresenter( - view->getRecentDashboardlet(), - orloj->getMainPresenter()->getHtmlRepresentation() - ); - tagsDashboardletPresenter = new TagsTablePresenter( - view->getTagsDashboardlet(), - orloj->getMainPresenter()->getHtmlRepresentation() - ); -} - -DashboardPresenter::~DashboardPresenter() -{ -} - -void DashboardPresenter::refresh( - const vector& os, - const vector& ns, - const map& ts, - int bytes, - MindStatistics* stats) -{ - // IMPROVE set size based on system resolution/zoom - view->getWelcomeDashboardlet()->setHtml( - QString( - "" - "" - "
 
" - "

We are MindForger!

" - "MindForger is personal " - "thinking notebook " - "and Markdown editor:" - "" - "Tips:" - "
    " - "
  • Return to this dashboard with Ctrl-Shift-d.
  • " - "
  • List notebooks/Markdown files with Ctrl-Shift-o.
  • " - "
  • Open item in a table listing with " - "double-click or ENTER.
  • " - "
  • Edit note with HTML preview double-click or " - "Ctrl-e.
  • " - "
  • Zoom note HTML preview with Ctrl-mouse wheel " - "or scroll.
  • " - "
" - "Statistics:" - "
    " - "
  • " + stringFormatIntAsUs(os.size()) + " notebooks, " - "" + stringFormatIntAsUs(ns.size()) + " notes, " - "" + stringFormatIntAsUs(ts.size()) + " tags and " - "" + stringFormatIntAsUs(bytes) + " bytes.
  • " - "
  • Most used notebook: " + QString::fromStdString(stats->mostReadOutline?stats->mostReadOutline->getName():"") + ".
  • " - "
  • Most used note: " + QString::fromStdString(stats->mostReadNote?stats->mostReadNote->getName():"") + " in " - "" + QString::fromStdString(stats->mostReadNote?stats->mostReadNote->getOutline()->getName():"") + ".
  • " - // TODO RD vs. WR: "
  • - Most written notebook: " + QString::fromStdString(stats->mostWrittenOutline?stats->mostWrittenOutline->getName():"") + ".
  • " - // TODO RD vs. WR: "
  • - Most written note: " + QString::fromStdString(stats->mostWrittenNote?stats->mostWrittenNote->getName():"") + ".
  • " - "
  • Most used tag:  " - "" + QString::fromStdString(stats->mostUsedTag?stats->mostUsedTag->getName():"") + " .
  • " - // TODO O w/ most Ns - "
" - "
" - )); - - vector doFirstOs; - if(os.size()) { - for(Outline* o:os) { - if(o->getUrgency()>2) { - if(o->getImportance()>2) { - doFirstOs.push_back(o->getOutlineDescriptorAsNote()); - } - } - } - } - doFirstDashboardletPresenter->refresh(doFirstOs, true, true, true); - - outlinesDashboardletPresenter->refresh(os); - recentDashboardletPresenter->refresh(ns); - // IMPROVE: consider showing recent O: navigatorDashboardletPresenter->showInitialView(ns[0]->getOutline()); - navigatorDashboardletPresenter->showInitialView(); - tagsDashboardletPresenter->refresh(ts); - - view->setMindForgerMode( - doFirstOs.size() > 0 - && - config.getActiveRepository()->getType() - == - Repository::RepositoryType::MINDFORGER); - - view->getRecentDashboardlet()->setFocus(); -} - -} // m8r namespace diff --git a/app/src/qt/dashboard_presenter.h b/app/src/qt/dashboard_presenter.h deleted file mode 100644 index 6ed1f259..00000000 --- a/app/src/qt/dashboard_presenter.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - dashboard_presenter.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8RUI_DASHBOARD_PRESENTER_H -#define M8RUI_DASHBOARD_PRESENTER_H - -#include - -#include - -#include "gear/qutils.h" -#include "orloj_presenter.h" -#include "dashboard_view.h" -#include "organizer_quadrant_presenter.h" -#include "recent_notes_table_presenter.h" -#include "navigator_presenter.h" -#include "tags_table_presenter.h" -#include "outlines_table_view.h" - -namespace m8r { - -class OrganizerQuadrantPresenter; -class OrlojPresenter; -class OutlinesTablePresenter; - -class DashboardPresenter : public QObject -{ - Q_OBJECT - -private: - DashboardView* view; - - Configuration& config; - - OrganizerQuadrantPresenter* doFirstDashboardletPresenter; - OrganizerQuadrantPresenter* doSoonDashboardletPresenter; - RecentNotesTablePresenter* recentDashboardletPresenter; - NavigatorPresenter* navigatorDashboardletPresenter; - TagsTablePresenter* tagsDashboardletPresenter; - OutlinesTablePresenter* outlinesDashboardletPresenter; - -public: - explicit DashboardPresenter(DashboardView* view, OrlojPresenter* orloj); - DashboardPresenter(const DashboardPresenter&) = delete; - DashboardPresenter(const DashboardPresenter&&) = delete; - DashboardPresenter &operator=(const DashboardPresenter&) = delete; - DashboardPresenter &operator=(const DashboardPresenter&&) = delete; - ~DashboardPresenter(); - - DashboardView* getView() { return view; } - - void refresh( - const std::vector& os, - const std::vector& ns, - const std::map& ts, - int bytes, - MindStatistics* stats - ); - - RecentNotesTablePresenter* getRecentNotesPresenter() { return recentDashboardletPresenter; } - TagsTablePresenter* getTagsPresenter() { return tagsDashboardletPresenter; } - OutlinesTablePresenter* getOutlinesPresenter() { return outlinesDashboardletPresenter; } -}; - -} -#endif // M8RUI_DASHBOARD_PRESENTER_H diff --git a/app/src/qt/dashboard_view.cpp b/app/src/qt/dashboard_view.cpp deleted file mode 100644 index 9f9f846a..00000000 --- a/app/src/qt/dashboard_view.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - organizer_view.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "dashboard_view.h" - -namespace m8r { - -DashboardView::DashboardView(QWidget* parent) - : QSplitter{Qt::Horizontal, parent}, - isMindForgerRepository(false) -{ - left = new QSplitter{Qt::Vertical, this}; - left->setStretchFactor(0, 1); - left->setStretchFactor(1, 1); - - middle = new QSplitter{Qt::Vertical, this}; - middle->setStretchFactor(0, 1); - middle->setStretchFactor(1, 1); - - right = new QSplitter{Qt::Vertical, this}; - right->setStretchFactor(0, 1); - right->setStretchFactor(1, 1); - - // welcome - welcomeDashboardlet = new QTextBrowser(left); - welcomeDashboardlet->setOpenExternalLinks(true); - left->addWidget(welcomeDashboardlet); - - // recent - recentDashboardlet = new RecentNotesTableView(left, true); - left->addWidget(recentDashboardlet); - - // organizer quadrants - doFirstDashboardlet = new OrganizerQuadrantView(middle); - middle->addWidget(doFirstDashboardlet); - - // tags - tagsDashboardlet = new TagsTableView(middle); - middle->addWidget(tagsDashboardlet); - - // navigator - navigatorDashboardlet = new NavigatorView(right, true); - // IMPROVE should go to resize event - int windowHeight=parent->parentWidget()->parentWidget()->size().height(); - navigatorDashboardlet->setFixedHeight(windowHeight); - right->addWidget(navigatorDashboardlet); - - // outlines - outlinesDashboardlet = new OutlinesTableView(right, true); - right->addWidget(outlinesDashboardlet); - - // self ~ horizontal splitter - setStretchFactor(0, 1); - setStretchFactor(1, 1); - setStretchFactor(2, 1); - - addWidget(left); - addWidget(middle); - addWidget(right); -} - -void DashboardView::setMindForgerMode(bool isMindForgerRepository) -{ - this->isMindForgerRepository = isMindForgerRepository; - if(isMindForgerRepository) { - middle->setVisible(true); - } else { - middle->setVisible(false); - } -} - -void DashboardView::resizeEvent(QResizeEvent* event) -{ - UNUSED_ARG(event); - - int normalizedWidth = width()/fontMetrics().averageCharWidth(); - if(!isMindForgerRepository || normalizedWidth < SIMPLIFIED_VIEW_THRESHOLD_WIDTH) { - middle->setVisible(false); - } else { - middle->setVisible(true); - } - - QSplitter::resizeEvent(event); -} - -DashboardView::~DashboardView() -{ -} - -} // m8r namespace diff --git a/app/src/qt/dashboard_view.h b/app/src/qt/dashboard_view.h deleted file mode 100644 index 38ee3215..00000000 --- a/app/src/qt/dashboard_view.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - dashboard_view.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8RUI_DASHBOARD_VIEW_H -#define M8RUI_DASHBOARD_VIEW_H - -#include - -#include "organizer_quadrant_view.h" -#include "recent_notes_table_view.h" -#include "navigator/navigator_view.h" -#include "tags_table_view.h" -#include "outlines_table_view.h" - -namespace m8r { - -/** - * @brief Dashboard - */ -class DashboardView : public QSplitter -{ - Q_OBJECT - -private: - // if view is width < threshold columns, then shows simplified view w/o Mind-related columns - static constexpr int SIMPLIFIED_VIEW_THRESHOLD_WIDTH = 75*2; - - bool isMindForgerRepository; - - QSplitter* left; - QSplitter* middle; - QSplitter* right; - - QTextBrowser* welcomeDashboardlet; - OrganizerQuadrantView* doFirstDashboardlet; - OrganizerQuadrantView* doSoonDashboardlet; - NavigatorView* navigatorDashboardlet; - RecentNotesTableView* recentDashboardlet; - TagsTableView* tagsDashboardlet; - OutlinesTableView* outlinesDashboardlet; - -public: - explicit DashboardView(QWidget* parent); - DashboardView(const DashboardView&) = delete; - DashboardView(const DashboardView&&) = delete; - DashboardView &operator=(const DashboardView&) = delete; - DashboardView &operator=(const DashboardView&&) = delete; - ~DashboardView(); - - void setMindForgerMode(bool isMindForgerRepository); - - QTextBrowser* getWelcomeDashboardlet() { return welcomeDashboardlet; } - OrganizerQuadrantView* getDoFirstDashboardlet() { return doFirstDashboardlet; } - OutlinesTableView* getOutlinesDashboardlet() { return outlinesDashboardlet; } - NavigatorView* getNavigatorDashboardlet() { return navigatorDashboardlet; } - RecentNotesTableView* getRecentDashboardlet() { return recentDashboardlet; } - TagsTableView* getTagsDashboardlet() { return tagsDashboardlet; } - -protected: - void resizeEvent(QResizeEvent* event) override; -}; - -} -#endif // M8RUI_DASHBOARD_VIEW_H diff --git a/app/src/qt/dialogs/configuration_dialog.cpp b/app/src/qt/dialogs/configuration_dialog.cpp index 0ea09a61..ab21966c 100644 --- a/app/src/qt/dialogs/configuration_dialog.cpp +++ b/app/src/qt/dialogs/configuration_dialog.cpp @@ -119,9 +119,6 @@ ConfigurationDialog::AppTab::AppTab(QWidget *parent) startupLabel = new QLabel(tr("Show the following view on application start")+":", this); startupCombo = new QComboBox{this}; -#ifdef MF_DEPRECATED - startupCombo->addItem(QString{START_TO_DASHBOARD}); -#endif startupCombo->addItem(QString{START_TO_OUTLINES}); startupCombo->addItem(QString{START_TO_OUTLINES_TREE}); startupCombo->addItem(QString{START_TO_TAGS}); diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp index 7b519ced..0e9d5579 100644 --- a/app/src/qt/main_menu_presenter.cpp +++ b/app/src/qt/main_menu_presenter.cpp @@ -99,7 +99,6 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp) QObject::connect( view->actionViewLimbo, SIGNAL(triggered()), mwp, SLOT(doActionViewLimbo())); - QObject::connect(view->actionViewDashboard, SIGNAL(triggered()), mwp, SLOT(doActionViewDashboard())); QObject::connect(view->actionViewHome, SIGNAL(triggered()), mwp, SLOT(doActionViewHome())); QObject::connect(view->actionViewOrganizers, SIGNAL(triggered()), mwp, SLOT(doActionViewOrganizers())); QObject::connect(view->actionViewOutlines, SIGNAL(triggered()), mwp, SLOT(doActionViewOutlines())); @@ -331,14 +330,6 @@ MainMenuPresenter::~MainMenuPresenter() // TODO deletes: actions } -void MainMenuPresenter::showFacetDashboard() -{ - view->showFacetOutlineList( - config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY, - config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER - ); -} - void MainMenuPresenter::showFacetOrganizerList() { view->showFacetOrganizerList( diff --git a/app/src/qt/main_menu_presenter.h b/app/src/qt/main_menu_presenter.h index d920f70b..8f252876 100644 --- a/app/src/qt/main_menu_presenter.h +++ b/app/src/qt/main_menu_presenter.h @@ -55,7 +55,6 @@ class MainMenuPresenter : public QObject MainMenuView* getView() { return view; } - void showFacetDashboard(); void showFacetOrganizerList(); void showFacetOrganizer(); void showFacetNavigator(); diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index 45914d95..415a6840 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -239,9 +239,6 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) // menu: view - actionViewDashboard = new QAction(QIcon(":/menu-icons/dashboard.svg"), tr("Dashboard"), mainWindow); - actionViewDashboard->setStatusTip(tr("Open Dashboard...")); - actionViewHome = new QAction(QIcon(":/menu-icons/home.svg"), tr("&Home Notebook"), mainWindow); actionViewHome->setShortcut(QKeySequence(Qt::CTRL+Qt::SHIFT+Qt::Key_H)); actionViewHome->setStatusTip(tr("Open Home Notebook...")); @@ -332,9 +329,6 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionViewFullscreen->setStatusTip(tr("Toggle fullscreen")); menuView = qMenuBar->addMenu(tr("&View")); -#ifdef MF_WIP - menuView->addAction(actionViewDashboard); -#endif menuView->addAction(actionViewHome); #ifdef MF_WIP menuView->addAction(actionViewDecks); @@ -1087,7 +1081,6 @@ void MainMenuView::showAllMenuItems() #endif menuView->setEnabled(true); - actionViewDashboard->setEnabled(true); actionViewHome->setEnabled(true); actionViewOrganizers->setEnabled(true); actionViewOutlinesMap->setEnabled(true); @@ -1192,7 +1185,6 @@ void MainMenuView::showModeAwareFacet(bool repositoryMode, bool mfMode) actionViewTags->setEnabled(false); actionViewLimbo->setEnabled(false); #ifdef MF_WIP - actionViewDashboard->setEnabled(false); actionViewDecks->setEnabled(false); #endif @@ -1338,7 +1330,6 @@ void MainMenuView::showFacetNoteEdit(bool repositoryMode, bool mfMode) actionFindNoteByTag->setEnabled(false); menuView->setEnabled(false); - actionViewDashboard->setEnabled(false); actionViewHome->setEnabled(false); actionViewOrganizers->setEnabled(false); actionViewOutlines->setEnabled(false); diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h index 5f135055..caf8e8fb 100644 --- a/app/src/qt/main_menu_view.h +++ b/app/src/qt/main_menu_view.h @@ -104,7 +104,6 @@ class MainMenuView : public QObject #endif // menu: View - QAction* actionViewDashboard; QAction* actionViewHome; QAction* actionViewDecks; QAction* actionViewOrganizers; diff --git a/app/src/qt/main_toolbar_view.cpp b/app/src/qt/main_toolbar_view.cpp index 7aababc8..efbcec92 100644 --- a/app/src/qt/main_toolbar_view.cpp +++ b/app/src/qt/main_toolbar_view.cpp @@ -57,20 +57,9 @@ MainToolbarView::MainToolbarView(MainWindowView* mainWindowView) addSeparator(); -#ifdef MF_DEPRECATED - actionViewDashboard = addAction( - QIcon(":/icons/dashboard.svg"), - tr("View Dashboard")); -#endif -#ifdef ONE_ORGANIZER - actionViewEisenhower = addAction( - QIcon(":/icons/view-eisenhower.svg"), - tr("View Eisenhower Matrix")); -#else actionViewOrganizers = addAction( QIcon(":/icons/view-eisenhower.svg"), tr("View Eisenhower Matrices")); -#endif actionViewOutlines = addAction( QIcon(":/icons/view-outlines.svg"), tr("View Notebooks")); diff --git a/app/src/qt/main_toolbar_view.h b/app/src/qt/main_toolbar_view.h index c712ef89..668602b1 100644 --- a/app/src/qt/main_toolbar_view.h +++ b/app/src/qt/main_toolbar_view.h @@ -41,15 +41,8 @@ class MainToolbarView : public QToolBar QAction* actionNewOutlineOrNote; QAction* actionOpenRepository; QAction* actionOpenFile; -#ifdef MF_DEPRECATED - QAction* actionViewDashboard; -#endif QAction* actionViewOutlines; -#ifdef OLD_EISENHOWER - QAction* actionViewEisenhower; -#else QAction* actionViewOrganizers; -#endif QAction* actionViewNavigator; QAction* actionViewTags; QAction* actionViewRecentNotes; diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 7ac6e9f7..65240f8a 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -154,10 +154,6 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) exportOutlineToHtmlDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleOutlineHtmlExport())); QObject::connect( exportMemoryToCsvDialog->getNewButton(), SIGNAL(clicked()), this, SLOT(handleMindCsvExport())); - QObject::connect( - orloj->getDashboard()->getView()->getNavigatorDashboardlet(), SIGNAL(clickToSwitchFacet()), - this, SLOT(doActionViewKnowledgeGraphNavigator()) - ); QObject::connect( orloj->getNoteEdit()->getView()->getNoteEditor(), SIGNAL(signalDnDropUrl(QString)), this, SLOT(doActionFormatLinkOrImage(QString)) @@ -235,14 +231,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) this, SLOT(doActionMindLearnRepository()) ); QObject::connect(view.getToolBar()->actionOpenFile, SIGNAL(triggered()), this, SLOT(doActionMindLearnFile())); -#ifdef MF_DEPRECATED - QObject::connect(view.getToolBar()->actionViewDashboard, SIGNAL(triggered()), this, SLOT(doActionViewDashboard())); -#endif -#ifdef ONE_ORGANIZER - QObject::connect(view.getToolBar()->actionViewEisenhower, SIGNAL(triggered()), this, SLOT(doActionViewOrganizer())); -#else QObject::connect(view.getToolBar()->actionViewOrganizers, SIGNAL(triggered()), this, SLOT(doActionViewOrganizers())); -#endif QObject::connect(view.getToolBar()->actionViewOutlines, SIGNAL(triggered()), this, SLOT(doActionViewOutlines())); QObject::connect(view.getToolBar()->actionViewNavigator, SIGNAL(triggered()), this, SLOT(doActionViewKnowledgeGraphNavigator())); QObject::connect(view.getToolBar()->actionViewTags, SIGNAL(triggered()), this, SLOT(doActionViewTagCloud())); @@ -334,9 +323,7 @@ void MainWindowPresenter::showInitialView() orloj->showFacetOutlineList(mind->getOutlines()); } } else if(config.getActiveRepository()->getType()==Repository::RepositoryType::MINDFORGER) { - if(!string{START_TO_DASHBOARD}.compare(config.getStartupView())) { - orloj->showFacetDashboard(); - } else if(!string{START_TO_OUTLINES}.compare(config.getStartupView())) { + if(!string{START_TO_OUTLINES}.compare(config.getStartupView())) { orloj->showFacetOutlineList(mind->getOutlines()); } else if(!string{START_TO_OUTLINES_TREE}.compare(config.getStartupView())) { orloj->showFacetOutlinesMap(mind->outlinesMapGet()); @@ -1287,13 +1274,6 @@ void MainWindowPresenter::doActionViewRecentNotes() orloj->showFacetRecentNotes(notes); } -void MainWindowPresenter::doActionViewDashboard() -{ - if(config.getActiveRepository()->getMode()==Repository::RepositoryMode::REPOSITORY) { - orloj->showFacetDashboard(); - } -} - void MainWindowPresenter::sortAndSaveOrganizersConfig() { if(config.hasRepositoryConfiguration()) { diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index c67f192b..8c6c567b 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -177,7 +177,7 @@ class MainWindowPresenter : public QObject // function Mind* getMind() const { return mind; } - // dashboard(s) + // hey hello! void showInitialView(); // N view @@ -242,7 +242,6 @@ public slots: void handleFtsNerEntity(); #endif // view - void doActionViewDashboard(); void sortAndSaveOrganizersConfig(); void doActionViewOrganizers(); void doActionViewOrganizer(); diff --git a/app/src/qt/orloj_presenter.cpp b/app/src/qt/orloj_presenter.cpp index 108138c3..7a92f2f6 100644 --- a/app/src/qt/orloj_presenter.cpp +++ b/app/src/qt/orloj_presenter.cpp @@ -36,7 +36,6 @@ OrlojPresenter::OrlojPresenter( this->view = view; this->mind = mind; - this->dashboardPresenter = new DashboardPresenter(view->getDashboard(), this); this->organizersTablePresenter = new OrganizersTablePresenter(view->getOrganizersTable(), mainPresenter->getHtmlRepresentation()); this->organizerPresenter = new OrganizerPresenter(view->getOrganizer(), this); this->kanbanPresenter = new KanbanPresenter(view->getKanban(), this); @@ -69,11 +68,6 @@ OrlojPresenter::OrlojPresenter( SIGNAL(signalShowSelectedOutline()), this, SLOT(slotShowSelectedOutline())); - QObject::connect( - view->getDashboard()->getOutlinesDashboardlet(), - SIGNAL(signalShowSelectedOutline()), - this, - SLOT(slotShowSelectedOutline())); QObject::connect( view->getOutlinesMapTable(), SIGNAL(signalMapShowSelectedOutline()), @@ -96,22 +90,12 @@ OrlojPresenter::OrlojPresenter( SIGNAL(signalShowSelectedRecentNote()), this, SLOT(slotShowSelectedRecentNote())); - QObject::connect( - view->getDashboard()->getRecentDashboardlet(), - SIGNAL(signalShowSelectedRecentNote()), - this, - SLOT(slotShowSelectedRecentNote())); // hit ENTER in Tags to view Recall by Tag detail QObject::connect( view->getTagCloud(), SIGNAL(signalShowDialogForTag()), this, SLOT(slotShowSelectedTagRecallDialog())); - QObject::connect( - view->getDashboard()->getTagsDashboardlet(), - SIGNAL(signalShowDialogForTag()), - this, - SLOT(slotShowSelectedTagRecallDialog())); // navigator QObject::connect( navigatorPresenter, SIGNAL(signalOutlineSelected(Outline*)), @@ -287,26 +271,6 @@ void OrlojPresenter::showFacetRecentNotes(const vector& notes) mainPresenter->getStatusBar()->showMindStatistics(); } -void OrlojPresenter::showFacetDashboard() { - setFacet(OrlojPresenterFacets::FACET_DASHBOARD); - - vector allNotes{}; - mind->getAllNotes(allNotes, true, true); - map allTags{}; - mind->getTagsCardinality(allTags); - - dashboardPresenter->refresh( - mind->getOutlines(), - allNotes, - allTags, - mind->remind().getOutlineMarkdownsSize(), - mind->getStatistics() - ); - view->showFacetDashboard(); - mainPresenter->getMainMenu()->showFacetDashboard(); - mainPresenter->getStatusBar()->showMindStatistics(); -} - void OrlojPresenter::showFacetOrganizerList(const vector& organizers) { setFacet(OrlojPresenterFacets::FACET_LIST_ORGANIZERS); @@ -565,19 +529,9 @@ void OrlojPresenter::slotShowSelectedOutline() activeFacet!=OrlojPresenterFacets::FACET_RECENT_NOTES ) { - int row; - if(activeFacet==OrlojPresenterFacets::FACET_DASHBOARD) { - row = dashboardPresenter->getOutlinesPresenter()->getCurrentRow(); - } else { - row = outlinesTablePresenter->getCurrentRow(); - } + int row = outlinesTablePresenter->getCurrentRow(); if(row != OutlinesTablePresenter::NO_ROW) { - QStandardItem* item; - if(activeFacet==OrlojPresenterFacets::FACET_DASHBOARD) { - item = dashboardPresenter->getOutlinesPresenter()->getModel()->item(row); - } else { - item = outlinesTablePresenter->getModel()->item(row); - } + QStandardItem* item = outlinesTablePresenter->getModel()->item(row); // TODO introduce name my user role - replace constant with my enum name > do it for whole file e.g. MfDataRole if(item) { Outline* outline = item->data(Qt::UserRole + 1).value(); @@ -632,26 +586,14 @@ void OrlojPresenter::showFacetTagCloud() void OrlojPresenter::slotShowSelectedTagRecallDialog() { - if(activeFacet == OrlojPresenterFacets::FACET_TAG_CLOUD - || - activeFacet == OrlojPresenterFacets::FACET_DASHBOARD - ) - { - int row; - if(activeFacet==OrlojPresenterFacets::FACET_DASHBOARD) { - row = dashboardPresenter->getTagsPresenter()->getCurrentRow(); - } else { - row = tagCloudPresenter->getCurrentRow(); - } + if(activeFacet == OrlojPresenterFacets::FACET_TAG_CLOUD) { + int row = tagCloudPresenter->getCurrentRow(); if(row != OutlinesTablePresenter::NO_ROW) { QStandardItem* item; switch(activeFacet) { case OrlojPresenterFacets::FACET_TAG_CLOUD: item = tagCloudPresenter->getModel()->item(row); break; - case OrlojPresenterFacets::FACET_DASHBOARD: - item = dashboardPresenter->getTagsPresenter()->getModel()->item(row); - break; default: item = nullptr; } @@ -672,21 +614,11 @@ void OrlojPresenter::slotShowTagRecallDialog(const QItemSelection& selected, con { Q_UNUSED(deselected); - if(activeFacet == OrlojPresenterFacets::FACET_TAG_CLOUD - || - activeFacet == OrlojPresenterFacets::FACET_DASHBOARD - ) - { + if(activeFacet == OrlojPresenterFacets::FACET_TAG_CLOUD) { QModelIndexList indices = selected.indexes(); if(indices.size()) { const QModelIndex& index = indices.at(0); - QStandardItem* item; - // TODO if 2 switch - if(activeFacet == OrlojPresenterFacets::FACET_TAG_CLOUD) { - item = tagCloudPresenter->getModel()->itemFromIndex(index); - } else { - item = dashboardPresenter->getTagsPresenter()->getModel()->itemFromIndex(index); - } + QStandardItem* item = tagCloudPresenter->getModel()->itemFromIndex(index); // TODO introduce name my user role - replace constant with my enum name > do it for whole file e.g. MfDataRole const Tag* tag = item->data(Qt::UserRole + 1).value(); mainPresenter->doTriggerFindNoteByTag(tag); @@ -1004,26 +936,14 @@ void OrlojPresenter::slotGetLinksForPattern(const QString& pattern) void OrlojPresenter::slotShowSelectedRecentNote() { - if(activeFacet == OrlojPresenterFacets::FACET_RECENT_NOTES - || - activeFacet == OrlojPresenterFacets::FACET_DASHBOARD - ) - { - int row; - if(activeFacet==OrlojPresenterFacets::FACET_DASHBOARD) { - row = dashboardPresenter->getRecentNotesPresenter()->getCurrentRow(); - } else { - row = recentNotesTablePresenter->getCurrentRow(); - } + if(activeFacet == OrlojPresenterFacets::FACET_RECENT_NOTES) { + int row = recentNotesTablePresenter->getCurrentRow(); if(row != RecentNotesTablePresenter::NO_ROW) { QStandardItem* item; switch(activeFacet) { case OrlojPresenterFacets::FACET_RECENT_NOTES: item = recentNotesTablePresenter->getModel()->item(row); break; - case OrlojPresenterFacets::FACET_DASHBOARD: - item = dashboardPresenter->getRecentNotesPresenter()->getModel()->item(row); - break; default: item = nullptr; } @@ -1051,20 +971,11 @@ void OrlojPresenter::slotShowRecentNote(const QItemSelection& selected, const QI { Q_UNUSED(deselected); - if(activeFacet == OrlojPresenterFacets::FACET_RECENT_NOTES - || - activeFacet == OrlojPresenterFacets::FACET_DASHBOARD - ) - { + if(activeFacet == OrlojPresenterFacets::FACET_RECENT_NOTES) { QModelIndexList indices = selected.indexes(); if(indices.size()) { const QModelIndex& index = indices.at(0); - QStandardItem* item; - if(activeFacet == OrlojPresenterFacets::FACET_RECENT_NOTES) { - item = recentNotesTablePresenter->getModel()->itemFromIndex(index); - } else { - item = dashboardPresenter->getRecentNotesPresenter()->getModel()->itemFromIndex(index); - } + QStandardItem* item = recentNotesTablePresenter->getModel()->itemFromIndex(index); // TODO make my role constant const Note* note = item->data(Qt::UserRole + 1).value(); diff --git a/app/src/qt/orloj_presenter.h b/app/src/qt/orloj_presenter.h index 5383d096..b46edf57 100644 --- a/app/src/qt/orloj_presenter.h +++ b/app/src/qt/orloj_presenter.h @@ -27,7 +27,6 @@ #include #include "orloj_view.h" -#include "dashboard_presenter.h" #include "organizers_table_presenter.h" #include "organizer_presenter.h" #include "kanban_presenter.h" @@ -46,7 +45,6 @@ namespace m8r { -class DashboardPresenter; class OrganizersTablePresenter; class OrganizerPresenter; class KanbanPresenter; @@ -73,10 +71,9 @@ enum OrlojPresenterFacets { FACET_TAG_CLOUD, // 9 FACET_RECENT_NOTES, // 10 FACET_NAVIGATOR, // 11 - FACET_DASHBOARD, // 12 - FACET_LIST_ORGANIZERS, // 13 - FACET_KANBAN, // 14 - FACET_MAP_OUTLINES // 15 + FACET_LIST_ORGANIZERS, // 12 + FACET_KANBAN, // 13 + FACET_MAP_OUTLINES // 14 }; // aspect modifies facet @@ -110,7 +107,6 @@ class OrlojPresenter : public QObject Configuration& config; Mind* mind; - DashboardPresenter* dashboardPresenter; OrganizersTablePresenter* organizersTablePresenter; OrganizerPresenter* organizerPresenter; KanbanPresenter* kanbanPresenter; @@ -136,7 +132,6 @@ class OrlojPresenter : public QObject Mind* getMind() { return mind; } OrlojView* getView() const { return view; } - DashboardPresenter* getDashboard() const { return dashboardPresenter; } OrganizerPresenter* getOrganizer() const { return organizerPresenter; } KanbanPresenter* getKanban() const { return kanbanPresenter; } NavigatorPresenter* getNavigator() const { return navigatorPresenter; } @@ -189,7 +184,6 @@ class OrlojPresenter : public QObject */ void onFacetChange(const OrlojPresenterFacets targetFacet) const; - void showFacetDashboard(); void showFacetOrganizerList(const std::vector& organizers); void showFacetEisenhowerMatrix( Organizer* organizer, diff --git a/app/src/qt/orloj_view.cpp b/app/src/qt/orloj_view.cpp index a715a8f0..4ebcdc07 100644 --- a/app/src/qt/orloj_view.cpp +++ b/app/src/qt/orloj_view.cpp @@ -25,9 +25,6 @@ using namespace std; OrlojView::OrlojView(QWidget* parent) : QSplitter(Qt::Horizontal, parent) { - dashboard = new DashboardView(this); - addWidget(dashboard); - organizersTable = new OrganizersTableView(this); addWidget(organizersTable); @@ -100,12 +97,6 @@ void OrlojView::fiftyFifty() setSizes(sizes); } -void OrlojView::showFacetDashboard() -{ - QSet v; v << dashboard; - hideChildren(v); -} - void OrlojView::showFacetOrganizers() { QSet v; v << organizersTable; diff --git a/app/src/qt/orloj_view.h b/app/src/qt/orloj_view.h index 6ce5c32a..fe5c90f0 100644 --- a/app/src/qt/orloj_view.h +++ b/app/src/qt/orloj_view.h @@ -21,7 +21,6 @@ #include -#include "dashboard_view.h" #include "organizers_table_view.h" #include "organizer_view.h" #include "kanban_view.h" @@ -62,7 +61,6 @@ class OrlojView : public QSplitter Q_OBJECT private: - DashboardView* dashboard; OrganizersTableView* organizersTable; OrganizerView* organizer; KanbanView* kanban; @@ -87,7 +85,6 @@ class OrlojView : public QSplitter OrlojView &operator=(const OrlojView&&) = delete; virtual ~OrlojView() {}; - DashboardView* getDashboard() const { return dashboard; } OrganizerView* getOrganizer() const { return organizer; } OrganizersTableView* getOrganizersTable() const { return organizersTable; } KanbanView* getKanban() const { return kanban; } @@ -105,11 +102,6 @@ class OrlojView : public QSplitter void setMainMenu(MainMenuView* menuView) { this->menuView=menuView; } - /** - * @brief Dashboard - */ - void showFacetDashboard(); - /** * @brief List of Organizers */ diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h index ba7f5b6d..d54a3cce 100644 --- a/lib/src/config/configuration.h +++ b/lib/src/config/configuration.h @@ -66,7 +66,6 @@ constexpr const auto UI_THEME_BLACK_WITH_FIXED_FONT = "black with fixed font"; constexpr const auto UI_THEME_NATIVE = "native"; constexpr const auto UI_THEME_NATIVE_WITH_FIXED_FONT = "native with fixed font"; -constexpr const auto START_TO_DASHBOARD = "dashboard"; constexpr const auto START_TO_OUTLINES_TREE = "outlines tree"; constexpr const auto START_TO_OUTLINES = "outlines"; constexpr const auto START_TO_TAGS = "tags"; From 2c06d2a8f0fcea310e69adae030d0e6dba2eef25 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Mon, 8 Jan 2024 23:09:06 +0100 Subject: [PATCH 076/131] Removing Mitie and NER which resolves #1522 --- .gitmodules | 3 - app/app.pro | 32 ---- .../dialogs/ner_choose_tag_types_dialog.cpp | 84 --------- .../qt/dialogs/ner_choose_tag_types_dialog.h | 72 ------- app/src/qt/dialogs/ner_result_dialog.cpp | 118 ------------ app/src/qt/dialogs/ner_result_dialog.h | 68 ------- app/src/qt/dialogs/wingman_dialog.cpp | 1 + app/src/qt/main_menu_presenter.cpp | 6 - app/src/qt/main_menu_view.cpp | 21 --- app/src/qt/main_menu_view.h | 6 - app/src/qt/main_window_presenter.cpp | 170 +---------------- app/src/qt/main_window_presenter.h | 29 --- app/src/qt/ner_leaderboard_model.cpp | 109 ----------- app/src/qt/ner_leaderboard_model.h | 46 ----- app/src/qt/ner_leaderboard_view.cpp | 61 ------ app/src/qt/ner_leaderboard_view.h | 44 ----- app/src/qt/ner_main_window_worker_thread.cpp | 38 ---- app/src/qt/ner_main_window_worker_thread.h | 91 --------- deps/mitie | 1 - lib/lib.pro | 21 --- lib/src/mind/ai/ai.cpp | 9 - lib/src/mind/ai/ai.h | 33 ---- .../mind/ai/nlp/named_entity_recognition.cpp | 178 ------------------ .../mind/ai/nlp/named_entity_recognition.h | 89 --------- lib/src/mind/ai/nlp/ner_named_entity.cpp | 22 --- lib/src/mind/ai/nlp/ner_named_entity.h | 47 ----- lib/src/mind/mind.cpp | 17 -- lib/src/mind/mind.h | 14 -- mindforger.pro | 2 - 29 files changed, 2 insertions(+), 1430 deletions(-) delete mode 100644 app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp delete mode 100644 app/src/qt/dialogs/ner_choose_tag_types_dialog.h delete mode 100644 app/src/qt/dialogs/ner_result_dialog.cpp delete mode 100644 app/src/qt/dialogs/ner_result_dialog.h delete mode 100644 app/src/qt/ner_leaderboard_model.cpp delete mode 100644 app/src/qt/ner_leaderboard_model.h delete mode 100644 app/src/qt/ner_leaderboard_view.cpp delete mode 100644 app/src/qt/ner_leaderboard_view.h delete mode 100644 app/src/qt/ner_main_window_worker_thread.cpp delete mode 100644 app/src/qt/ner_main_window_worker_thread.h delete mode 160000 deps/mitie delete mode 100644 lib/src/mind/ai/nlp/named_entity_recognition.cpp delete mode 100644 lib/src/mind/ai/nlp/named_entity_recognition.h delete mode 100644 lib/src/mind/ai/nlp/ner_named_entity.cpp delete mode 100644 lib/src/mind/ai/nlp/ner_named_entity.h diff --git a/.gitmodules b/.gitmodules index 5402d0a8..ad167075 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "doc"] path = doc url = https://github.com/dvorka/mindforger-repository.git -[submodule "deps/mitie"] - path = deps/mitie - url = https://github.com/dvorka/MITIE.git [submodule "deps/cmark-gfm"] path = deps/cmark-gfm url = https://github.com/dvorka/cmark.git diff --git a/app/app.pro b/app/app.pro index f3df8237..0c5da17c 100644 --- a/app/app.pro +++ b/app/app.pro @@ -58,15 +58,6 @@ mfoldhunspell | equals(OS_DISTRO_VERSION, "Windows") | equals(OS_DISTRO_VERSION, message("Hunspell: configuring use of NEW API on OS: $$OS_DISTRO_VERSION") } -mfllamacpp { - DEFINES += MF_LLAMA_CPP -} - -# Named Entity Recognition -mfner { - DEFINES += MF_NER -} - # webkit is supposed to be OBSOLETED by webengine, but webengine is disabled # on Linux since Qt 5.9 due to its tragic performance -> conditional compilation # seems to be the only way: @@ -127,12 +118,6 @@ win32 { } } -# NER library -mfner { - # MF links MITIE for AI/NLP/DL - LIBS += -L$$OUT_PWD/../deps/mitie/mitielib -lmitie -} - # Zlib win32 { INCLUDEPATH += $$PWD/../deps/zlib-win/include @@ -337,14 +322,6 @@ HEADERS += \ win32|macx|mfwebengine { HEADERS += ./src/qt/web_engine_page_link_navigation_policy.h } -mfner { - HEADERS += \ - src/qt/dialogs/ner_choose_tag_types_dialog.h \ - src/qt/dialogs/ner_result_dialog.h \ - src/qt/ner_leaderboard_model.h \ - src/qt/ner_leaderboard_view.h \ - src/qt/ner_main_window_worker_thread.h -} SOURCES += \ ./src/qt/mindforger.cpp \ @@ -463,15 +440,6 @@ win32|macx|mfwebengine { SOURCES += ./src/qt/web_engine_page_link_navigation_policy.cpp } -mfner { - SOURCES += \ - src/qt/dialogs/ner_choose_tag_types_dialog.cpp \ - src/qt/dialogs/ner_result_dialog.cpp \ - src/qt/ner_leaderboard_model.cpp \ - src/qt/ner_leaderboard_view.cpp \ - src/qt/ner_main_window_worker_thread.cpp -} - win32 { HEADERS += \ ../deps/getopt/getopt.h diff --git a/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp b/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp deleted file mode 100644 index fab55896..00000000 --- a/app/src/qt/dialogs/ner_choose_tag_types_dialog.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - ner_choose_tag_types_dialog.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "ner_choose_tag_types_dialog.h" - -namespace m8r { - -NerChooseTagTypesDialog::NerChooseTagTypesDialog(QWidget* parent) - : QDialog(parent) -{ - // widgets - label = new QLabel{tr("Choose entity types to be extracted:")}; - - personsCheckBox = new QCheckBox{tr("persons")}; - locationsCheckBox = new QCheckBox{tr("locations")}; - organizationsCheckBox = new QCheckBox{tr("organizations")}; - miscCheckBox = new QCheckBox{tr("other entities")}; - - chooseButton = new QPushButton{tr("&Choose")}; - chooseButton->setDefault(true); - - closeButton = new QPushButton{tr("&Cancel")}; - - // signals - connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); - connect(personsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotChooseButtonEnable(int))); - connect(locationsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotChooseButtonEnable(int))); - connect(organizationsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotChooseButtonEnable(int))); - connect(miscCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotChooseButtonEnable(int))); - - // assembly - QVBoxLayout* mainLayout = new QVBoxLayout{}; - mainLayout->addWidget(label); - mainLayout->addWidget(personsCheckBox); - mainLayout->addWidget(locationsCheckBox); - mainLayout->addWidget(organizationsCheckBox); - mainLayout->addWidget(miscCheckBox); - - QHBoxLayout* buttonLayout = new QHBoxLayout{}; - buttonLayout->addStretch(1); - buttonLayout->addWidget(closeButton); - buttonLayout->addWidget(chooseButton); - buttonLayout->addStretch(); - - mainLayout->addLayout(buttonLayout); - setLayout(mainLayout); - - // dialog - setWindowTitle(tr("Choose Entity Type")); - resize(fontMetrics().averageCharWidth()*35, height()); - setModal(true); -} - -NerChooseTagTypesDialog::~NerChooseTagTypesDialog() -{ -} - -void NerChooseTagTypesDialog::slotChooseButtonEnable(int state) -{ - UNUSED_ARG(state); - - if(personsCheckBox->isChecked() || locationsCheckBox->isChecked() || organizationsCheckBox->isChecked() || miscCheckBox->isChecked()) { - chooseButton->setEnabled(true); - } else { - chooseButton->setEnabled(false); - } -} - -} // m8r namespace diff --git a/app/src/qt/dialogs/ner_choose_tag_types_dialog.h b/app/src/qt/dialogs/ner_choose_tag_types_dialog.h deleted file mode 100644 index 9c56248e..00000000 --- a/app/src/qt/dialogs/ner_choose_tag_types_dialog.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - ner_choose_tag_types_dialog.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8RUI_NER_CHOOSE_TAG_TYPES_DIALOG_H -#define M8RUI_NER_CHOOSE_TAG_TYPES_DIALOG_H - -#include - -#include "../../lib/src/gear/lang_utils.h" -#include "../../lib/src/debug.h" - -namespace m8r { - -class NerChooseTagTypesDialog : public QDialog -{ - Q_OBJECT - -private: - QLabel* label; - // IMPROVE tag types are hardcoded - allow loading them dynamically for generic NER models - QCheckBox* personsCheckBox; - QCheckBox* locationsCheckBox; - QCheckBox* organizationsCheckBox; - QCheckBox* miscCheckBox; - QPushButton* chooseButton; - QPushButton* closeButton; - -public: - explicit NerChooseTagTypesDialog(QWidget* parent); - NerChooseTagTypesDialog(const NerChooseTagTypesDialog&) = delete; - NerChooseTagTypesDialog(const NerChooseTagTypesDialog&&) = delete; - NerChooseTagTypesDialog &operator=(const NerChooseTagTypesDialog&) = delete; - NerChooseTagTypesDialog &operator=(const NerChooseTagTypesDialog&&) = delete; - ~NerChooseTagTypesDialog(); - - void clearCheckboxes() { - personsCheckBox->setChecked(false); - locationsCheckBox->setChecked(false); - organizationsCheckBox->setChecked(false); - miscCheckBox->setChecked(false); - } - - QCheckBox* getPersonsCheckbox() const { return personsCheckBox; } - QCheckBox* getLocationsCheckbox() const { return locationsCheckBox; } - QCheckBox* getOrganizationsCheckbox() const { return organizationsCheckBox; } - QCheckBox* getMiscCheckbox() const { return miscCheckBox; } - - QPushButton* getChooseButton() const { return chooseButton; } - - void show() { slotChooseButtonEnable(0); QDialog::show(); } - -private slots: - void slotChooseButtonEnable(int); -}; - -} -#endif // M8RUI_NER_CHOOSE_TAG_TYPES_DIALOG_H diff --git a/app/src/qt/dialogs/ner_result_dialog.cpp b/app/src/qt/dialogs/ner_result_dialog.cpp deleted file mode 100644 index c02862f9..00000000 --- a/app/src/qt/dialogs/ner_result_dialog.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - ner_result_dialog.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "ner_result_dialog.h" - -namespace m8r { - -using namespace std; - -NerResultDialog::NerResultDialog(QWidget* parent) - : QDialog(parent) -{ - // widgets - leaderboardModel = new NerLeaderboardModel(this); - leaderboardView = new NerLeaderboardView(this); - leaderboardView->setModel(leaderboardModel); - - label = new QLabel{tr("Recognized named entities:")}; - - findButton = new QPushButton{tr("&Find Entity in Notes")}; - findButton->setDefault(true); - findButton->setEnabled(false); - - closeButton = new QPushButton{tr("&Cancel")}; - - // signals - QObject::connect(findButton, SIGNAL(clicked()), this, SLOT(handleChoice())); - QObject::connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); - QObject::connect( - leaderboardView->selectionModel(), - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(slotRowSelected(const QItemSelection&, const QItemSelection&))); - - // assembly - QVBoxLayout *mainLayout = new QVBoxLayout{}; - mainLayout->addWidget(label); - mainLayout->addWidget(leaderboardView); - - QHBoxLayout *buttonLayout = new QHBoxLayout{}; - buttonLayout->addStretch(1); - buttonLayout->addWidget(closeButton); - buttonLayout->addWidget(findButton); - buttonLayout->addStretch(); - - mainLayout->addLayout(buttonLayout); - setLayout(mainLayout); - - // dialog - setWindowTitle(tr("Find Named Entities")); - // height is set to make sure listview gets enough lines - resize(fontMetrics().averageCharWidth()*75, fontMetrics().height()*30); - setModal(true); -} - -NerResultDialog::~NerResultDialog() -{ - delete label; - delete leaderboardView; - delete leaderboardModel; - delete closeButton; -} - -void NerResultDialog::show(std::vector& entities) -{ - choice.clear(); - leaderboardModel->removeAllRows(); - - if(entities.size()) { - for(NerNamedEntity& e:entities) { - leaderboardModel->addRow(e.name, e.type, e.score); - } - } - - QDialog::show(); - - leaderboardView->sortByColumn(2, Qt::SortOrder::DescendingOrder); -} - -void NerResultDialog::handleChoice() -{ - QDialog::close(); - emit choiceFinished(); -} - -void NerResultDialog::slotRowSelected(const QItemSelection& selected, const QItemSelection& deselected) -{ - Q_UNUSED(deselected); - - QModelIndexList indices = selected.indexes(); - if(indices.size()) { - const QModelIndex& index = indices.at(0); - QStandardItem* item = leaderboardModel->itemFromIndex(index); - choice = item->text().toStdString(); - if(choice.size()) { - findButton->setEnabled(true); - } else { - findButton->setEnabled(false); - } - } -} - -} // m8r namespace diff --git a/app/src/qt/dialogs/ner_result_dialog.h b/app/src/qt/dialogs/ner_result_dialog.h deleted file mode 100644 index 5713251d..00000000 --- a/app/src/qt/dialogs/ner_result_dialog.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - ner_result_dialog.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8RUI_NER_RESULT_DIALOG_H -#define M8RUI_NER_RESULT_DIALOG_H - -#include - -#include "../../../../lib/src/mind/ai/nlp/ner_named_entity.h" - -#include "../ner_leaderboard_model.h" -#include "../ner_leaderboard_view.h" - -#include "../../../../lib/src/debug.h" - -namespace m8r { - -class NerResultDialog : public QDialog -{ - Q_OBJECT - -private: - std::string choice; - - QLabel* label; - NerLeaderboardModel* leaderboardModel; - NerLeaderboardView* leaderboardView; - QPushButton* closeButton; - QPushButton* findButton; - -public: - explicit NerResultDialog(QWidget* parent); - NerResultDialog(const NerResultDialog&) = delete; - NerResultDialog(const NerResultDialog&&) = delete; - NerResultDialog &operator=(const NerResultDialog&) = delete; - NerResultDialog &operator=(const NerResultDialog&&) = delete; - ~NerResultDialog(); - - QPushButton* getFindButton() const { return findButton; } - std::string getChoice() const { return choice; } - - void show(std::vector& entities); - -signals: - void choiceFinished(); - -private slots: - void handleChoice(); - void slotRowSelected(const QItemSelection& selected, const QItemSelection& deselected); -}; - -} -#endif // M8RUI_NER_RESULT_DIALOG_H diff --git a/app/src/qt/dialogs/wingman_dialog.cpp b/app/src/qt/dialogs/wingman_dialog.cpp index 8fb2df1a..80de6716 100644 --- a/app/src/qt/dialogs/wingman_dialog.cpp +++ b/app/src/qt/dialogs/wingman_dialog.cpp @@ -44,6 +44,7 @@ const vector WingmanDialog::notePrompts( QString{"Rewrite to be funny."}, QString{"Chat with the content."}, // other UCs: + // - NER UCs // - simplify // - beautify // - translate diff --git a/app/src/qt/main_menu_presenter.cpp b/app/src/qt/main_menu_presenter.cpp index 0e9d5579..608383c8 100644 --- a/app/src/qt/main_menu_presenter.cpp +++ b/app/src/qt/main_menu_presenter.cpp @@ -85,12 +85,6 @@ MainMenuPresenter::MainMenuPresenter(MainWindowPresenter* mwp) QObject::connect(view->actionFindNoteByName, SIGNAL(triggered()), mwp, SLOT(doActionFindNoteByName())); QObject::connect(view->actionFindOutlineByTag, SIGNAL(triggered()), mwp, SLOT(doActionFindOutlineByTag())); QObject::connect(view->actionFindNoteByTag, SIGNAL(triggered()), mwp, SLOT(doActionFindNoteByTag())); -#ifdef MF_NER - QObject::connect(view->actionFindNerPersons, SIGNAL(triggered()), mwp, SLOT(doActionFindNerPersons())); - QObject::connect(view->actionFindNerLocations, SIGNAL(triggered()), mwp, SLOT(doActionFindNerLocations())); - QObject::connect(view->actionFindNerOrganizations, SIGNAL(triggered()), mwp, SLOT(doActionFindNerOrganizations())); - QObject::connect(view->actionFindNerMisc, SIGNAL(triggered()), mwp, SLOT(doActionFindNerMisc())); -#endif // menu: view QObject::connect( diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index 415a6840..d3fe51b8 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -206,20 +206,6 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionFindDocByName->setStatusTip(tr("Find Document by name")); #endif -#ifdef MF_NER - actionFindNerPersons = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall &Persons"), mainWindow); - actionFindNerPersons->setStatusTip(tr("Find persons using Named-entity recognition (NER)")); - - actionFindNerLocations = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall &Locations"), mainWindow); - actionFindNerLocations->setStatusTip(tr("Find locations using Named-entity recognition (NER)")); - - actionFindNerOrganizations = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall Organizations"), mainWindow); - actionFindNerOrganizations->setStatusTip(tr("Find organizations using Named-entity recognition (NER)")); - - actionFindNerMisc = new QAction(QIcon(":/menu-icons/find.svg"), tr("Recall Other Entities"), mainWindow); - actionFindNerMisc->setStatusTip(tr("Find miscellaneous entities using Named-entity recognition (NER)")); -#endif - menuFind = qMenuBar->addMenu(tr("&Recall")); menuFind->addAction(actionFindFts); menuFind->addAction(actionFindOutlineByName); @@ -229,13 +215,6 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) #ifdef MF_WIP menuFind->addAction(actionFindDocByName); #endif -#ifdef MF_NER - menuFind->addSeparator(); - menuFind->addAction(actionFindNerPersons); - menuFind->addAction(actionFindNerLocations); - menuFind->addAction(actionFindNerOrganizations); - menuFind->addAction(actionFindNerMisc); -#endif // menu: view diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h index caf8e8fb..ad29635d 100644 --- a/app/src/qt/main_menu_view.h +++ b/app/src/qt/main_menu_view.h @@ -96,12 +96,6 @@ class MainMenuView : public QObject #ifdef MF_WIP QAction* actionFindDocByName; #endif -#ifdef MF_NER - QAction* actionFindNerPersons; - QAction* actionFindNerLocations; - QAction* actionFindNerOrganizations; - QAction* actionFindNerMisc; -#endif // menu: View QAction* actionViewHome; diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 65240f8a..9d071a8c 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -93,10 +93,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) QString::fromStdString(File::EXTENSION_CSV), &view ); -#ifdef MF_NER - nerChooseTagsDialog = new NerChooseTagTypesDialog(&view); - nerResultDialog = new NerResultDialog(&view); -#endif + // show/hide widgets based on configuration handleMindPreferences(); @@ -249,21 +246,11 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) this, SLOT(slotMainToolbarVisibilityChanged(bool)) ); - -#ifdef MF_NER - QObject::connect(nerChooseTagsDialog->getChooseButton(), SIGNAL(clicked()), this, SLOT(handleFindNerEntities())); - QObject::connect(nerResultDialog, SIGNAL(choiceFinished()), this, SLOT(handleFtsNerEntity())); -#endif - // async task 2 GUI events distributor distributor = new AsyncTaskNotificationsDistributor(this); // setup callback for cleanup when it finishes QObject::connect(distributor, SIGNAL(finished()), distributor, SLOT(deleteLater())); distributor->start(); -#ifdef MF_NER - // NER worker - nerWorker = nullptr; -#endif // send signal to components to be updated on a configuration change QObject::connect(configDialog, SIGNAL(saveConfigSignal()), this, SLOT(handleMindPreferences())); @@ -1112,161 +1099,6 @@ void MainWindowPresenter::handleFindNoteByName() } } -#ifdef MF_NER - -void MainWindowPresenter::doActionFindNerPersons() -{ - if(orloj->isFacetActiveOutlineManagement()) { - nerChooseTagsDialog->clearCheckboxes(); - nerChooseTagsDialog->getPersonsCheckbox()->setChecked(true); - nerChooseTagsDialog->show(); - } else { - statusBar->showInfo(tr("Initializing NER and predicting...")); - QMessageBox::critical(&view, tr("NER"), tr("Memory NER not implemented yet.")); - } -} -void MainWindowPresenter::doActionFindNerLocations() -{ - if(orloj->isFacetActiveOutlineManagement()) { - nerChooseTagsDialog->clearCheckboxes(); - nerChooseTagsDialog->getLocationsCheckbox()->setChecked(true); - nerChooseTagsDialog->show(); - } else { - statusBar->showInfo(tr("Initializing NER and predicting...")); - QMessageBox::critical(&view, tr("NER"), tr("Memory NER not implemented yet.")); - } -} -void MainWindowPresenter::doActionFindNerOrganizations() -{ - if(orloj->isFacetActiveOutlineManagement()) { - nerChooseTagsDialog->clearCheckboxes(); - nerChooseTagsDialog->getOrganizationsCheckbox()->setChecked(true); - nerChooseTagsDialog->show(); - } else { - statusBar->showInfo(tr("Initializing NER and predicting...")); - QMessageBox::critical(&view, tr("NER"), tr("Memory NER not implemented yet.")); - } -} -void MainWindowPresenter::doActionFindNerMisc() -{ - if(orloj->isFacetActiveOutlineManagement()) { - nerChooseTagsDialog->clearCheckboxes(); - nerChooseTagsDialog->getMiscCheckbox()->setChecked(true); - nerChooseTagsDialog->show(); - } else { - statusBar->showInfo(tr("Initializing NER and predicting...")); - QMessageBox::critical(&view, tr("NER"), tr("Memory NER not implemented yet.")); - } -} - -NerMainWindowWorkerThread* MainWindowPresenter::startNerWorkerThread( - Mind* m, - OrlojPresenter* o, - int f, - std::vector* r, - QDialog* d) -{ - QThread* thread = new QThread; - NerMainWindowWorkerThread* worker - = new NerMainWindowWorkerThread(thread, m, o, f, r, d); - - // signals - worker->moveToThread(thread); - // TODO implement dialog w/ error handling - QObject::connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString))); - QObject::connect(thread, SIGNAL(started()), worker, SLOT(process())); - // open dialog to choose from result(s) - QObject::connect(worker, SIGNAL(finished()), this, SLOT(handleChooseNerEntityResult())); - // worker's finished signal quits thread ~ thread CANNOT be reused - QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit())); - // schedule thread for automatic deletion by Qt - I delete worker myself - //QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater())); - QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); - - thread->start(); - - return worker; -} - -// handleFindNerPerson() -> handleChooseNerEntityResult() -> handleFtsNerEntity() -void MainWindowPresenter::handleFindNerEntities() -{ - nerChooseTagsDialog->hide(); - - int entityFilter{}; - entityFilter = - (nerChooseTagsDialog->getPersonsCheckbox()->isChecked()?NerNamedEntityType::PERSON:0) | - (nerChooseTagsDialog->getLocationsCheckbox()->isChecked()?NerNamedEntityType::LOCATION:0) | - (nerChooseTagsDialog->getOrganizationsCheckbox()->isChecked()?NerNamedEntityType::ORGANIZATION:0) | - (nerChooseTagsDialog->getMiscCheckbox()->isChecked()?NerNamedEntityType::MISC:0); - - MF_DEBUG("Named-entity type filter: " << entityFilter << endl); - - vector* result - = new vector{}; - if(mind->isNerInitilized()) { - statusBar->showInfo(tr("Recognizing named entities...")); - - mind->recognizePersons(orloj->getOutlineView()->getCurrentOutline(), entityFilter, *result); - - chooseNerEntityResult(result); - } else { - statusBar->showInfo(tr("Initializing NER and recognizing named entities...")); - - // launch async worker - QDialog* progressDialog - = new QDialog{&view}; - nerWorker - = startNerWorkerThread(mind, orloj, entityFilter, result, progressDialog); - - // show PROGRESS dialog - will be closed by worker - QVBoxLayout* mainLayout = new QVBoxLayout{}; - QLabel* l = new QLabel{tr(" Initializing (the first run only) NER and predicting... ")}; - mainLayout->addWidget(l); - progressDialog->setLayout(mainLayout); - progressDialog->setWindowTitle(tr("Named-entity Recognition")); - //progressDialog->resize(fontMetrics().averageCharWidth()*35, height()); - //progressDialog->setModal(true); - progressDialog->update(); - progressDialog->activateWindow(); - progressDialog->show(); - // dialog is deleted by worker thread - } -} - -void MainWindowPresenter::chooseNerEntityResult(vector* nerEntities) -{ - MF_DEBUG("Showing NER results to choose one entity for FTS..." << endl); - statusBar->showInfo(tr("NER predicition finished")); - - if(nerEntities && nerEntities->size()) { - nerResultDialog->show(*nerEntities); - } else { - QMessageBox::information(&view, tr("Named-entity Recognition"), tr("No named entities recognized.")); - } -} - -void MainWindowPresenter::handleChooseNerEntityResult() -{ - vector* nerEntities = nerWorker->getResult(); - chooseNerEntityResult(nerEntities); - - // cleanup: thread is deleted by Qt (deleteLater() signal) - delete nerEntities; - delete nerWorker; -} - -void MainWindowPresenter::handleFtsNerEntity() -{ - if(nerResultDialog->getChoice().size()) { - executeFts( - nerResultDialog->getChoice(), - false, - orloj->getOutlineView()->getCurrentOutline()); - } -} - -#endif - void MainWindowPresenter::doActionViewRecentNotes() { vector notes{}; diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index 8c6c567b..47bc6a1d 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -30,9 +30,6 @@ #include "main_menu_presenter.h" #include "gear/async_task_notifications_distributor.h" -#ifdef MF_NER - #include "ner_main_window_worker_thread.h" -#endif #include "cli_n_breadcrumbs_presenter.h" #include "orloj_presenter.h" #include "status_bar_presenter.h" @@ -61,8 +58,6 @@ #include "dialogs/terminal_dialog.h" #include "dialogs/export_csv_file_dialog.h" #include "dialogs/export_file_dialog.h" -#include "dialogs/ner_choose_tag_types_dialog.h" -#include "dialogs/ner_result_dialog.h" #include #include @@ -108,9 +103,6 @@ class MainWindowPresenter : public QObject Mind* mind; AsyncTaskNotificationsDistributor* distributor; -#ifdef MF_NER - NerMainWindowWorkerThread* nerWorker; -#endif MarkdownOutlineRepresentation* mdRepresentation; HtmlOutlineRepresentation* htmlRepresentation; @@ -149,8 +141,6 @@ class MainWindowPresenter : public QObject NewFileDialog* newFileDialog; ExportFileDialog* exportOutlineToHtmlDialog; ExportCsvFileDialog* exportMemoryToCsvDialog; - NerChooseTagTypesDialog *nerChooseTagsDialog; - NerResultDialog* nerResultDialog; public: explicit MainWindowPresenter(MainWindowView& view); @@ -183,15 +173,6 @@ class MainWindowPresenter : public QObject // N view void handleNoteViewLinkClicked(const QUrl& url); - // NER - NerMainWindowWorkerThread* startNerWorkerThread( - Mind* m, - OrlojPresenter* o, - int f, - std::vector* r, - QDialog* d - ); - public slots: // mind #ifdef DO_MF_DEBUG @@ -231,16 +212,6 @@ public slots: void doTriggerFindNoteByTag(const m8r::Tag* tag); void doSwitchFindByTagDialog(bool toFindNotesByTag); void handleFindNoteByTag(); -#ifdef MF_NER - void doActionFindNerPersons(); - void doActionFindNerLocations(); - void doActionFindNerOrganizations(); - void doActionFindNerMisc(); - void handleFindNerEntities(); - void chooseNerEntityResult(vector*); - void handleChooseNerEntityResult(); - void handleFtsNerEntity(); -#endif // view void sortAndSaveOrganizersConfig(); void doActionViewOrganizers(); diff --git a/app/src/qt/ner_leaderboard_model.cpp b/app/src/qt/ner_leaderboard_model.cpp deleted file mode 100644 index 0fe62020..00000000 --- a/app/src/qt/ner_leaderboard_model.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - ner_leaderboard_model.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "ner_leaderboard_model.h" - -namespace m8r { - -using namespace std; - -NerLeaderboardModel::NerLeaderboardModel(QWidget* parent) - : QStandardItemModel(parent) -{ - setColumnCount(3); - setRowCount(0); -} - -NerLeaderboardModel::~NerLeaderboardModel() -{ -} - -void NerLeaderboardModel::removeAllRows() -{ - QStandardItemModel::clear(); - - QStringList tableHeader; - tableHeader - << tr("Name") - << tr("Type") - << tr("Score"); - - // IMPROVE set tooltips: items w/ tooltips instead of just strings - setHorizontalHeaderLabels(tableHeader); -} - -void NerLeaderboardModel::addRow(string& entityName, NerNamedEntityType entityType, float score) -{ - QList items; - QStandardItem* item; - - QString html{}; - html += QString::fromStdString(entityName); - - // item - item = new QStandardItem(html); - item->setToolTip(html); - items += item; - - html.clear(); - switch(entityType) { - case NerNamedEntityType::PERSON: - html += tr("person"); - break; - case NerNamedEntityType::LOCATION: - html += tr("location"); - break; - case NerNamedEntityType::ORGANIZATION: - html += tr("organization"); - break; - case NerNamedEntityType::MISC: - html += tr("misc"); - break; - } - - item = new QStandardItem(html); - item->setToolTip(html); - items += item; - - html.clear(); - if(score>0.29) { - html += ""; - } - score = ROUND_FLOAT(score, 1000); - html += QString::number(score); - if(score>0.29) { - html += ""; - } - item = new QStandardItem(html); - item->setData(QVariant::fromValue(score)); - items += item; - - appendRow(items); -} - -} // m8r namespace diff --git a/app/src/qt/ner_leaderboard_model.h b/app/src/qt/ner_leaderboard_model.h deleted file mode 100644 index b95b2e7d..00000000 --- a/app/src/qt/ner_leaderboard_model.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - ner_leaderboard_model.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8RUI_NER_LEADERBOARD_MODEL_H -#define M8RUI_NER_LEADERBOARD_MODEL_H - -#include - -#include "../../../lib/src/mind/ai/nlp/ner_named_entity.h" -#include "../../../lib/src/gear/lang_utils.h" - -namespace m8r { - -class NerLeaderboardModel : public QStandardItemModel -{ - Q_OBJECT - -public: - explicit NerLeaderboardModel(QWidget* parent); - NerLeaderboardModel(const NerLeaderboardModel&) = delete; - NerLeaderboardModel(const NerLeaderboardModel&&) = delete; - NerLeaderboardModel &operator=(const NerLeaderboardModel&) = delete; - NerLeaderboardModel &operator=(const NerLeaderboardModel&&) = delete; - ~NerLeaderboardModel(); - - void removeAllRows(); - void addRow(std::string& entityName, NerNamedEntityType entityType, float score); -}; - -} -#endif // M8RUI_NER_LEADERBOARD_MODEL_H diff --git a/app/src/qt/ner_leaderboard_view.cpp b/app/src/qt/ner_leaderboard_view.cpp deleted file mode 100644 index 0009011f..00000000 --- a/app/src/qt/ner_leaderboard_view.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - ner_leaderboard_view.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "ner_leaderboard_view.h" - -namespace m8r { - -NerLeaderboardView::NerLeaderboardView(QWidget* parent) - : QTableView(parent) -{ - verticalHeader()->setVisible(false); - // BEFARE this kills performance: verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); - - // IMPORTANT this must b in constructors - causes CPU high consuption loop if in an event handler - verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); - - setSortingEnabled(true); - - setEditTriggers(QAbstractItemView::NoEditTriggers); - setSelectionBehavior(QAbstractItemView::SelectRows); - setSelectionMode(QAbstractItemView::SingleSelection); - - // ensure HTML cells rendering - HtmlDelegate* delegate = new HtmlDelegate(); - setItemDelegate(delegate); -} - -void NerLeaderboardView::resizeEvent(QResizeEvent* event) -{ - MF_DEBUG("NerLeaderboardView::resizeEvent " << event << std::endl); - - if(horizontalHeader()->length() > 0) { - // ensure that 1st column gets the remaining space from others - horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); - } - verticalHeader()->setDefaultSectionSize(fontMetrics().height()*1.5); - - // type - this->setColumnWidth(1, this->fontMetrics().averageCharWidth()*15); - // % - this->setColumnWidth(2, this->fontMetrics().averageCharWidth()*12); - - QTableView::resizeEvent(event); -} - -} // m8r namespace diff --git a/app/src/qt/ner_leaderboard_view.h b/app/src/qt/ner_leaderboard_view.h deleted file mode 100644 index 3fd0d558..00000000 --- a/app/src/qt/ner_leaderboard_view.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - ner_leaderboard_view.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8RUI_NER_LEADERBOARD_VIEW_H -#define M8RUI_NER_LEADERBOARD_VIEW_H - -#include - -#include "html_delegate.h" - -namespace m8r { - -class NerLeaderboardView : public QTableView -{ - Q_OBJECT - -public: - explicit NerLeaderboardView(QWidget* parent); - NerLeaderboardView(const NerLeaderboardView&) = delete; - NerLeaderboardView(const NerLeaderboardView&&) = delete; - NerLeaderboardView &operator=(const NerLeaderboardView&) = delete; - NerLeaderboardView &operator=(const NerLeaderboardView&&) = delete; - virtual ~NerLeaderboardView() override {} - - virtual void resizeEvent(QResizeEvent* event) override; -}; - -} -#endif // M8RUI_NER_LEADERBOARD_VIEW_H diff --git a/app/src/qt/ner_main_window_worker_thread.cpp b/app/src/qt/ner_main_window_worker_thread.cpp deleted file mode 100644 index 99eb6eec..00000000 --- a/app/src/qt/ner_main_window_worker_thread.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - ner_main_window_worker_thread.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "ner_main_window_worker_thread.h" - -namespace m8r { - -NerMainWindowWorkerThread::~NerMainWindowWorkerThread() -{ - delete progressDialog; -} - -void NerMainWindowWorkerThread::process() -{ - mind->recognizePersons(orloj->getOutlineView()->getCurrentOutline(), entityFilter, *result); - - progressDialog->hide(); - - MF_DEBUG("NER initialization and prediction WORKER finished" << endl); - emit finished(); -} - -} // m8r namespace diff --git a/app/src/qt/ner_main_window_worker_thread.h b/app/src/qt/ner_main_window_worker_thread.h deleted file mode 100644 index 74ce99de..00000000 --- a/app/src/qt/ner_main_window_worker_thread.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - ner_main_window_worker_thread.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8RUI_NER_MAIN_WINDOW_WORKER_THREAD_H -#define M8RUI_NER_MAIN_WINDOW_WORKER_THREAD_H - -#include - -#include - -#include "orloj_presenter.h" - -namespace m8r { - -class OrlojPresenter; - -/** - * @brief NER worker thread class. - * - * IMPORTANT: remember that QThread subclassing is ANTIPATTERN - QThread is just envelope. - * - * IMPORTANT: NEVER allocate heap objects (using new) in the constructor of the QObject - * class as this allocation is then performed on the main thread and not on the - * new QThread instance, meaning that the newly created object is then owned by the - * main thread and not the QThread instance. This will make your code fail to work. - * Instead, allocate such resources in the main function slot such as process() in - * this case as when that is called the object will be on the new thread instance - * and thus it will own the resource. - */ -class NerMainWindowWorkerThread : public QObject -{ - Q_OBJECT - - // just (parent) thread handle allowing to delete it when worker finishes - QThread* thread; - - Mind* mind; - OrlojPresenter* orloj; - int entityFilter; - std::vector* result; - QDialog* progressDialog; - -public: - explicit NerMainWindowWorkerThread( - QThread* t, - Mind* m, - OrlojPresenter* o, - int f, - std::vector* r, - QDialog* d) - { - this->thread = t; - this->mind = m; - this->orloj = o; - this->entityFilter = f; - this->result = r; - this->progressDialog = d; - } - NerMainWindowWorkerThread(const NerMainWindowWorkerThread&) = delete; - NerMainWindowWorkerThread(const NerMainWindowWorkerThread&&) = delete; - NerMainWindowWorkerThread &operator=(const NerMainWindowWorkerThread&) = delete; - NerMainWindowWorkerThread &operator=(const NerMainWindowWorkerThread&&) = delete; - ~NerMainWindowWorkerThread(); - - std::vector* getResult() { return result; } - -public slots: - void process(); - -signals: - void finished(); - void error(QString error); -}; - -} -#endif // M8RUI_NER_MAIN_WINDOW_WORKER_THREAD_H diff --git a/deps/mitie b/deps/mitie deleted file mode 160000 index 6f43a5b9..00000000 --- a/deps/mitie +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6f43a5b9cb8ddd852a047fb3d2e73b816ea54465 diff --git a/lib/lib.pro b/lib/lib.pro index a44412d0..b42ea8a9 100644 --- a/lib/lib.pro +++ b/lib/lib.pro @@ -41,13 +41,6 @@ win32 { DEPENDPATH += $$PWD/../deps/zlib-win/include } -# DEPRECATED: Mitie (NER library) -mfner { - DEFINES += MF_NER - INCLUDEPATH += $$PWD/../deps/mitie/mitielib/include - DEPENDPATH += $$PWD/../deps/mitie/mitielib/include -} - # debug mfdebug|mfunits { DEFINES += DO_MF_DEBUG @@ -162,13 +155,6 @@ SOURCES += \ src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.cpp } -# DEPRECATED: Mitie (NER library) -mfner { - SOURCES += \ - src/mind/ai/nlp/named_entity_recognition.cpp \ - src/mind/ai/nlp/ner_named_entity.cpp -} - HEADERS += \ ./src/debug.h \ ./src/exceptions.h \ @@ -303,13 +289,6 @@ HEADERS += \ src/mind/ai/autolinking/cmark_aho_corasick_block_autolinking_preprocessor.h } -# DEPRECATED: Mitie (NER library) -mfner { - HEADERS += \ - src/mind/ai/nlp/named_entity_recognition.h \ - src/mind/ai/nlp/ner_named_entity.h -} - win32 { HEADERS += \ ../deps/dirent/dirent.h \ diff --git a/lib/src/mind/ai/ai.cpp b/lib/src/mind/ai/ai.cpp index 8b2b2c2a..3179c8c6 100644 --- a/lib/src/mind/ai/ai.cpp +++ b/lib/src/mind/ai/ai.cpp @@ -23,9 +23,6 @@ namespace m8r { using namespace std; Ai::Ai(Memory& memory, Mind& mind) -#ifdef MF_NER - : ner{} -#endif { switch(Configuration::getInstance().getAaAlgorithm()) { case Configuration::AssociationAssessmentAlgorithm::BOW: @@ -37,12 +34,6 @@ Ai::Ai(Memory& memory, Mind& mind) default: aa = nullptr; } - -#ifdef MF_NER - // TODO get MODEL location from configuration - static std::string nerModelPath{"/home/dvorka/p/mindforger/lab/ner/MITIE/MITIE-models/english/ner_model.dat"}; - ner.setNerModel(nerModelPath); -#endif } Ai::~Ai() diff --git a/lib/src/mind/ai/ai.h b/lib/src/mind/ai/ai.h index b49c937b..5d4d6b68 100644 --- a/lib/src/mind/ai/ai.h +++ b/lib/src/mind/ai/ai.h @@ -29,9 +29,6 @@ #include "./aa_model.h" #include "./ai_aa_weighted_fts.h" #include "./ai_aa_bow.h" -#ifdef MF_NER - #include "./nlp/named_entity_recognition.h" -#endif namespace m8r { @@ -76,14 +73,6 @@ class Ai // Associations assessment implemenations: AA @ weighted FTS, AA @ BoW AiAssociationsAssessment* aa; -#ifdef MF_NER - /* - * Named-entity recognition (NER) - */ - - NamedEntityRecognition ner; -#endif - /* * Neural network models */ @@ -127,17 +116,6 @@ class Ai return aa->getAssociatedNotes(words, associations, self); } -#ifdef MF_NER - bool isNerInitialized() const { return ner.isInitialized(); } - - /** - * @brief Recognize person names in O. - */ - void recognizePersons(const Outline* outline, int entityFilter, std::vector& result) { - ner.recognizePersons(outline, entityFilter, result); - } -#endif - /** * @brief Clear, but don't deallocate. * @@ -162,17 +140,6 @@ class Ai * @brief Train associations assessment neural network once memory is learned. */ void trainAaNn(); - -public: -#ifdef DO_MF_DEBUG - static void print(const Note* n, std::vector>& leaderboard) { - std::cout << "Note '" << n->getName() << "' AA leaderboard("<< leaderboard.size() <<"):" << std::endl; - int i=1; - for(auto& nn:leaderboard) { - std::cout << " #" << i++ << " '" << nn.first->getName() << "' ~ " << nn.second << std::endl; - } - } -#endif }; } diff --git a/lib/src/mind/ai/nlp/named_entity_recognition.cpp b/lib/src/mind/ai/nlp/named_entity_recognition.cpp deleted file mode 100644 index 18b9085e..00000000 --- a/lib/src/mind/ai/nlp/named_entity_recognition.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - named_entity_recognition.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "named_entity_recognition.h" - -namespace m8r { - -using namespace std; - -NamedEntityRecognition::NamedEntityRecognition() - : initilized{false}, nerModel{} -{ -} - -NamedEntityRecognition::~NamedEntityRecognition() -{ -} - -void NamedEntityRecognition::setNerModel(const std::string& nerModel) { - std::lock_guard criticalSection{initMutex}; - - initilized = false; - nerModelPath = nerModel; -} - -// this method is NOT synchronized - callers are synchronized so that race condition is avoided -bool NamedEntityRecognition::loadAndInitNerModel() -{ - if(!initilized) { - // Load MITIE's named entity extractor from disk. Each file in the MITIE-models - // folder begins with a string containing the name of the serialized class. In - // this case classname contains "mitie::named_entity_extractor". It can be used to - // identify what is in any particular file. However, in this example we don't need - // it so it is just ignored. -#ifdef DO_MF_DEBUG - MF_DEBUG("NER loading model: " << nerModelPath << endl); - auto begin = chrono::high_resolution_clock::now(); -#endif - string classname; - dlib::deserialize(nerModelPath) >> classname >> nerModel; - initilized = true; -#ifdef DO_MF_DEBUG - auto end = chrono::high_resolution_clock::now(); - MF_DEBUG("NER model loaded in " << chrono::duration_cast(end-begin).count()/1000.0 << "ms" << endl); -#endif - -#ifdef DO_MF_DEBUG - // print out what kind of tags this tagger can predict. - const std::vector tagstr = nerModel.get_tag_name_strings(); - MF_DEBUG("NER tagger supports "<< tagstr.size() <<" tags:" << endl); - for(unsigned int i = 0; i < tagstr.size(); ++i) { - MF_DEBUG(" " << tagstr[i] << endl); - } -#endif - } - - return true; -} - -vector NamedEntityRecognition::tokenizeFile(const string& filename) -{ - ifstream fin(filename.c_str()); - if(!fin) { - cout << "Unable to load input text file" << endl; - exit(EXIT_FAILURE); - } - - // The conll_tokenizer splits the contents of an istream into a bunch of words and is - // MITIE's default tokenization method. - mitie::conll_tokenizer tok(fin); - std::vector tokens; - string token; - - // Read the tokens out of the file one at a time and store into tokens. - while(tok(token)) { - tokens.push_back(token); - } - - return tokens; -} - -bool NamedEntityRecognition::recognizePersons(vector& result) -{ - UNUSED_ARG(result); - - - - std::lock_guard criticalSection{initMutex}; - - if(loadAndInitNerModel()) { - // ... - } - - return false; -} - -bool NamedEntityRecognition::recognizePersons(const Outline* outline, int entityTypeFilter, vector& result) -{ - std::lock_guard criticalSection{initMutex}; - - if(loadAndInitNerModel()) { - try { - // tokenize data to prepare it for the tagger - MF_DEBUG("NER: tokenizing O " << outline->getKey() << endl); - std::vector tokens = tokenizeFile(outline->getKey()); - - std::vector > chunks; - std::vector chunk_tags; - std::vector chunk_scores; - - // Now detect all the entities in the text file we loaded and print them to the screen. - // The output of this function is a set of "chunks" of tokens, each a named entity. - // Additionally, if it is useful for your application a confidence score for each "chunk" - // is available by using the predict() method. The larger the score the more - // confident MITIE is in the tag. -#ifdef DO_MF_DEBUG - MF_DEBUG("NER predicting..." << endl); - auto begin = chrono::high_resolution_clock::now(); -#endif - nerModel.predict(tokens, chunks, chunk_tags, chunk_scores); -#ifdef DO_MF_DEBUG - auto end = chrono::high_resolution_clock::now(); - MF_DEBUG("NER prediction done in " << chrono::duration_cast(end-begin).count()/1000.0 << "ms" << endl); -#endif - - // If a confidence score is not necessary for your application you can detect entities - // using the operator() method as shown in the following line. - //ner(tokens, chunks, chunk_tags); - - MF_DEBUG("\nNumber of named entities detected: " << chunks.size() << endl); - const std::vector tagstr = nerModel.get_tag_name_strings(); - string entityName{}; - for (unsigned int i = 0; i < chunks.size(); ++i) { - if((1<(1<(chunk_scores[i])}; - result.push_back(entity); - } - } - - return true; - } - catch(std::exception& e) { - cerr << "NRE error: " << e.what() << endl; - } - } - - return false; -} - -} // m8r namespace diff --git a/lib/src/mind/ai/nlp/named_entity_recognition.h b/lib/src/mind/ai/nlp/named_entity_recognition.h deleted file mode 100644 index ffb80ebb..00000000 --- a/lib/src/mind/ai/nlp/named_entity_recognition.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - named_entity_recognition.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8R_NAMED_ENTITY_RECOGNITION_H -#define M8R_NAMED_ENTITY_RECOGNITION_H - -#include -#include - -#include -#include -#include -#include -#include - -#include "../../deps/mitie/mitielib/include/mitie/named_entity_extractor.h" -#include "../../deps/mitie/mitielib/include/mitie/conll_tokenizer.h" -#include "../../deps/mitie/mitielib/include/mitie.h" - -#include "ner_named_entity.h" - -#include "../../../model/outline.h" - -namespace m8r { - -class NamedEntityRecognition -{ -private: - std::mutex initMutex; - bool initilized; - - std::string nerModelPath; - mitie::named_entity_extractor nerModel; - -public: - explicit NamedEntityRecognition(); - NamedEntityRecognition(const NamedEntityRecognition&) = delete; - NamedEntityRecognition(const NamedEntityRecognition&&) = delete; - NamedEntityRecognition &operator=(const NamedEntityRecognition&) = delete; - NamedEntityRecognition &operator=(const NamedEntityRecognition&&) = delete; - ~NamedEntityRecognition(); - - bool isInitialized() const { return initilized; } - - /** - * @brief Set NER model location. - * - * This set path to the method, but it does NOT load and initialize it. - */ - void setNerModel(const std::string& nerModel); - - /** - * @brief NRE persons in memory. - */ - bool recognizePersons(std::vector& result); - - /** - * @brief NRE persons in O. - */ - bool recognizePersons(const Outline* outline, int entityTypeFilter, std::vector& result); - -private: - std::vector tokenizeFile(const std::string& filename); - - /** - * @brief Load and initialize NER model file. - * - * NER file is typically huge (MBs) therefore it is loaded and initialized on demand. - */ - bool loadAndInitNerModel(); -}; - -} -#endif // M8R_NAMED_ENTITY_RECOGNITION_H diff --git a/lib/src/mind/ai/nlp/ner_named_entity.cpp b/lib/src/mind/ai/nlp/ner_named_entity.cpp deleted file mode 100644 index c04c4dd8..00000000 --- a/lib/src/mind/ai/nlp/ner_named_entity.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - ner_named_entity.cpp MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "ner_named_entity.h" - -namespace m8r { -} // m8r namespace diff --git a/lib/src/mind/ai/nlp/ner_named_entity.h b/lib/src/mind/ai/nlp/ner_named_entity.h deleted file mode 100644 index a29a940e..00000000 --- a/lib/src/mind/ai/nlp/ner_named_entity.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - ner_named_entity.h MindForger thinking notebook - - Copyright (C) 2016-2024 Martin Dvorak - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef M8R_NER_NAMED_ENTITY_H -#define M8R_NER_NAMED_ENTITY_H - -#include - -namespace m8r { - -enum NerNamedEntityType { - PERSON = 1<<0, - LOCATION = 1<<1, - ORGANIZATION = 1<<2, - MISC = 1<<3 -}; - -struct NerNamedEntity -{ - std::string name; - NerNamedEntityType type; - float score; - - explicit NerNamedEntity(const std::string& n, NerNamedEntityType t, float s) { - this->name = n; - this->type = t; - this->score = s; - } -}; - -} -#endif // M8R_NER_NAMED_ENTITY_H diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp index 1b596a63..4d183efe 100644 --- a/lib/src/mind/mind.cpp +++ b/lib/src/mind/mind.cpp @@ -1408,23 +1408,6 @@ MindStatistics* Mind::getStatistics() return stats; } -/* - * NER - */ - -#ifdef MF_NER - -bool Mind::isNerInitilized() const -{ - return ai->isNerInitialized(); -} - -void Mind::recognizePersons(const Outline* outline, int entityFilter, std::vector& result) { - ai->recognizePersons(outline, entityFilter, result); -} - -#endif - // unique_ptr template BREAKS Qt Developer indentation > stored at EOF unique_ptr> Mind::findOutlineByNameFts(const string& pattern) const { diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h index 1ee217ed..2174ea9a 100644 --- a/lib/src/mind/mind.h +++ b/lib/src/mind/mind.h @@ -36,9 +36,6 @@ #include "../config/configuration.h" #include "../representations/representation_interceptor.h" #include "../representations/markdown/markdown_configuration_representation.h" -#ifdef MF_NER - #include "ai/nlp/named_entity_recognition.h" -#endif namespace m8r { @@ -330,17 +327,6 @@ class Mind : public OntologyProvider size_t getTriplesCount() const { return triples.size(); } -#ifdef MF_NER - - /* - * NRE - */ - - bool isNerInitilized() const; - void recognizePersons(const Outline* outline, int entityFilter, std::vector& result); - -#endif - /* * REMEMBERING */ diff --git a/mindforger.pro b/mindforger.pro index 9f0f6f94..22b0835e 100644 --- a/mindforger.pro +++ b/mindforger.pro @@ -32,8 +32,6 @@ # qmake CONFIG+=mfci ... CI build (AppVeyor, ...) w/ build info @ window title # qmake CONFIG+=mfrc ... RC build w/ build info @ window title # qmake CONFIG+=mfunits ... option to run unit tests -# qmake CONFIG+=mfllamacpp ... EXPERIMENTAL option to enable wingman @ llama.cpp -# qmake CONFIG+=mfner ... DEPRECATED: build project w/ NER and link dlib/MITIE # # Warning: DEPRECATED build options will be removed in the next major release. # From 81eeb94f621ee751b56acc647f590443cba81241 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Tue, 9 Jan 2024 08:51:55 +0100 Subject: [PATCH 077/131] Adding chat dialog for wingman #1514 --- app/app.pro | 2 + app/src/qt/dialogs/chat_dialog.cpp | 191 +++++++++++++++++++++++++ app/src/qt/dialogs/chat_dialog.h | 87 +++++++++++ app/src/qt/dialogs/terminal_dialog.cpp | 2 +- app/src/qt/main_window_presenter.cpp | 7 + app/src/qt/main_window_presenter.h | 2 + lib/src/mind/ai/llm/wingman.h | 1 + 7 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 app/src/qt/dialogs/chat_dialog.cpp create mode 100644 app/src/qt/dialogs/chat_dialog.h diff --git a/app/app.pro b/app/app.pro index 0c5da17c..ff2bb090 100644 --- a/app/app.pro +++ b/app/app.pro @@ -276,6 +276,7 @@ HEADERS += \ src/qt/dialogs/rm_library_dialog.h \ src/qt/dialogs/run_tool_dialog.h \ src/qt/dialogs/wingman_dialog.h \ + src/qt/dialogs/chat_dialog.h \ src/qt/dialogs/sync_library_dialog.h \ src/qt/dialogs/terminal_dialog.h \ src/qt/kanban_column_model.h \ @@ -398,6 +399,7 @@ SOURCES += \ src/qt/dialogs/rm_library_dialog.cpp \ src/qt/dialogs/run_tool_dialog.cpp \ src/qt/dialogs/wingman_dialog.cpp \ + src/qt/dialogs/chat_dialog.cpp \ src/qt/dialogs/sync_library_dialog.cpp \ src/qt/dialogs/terminal_dialog.cpp \ src/qt/kanban_column_model.cpp \ diff --git a/app/src/qt/dialogs/chat_dialog.cpp b/app/src/qt/dialogs/chat_dialog.cpp new file mode 100644 index 00000000..e89eac03 --- /dev/null +++ b/app/src/qt/dialogs/chat_dialog.cpp @@ -0,0 +1,191 @@ +/* + chat_dialog.cpp MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "chat_dialog.h" + +namespace m8r { + +using namespace std; + +ChatDialog::ChatDialog(QWidget* parent) + : QDialog(parent) +{ + setWindowTitle(tr("Wingman Chat")); + + cmdEdit = new MyLineEdit(this, this); + + cmdCompleter = new QCompleter(new QStandardItemModel(cmdEdit), this); + cmdCompleter->setCompletionMode(QCompleter::CompletionMode::InlineCompletion); + cmdCompleter->setCaseSensitivity(Qt::CaseInsensitive); + QStandardItemModel* cmdCompleterModel = + dynamic_cast(cmdCompleter->model()); + if(cmdCompleterModel) { + // prompts + completerCommands.clear(); + completerCommands << QString::fromStdString("Explain like I'm five: "); + completerCommands << QString::fromStdString("Create plan in bullet list for "); + + completerCommands << QString::fromStdString("exit"); + completerCommands << QString::fromStdString("quit"); + completerCommands << QString::fromStdString("bye"); + + for(auto c:completerCommands) { + cmdCompleterModel->appendRow(new QStandardItem(c)); + } + } + + cmdEdit->setCompleter(cmdCompleter); + + chatWindow = new QTextEdit(this); + chatWindow->setReadOnly(true); + chatWindow->clear(); + chatWindow->insertHtml(QString::fromStdString(getPrompt())); + + QVBoxLayout* layout = new QVBoxLayout{this}; + layout->addWidget(chatWindow); + layout->addWidget(cmdEdit); + setLayout(layout); + + resize(fontMetrics().averageCharWidth()*100, fontMetrics().height()*35); +} + +ChatDialog::~ChatDialog() +{ +} + +void ChatDialog::show() +{ + // > Summarize. [green] + // 🤖 Lorem ipsum dolor sit amet, [gray] + // consectetur adipiscing elit. + // + // Explain like I'm 5: NLP. + // 🤖 Lorem ipsum dolor sit amet, + // + // > + // ^ cursor + + cmdEdit->clear(); + cmdEdit->setFocus(); + + setModal(true); + QDialog::show(); +} + +string ChatDialog::getPrompt(bool error) +{ + string prompt{"" + getCwd() + ""}; + prompt.append("
> "); + return prompt; +} + +void ChatDialog::insertPrompt(const std::string& prompt) +{ + chatWindow->insertHtml( + QString::fromStdString( + "" + "> " + prompt + + "" + )); + chatWindow->insertHtml(QString::fromStdString("

")); +} + +void ChatDialog::insertOutput(const std::string& output) +{ + chatWindow->insertHtml(QString::fromStdString("🤖 " + output)); + chatWindow->insertHtml(QString::fromStdString("

")); +} + +void ChatDialog::runCommand() +{ + if(cmdEdit->text().size()) { + // TODO help + if(cmdEdit->text() == QString::fromStdString("clear") + || cmdEdit->text() == QString::fromStdString("cls") + ) { + chatWindow->clear(); + chatWindow->insertHtml(QString::fromStdString(getPrompt())); + } else if(cmdEdit->text() == QString::fromStdString("exit") + || cmdEdit->text() == QString::fromStdString("quit") + || cmdEdit->text() == QString::fromStdString("bye") + ) { + QDialog::close(); + } else { + chatWindow->insertHtml( + cmdEdit->text() + QString::fromStdString("

") + ); + + string cmd{cmdEdit->text().toStdString()}; + + // add command to completer + QStandardItemModel* completerModel + = dynamic_cast(cmdCompleter->model()); + if(!completerModel) { + completerModel = new QStandardItemModel(); + } + completerModel->insertRow( + 0, new QStandardItem(cmdEdit->text()) + ); + + // run prompt + MF_DEBUG("Running prompt: '" << cmd << "'" << endl); + int statusCode{0}; + string cmdStdOut{}; + + // TODO run prompt + // TODO run prompt + // TODO run prompt + + MF_DEBUG("Chat command finished with status: " << statusCode << endl); + chatWindow->insertHtml(QString::fromStdString("
")); + + if(cmdStdOut.size()) { + replaceAll("\n", "
", cmdStdOut); + chatWindow->insertHtml( + QString::fromStdString("🤖 " + cmdStdOut + "
") + ); + } + + if(statusCode) { + cerr << "Chat command failed with status: " << statusCode << endl; + chatWindow->insertHtml( + QString::fromStdString(getPrompt(true)) + ); + } else { + chatWindow->insertHtml( + QString::fromStdString(getPrompt()) + ); + } + + // scroll down by moving cursor to the end AND ensuring it's visible + chatWindow->moveCursor(QTextCursor::End); + chatWindow->ensureCursorVisible(); + } + } + + cmdEdit->clear(); + MF_DEBUG("Chat prompt cleared: " << cmdEdit->text().toStdString() << endl); +} + +} // m8r namespace diff --git a/app/src/qt/dialogs/chat_dialog.h b/app/src/qt/dialogs/chat_dialog.h new file mode 100644 index 00000000..d72256d9 --- /dev/null +++ b/app/src/qt/dialogs/chat_dialog.h @@ -0,0 +1,87 @@ +/* + chat_dialog.h MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef M8RUI_CHAT_DIALOG_H +#define M8RUI_CHAT_DIALOG_H + + +#include +#include +#include +#include + +#include "../../lib/src/debug.h" +#include "../../lib/src/gear/file_utils.h" +#include "../../lib/src/gear/string_utils.h" + +#include + +namespace m8r { + +class ChatDialog : public QDialog +{ + Q_OBJECT + + class MyLineEdit : public QLineEdit + { + private: + ChatDialog* chatDialog; + public: + explicit MyLineEdit(ChatDialog* chatDialog, QWidget* parent) + : QLineEdit(parent), + chatDialog(chatDialog) + {} + virtual void keyPressEvent(QKeyEvent* event) override { + switch(event->key()) { + case Qt::Key_Return: // Qt::Key_Enter is keypad Enter + chatDialog->runCommand(); + setFocus(); + return; + } + + QLineEdit::keyPressEvent(event);; // continue event dispatch (completer needs to get the event) + } + }; + +private: + MyLineEdit* cmdEdit; + QCompleter* cmdCompleter; + QStringList completerCommands; + + QTextEdit* chatWindow; + +public: + explicit ChatDialog(QWidget* parent); + ChatDialog(const ChatDialog&) = delete; + ChatDialog(const ChatDialog&&) = delete; + ChatDialog& operator =(const ChatDialog&) = delete; + ChatDialog& operator =(const ChatDialog&&) = delete; + ~ChatDialog(); + + void insertPrompt(const std::string& prompt); + void insertOutput(const std::string& output); + + void show(); + +private: + void runCommand(); + std::string getPrompt(bool error=false); +}; + +} +#endif // M8RUI_TERMINAL_DIALOG_H diff --git a/app/src/qt/dialogs/terminal_dialog.cpp b/app/src/qt/dialogs/terminal_dialog.cpp index d7187ebe..7135e246 100644 --- a/app/src/qt/dialogs/terminal_dialog.cpp +++ b/app/src/qt/dialogs/terminal_dialog.cpp @@ -164,7 +164,7 @@ void TerminalDialog::runCommand() // TODO _popen WINDOWS #ifdef _WIN32 FILE* pipe = _popen(cmd.c_str(), "r"); - # else + #else FILE* pipe = popen(cmd.c_str(), "r"); #endif if(!pipe) { diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 9d071a8c..5cff5e80 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -58,6 +58,7 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) rmLibraryDialog = new RemoveLibraryDialog(&view); runToolDialog = new RunToolDialog{&view}; wingmanDialog = new WingmanDialog{&view}; + chatDialog = new ChatDialog{&view}; scopeDialog = new ScopeDialog{mind->getOntology(), &view}; newOrganizerDialog = new OrganizerNewDialog{mind->getOntology(), &view}; newOutlineDialog = new OutlineNewDialog{ @@ -2105,6 +2106,7 @@ void MainWindowPresenter::doActionWingman() void MainWindowPresenter::handleActionWingman() { MF_DEBUG("SIGNAL handled: WINGMAN dialog..." << endl); + this->wingmanDialog->hide(); string wingmanAnswer{}; @@ -2116,6 +2118,11 @@ void MainWindowPresenter::handleActionWingman() wingmanAnswer ); + // show result + this->chatDialog->insertPrompt("Summarize."); + this->chatDialog->insertOutput(wingmanAnswer); + this->chatDialog->show(); + // TODO TODO TODO continue here } diff --git a/app/src/qt/main_window_presenter.h b/app/src/qt/main_window_presenter.h index 47bc6a1d..33ca65f0 100644 --- a/app/src/qt/main_window_presenter.h +++ b/app/src/qt/main_window_presenter.h @@ -39,6 +39,7 @@ #include "dialogs/rm_library_dialog.h" #include "dialogs/run_tool_dialog.h" #include "dialogs/wingman_dialog.h" +#include "dialogs/chat_dialog.h" #include "dialogs/organizer_new_dialog.h" #include "dialogs/outline_new_dialog.h" #include "dialogs/note_new_dialog.h" @@ -120,6 +121,7 @@ class MainWindowPresenter : public QObject RemoveLibraryDialog* rmLibraryDialog; RunToolDialog* runToolDialog; WingmanDialog* wingmanDialog; + ChatDialog* chatDialog; ScopeDialog* scopeDialog; OrganizerNewDialog* newOrganizerDialog; OutlineNewDialog* newOutlineDialog; diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h index 8e5a0ab6..5e0f3c8b 100644 --- a/lib/src/mind/ai/llm/wingman.h +++ b/lib/src/mind/ai/llm/wingman.h @@ -46,6 +46,7 @@ class Wingman Wingman& operator =(const Wingman&&) = delete; virtual ~Wingman(); + // dialog || menu Notebook/Wingman/Summarize || menu Note/Wingman/Summarize virtual void summarize(const std::string& text, std::string& summary) = 0; }; From e688f45198a09dfa363fc93e2aeba0125ecae993 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sat, 13 Jan 2024 20:54:46 +0100 Subject: [PATCH 078/131] Wingman MOCK done. --- app/src/qt/dialogs/chat_dialog.cpp | 91 ++++++++++++---------- app/src/qt/dialogs/chat_dialog.h | 4 +- app/src/qt/dialogs/wingman_dialog.cpp | 104 +++++++++++-------------- app/src/qt/dialogs/wingman_dialog.h | 49 ++++++++---- app/src/qt/main_menu_view.cpp | 6 +- app/src/qt/main_menu_view.h | 2 +- app/src/qt/main_window_presenter.cpp | 92 +++++++++++++++------- app/src/qt/note_editor_view.cpp | 2 + lib/src/config/configuration.h | 2 +- lib/src/gear/string_utils.h | 4 +- lib/src/mind/ai/llm/bard_wingman.cpp | 31 ++++++++ lib/src/mind/ai/llm/bard_wingman.h | 100 ++++++++++++++++++++++++ lib/src/mind/ai/llm/mock_wingman.cpp | 2 +- lib/src/mind/ai/llm/openai_wingman.cpp | 2 +- lib/src/mind/ai/llm/wingman.h | 79 +++++++++++++++++++ lib/src/mind/mind.h | 1 + 16 files changed, 420 insertions(+), 151 deletions(-) create mode 100644 lib/src/mind/ai/llm/bard_wingman.cpp create mode 100644 lib/src/mind/ai/llm/bard_wingman.h diff --git a/app/src/qt/dialogs/chat_dialog.cpp b/app/src/qt/dialogs/chat_dialog.cpp index e89eac03..d861d034 100644 --- a/app/src/qt/dialogs/chat_dialog.cpp +++ b/app/src/qt/dialogs/chat_dialog.cpp @@ -22,6 +22,9 @@ namespace m8r { using namespace std; +const string COLOR_PROMPT_GREEN{"#00bb00"}; +const string COLOR_PROMPT_BLUE{"#00aaaa"}; + ChatDialog::ChatDialog(QWidget* parent) : QDialog(parent) { @@ -54,7 +57,7 @@ ChatDialog::ChatDialog(QWidget* parent) chatWindow = new QTextEdit(this); chatWindow->setReadOnly(true); chatWindow->clear(); - chatWindow->insertHtml(QString::fromStdString(getPrompt())); + chatWindow->insertHtml(QString::fromStdString(getTerminalPrompt())); QVBoxLayout* layout = new QVBoxLayout{this}; layout->addWidget(chatWindow); @@ -70,15 +73,20 @@ ChatDialog::~ChatDialog() void ChatDialog::show() { - // > Summarize. [green] - // 🤖 Lorem ipsum dolor sit amet, [gray] + // Notebook/ OpenAI chatGPT3.5 [blue, yellow] + // $ Summarize. [green] + // + // Lorem ipsum dolor sit amet, [gray] // consectetur adipiscing elit. // - // Explain like I'm 5: NLP. - // 🤖 Lorem ipsum dolor sit amet, + // ~/notebook/ OpenAI chatGPT3.5 + // $ Explain 'NLP' like I'm 5. + // + // Lorem ipsum dolor sit amet, // - // > - // ^ cursor + // ~/notebook/ OpenAI chatGPT3.5 + // $ + // ^ cursor cmdEdit->clear(); cmdEdit->setFocus(); @@ -87,14 +95,27 @@ void ChatDialog::show() QDialog::show(); } -string ChatDialog::getPrompt(bool error) +string ChatDialog::getTerminalPrompt(bool error) { - string prompt{"" + getCwd() + ""}; - prompt.append("
@" + thing + " " + + "" + thingName + "" + "        " + "" + wingmanModel + "" + "
" + }; + + prompt.append("> "); return prompt; @@ -104,17 +125,26 @@ void ChatDialog::insertPrompt(const std::string& prompt) { chatWindow->insertHtml( QString::fromStdString( - "" - "> " + prompt + + "" + + prompt + "" + "

" )); - chatWindow->insertHtml(QString::fromStdString("

")); + chatWindow->moveCursor(QTextCursor::End); + chatWindow->ensureCursorVisible(); } -void ChatDialog::insertOutput(const std::string& output) +void ChatDialog::insertOutput(const std::string& output, bool error) { - chatWindow->insertHtml(QString::fromStdString("🤖 " + output)); - chatWindow->insertHtml(QString::fromStdString("

")); + chatWindow->insertHtml( + QString::fromStdString( + "
" + + output + + "
" + + getTerminalPrompt(error) + )); + chatWindow->moveCursor(QTextCursor::End); + chatWindow->ensureCursorVisible(); } void ChatDialog::runCommand() @@ -125,7 +155,7 @@ void ChatDialog::runCommand() || cmdEdit->text() == QString::fromStdString("cls") ) { chatWindow->clear(); - chatWindow->insertHtml(QString::fromStdString(getPrompt())); + chatWindow->insertHtml(QString::fromStdString(getTerminalPrompt())); } else if(cmdEdit->text() == QString::fromStdString("exit") || cmdEdit->text() == QString::fromStdString("quit") || cmdEdit->text() == QString::fromStdString("bye") @@ -151,36 +181,17 @@ void ChatDialog::runCommand() // run prompt MF_DEBUG("Running prompt: '" << cmd << "'" << endl); int statusCode{0}; - string cmdStdOut{}; + string cmdStdOut{"Foo result Lorem ipsum dolor sit amet, consectetur adipiscing elit."}; // TODO run prompt // TODO run prompt // TODO run prompt MF_DEBUG("Chat command finished with status: " << statusCode << endl); - chatWindow->insertHtml(QString::fromStdString("
")); - if(cmdStdOut.size()) { - replaceAll("\n", "
", cmdStdOut); - chatWindow->insertHtml( - QString::fromStdString("🤖 " + cmdStdOut + "
") - ); + // replaceAll("\n", "
", cmdStdOut); + this->insertOutput(cmdStdOut, statusCode!=0?true:false); } - - if(statusCode) { - cerr << "Chat command failed with status: " << statusCode << endl; - chatWindow->insertHtml( - QString::fromStdString(getPrompt(true)) - ); - } else { - chatWindow->insertHtml( - QString::fromStdString(getPrompt()) - ); - } - - // scroll down by moving cursor to the end AND ensuring it's visible - chatWindow->moveCursor(QTextCursor::End); - chatWindow->ensureCursorVisible(); } } diff --git a/app/src/qt/dialogs/chat_dialog.h b/app/src/qt/dialogs/chat_dialog.h index d72256d9..5e2b9e05 100644 --- a/app/src/qt/dialogs/chat_dialog.h +++ b/app/src/qt/dialogs/chat_dialog.h @@ -74,13 +74,13 @@ class ChatDialog : public QDialog ~ChatDialog(); void insertPrompt(const std::string& prompt); - void insertOutput(const std::string& output); + void insertOutput(const std::string& output, bool error=false); void show(); private: void runCommand(); - std::string getPrompt(bool error=false); + std::string getTerminalPrompt(bool error=false); }; } diff --git a/app/src/qt/dialogs/wingman_dialog.cpp b/app/src/qt/dialogs/wingman_dialog.cpp index 80de6716..01c0399b 100644 --- a/app/src/qt/dialogs/wingman_dialog.cpp +++ b/app/src/qt/dialogs/wingman_dialog.cpp @@ -22,59 +22,33 @@ namespace m8r { using namespace std; -const vector WingmanDialog::outlinePrompts( - { - QString{"Summarize."}, - QString{"Generate tags from the text."}, - QString{"Find persons."}, - QString{"Find locations."}, - QString{"Find organizations."}, - QString{"Chat with the content."}, +WingmanDialog::WingmanDialog( + const vector& predefinedOPrompts, + const vector& predefinedNPrompts, + const vector& predefinedTPrompts, + QWidget* parent +): + context{}, + QDialog(parent) +{ + for(string prompt:predefinedOPrompts) { + outlinePrompts.push_back(QString::fromStdString(prompt)); } -); -const vector WingmanDialog::notePrompts( - { - QString{"Summarize."}, - QString{"Shorten."}, - QString{"Explain #NAME like I'm 5."}, - QString{"Generate tags."}, - QString{"Fix grammar."}, - QString{"Rewrite formally."}, - QString{"Rewrite informally."}, - QString{"Rewrite to be funny."}, - QString{"Chat with the content."}, - // other UCs: - // - NER UCs - // - simplify - // - beautify - // - translate - // - fix spelling - // - fix style - // - create plan ... + for(string prompt:predefinedNPrompts) { + notePrompts.push_back(QString::fromStdString(prompt)); } -); -const vector WingmanDialog::textPrompts( - { - QString{"Complete the text."}, - QString{"Complete the last text line."}, - QString{"Explain like I'm 5."}, - QString{"Fix grammar."}, - QString{"Generate tags."}, - QString{"Rewrite formally."}, - QString{"Rewrite informally."}, - QString{"Rewrite to Kafka style."}, + for(string prompt:predefinedTPrompts) { + textPrompts.push_back(QString::fromStdString(prompt)); } -); -WingmanDialog::WingmanDialog(QWidget* parent) - : QDialog(parent) -{ // UI setWindowTitle(tr("Wingman")); preludeLabel = new QLabel{ tr( - "Wingman can run a predefined or custom prompt." + "Wingman can run a predefined or custom prompt" + " " + "with the selected context." "
" ), parent @@ -90,8 +64,10 @@ WingmanDialog::WingmanDialog(QWidget* parent) predefinedPromptsCombo->addItem(toolName); } - promptLabel = new QLabel{tr("Your:"), parent}; - promptEdit = new QLineEdit{parent}; + promptLabel = new QLabel{ + tr("Your (overrides Predefined, use #NAME or #TEXT to include context):"), + parent}; + promptEdit = new QTextEdit{parent}; promptEdit->setToolTip( tr("Type in your prompt like: 'Translate the following text to Spanish: #CONTENT.")); @@ -117,17 +93,12 @@ WingmanDialog::WingmanDialog(QWidget* parent) contextEdit = new QLineEdit{parent}; contextEdit->setReadOnly(true); - postmortemLabel = new QLabel{ - tr("Use #NAME or #TEXT to include it to your prompt."), - parent}; - - contentLayout->addWidget(contextTypeLabel); - contentLayout->addWidget(contextTypeEdit); contentLayout->addWidget(contextNameLabel); contentLayout->addWidget(contextNameEdit); contentLayout->addWidget(contextLabel); contentLayout->addWidget(contextEdit); - contentLayout->addWidget(postmortemLabel); + contentLayout->addWidget(contextTypeLabel); + contentLayout->addWidget(contextTypeEdit); contentGroup->setLayout(contentLayout); // IMPROVE disable/enable find button if text/path is valid: freedom vs validation @@ -176,12 +147,19 @@ WingmanDialog::~WingmanDialog() delete contextLabel; delete contextEdit; - delete postmortemLabel; - delete runButton; delete closeButton; } +void WingmanDialog::clear() +{ + this->context.clear(); + + this->promptEdit->clear(); + this->contextNameEdit->clear(); + this->contextEdit->clear(); +} + void WingmanDialog::initForMode(WingmanDialogModes mode) { this->mode=mode; @@ -189,18 +167,28 @@ void WingmanDialog::initForMode(WingmanDialogModes mode) switch(mode) { case WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE: contextTypeEdit->setText(tr("outline")); - contextEdit->setText(tr("")); + contextEdit->setText(tr("")); break; case WingmanDialogModes::WINGMAN_DIALOG_MODE_NOTE: contextTypeEdit->setText(tr("note")); - contextEdit->setText(tr("")); + contextEdit->setText(tr("")); break; case WingmanDialogModes::WINGMAN_DIALOG_MODE_TEXT: - contextEdit->setText(tr("")); + contextNameEdit->clear(); + contextEdit->clear(); break; } } +void WingmanDialog::setContextText(QString context) { + this->context=context; + this->contextEdit->setText(context.mid(0, 50).append("...")); +} + +QString WingmanDialog::getContextText() const { + return context; +} + void WingmanDialog::show() { QDialog::show(); diff --git a/app/src/qt/dialogs/wingman_dialog.h b/app/src/qt/dialogs/wingman_dialog.h index 808ee86f..d9c8db6d 100644 --- a/app/src/qt/dialogs/wingman_dialog.h +++ b/app/src/qt/dialogs/wingman_dialog.h @@ -19,6 +19,9 @@ #ifndef M8RUI_WINGMAN_DIALOG_H #define M8RUI_WINGMAN_DIALOG_H +#include +#include + #include #include "../../lib/src/config/configuration.h" @@ -36,20 +39,21 @@ class WingmanDialog : public QDialog Q_OBJECT private: - - static const std::vector outlinePrompts; - static const std::vector notePrompts; - static const std::vector textPrompts; + std::vector outlinePrompts; + std::vector notePrompts; + std::vector textPrompts; WingmanDialogModes mode; + QString context; + QLabel* preludeLabel; QLabel* predefinedPromptsLabel; QComboBox* predefinedPromptsCombo; QLabel* promptLabel; - QLineEdit* promptEdit; + QTextEdit* promptEdit; QLabel* contextTypeLabel; QLineEdit* contextTypeEdit; @@ -58,34 +62,49 @@ class WingmanDialog : public QDialog QLabel* contextLabel; QLineEdit* contextEdit; - QLabel* postmortemLabel; - QPushButton* runButton; QPushButton* closeButton; public: - explicit WingmanDialog(QWidget* parent); + explicit WingmanDialog( + const std::vector& predefinedOPrompts, + const std::vector& predefinedNPrompts, + const std::vector& predefinedTPrompts, + QWidget* parent); WingmanDialog(const WingmanDialog&) = delete; WingmanDialog(const WingmanDialog&&) = delete; WingmanDialog& operator =(const WingmanDialog&) = delete; WingmanDialog& operator =(const WingmanDialog&&) = delete; ~WingmanDialog(); - void clear() { - this->promptEdit->clear(); - this->contextNameEdit->clear(); - this->contextEdit->clear(); - } + void clear(); void initForMode(WingmanDialogModes mode); + WingmanDialogModes getMode() const { return mode; } + void setPromptText(QString phrase) { this->promptEdit->setText(phrase); } + QString getPromptText() const { + if(this->promptEdit->toPlainText().isEmpty()) { + return predefinedPromptsCombo->currentText(); + } + return this->promptEdit->toPlainText(); + } + + void setContextType(WingmanDialogModes contextType) { + this->mode = contextType; + } + WingmanDialogModes getContextType() const { + return this->mode; + } void setContextNameText(QString contentName) { this->contextNameEdit->setText(contentName); } - void setContextText(QString content) { - this->contextEdit->setText(content); + QString getContextNameText() const { + return this->contextNameEdit->text(); } + void setContextText(QString context); + QString getContextText() const; void show(); diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index d3fe51b8..781bf4b4 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -741,8 +741,8 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) actionEditExtract = new QAction(QIcon(":/menu-icons/cut.svg"), tr("E&xtract"), mainWindow); actionEditExtract->setStatusTip(tr("Create new Note from the text selected in the current Note...")); - actionEditRunTool = new QAction(QIcon(":/menu-icons/on.svg"), tr("Find Knowledge\tCtrl+/"), mainWindow); - actionEditRunTool->setStatusTip(tr("Run an external tool to find, explain, process text under the cursor")); + actionEditWingman = new QAction(QIcon(":/menu-icons/on.svg"), tr("&Wingman"), mainWindow); // \tCtrl+/ + actionEditWingman->setStatusTip(tr("Run an external tool to find, explain, process text under the cursor")); actionEditComplete = new QAction(QIcon(":/menu-icons/link.svg"), tr("Complete Link\tCtrl+L"), mainWindow); actionEditComplete->setStatusTip(tr("Complete word being written by finding link to Notebook or Note")); @@ -765,7 +765,7 @@ MainMenuView::MainMenuView(MainWindowView& mainWindowView) menuEdit->addAction(actionEditWordWrap); menuEdit->addAction(actionEditNameDescFocusSwap); menuEdit->addSeparator(); - menuEdit->addAction(actionEditRunTool); + menuEdit->addAction(actionEditWingman); menuEdit->addAction(actionEditComplete); menuEdit->addAction(actionEditExtract); menuEdit->addSeparator(); diff --git a/app/src/qt/main_menu_view.h b/app/src/qt/main_menu_view.h index ad29635d..b92bd41e 100644 --- a/app/src/qt/main_menu_view.h +++ b/app/src/qt/main_menu_view.h @@ -194,7 +194,7 @@ class MainMenuView : public QObject QAction* actionEditWordWrap; QAction* actionEditNameDescFocusSwap; QAction* actionEditExtract; - QAction* actionEditRunTool; + QAction* actionEditWingman; QAction* actionEditComplete; QAction* actionEditSpellCheck; diff --git a/app/src/qt/main_window_presenter.cpp b/app/src/qt/main_window_presenter.cpp index 5cff5e80..c21c0ca3 100644 --- a/app/src/qt/main_window_presenter.cpp +++ b/app/src/qt/main_window_presenter.cpp @@ -57,7 +57,11 @@ MainWindowPresenter::MainWindowPresenter(MainWindowView& view) syncLibraryDialog = new SyncLibraryDialog{&view}; rmLibraryDialog = new RemoveLibraryDialog(&view); runToolDialog = new RunToolDialog{&view}; - wingmanDialog = new WingmanDialog{&view}; + wingmanDialog = new WingmanDialog{ + mind->getWingman()->getPredefinedOPrompts(), + mind->getWingman()->getPredefinedNPrompts(), + mind->getWingman()->getPredefinedTPrompts(), + &view}; chatDialog = new ChatDialog{&view}; scopeDialog = new ScopeDialog{mind->getOntology(), &view}; newOrganizerDialog = new OrganizerNewDialog{mind->getOntology(), &view}; @@ -2042,24 +2046,37 @@ void MainWindowPresenter::doActionWingman() // - N tree: get N name // - O tree: get O name // - ... - QString phrase; + QString contextTextName{}; + QString contextText{}; + WingmanDialogModes contextType{WingmanDialogModes::WINGMAN_DIALOG_MODE_TEXT}; + if(orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_NOTE)) { - phrase = orloj->getNoteEdit()->getView()->getNoteEditor()->getToolPhrase(); + contextText = orloj->getNoteEdit()->getView()->getNoteEditor()->getToolPhrase(); + contextType = WingmanDialogModes::WINGMAN_DIALOG_MODE_TEXT; } else if( orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE) || orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_OUTLINE_HEADER) ) { Outline* o = orloj->getOutlineView()->getCurrentOutline(); if(o) { - phrase = QString::fromStdString(o->getName()); + contextTextName = QString::fromStdString(o->getName()); + string contextTextStr{}; + mdRepresentation->to(o, &contextTextStr); + contextText = QString::fromStdString(contextTextStr); + contextType = WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE; } } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_VIEW_NOTE)) { Note* note = orloj->getOutlineView()->getOutlineTree()->getCurrentNote(); if(note) { - phrase = QString::fromStdString(note->getName()); + contextTextName = QString::fromStdString(note->getName()); + string contextTextStr{}; + mdRepresentation->to(note, &contextTextStr); + contextText = QString::fromStdString(contextTextStr); + contextType = WingmanDialogModes::WINGMAN_DIALOG_MODE_NOTE; } } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_EDIT_OUTLINE_HEADER)) { - phrase = orloj->getOutlineHeaderEdit()->getView()->getHeaderEditor()->getToolPhrase(); + contextText = orloj->getOutlineHeaderEdit()->getView()->getHeaderEditor()->getToolPhrase(); + contextType = WingmanDialogModes::WINGMAN_DIALOG_MODE_TEXT; } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_LIST_OUTLINES)) { int row = orloj->getOutlinesTable()->getCurrentRow(); if(row != OutlinesTablePresenter::NO_ROW) { @@ -2067,7 +2084,13 @@ void MainWindowPresenter::doActionWingman() = orloj->getOutlinesTable()->getModel()->item(row); if(item) { Outline* outline = item->data(Qt::UserRole + 1).value(); - phrase = QString::fromStdString(outline->getName()); + if(outline) { + contextTextName = QString::fromStdString(outline->getName()); + string contextTextStr{}; + mdRepresentation->to(outline, &contextTextStr); + contextText = QString::fromStdString(contextTextStr); + contextType = WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE; + } } } } else if(orloj->isFacetActive(OrlojPresenterFacets::FACET_MAP_OUTLINES)) { @@ -2077,29 +2100,37 @@ void MainWindowPresenter::doActionWingman() = orloj->getOutlinesMap()->getModel()->item(row); if(item) { Note* note = item->data(Qt::UserRole + 1).value(); - phrase = QString::fromStdString(note->getName()); + if(note) { + contextTextName = QString::fromStdString(note->getName()); + string contextTextStr{}; + mdRepresentation->to(note, &contextTextStr); + contextText = QString::fromStdString(contextTextStr); + contextType = WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE; + } } } } - if(phrase.length() == 0) { + if(contextTextName.length() == 0) { QMessageBox msgBox{ QMessageBox::Critical, - QObject::tr("Empty Phrase"), - QObject::tr("Phrase to search/explain/process is empty.") + QObject::tr("Empty Prompt"), + QObject::tr("Prompt to run/explain/process is empty.") }; msgBox.exec(); return; } - // TODO set type determined ^ - this->wingmanDialog->initForMode(WingmanDialogModes::WINGMAN_DIALOG_MODE_OUTLINE); - // TODO set context name e.g. N name - // TODO set context (actual text to be used in prompt) e.g. N description - + // context + this->wingmanDialog->initForMode(contextType); + if(contextType == WingmanDialogModes::WINGMAN_DIALOG_MODE_TEXT) { + this->wingmanDialog->setContextNameText(""); + this->wingmanDialog->setContextText(contextTextName); + } else { + this->wingmanDialog->setContextNameText(contextTextName); + this->wingmanDialog->setContextText(contextText); + } - // TODO rename content to context - this->wingmanDialog->setContextNameText(phrase); this->wingmanDialog->show(); } @@ -2110,20 +2141,27 @@ void MainWindowPresenter::handleActionWingman() string wingmanAnswer{}; - // TODO get and resolve prompt + // system prompt: prompt + context - // TODO this->wingmanDialog->getPrompt(); - mind->wingmanSummarize( - "FOO text", - wingmanAnswer - ); + // resolve prompt to system prompt + string systemPrompt{this->wingmanDialog->getPromptText().toStdString()}; + replaceAll( + CTX_INCLUDE_NAME, + this->wingmanDialog->getContextNameText().toStdString(), + systemPrompt); + replaceAll( + CTX_INCLUDE_TEXT, + this->wingmanDialog->getContextText().toStdString(), + systemPrompt); + + // RUN wingman + // TODO route action to wingman handler + mind->wingmanSummarize(systemPrompt, wingmanAnswer); // show result - this->chatDialog->insertPrompt("Summarize."); + this->chatDialog->insertPrompt(systemPrompt); // TODO trom huge prompts + suffix ... this->chatDialog->insertOutput(wingmanAnswer); this->chatDialog->show(); - - // TODO TODO TODO continue here } void MainWindowPresenter::doActionOutlineOrNoteNew() diff --git a/app/src/qt/note_editor_view.cpp b/app/src/qt/note_editor_view.cpp index a14ca196..456f81eb 100644 --- a/app/src/qt/note_editor_view.cpp +++ b/app/src/qt/note_editor_view.cpp @@ -101,10 +101,12 @@ NoteEditorView::NoteEditorView(QWidget* parent) this, SLOT(insertCompletion(QString)) ); // shortcut signals + /* new QShortcut( QKeySequence(QKeySequence(Qt::CTRL+Qt::Key_Slash)), this, SLOT(slotStartRunTool()) ); + */ new QShortcut( QKeySequence(QKeySequence(Qt::CTRL+Qt::Key_L)), this, SLOT(slotStartLinkCompletion()) diff --git a/lib/src/config/configuration.h b/lib/src/config/configuration.h index d54a3cce..236edc3a 100644 --- a/lib/src/config/configuration.h +++ b/lib/src/config/configuration.h @@ -70,7 +70,7 @@ constexpr const auto START_TO_OUTLINES_TREE = "outlines tree"; constexpr const auto START_TO_OUTLINES = "outlines"; constexpr const auto START_TO_TAGS = "tags"; constexpr const auto START_TO_RECENT = "recent"; -constexpr const auto START_TO_EISENHOWER_MATRIX = "Eisehower"; +constexpr const auto START_TO_EISENHOWER_MATRIX = "Eisenhower"; constexpr const auto START_TO_HOME_OUTLINE = "home"; constexpr const auto DEFAULT_STARTUP_VIEW = START_TO_OUTLINES; diff --git a/lib/src/gear/string_utils.h b/lib/src/gear/string_utils.h index 34c08ec9..4475c491 100644 --- a/lib/src/gear/string_utils.h +++ b/lib/src/gear/string_utils.h @@ -59,7 +59,7 @@ std::vector stringSplit(const std::string s, const std::string rege std::string normalizeToNcName(std::string name, char quoteChar); /** - * @brief Check wheter strings are identical while ignoring case. + * @brief Check whether the strings are identical while ignoring case. */ static inline bool stringistring(const std::string& a, const std::string& b) { @@ -88,7 +88,7 @@ static inline void stringToLower(const std::string& s, std::string& lowerS) * * New trimmed string is created and returned - caller is responsible for freeing it. */ -static inline char *stringTrim(const char *s) { +static inline char* stringTrim(const char* s) { if(s) { while(isspace(static_cast(*s))) { s++; diff --git a/lib/src/mind/ai/llm/bard_wingman.cpp b/lib/src/mind/ai/llm/bard_wingman.cpp new file mode 100644 index 00000000..73c08647 --- /dev/null +++ b/lib/src/mind/ai/llm/bard_wingman.cpp @@ -0,0 +1,31 @@ +/* + bard_wingman.cpp MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "bard_wingman.h" + +namespace m8r { + +BardWingman::BardWingman() +{ +} + +BardWingman::~BardWingman() +{ +} + +} // m8r namespace diff --git a/lib/src/mind/ai/llm/bard_wingman.h b/lib/src/mind/ai/llm/bard_wingman.h new file mode 100644 index 00000000..f950725b --- /dev/null +++ b/lib/src/mind/ai/llm/bard_wingman.h @@ -0,0 +1,100 @@ +/* + bard_wingman.h MindForger thinking notebook + + Copyright (C) 2016-2024 Martin Dvorak + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef M8R_BARD_WINGMAN_H +#define M8R_BARD_WINGMAN_H + +namespace m8r { + +/* + +PaLM2 prompt: Give C++ call to bard API to get inference + +ANSWER: + +To call the Bard API in C++ to get an inference, you can use the following code: + +#include +#include + +int main() { + // Initialize CURL + CURL *curl = curl_easy_init(); + if (!curl) { + std::cerr << "Failed to initialize CURL" << std::endl; + return 1; + } + + // Set the URL of the Bard API endpoint + curl_easy_setopt(curl, CURLOPT_URL, "https://bard.google.com/v2/query"); + + // Set the request body + std::string requestBody = "query=Hello, world!"; + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestBody.c_str()); + + // Set the content type + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, + std::vector({ + {"Content-Type: application/json"}, + })); + + // Perform the request + CURLcode res = curl_easy_perform(curl); + if (res != CURLE_OK) { + std::cerr << "Failed to perform the request: " << curl_easy_strerror(res) + << std::endl; + return 1; + } + + // Get the response + std::string responseBody; + curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &responseBody.size()); + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &res); + if (res != CURLE_OK || responseBody.empty()) { + std::cerr << "Failed to get a valid response" << std::endl; + return 1; + } + + // Read the response body + std::vector responseBuffer(responseBody.size()); + curl_easy_read_buffer(curl, responseBuffer.data(), responseBuffer.size()); + responseBody.assign(responseBuffer.data(), responseBuffer.size()); + + // Close the connection + curl_easy_cleanup(curl); + + // Print the response + std::cout << responseBody << std::endl; + + return 0; +} + +*/ +class BardWingman +{ +public: + explicit BardWingman(); + BardWingman(const BardWingman&) = delete; + BardWingman(const BardWingman&&) = delete; + BardWingman& operator =(const BardWingman&) = delete; + BardWingman& operator =(const BardWingman&&) = delete; + ~BardWingman(); +}; + +} +#endif // M8R_BARD_WINGMAN_H diff --git a/lib/src/mind/ai/llm/mock_wingman.cpp b/lib/src/mind/ai/llm/mock_wingman.cpp index f977bf23..9a8d420f 100644 --- a/lib/src/mind/ai/llm/mock_wingman.cpp +++ b/lib/src/mind/ai/llm/mock_wingman.cpp @@ -35,7 +35,7 @@ void MockWingman::summarize(const string& text, string& summary) { MF_DEBUG("MockWingman::summarize() text:" << text << endl); - summary = "This is a MOCK summary of the text: '"+text+"'."; + summary = "SUMMARY(MOCK, '"+text+"')"; MF_DEBUG("MockWingman::summarize() summary:" << summary << endl); } diff --git a/lib/src/mind/ai/llm/openai_wingman.cpp b/lib/src/mind/ai/llm/openai_wingman.cpp index 496d8791..a1e43e14 100644 --- a/lib/src/mind/ai/llm/openai_wingman.cpp +++ b/lib/src/mind/ai/llm/openai_wingman.cpp @@ -71,7 +71,7 @@ void OpenAiWingman::summarize(const string& text, string& summary) { MF_DEBUG("OpenAiWingman::summarize() text:" << text << endl); - summary = "This is a OPENAI summary of the text: '"+text+"'."; + summary = "SUMMARY(OpenAI, '"+text+"')"; MF_DEBUG("OpenAiWingman::summarize() summary:" << summary << endl); } diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h index 5e0f3c8b..40ebfdaa 100644 --- a/lib/src/mind/ai/llm/wingman.h +++ b/lib/src/mind/ai/llm/wingman.h @@ -20,14 +20,52 @@ #define M8R_WINGMAN_H #include +#include #include "../../../debug.h" namespace m8r { +/* + * Predefined LLM prompts. + */ + +constexpr const auto CTX_INCLUDE_NAME = "#NAME"; +constexpr const auto CTX_INCLUDE_TEXT = "#TEXT"; + +constexpr const auto PROMPT_SUMMARIZE = "Summarize: #NAME. #TEXT"; +constexpr const auto PROMPT_GENERATE_TAGS = "Generate tags for: #NAME. #TEXT"; +constexpr const auto PROMPT_FIND_PERSONS = "Find persons names in: #NAME. #TEXT"; +constexpr const auto PROMPT_FIND_LOCATIONS = "Find locations in: #NAME. #TEXT"; +constexpr const auto PROMPT_FIND_ORGS = "Find organizations in: #NAME. #TEXT"; +constexpr const auto PROMPT_CHAT = "Chat with the context."; + +constexpr const auto PROMPT_SHORTEN = "Shorten #TEXT"; +constexpr const auto PROMPT_EXPLAIN_LIKE_5 = "Explain #NAME like I'm 5."; +constexpr const auto PROMPT_FIX_GRAMMAR = "Fix grammar in: #TEXT"; +constexpr const auto PROMPT_REWRITE_FORMALLY = "Rewrite formally: #TEXT"; +constexpr const auto PROMPT_REWRITE_INFORMALLY = "Rewrite informally: #TEXT"; +constexpr const auto PROMPT_REWRITE_KAFKA = "Rewrite in Kafka style: #TEXT"; + +constexpr const auto PROMPT_COMPLETE_TEXT = "Complete the text: #TEXT"; + +// other UCs: +// - NER UCs +// - simplify +// - beautify +// - translate +// - fix spelling +// - fix style +// - create plan ... + +/* + * Wingman providers. + */ + enum WingmanLlmProviders { WINGMAN_PROVIDER_MOCK, WINGMAN_PROVIDER_OPENAI, + WINGMAN_PROVIDER_GOOGLE, }; /** @@ -38,6 +76,37 @@ class Wingman private: WingmanLlmProviders llmProvider; + std::vector outlinePrompts = { + PROMPT_SUMMARIZE, + PROMPT_GENERATE_TAGS, + PROMPT_FIND_PERSONS, + PROMPT_FIND_LOCATIONS, + PROMPT_FIND_ORGS, + // PROMPT_CHAT, + }; + + std::vector notePrompts = { + PROMPT_SUMMARIZE, + PROMPT_SHORTEN, + PROMPT_EXPLAIN_LIKE_5, + PROMPT_GENERATE_TAGS, + PROMPT_FIX_GRAMMAR, + PROMPT_REWRITE_FORMALLY, + PROMPT_REWRITE_INFORMALLY, + PROMPT_REWRITE_KAFKA, + // PROMPT_CHAT, + }; + + std::vector textPrompts = { + PROMPT_COMPLETE_TEXT, + PROMPT_EXPLAIN_LIKE_5, + PROMPT_FIX_GRAMMAR, + PROMPT_GENERATE_TAGS, + PROMPT_REWRITE_FORMALLY, + PROMPT_REWRITE_INFORMALLY, + PROMPT_REWRITE_KAFKA, + }; + public: explicit Wingman(WingmanLlmProviders llmProvider); Wingman(const Wingman&) = delete; @@ -46,6 +115,16 @@ class Wingman Wingman& operator =(const Wingman&&) = delete; virtual ~Wingman(); + virtual const std::vector& getPredefinedOPrompts() { + return outlinePrompts; + } + virtual const std::vector& getPredefinedNPrompts() { + return notePrompts; + } + virtual const std::vector& getPredefinedTPrompts() { + return textPrompts; + } + // dialog || menu Notebook/Wingman/Summarize || menu Note/Wingman/Summarize virtual void summarize(const std::string& text, std::string& summary) = 0; }; diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h index 2174ea9a..7e2f6dc9 100644 --- a/lib/src/mind/mind.h +++ b/lib/src/mind/mind.h @@ -675,6 +675,7 @@ class Mind : public OntologyProvider /* * WINGMAN */ + Wingman* getWingman() const { return wingman; } void wingmanSummarize(const std::string& text, std::string& summary); /* From 153496e4a66a8a835fae53a1befb6c2b10449040 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 14 Jan 2024 08:12:50 +0100 Subject: [PATCH 079/131] Fixing test library compilation. --- lib/src/mind/ai/ai.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/src/mind/ai/ai.h b/lib/src/mind/ai/ai.h index 5d4d6b68..d57c9f7e 100644 --- a/lib/src/mind/ai/ai.h +++ b/lib/src/mind/ai/ai.h @@ -70,7 +70,7 @@ class Ai * Associations */ - // Associations assessment implemenations: AA @ weighted FTS, AA @ BoW + // Associations assessment implementations: AA @ weighted FTS, AA @ BoW AiAssociationsAssessment* aa; /* @@ -140,6 +140,18 @@ class Ai * @brief Train associations assessment neural network once memory is learned. */ void trainAaNn(); + +#ifdef DO_MF_DEBUG +public: + static void print(const Note* n, std::vector>& leaderboard) { + std::cout << "Note '" << n->getName() << "' AA leaderboard("<< leaderboard.size() <<"):" << std::endl; + int i=1; + for(auto& nn:leaderboard) { + std::cout << " #" << i++ << " '" << nn.first->getName() << "' ~ " << nn.second << std::endl; + } + } +#endif + }; } From 9ceb557bf5834dd0358b643d42757349f488c316 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Sun, 14 Jan 2024 08:15:26 +0100 Subject: [PATCH 080/131] OpenAI Wingman works! (1st usecase ~ summarization) + adding JSon parsing library #1514 --- CREDITS.md | 1 + Changelog | 24 +- app/app.pro | 2 +- app/src/qt/dialogs/chat_dialog.cpp | 9 +- app/src/qt/dialogs/wingman_dialog.cpp | 4 +- app/src/qt/main_menu_view.cpp | 20 +- lib/src/mind/ai/llm/mock_wingman.cpp | 9 +- lib/src/mind/ai/llm/mock_wingman.h | 2 +- lib/src/mind/ai/llm/openai_wingman.cpp | 141 +- lib/src/mind/ai/llm/openai_wingman.h | 8 +- lib/src/mind/ai/llm/wingman.h | 3 +- lib/src/mind/mind.cpp | 13 +- lib/src/mind/mind.h | 2 +- .../representations/json/nlohmann/json.hpp | 24766 ++++++++++++++++ lib/test/src/src.pro | 2 +- licenses/json-license.txt | 21 + 16 files changed, 24958 insertions(+), 69 deletions(-) create mode 100644 lib/src/representations/json/nlohmann/json.hpp create mode 100644 licenses/json-license.txt diff --git a/CREDITS.md b/CREDITS.md index a267c852..22a09d35 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -13,6 +13,7 @@ Big thanks to 3rd party FOSS content authors: * GitHub ([CMark GFM](https://github.com/github/cmark-gfm) - Markdown rendering - lib) * Kevin Hendricks, Bjoern Jacke, Lázsló Németh ([Hunspell](https://github.com/hunspell/hunspell) - spellcheck - lib) * Daniel Stenberg ([cURL](https://curl.se) - libcurl with GnuTLS flavor) +* Niels Lohmann ([json](https://github.com/nlohmann/json) - JSon for modern C++ library) * NetBSD Foundation (strptime - Windows port - lib) * Toni Ronkko (dirent - Windows port - lib) * Microsoft (getopt - Windows port - lib) diff --git a/Changelog b/Changelog index 82e8085c..67c48fe1 100644 --- a/Changelog +++ b/Changelog @@ -1,13 +1,17 @@ 2024-02-?? Martin Dvorak - * Released v2.0.0 - major release which removes features which are not used - in practices and brings several new features. + * Released v2.0.0 - a major release that removes unused features + and brings several new features like Wingman + * Feature: Wingman brings OpenAI chat GPT integration allowing to + compose, rewrite, summarize, do NER, fix, or chat with remarks. * Feature: Notebook Tree view brings ability to organize Notebooks to and outline. * Feature: Libraries bring ability to index external PDF files and generate Notebooks which represent them in MindForger. Synchronization and removal of the library supported as well. - * Feature: New left side toolbar which runs various tools + * Feature: Emojis dialog allowing to use Unicode-based emojis + in Notebook names, Note names or text. + * Hidden feature: New left side toolbar which runs various tools (like Wikipedia, arXiv, StackOverflow, ...) on phrase which is the current context (Notebook or Note name, selected text or text under the cursor, ...) in order to get more information about the phrase. @@ -20,17 +24,21 @@ O's Ns while presenting a N. * Enhancement: MindForger icon changed to GenAI style. * Enhancement: CLI rewrite towards Wingman with help, search, knowledge recherche and commands. + * Enhancement: menu refactoring impacting Scope, and Navigate and various + menu items. * Fix: Missing OOTB Eisenhower Matrix is automatically added back to the list of Organizers. - * Fix: Conflicting menu keyboard shortcuts resolved. + * Fix: Conflicting menu keyboard shortcuts resolution (e.g. Organizers view). * Deprecation: dashboard view removed. + * Deprecation: experimental Nitie code removed. 2023-01-15 Martin Dvorak - * Released v1.55.0 - delete of a Note in the outline view keeps selected - an adjacent Note, improved page up/page down navigation in table widgets, - Tools menu, charset added to HTML head, new Note templates, from Registry - to Workspace in UI (source code kept intact). + * Released v1.55.0 - a minor release which fixes delete of a Note in + the Notebook view that now keeps selected an adjacent Note, improves + page up/page down navigation in table widgets, adds charset to + the exported HTML head, adds new Note templates, and renames Repository + to Workspace in the UI (source code kept intact). 2022-03-07 Martin Dvorak diff --git a/app/app.pro b/app/app.pro index ff2bb090..540def88 100644 --- a/app/app.pro +++ b/app/app.pro @@ -88,7 +88,7 @@ win32 { else:CONFIG(debug, debug|release): LIBS += -L$$PWD/../lib/debug -lmindforger } else { # Linux and macOS - LIBS += -L$$OUT_PWD/../lib -lmindforger + LIBS += -L$$OUT_PWD/../lib -lmindforger -lcurl } # Markdown to HTML: cmark-gfm (or nothing) diff --git a/app/src/qt/dialogs/chat_dialog.cpp b/app/src/qt/dialogs/chat_dialog.cpp index d861d034..d1acf3c2 100644 --- a/app/src/qt/dialogs/chat_dialog.cpp +++ b/app/src/qt/dialogs/chat_dialog.cpp @@ -97,17 +97,16 @@ void ChatDialog::show() string ChatDialog::getTerminalPrompt(bool error) { - // TODO - string thing{"notebook"}; - string thingName{"My notebook"}; - string wingmanModel{"OpenAI gpt-3"}; + string thing{"notebook"}; // TODO notebook / note + string thingName{"My notebook"}; // TODO name based on ctx + string wingmanModel{"OpenAI gpt-3"}; // TODO get provider from mind (virtual method @ base class) string prompt{ "
" "@" + thing + " " + "" + thingName + "" "        " - "" + wingmanModel + "" + "[" + wingmanModel + "]" "
" }; diff --git a/app/src/qt/dialogs/wingman_dialog.cpp b/app/src/qt/dialogs/wingman_dialog.cpp index 01c0399b..c9803b64 100644 --- a/app/src/qt/dialogs/wingman_dialog.cpp +++ b/app/src/qt/dialogs/wingman_dialog.cpp @@ -28,8 +28,8 @@ WingmanDialog::WingmanDialog( const vector& predefinedTPrompts, QWidget* parent ): - context{}, - QDialog(parent) + QDialog(parent), + context{} { for(string prompt:predefinedOPrompts) { outlinePrompts.push_back(QString::fromStdString(prompt)); diff --git a/app/src/qt/main_menu_view.cpp b/app/src/qt/main_menu_view.cpp index 781bf4b4..7d76d2e5 100644 --- a/app/src/qt/main_menu_view.cpp +++ b/app/src/qt/main_menu_view.cpp @@ -1091,6 +1091,7 @@ void MainMenuView::showAllMenuItems() actionOrganizerMovePrevious->setEnabled(true); actionOrganizerMoveNext->setEnabled(true); + menuNavigator->show(); menuNavigator->setEnabled(true); actionViewOrganizers->setEnabled(true); actionOutlineEdit->setEnabled(true); @@ -1180,7 +1181,6 @@ void MainMenuView::showModeAwareFacet(bool repositoryMode, bool mfMode) } } - void MainMenuView::showFacetOrganizerList(bool repositoryMode, bool mfMode) { showAllMenuItems(); @@ -1193,7 +1193,7 @@ void MainMenuView::showFacetOrganizerList(bool repositoryMode, bool mfMode) actionOrganizerMovePrevious->setEnabled(false); actionOrganizerMoveNext->setEnabled(false); - menuNavigator->setEnabled(false); + menuNavigator->setEnabled(false); menuNavigator->setVisible(false); menuLibrary->setEnabled(false); menuOutline->setEnabled(false); menuNote->setEnabled(false); @@ -1208,10 +1208,8 @@ void MainMenuView::showFacetOrganizerView(bool repositoryMode, bool mfMode) { showAllMenuItems(); - menuNavigator->setEnabled(false); -#ifdef MF_WIP + menuNavigator->setEnabled(false); menuNavigator->hide(); menuLibrary->setEnabled(false); -#endif menuOutline->setEnabled(false); menuNote->setEnabled(false); menuEdit->setEnabled(false); @@ -1225,7 +1223,7 @@ void MainMenuView::showFacetOutlineList(bool repositoryMode, bool mfMode) { showAllMenuItems(); - menuNavigator->setEnabled(false); + menuNavigator->setEnabled(false); menuNavigator->hide(); menuOrganizer->setEnabled(false); menuEdit->setEnabled(false); menuFormat->setEnabled(false); @@ -1250,7 +1248,7 @@ void MainMenuView::showFacetOutlinesMap(bool repositoryMode, bool mfMode) { showAllMenuItems(); - menuNavigator->setEnabled(false); + menuNavigator->setEnabled(false); menuNavigator->hide(); menuOrganizer->setEnabled(false); menuEdit->setEnabled(false); menuFormat->setEnabled(false); @@ -1264,10 +1262,8 @@ void MainMenuView::showFacetOutlineView(bool repositoryMode, bool mfMode) { showAllMenuItems(); - menuNavigator->setEnabled(false); -#ifdef MF_WIP + menuNavigator->setEnabled(false); menuNavigator->hide(); menuLibrary->setEnabled(false); -#endif menuOrganizer->setEnabled(false); menuEdit->setEnabled(false); menuFormat->setEnabled(false); @@ -1289,9 +1285,7 @@ void MainMenuView::showFacetNoteEdit(bool repositoryMode, bool mfMode) menuMind->setEnabled(false); actionExit->setEnabled(false); -#ifdef MF_WIP menuLibrary->setEnabled(false); -#endif menuOrganizer->setEnabled(false); actionOrganizerNew->setEnabled(false); actionOrganizerEdit->setEnabled(false); @@ -1317,7 +1311,7 @@ void MainMenuView::showFacetNoteEdit(bool repositoryMode, bool mfMode) actionViewLimbo->setEnabled(false); actionViewRecentNotes->setEnabled(false); - menuNavigator->setEnabled(false); + menuNavigator->setEnabled(false); menuNavigator->hide(); actionViewOrganizers->setEnabled(false); actionOutlineEdit->setEnabled(false); actionOutlineClone->setEnabled(false); diff --git a/lib/src/mind/ai/llm/mock_wingman.cpp b/lib/src/mind/ai/llm/mock_wingman.cpp index 9a8d420f..dcfd6406 100644 --- a/lib/src/mind/ai/llm/mock_wingman.cpp +++ b/lib/src/mind/ai/llm/mock_wingman.cpp @@ -31,13 +31,14 @@ MockWingman::~MockWingman() { } -void MockWingman::summarize(const string& text, string& summary) + +void MockWingman::chat(const std::string& prompt, std::string& answer) { - MF_DEBUG("MockWingman::summarize() text:" << text << endl); + MF_DEBUG("MockWingman::summarize() text:" << prompt << endl); - summary = "SUMMARY(MOCK, '"+text+"')"; + answer.assign("chat(MOCK, '"+prompt+"')"); - MF_DEBUG("MockWingman::summarize() summary:" << summary << endl); + MF_DEBUG("MockWingman::summarize() summary:" << answer << endl); } } // m8r namespace diff --git a/lib/src/mind/ai/llm/mock_wingman.h b/lib/src/mind/ai/llm/mock_wingman.h index 3cdd3455..afc1aff9 100644 --- a/lib/src/mind/ai/llm/mock_wingman.h +++ b/lib/src/mind/ai/llm/mock_wingman.h @@ -36,7 +36,7 @@ class MockWingman: Wingman MockWingman& operator =(const MockWingman&&) = delete; ~MockWingman(); - virtual void summarize(const std::string& text, std::string& summary) override; + virtual void chat(const std::string& prompt, std::string& answer) override; }; } diff --git a/lib/src/mind/ai/llm/openai_wingman.cpp b/lib/src/mind/ai/llm/openai_wingman.cpp index a1e43e14..be5ef8ec 100644 --- a/lib/src/mind/ai/llm/openai_wingman.cpp +++ b/lib/src/mind/ai/llm/openai_wingman.cpp @@ -18,6 +18,10 @@ */ #include "openai_wingman.h" +#include "../../../representations/json/nlohmann/json.hpp" + +#include "../../../gear/string_utils.h" + namespace m8r { using namespace std; @@ -26,12 +30,10 @@ using namespace std; * cURL callback for writing data to string. */ -static size_t WriteCallback( - void* contents, size_t size, size_t nmemb, void* userp -) { - ((std::string*)userp)->append((char*)contents, size * nmemb); - - return size * nmemb; +size_t openaiCurlWriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) { + size_t totalSize = size * nmemb; + output->append((char*)contents, totalSize); + return totalSize; } /* @@ -39,41 +41,126 @@ static size_t WriteCallback( */ OpenAiWingman::OpenAiWingman() - : Wingman(WingmanLlmProviders::WINGMAN_PROVIDER_OPENAI) + : Wingman(WingmanLlmProviders::WINGMAN_PROVIDER_OPENAI), + apiKey{} { + const char* apiKeyEnv = std::getenv("OPENAI_API_KEY"); + if (!apiKeyEnv) { + std::cerr << "OpenAI API key not found in the environment variable OPENAI_API_KEY." << std::endl; + // TODO open FE dialog and ask for entering the key + throw std::runtime_error( + "OpenAI API key not found in the environment variable OPENAI_API_KEY."); + } + this->apiKey = string(apiKeyEnv); } OpenAiWingman::~OpenAiWingman() { } -void OpenAiWingman::curlGet(string& url, string& readBuffer) -{ - CURL* curl; - CURLcode res; - - curl = curl_easy_init(); - if(curl) { - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); - - // https://curl.se/libcurl/c/curl_easy_perform.html - res = curl_easy_perform(curl); - +/** + * OpenAI cURL GET request. + * + * @see https://platform.openai.com/docs/guides/text-generation/chat-completions-api?lang=curl + */ +void OpenAiWingman::curlGet( + const string& prompt, + string& response +) { + CURL* curl = curl_easy_init(); + if (curl) { + // TODO get GPT model from the configuration + string gptModel{"gpt-3.5-turbo"}; + + string escapedPrompt{prompt}; + replaceAll("\n", " ", escapedPrompt); + replaceAll("\"", "\\\"", escapedPrompt); + + string promptJSon{ + "{" + " \"model\": \"" + gptModel + "\"," + " \"messages\": [" + " {" + " \"role\": \"system\"," + " \"content\": \"You are a helpful assistant.\"" + " }," + // TODO conversation history as additional context + //" {" + //" \"role\": \"user\"," + //" \"content\": \"Who won the world series in 2020?\"" + //" }," + //" {" + //" \"role\": \"assistant\"," + //" \"content\": \"The Los Angeles Dodgers won the World Series in 2020.\"" + //" }," + " {" + " \"role\": \"user\"," + " \"content\": \"" + escapedPrompt + "\"" + " }" + " ]" + "}" + }; + MF_DEBUG( + "OpenAiWingman::curlGet() promptJSon:" << endl + << ">>>" + << promptJSon + << "<<<" + << endl); + // TODO remove + // TODO response = promptJSon; + + // set up cURL options + curl_easy_setopt( + curl, CURLOPT_URL, + "https://api.openai.com/v1/chat/completions"); + curl_easy_setopt( + curl, CURLOPT_POSTFIELDS, + promptJSon.c_str()); + curl_easy_setopt( + curl, CURLOPT_WRITEFUNCTION, + openaiCurlWriteCallback); + curl_easy_setopt( + curl, CURLOPT_WRITEDATA, + &response); + + struct curl_slist* headers = NULL; + headers = curl_slist_append(headers, ("Authorization: Bearer " + apiKey).c_str()); + headers = curl_slist_append(headers, "Content-Type: application/json"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + + // perform the request + CURLcode res = curl_easy_perform(curl); + + // clean up curl_easy_cleanup(curl); - MF_DEBUG("Wingman::curlGet() result:" << res << endl); - MF_DEBUG("Wingman::curlGet() response:" << readBuffer << endl); + curl_slist_free_all(headers); + + if (res != CURLE_OK) { + std::cerr << "cURL request failed: " << curl_easy_strerror(res) << std::endl; + response.clear(); + } + // TODO report error code to show RED in chat + + // parse JSon + // TODO import to json namespace + // TODO auto responseJSon = nlohmann::json::parse(R"({"happy": true, "pi": 3.141})"); + auto responseJSon = nlohmann::json::parse(response); + MF_DEBUG( + "OpenAiWingman::curlGet() responseJSon:" << endl + << ">>>" + << responseJSon.dump(4) + << "<<<" + << endl); } } -void OpenAiWingman::summarize(const string& text, string& summary) +void OpenAiWingman::chat(const std::string& prompt, std::string& answer) { - MF_DEBUG("OpenAiWingman::summarize() text:" << text << endl); + MF_DEBUG("OpenAiWingman::summarize() prompt:" << endl << prompt << endl); - summary = "SUMMARY(OpenAI, '"+text+"')"; + curlGet(prompt, answer); - MF_DEBUG("OpenAiWingman::summarize() summary:" << summary << endl); + MF_DEBUG("OpenAiWingman::summarize() summary:" << endl << answer << endl); } } // m8r namespace diff --git a/lib/src/mind/ai/llm/openai_wingman.h b/lib/src/mind/ai/llm/openai_wingman.h index 6dd58aa9..0e0d5d2e 100644 --- a/lib/src/mind/ai/llm/openai_wingman.h +++ b/lib/src/mind/ai/llm/openai_wingman.h @@ -33,7 +33,11 @@ namespace m8r { class OpenAiWingman: Wingman { private: - void curlGet(std::string& url, std::string& readBuffer); + std::string apiKey; + + void curlGet( + const std::string& prompt, + std::string& response); public: explicit OpenAiWingman(); @@ -43,7 +47,7 @@ class OpenAiWingman: Wingman OpenAiWingman& operator =(const OpenAiWingman&&) = delete; ~OpenAiWingman(); - virtual void summarize(const std::string& text, std::string& summary) override; + virtual void chat(const std::string& prompt, std::string& answer) override; }; } diff --git a/lib/src/mind/ai/llm/wingman.h b/lib/src/mind/ai/llm/wingman.h index 40ebfdaa..13fd8f08 100644 --- a/lib/src/mind/ai/llm/wingman.h +++ b/lib/src/mind/ai/llm/wingman.h @@ -125,8 +125,7 @@ class Wingman return textPrompts; } - // dialog || menu Notebook/Wingman/Summarize || menu Note/Wingman/Summarize - virtual void summarize(const std::string& text, std::string& summary) = 0; + virtual void chat(const std::string& prompt, std::string& answer) = 0; }; } diff --git a/lib/src/mind/mind.cpp b/lib/src/mind/mind.cpp index 4d183efe..9c806158 100644 --- a/lib/src/mind/mind.cpp +++ b/lib/src/mind/mind.cpp @@ -52,7 +52,16 @@ Mind::Mind(Configuration &configuration) scopeAspect{timeScopeAspect, tagsScopeAspect} { ai = new Ai{memory, *this}; - wingman = (Wingman*)new MockWingman{}; + + // wingman: MOCK + // wingman = (Wingman*)new MockWingman{}; + // wingman: OpenAI + wingman = (Wingman*)new OpenAiWingman{}; + // wingman: Google Bard + // wingman = (Wingman*)new BardWingman{}; + + + deleteWatermark = 0; activeProcesses = 0; associationsSemaphore = 0; @@ -1442,7 +1451,7 @@ Outline* Mind::findOutlineByKey(const string& key) const void Mind::wingmanSummarize(const string& text, string& summary) { MF_DEBUG("MIND: Wingman summarizing: '" << text << "'" << endl); - wingman->summarize(text, summary); + wingman->chat(text, summary); } } /* namespace */ diff --git a/lib/src/mind/mind.h b/lib/src/mind/mind.h index 7e2f6dc9..cbd1aff2 100644 --- a/lib/src/mind/mind.h +++ b/lib/src/mind/mind.h @@ -29,7 +29,7 @@ #include "knowledge_graph.h" #include "ai/ai.h" #include "ai/llm/wingman.h" -#include "ai/llm/mock_wingman.h" +#include "ai/llm/openai_wingman.h" #include "associated_notes.h" #include "ontology/thing_class_rel_triple.h" #include "aspect/mind_scope_aspect.h" diff --git a/lib/src/representations/json/nlohmann/json.hpp b/lib/src/representations/json/nlohmann/json.hpp new file mode 100644 index 00000000..b191bb91 --- /dev/null +++ b/lib/src/representations/json/nlohmann/json.hpp @@ -0,0 +1,24766 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file docs/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 3 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 3 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // nullptr_t +#include // exception +#if JSON_DIAGNOSTICS + #include // accumulate +#endif +#include // runtime_error +#include // to_string +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // declval, pair +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + + +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson +// SPDX-License-Identifier: MIT + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + + +// This file contains all internal macro definitions (except those affecting ABI) +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// #include + + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#ifdef __has_include + #if __has_include() + #include + #endif +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_THREE_WAY_COMPARISON + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L + #define JSON_HAS_THREE_WAY_COMPARISON 1 + #else + #define JSON_HAS_THREE_WAY_COMPARISON 0 + #endif +#endif + +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifndef JSON_HAS_STATIC_RTTI + #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0 + #define JSON_HAS_STATIC_RTTI 1 + #else + #define JSON_HAS_STATIC_RTTI 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + +#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) + #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else + #define JSON_NO_UNIQUE_ADDRESS +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType, \ + class CustomBaseClass> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1); + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +// inspired from https://stackoverflow.com/a/26745591 +// allows to call any std function as if (e.g. with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 +#endif + +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif + +#if JSON_HAS_THREE_WAY_COMPARISON + #include // partial_ordering +#endif + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +#if JSON_HAS_THREE_WAY_COMPARISON + inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* +#else + inline bool operator<(const value_t lhs, const value_t rhs) noexcept +#endif +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + if (l_index < order.size() && r_index < order.size()) + { + return order[l_index] <=> order[r_index]; // *NOPAD* + } + return std::partial_ordering::unordered; +#else + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +#endif +} + +// GCC selects the built-in operator< over an operator rewritten from +// a user-defined spaceship operator +// Clang, MSVC, and ICC select the rewritten candidate +// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) +#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + return std::is_lt(lhs <=> rhs); // *NOPAD* +} +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +template +inline void replace_substring(StringType& s, const StringType& f, + const StringType& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != StringType::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +template +inline StringType escape(StringType s) +{ + replace_substring(s, StringType{"~"}, StringType{"~0"}); + replace_substring(s, StringType{"/"}, StringType{"~1"}); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +template +static void unescape(StringType& s) +{ + replace_substring(s, StringType{"~1"}, StringType{"/"}); + replace_substring(s, StringType{"~0"}, StringType{"~"}); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // size_t + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static JSON_INLINE_VARIABLE constexpr T value{}; +}; + +#ifndef JSON_HAS_CPP_17 + template + constexpr T static_const::value; +#endif + +template +inline constexpr std::array make_array(Args&& ... args) +{ + return std::array {{static_cast(std::forward(args))...}}; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // numeric_limits +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval +#include // tuple +#include // char_traits + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // random_access_iterator_tag + +// #include + +// #include + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); + +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); + +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ + #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + #include // int64_t, uint64_t + #include // map + #include // allocator + #include // string + #include // vector + + // #include + + + /*! + @brief namespace for Niels Lohmann + @see https://github.com/nlohmann + @since version 1.0.0 + */ + NLOHMANN_JSON_NAMESPACE_BEGIN + + /*! + @brief default JSONSerializer template argument + + This serializer ignores the template arguments and uses ADL + ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) + for serialization. + */ + template + struct adl_serializer; + + /// a class to store JSON values + /// @sa https://json.nlohmann.me/api/basic_json/ + template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector, // cppcheck-suppress syntaxError + class CustomBaseClass = void> + class basic_json; + + /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document + /// @sa https://json.nlohmann.me/api/json_pointer/ + template + class json_pointer; + + /*! + @brief default specialization + @sa https://json.nlohmann.me/api/json/ + */ + using json = basic_json<>; + + /// @brief a minimal map-like container that preserves insertion order + /// @sa https://json.nlohmann.me/api/ordered_map/ + template + struct ordered_map; + + /// @brief specialization that maintains the insertion order of object keys + /// @sa https://json.nlohmann.me/api/ordered_json/ + using ordered_json = basic_json; + + NLOHMANN_JSON_NAMESPACE_END + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +NLOHMANN_JSON_NAMESPACE_BEGIN +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ + +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +// used by exceptions create() member functions +// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t +// false_type otherwise +template +struct is_basic_json_context : + std::integral_constant < bool, + is_basic_json::type>::type>::value + || std::is_same::value > +{}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +template +using detect_key_compare = typename T::key_compare; + +template +struct has_key_compare : std::integral_constant::value> {}; + +// obtains the actual object key comparator +template +struct actual_object_comparator +{ + using object_t = typename BasicJsonType::object_t; + using object_comparator_t = typename BasicJsonType::default_object_comparator_t; + using type = typename std::conditional < has_key_compare::value, + typename object_t::key_compare, object_comparator_t>::type; +}; + +template +using actual_object_comparator_t = typename actual_object_comparator::type; + +///////////////// +// char_traits // +///////////////// + +// Primary template of char_traits calls std char_traits +template +struct char_traits : std::char_traits +{}; + +// Explicitly define char traits for unsigned char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = unsigned char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(EOF); + } +}; + +// Explicitly define char traits for signed char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = signed char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(EOF); + } +}; + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B { }; +template +struct conjunction +: std::conditional(B::value), conjunction, B>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + // launder type through decltype() to fix compilation failure on ICPC +#ifdef __INTEL_COMPILER + using laundered_type = decltype(std::declval()); +#else + using laundered_type = ConstructibleStringType; +#endif + + static constexpr auto value = + conjunction < + is_constructible, + is_detected_exact>::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& + is_complete_type < + detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +template +struct is_json_iterator_of : std::false_type {}; + +template +struct is_json_iterator_of : std::true_type {}; + +template +struct is_json_iterator_of : std::true_type +{}; + +// checks if a given type T is a template specialization of Primary +template