mirror of
https://github.com/Ladebeze66/notes_stage_brut.git
synced 2025-12-13 09:06:52 +01:00
first commit
This commit is contained in:
commit
b15f7a8f1d
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
echo '.obsidian/workspace' >> .gitignore
|
||||
echo '.DS_Store' >> .gitignore
|
||||
echo 'node_modules' >> .gitignore
|
||||
echo '*.log' >> .gitignore
|
||||
|
||||
3
.obsidian/app.json
vendored
Normal file
3
.obsidian/app.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"spellcheck": true
|
||||
}
|
||||
1
.obsidian/appearance.json
vendored
Normal file
1
.obsidian/appearance.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{}
|
||||
4
.obsidian/community-plugins.json
vendored
Normal file
4
.obsidian/community-plugins.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
[
|
||||
"editing-toolbar",
|
||||
"obsidian-auto-link-title"
|
||||
]
|
||||
31
.obsidian/core-plugins.json
vendored
Normal file
31
.obsidian/core-plugins.json
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
{
|
||||
"file-explorer": true,
|
||||
"global-search": true,
|
||||
"switcher": true,
|
||||
"graph": true,
|
||||
"backlink": true,
|
||||
"canvas": true,
|
||||
"outgoing-link": true,
|
||||
"tag-pane": true,
|
||||
"properties": false,
|
||||
"page-preview": true,
|
||||
"daily-notes": true,
|
||||
"templates": true,
|
||||
"note-composer": true,
|
||||
"command-palette": true,
|
||||
"slash-command": false,
|
||||
"editor-status": true,
|
||||
"bookmarks": true,
|
||||
"markdown-importer": false,
|
||||
"zk-prefixer": false,
|
||||
"random-note": false,
|
||||
"outline": true,
|
||||
"word-count": true,
|
||||
"slides": false,
|
||||
"audio-recorder": false,
|
||||
"workspaces": true,
|
||||
"file-recovery": true,
|
||||
"publish": false,
|
||||
"sync": true,
|
||||
"webviewer": false
|
||||
}
|
||||
22
.obsidian/graph.json
vendored
Normal file
22
.obsidian/graph.json
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"collapse-filter": true,
|
||||
"search": "",
|
||||
"showTags": false,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": true,
|
||||
"collapse-color-groups": true,
|
||||
"colorGroups": [],
|
||||
"collapse-display": true,
|
||||
"showArrow": false,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1,
|
||||
"lineSizeMultiplier": 1,
|
||||
"collapse-forces": true,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 0.713275462622445,
|
||||
"close": true
|
||||
}
|
||||
62
.obsidian/hotkeys.json
vendored
Normal file
62
.obsidian/hotkeys.json
vendored
Normal file
@ -0,0 +1,62 @@
|
||||
{
|
||||
"editor:toggle-spellcheck": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod"
|
||||
],
|
||||
"key": "V"
|
||||
}
|
||||
],
|
||||
"editor:swap-line-down": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Shift"
|
||||
],
|
||||
"key": "ArrowDown"
|
||||
}
|
||||
],
|
||||
"editor:swap-line-up": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Shift"
|
||||
],
|
||||
"key": "ArrowUp"
|
||||
}
|
||||
],
|
||||
"editor:unfold-all": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod",
|
||||
"Shift"
|
||||
],
|
||||
"key": "D"
|
||||
}
|
||||
],
|
||||
"editor:fold-all": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod",
|
||||
"Shift"
|
||||
],
|
||||
"key": "P"
|
||||
}
|
||||
],
|
||||
"editor:fold-less": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod",
|
||||
"Shift"
|
||||
],
|
||||
"key": "+"
|
||||
}
|
||||
],
|
||||
"editor:fold-more": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod",
|
||||
"Shift"
|
||||
],
|
||||
"key": "-"
|
||||
}
|
||||
]
|
||||
}
|
||||
319
.obsidian/plugins/editing-toolbar/data.json
vendored
Normal file
319
.obsidian/plugins/editing-toolbar/data.json
vendored
Normal file
@ -0,0 +1,319 @@
|
||||
{
|
||||
"lastVersion": "3.1.3",
|
||||
"aestheticStyle": "default",
|
||||
"positionStyle": "top",
|
||||
"menuCommands": [
|
||||
{
|
||||
"id": "editing-toolbar:editor-undo",
|
||||
"name": "Undo editor",
|
||||
"icon": "undo-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor-redo",
|
||||
"name": "Redo editor",
|
||||
"icon": "redo-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:toggle-format-brush",
|
||||
"name": "Format Brush",
|
||||
"icon": "paintbrush"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:format-eraser",
|
||||
"name": "Clear text formatting",
|
||||
"icon": "eraser"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:header2-text",
|
||||
"name": "Header 2",
|
||||
"icon": "header-2"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:header3-text",
|
||||
"name": "Header 3",
|
||||
"icon": "header-3"
|
||||
},
|
||||
{
|
||||
"id": "SubmenuCommands-header",
|
||||
"name": "submenu",
|
||||
"icon": "header-n",
|
||||
"SubmenuCommands": [
|
||||
{
|
||||
"id": "editing-toolbar:header1-text",
|
||||
"name": "Header 1",
|
||||
"icon": "header-1"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:header4-text",
|
||||
"name": "Header 4",
|
||||
"icon": "header-4"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:header5-text",
|
||||
"name": "Header 5",
|
||||
"icon": "header-5"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:header6-text",
|
||||
"name": "Header 6",
|
||||
"icon": "header-6"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:toggle-bold",
|
||||
"name": "Bold",
|
||||
"icon": "bold-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:toggle-italics",
|
||||
"name": "Italics",
|
||||
"icon": "italic-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:toggle-strikethrough",
|
||||
"name": "Strikethrough",
|
||||
"icon": "strikethrough-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:underline",
|
||||
"name": "Underline",
|
||||
"icon": "underline-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:toggle-highlight",
|
||||
"name": "==Highlight==",
|
||||
"icon": "highlight-glyph"
|
||||
},
|
||||
{
|
||||
"id": "SubmenuCommands-lucdf3en5",
|
||||
"name": "submenu",
|
||||
"icon": "edit",
|
||||
"SubmenuCommands": [
|
||||
{
|
||||
"id": "editing-toolbar:editor-copy",
|
||||
"name": "Copy",
|
||||
"icon": "lucide-copy"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor-cut",
|
||||
"name": "Cut",
|
||||
"icon": "lucide-scissors"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor-paste",
|
||||
"name": "Paste",
|
||||
"icon": "lucide-clipboard-type"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:swap-line-down",
|
||||
"name": "Swap line down",
|
||||
"icon": "lucide-corner-right-down"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:swap-line-up",
|
||||
"name": "Swap line up",
|
||||
"icon": "lucide-corner-right-up"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:attach-file",
|
||||
"name": "Attach file",
|
||||
"icon": "lucide-paperclip"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:insert-table",
|
||||
"name": "Insert Table",
|
||||
"icon": "lucide-table"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:cycle-list-checklist",
|
||||
"name": "Cycle list checklist",
|
||||
"icon": "check-circle"
|
||||
},
|
||||
{
|
||||
"id": "SubmenuCommands-luc8efull",
|
||||
"name": "submenu",
|
||||
"icon": "message-square",
|
||||
"SubmenuCommands": [
|
||||
{
|
||||
"id": "editing-toolbar:editor:toggle-blockquote",
|
||||
"name": "Blockquote",
|
||||
"icon": "lucide-text-quote"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:insert-callout",
|
||||
"name": "Insert Callout ",
|
||||
"icon": "lucide-quote"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "SubmenuCommands-mdcmder",
|
||||
"name": "submenu",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M464 608 l0 -568 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-80 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 568 l-232 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 80 q0 3 2.5 5.5 q2.5 2.5 5.5 2.5 l560 0 q3 0 5.5 -2.5 q2.5 -2.5 2.5 -5.5 l0 -80 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-232 0 ZM864 696 q17 0 28.5 11.5 q11.5 11.5 11.5 28.5 q0 17 -11.5 28.5 q-11.5 11.5 -28.5 11.5 q-17 0 -28.5 -11.5 q-11.5 -11.5 -11.5 -28.5 q0 -17 11.5 -28.5 q11.5 -11.5 28.5 -11.5 ZM864 640 q-40 0 -68 28 q-28 28 -28 68 q0 40 28 68 q28 28 68 28 q40 0 68 -28 q28 -28 28 -68 q0 -40 -28 -68 q-28 -28 -68 -28 ZM576 322 l0 -63 q0 -3 2 -5 l89 -70 l-89 -70 q-2 -2 -2 -5 l0 -63 q0 -4 3.5 -5.5 q3.5 -1.5 6.5 0.5 l170 133 q4 3 4.5 8.5 q0.5 5.5 -2.5 9.5 l-2 2 l-170 133 q-3 2 -6.5 0.5 q-3.5 -1.5 -3.5 -5.5 ZM256 322 l0 -63 q0 -3 -2 -5 l-89 -70 l89 -70 q2 -2 2 -5 l0 -63 q0 -4 -3.5 -5.5 q-3.5 -1.5 -6.5 0.5 l-170 133 q-4 3 -4.5 8.5 q-0.5 5.5 2.5 9.5 l2 2 l170 133 q3 2 6.5 0.5 q3.5 -1.5 3.5 -5.5 Z\"></path></g></svg>",
|
||||
"SubmenuCommands": [
|
||||
{
|
||||
"id": "editing-toolbar:superscript",
|
||||
"name": "Superscript",
|
||||
"icon": "superscript-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:subscript",
|
||||
"name": "Subscript",
|
||||
"icon": "subscript-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:toggle-code",
|
||||
"name": "Inline code",
|
||||
"icon": "code-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:codeblock",
|
||||
"name": "Code block",
|
||||
"icon": "codeblock-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:insert-wikilink",
|
||||
"name": "Insert wikilink [[]]",
|
||||
"icon": "<svg width=\"15\" height=\"15\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M306 134 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 7 q0 -8 -5 -8 l-45 0 q-5 0 -5 8 l0 784 q0 8 5 8 l45 0 q5 0 5 -8 q0 8 1 8 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 -623 q0 8 1 8 ZM139 134 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 7 q0 -8 -5 -8 l-45 0 q-5 0 -5 8 l0 784 q0 8 5 8 l45 0 q5 0 5 -8 q0 8 1 8 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 -623 q0 8 1 8 ZM711 134 q1 0 1 -8 l0 623 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 q1 0 1 -8 q0 8 4 8 l46 0 q4 0 4 -8 l0 -784 q0 -8 -4 -8 l-46 0 q-4 0 -4 8 q0 -7 -1 -7 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 ZM878 134 q1 0 1 -8 l0 623 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 q1 0 1 -8 q0 8 5 8 l45 0 q4 0 4 -8 l0 -784 q0 -8 -4 -8 l-45 0 q-5 0 -5 8 q0 -7 -1 -7 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 Z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:insert-embed",
|
||||
"name": "Insert embed ![[]]",
|
||||
"icon": "note-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:insert-link",
|
||||
"name": "Insert link []()",
|
||||
"icon": "link-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:hrline",
|
||||
"name": "Horizontal divider",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M912 424 l0 -80 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-784 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 80 q0 3 2.5 5.5 q2.5 2.5 5.5 2.5 l784 0 q3 0 5.5 -2.5 q2.5 -2.5 2.5 -5.5 Z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:toggle-inline-math",
|
||||
"name": "Inline math",
|
||||
"icon": "lucide-sigma"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:editor:insert-mathblock",
|
||||
"name": "MathBlock",
|
||||
"icon": "lucide-sigma-square"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "SubmenuCommands-list",
|
||||
"name": "submenu-list",
|
||||
"icon": "bullet-list-glyph",
|
||||
"SubmenuCommands": [
|
||||
{
|
||||
"id": "editing-toolbar:editor:toggle-checklist-status",
|
||||
"name": "Checklist",
|
||||
"icon": "checkbox-glyph"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:toggle-numbered-list",
|
||||
"name": "Numbered list",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M860 424 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM860 756 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM860 92 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM264 136 l-3 -3 l-51 -57 l56 0 q14 0 24.5 -10 q10.5 -10 11.5 -25 l0 -1 q0 -15 -10.5 -25.5 q-10.5 -10.5 -24.5 -10.5 l-137 0 q-15 0 -25 10 q-10 10 -11 24.5 q-1 14.5 9 25.5 l63 70 l49 54 q7 7 7 16.5 q0 9.5 -7.5 16.5 q-7.5 7 -18.5 7 q-11 0 -18.5 -6.5 q-7.5 -6.5 -8.5 -16.5 l0 0 q0 -15 -10.5 -25.5 q-10.5 -10.5 -25.5 -10.5 q-15 0 -25.5 10.5 q-10.5 10.5 -10.5 25.5 q0 26 13.5 47.5 q13.5 21.5 36 34.5 q22.5 13 49 13 q26.5 0 49.5 -13 q23 -13 36 -34.5 q13 -21.5 13 -47.5 q0 -20 -7.5 -37.5 q-7.5 -17.5 -21.5 -30.5 l-1 -1 ZM173 794 q11 11 25 10.5 q14 -0.5 24.5 -10.5 q10.5 -10 10.5 -25 l0 -293 q0 -15 -10 -25.5 q-10 -10.5 -25 -10.5 q-15 0 -25.5 10 q-10.5 10 -11.5 25 l0 211 q-10 -8 -23.5 -7 q-13.5 1 -22.5 11 l-1 0 q-10 11 -9.5 25.5 q0.5 14.5 10.5 24.5 l58 54 Z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:toggle-bullet-list",
|
||||
"name": "Bullet list",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M860 424 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM860 756 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM860 92 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM176 716 l0 0 ZM112 716 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 ZM176 384 l0 0 ZM112 384 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 ZM176 52 l0 0 ZM112 52 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 Z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:undent-list",
|
||||
"name": "Unindent-list",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M872 302 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 542 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 784 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM872 62 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM244 534 l-123 -122 q-8 -7 -8 -18 q0 -11 8 -18 l123 -122 q8 -7 19 -7 q11 0 18.5 7.5 q7.5 7.5 7.5 18.5 l0 242 q0 11 -7.5 18.5 q-7.5 7.5 -18.5 7.5 q-11 0 -19 -7 Z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:indent-list",
|
||||
"name": "Indent list",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M872 302 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 542 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 784 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM872 62 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM158 534 l124 -122 q7 -7 7 -18 q0 -11 -7 -18 l-124 -122 q-7 -7 -18 -7 q-11 0 -19 7.5 q-8 7.5 -8 18.5 l0 242 q0 11 8 18.5 q8 7.5 19 7.5 q11 0 18 -7 Z\"></path></g></svg>"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "SubmenuCommands-aligin",
|
||||
"name": "submenu-aligin",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M724 304 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 540 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM724 776 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 68 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 Z\"></path></g></svg>",
|
||||
"SubmenuCommands": [
|
||||
{
|
||||
"id": "editing-toolbar:justify",
|
||||
"name": "<p aligin=\"justify\"></p>",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M112 736 l0 0 ZM120 736 l784 0 q8 0 8 -8 l0 -80 q0 -8 -8 -8 l-784 0 q-8 0 -8 8 l0 80 q0 8 8 8 ZM112 331 l0 0 ZM120 331 l784 0 q8 0 8 -8 l0 -80 q0 -8 -8 -8 l-784 0 q-8 0 -8 8 l0 80 q0 8 8 8 ZM112 128 l0 0 ZM120 128 l784 0 q8 0 8 -8 l0 -80 q0 -8 -8 -8 l-784 0 q-8 0 -8 8 l0 80 q0 8 8 8 ZM112 533 l0 0 ZM120 533 l784 0 q8 0 8 -8 l0 -80 q0 -8 -8 -8 l-784 0 q-8 0 -8 8 l0 80 q0 8 8 8 Z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:left",
|
||||
"name": "<p aligin=\"left\"></p>",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M572 304 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 540 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM572 776 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 68 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 Z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:center",
|
||||
"name": "<center>",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M724 304 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 540 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM724 776 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 68 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 Z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:right",
|
||||
"name": "<p aligin=\"right\"></p>",
|
||||
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M872 304 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 540 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM872 776 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 68 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 Z\"></path></g></svg>"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:change-font-color",
|
||||
"name": "Change font color[html]",
|
||||
"icon": "<svg width=\"24\" height=\"24\" focusable=\"false\" fill=\"currentColor\"><g fill-rule=\"evenodd\"><path id=\"change-font-color-icon\" d=\"M3 18h18v3H3z\" style=\"fill:#2DC26B\"></path><path d=\"M8.7 16h-.8a.5.5 0 01-.5-.6l2.7-9c.1-.3.3-.4.5-.4h2.8c.2 0 .4.1.5.4l2.7 9a.5.5 0 01-.5.6h-.8a.5.5 0 01-.4-.4l-.7-2.2c0-.3-.3-.4-.5-.4h-3.4c-.2 0-.4.1-.5.4l-.7 2.2c0 .3-.2.4-.4.4zm2.6-7.6l-.6 2a.5.5 0 00.5.6h1.6a.5.5 0 00.5-.6l-.6-2c0-.3-.3-.4-.5-.4h-.4c-.2 0-.4.1-.5.4z\"></path></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:change-background-color",
|
||||
"name": "Change Backgroundcolor[html]",
|
||||
"icon": "<svg width=\"18\" height=\"24\" viewBox=\"0 0 256 256\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><g stroke=\"none\" stroke-width=\"1\" fill=\"currentColor\" fill-rule=\"evenodd\"><g ><g fill=\"currentColor\"><g transform=\"translate(119.502295, 137.878331) rotate(-135.000000) translate(-119.502295, -137.878331) translate(48.002295, 31.757731)\" ><path d=\"M100.946943,60.8084699 L43.7469427,60.8084699 C37.2852111,60.8084699 32.0469427,66.0467383 32.0469427,72.5084699 L32.0469427,118.70847 C32.0469427,125.170201 37.2852111,130.40847 43.7469427,130.40847 L100.946943,130.40847 C107.408674,130.40847 112.646943,125.170201 112.646943,118.70847 L112.646943,72.5084699 C112.646943,66.0467383 107.408674,60.8084699 100.946943,60.8084699 Z M93.646,79.808 L93.646,111.408 L51.046,111.408 L51.046,79.808 L93.646,79.808 Z\" fill-rule=\"nonzero\"></path><path d=\"M87.9366521,16.90916 L87.9194966,68.2000001 C87.9183543,69.4147389 86.9334998,70.399264 85.7187607,70.4 L56.9423078,70.4 C55.7272813,70.4 54.7423078,69.4150264 54.7423078,68.2 L54.7423078,39.4621057 C54.7423078,37.2523513 55.5736632,35.1234748 57.0711706,33.4985176 L76.4832996,12.4342613 C78.9534987,9.75382857 83.1289108,9.5834005 85.8093436,12.0535996 C87.1658473,13.303709 87.9372691,15.0644715 87.9366521,16.90916 Z\" fill-rule=\"evenodd\"></path><path d=\"M131.3,111.241199 L11.7,111.241199 C5.23826843,111.241199 0,116.479467 0,122.941199 L0,200.541199 C0,207.002931 5.23826843,212.241199 11.7,212.241199 L131.3,212.241199 C137.761732,212.241199 143,207.002931 143,200.541199 L143,122.941199 C143,116.479467 137.761732,111.241199 131.3,111.241199 Z M124,130.241 L124,193.241 L19,193.241 L19,130.241 L124,130.241 Z\" fill-rule=\"nonzero\"></path></g></g><path d=\"M51,218 L205,218 C211.075132,218 216,222.924868 216,229 C216,235.075132 211.075132,240 205,240 L51,240 C44.9248678,240 40,235.075132 40,229 C40,222.924868 44.9248678,218 51,218 Z\" id=\"change-background-color-icon\" style=\"fill:#FA541C\"></path></g></g></svg>"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:fullscreen-focus",
|
||||
"name": "Fullscreen focus mode",
|
||||
"icon": "fullscreen"
|
||||
},
|
||||
{
|
||||
"id": "editing-toolbar:workplace-fullscreen-focus",
|
||||
"name": "Workplace-Fullscreen ",
|
||||
"icon": "exit-fullscreen"
|
||||
}
|
||||
],
|
||||
"followingCommands": [],
|
||||
"topCommands": [],
|
||||
"fixedCommands": [],
|
||||
"mobileCommands": [],
|
||||
"enableMultipleConfig": false,
|
||||
"appendMethod": "workspace",
|
||||
"shouldShowMenuOnSelect": false,
|
||||
"cMenuVisibility": true,
|
||||
"cMenuBottomValue": 4.25,
|
||||
"cMenuNumRows": 12,
|
||||
"cMenuWidth": 610,
|
||||
"cMenuFontColor": "#92cddc",
|
||||
"cMenuBackgroundColor": "#d3f8b6",
|
||||
"autohide": false,
|
||||
"custom_bg1": "#FFB78B8C",
|
||||
"custom_bg2": "#CDF4698C",
|
||||
"custom_bg3": "#A0CCF68C",
|
||||
"custom_bg4": "#F0A7D88C",
|
||||
"custom_bg5": "#ADEFEF8C",
|
||||
"custom_fc1": "#D83931",
|
||||
"custom_fc2": "#DE7802",
|
||||
"custom_fc3": "#245BDB",
|
||||
"custom_fc4": "#6425D0",
|
||||
"custom_fc5": "#646A73",
|
||||
"isLoadOnMobile": false,
|
||||
"horizontalPosition": 0,
|
||||
"verticalPosition": 0,
|
||||
"formatBrushes": {},
|
||||
"customCommands": [],
|
||||
"viewTypeSettings": {}
|
||||
}
|
||||
12
.obsidian/plugins/editing-toolbar/main.js
vendored
Normal file
12
.obsidian/plugins/editing-toolbar/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/editing-toolbar/manifest.json
vendored
Normal file
10
.obsidian/plugins/editing-toolbar/manifest.json
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "editing-toolbar",
|
||||
"name": "Editing Toolbar",
|
||||
"version": "3.1.3",
|
||||
"minAppVersion": "0.14.0",
|
||||
"description": "The Obsidian Editing Toolbar is modified from cmenu, which provides more powerful customization settings and has many built-in editing commands to be a MS Word-like toolbar editing experience.",
|
||||
"author": "Cuman",
|
||||
"authorUrl": "https://github.com/cumany/obsidian-editing-toolbar",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
1235
.obsidian/plugins/editing-toolbar/styles.css
vendored
Normal file
1235
.obsidian/plugins/editing-toolbar/styles.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
771
.obsidian/plugins/obsidian-auto-link-title/main.js
vendored
Normal file
771
.obsidian/plugins/obsidian-auto-link-title/main.js
vendored
Normal file
@ -0,0 +1,771 @@
|
||||
/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
||||
if you want to view the source visit the plugins github repository
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var obsidian = require('obsidian');
|
||||
|
||||
/******************************************************************************
|
||||
Copyright (c) Microsoft Corporation.
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
***************************************************************************** */
|
||||
|
||||
function __awaiter(thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
}
|
||||
|
||||
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
||||
var e = new Error(message);
|
||||
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
||||
};
|
||||
|
||||
const DEFAULT_SETTINGS = {
|
||||
regex: /^(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})$/i,
|
||||
lineRegex: /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/gi,
|
||||
linkRegex: /^\[([^\[\]]*)\]\((https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})\)$/i,
|
||||
linkLineRegex: /\[([^\[\]]*)\]\((https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})\)/gi,
|
||||
imageRegex: /\.(gif|jpe?g|tiff?|png|webp|bmp|tga|psd|ai)$/i,
|
||||
enhanceDefaultPaste: true,
|
||||
shouldPreserveSelectionAsTitle: false,
|
||||
enhanceDropEvents: true,
|
||||
websiteBlacklist: "",
|
||||
maximumTitleLength: 0,
|
||||
useNewScraper: false,
|
||||
linkPreviewApiKey: "",
|
||||
useBetterPasteId: false,
|
||||
};
|
||||
class AutoLinkTitleSettingTab extends obsidian.PluginSettingTab {
|
||||
constructor(app, plugin) {
|
||||
super(app, plugin);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
display() {
|
||||
let { containerEl } = this;
|
||||
containerEl.empty();
|
||||
new obsidian.Setting(containerEl)
|
||||
.setName("Enhance Default Paste")
|
||||
.setDesc("Fetch the link title when pasting a link in the editor with the default paste command")
|
||||
.addToggle((val) => val
|
||||
.setValue(this.plugin.settings.enhanceDefaultPaste)
|
||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||||
console.log(value);
|
||||
this.plugin.settings.enhanceDefaultPaste = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new obsidian.Setting(containerEl)
|
||||
.setName("Enhance Drop Events")
|
||||
.setDesc("Fetch the link title when drag and dropping a link from another program")
|
||||
.addToggle((val) => val
|
||||
.setValue(this.plugin.settings.enhanceDropEvents)
|
||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||||
console.log(value);
|
||||
this.plugin.settings.enhanceDropEvents = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new obsidian.Setting(containerEl)
|
||||
.setName("Maximum title length")
|
||||
.setDesc("Set the maximum length of the title. Set to 0 to disable.")
|
||||
.addText((val) => val
|
||||
.setValue(this.plugin.settings.maximumTitleLength.toString(10))
|
||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||||
const titleLength = Number(value);
|
||||
this.plugin.settings.maximumTitleLength =
|
||||
isNaN(titleLength) || titleLength < 0 ? 0 : titleLength;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new obsidian.Setting(containerEl)
|
||||
.setName("Preserve selection as title")
|
||||
.setDesc("Whether to prefer selected text as title over fetched title when pasting")
|
||||
.addToggle((val) => val
|
||||
.setValue(this.plugin.settings.shouldPreserveSelectionAsTitle)
|
||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||||
console.log(value);
|
||||
this.plugin.settings.shouldPreserveSelectionAsTitle = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new obsidian.Setting(containerEl)
|
||||
.setName("Website Blacklist")
|
||||
.setDesc("List of strings (comma separated) that disable autocompleting website titles. Can be URLs or arbitrary text.")
|
||||
.addTextArea((val) => val
|
||||
.setValue(this.plugin.settings.websiteBlacklist)
|
||||
.setPlaceholder("localhost, tiktok.com")
|
||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||||
this.plugin.settings.websiteBlacklist = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new obsidian.Setting(containerEl)
|
||||
.setName("Use New Scraper")
|
||||
.setDesc("Use experimental new scraper, seems to work well on desktop but not mobile.")
|
||||
.addToggle((val) => val
|
||||
.setValue(this.plugin.settings.useNewScraper)
|
||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||||
console.log(value);
|
||||
this.plugin.settings.useNewScraper = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new obsidian.Setting(containerEl)
|
||||
.setName("Use Better Fetching Placeholder")
|
||||
.setDesc("Use a more readable placeholder when fetching the title of a link.")
|
||||
.addToggle((val) => val
|
||||
.setValue(this.plugin.settings.useBetterPasteId)
|
||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||||
console.log(value);
|
||||
this.plugin.settings.useBetterPasteId = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new obsidian.Setting(containerEl)
|
||||
.setName("LinkPreview API Key")
|
||||
.setDesc("API key for the LinkPreview.net service. Get one at https://my.linkpreview.net/access_keys")
|
||||
.addText((text) => text
|
||||
.setValue(this.plugin.settings.linkPreviewApiKey || "")
|
||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||||
const trimmedValue = value.trim();
|
||||
if (trimmedValue.length > 0 && trimmedValue.length !== 32) {
|
||||
new obsidian.Notice("LinkPreview API key must be 32 characters long");
|
||||
this.plugin.settings.linkPreviewApiKey = "";
|
||||
}
|
||||
else {
|
||||
this.plugin.settings.linkPreviewApiKey = trimmedValue;
|
||||
}
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
}
|
||||
}
|
||||
|
||||
class CheckIf {
|
||||
static isMarkdownLinkAlready(editor) {
|
||||
let cursor = editor.getCursor();
|
||||
// Check if the characters before the url are ]( to indicate a markdown link
|
||||
var titleEnd = editor.getRange({ ch: cursor.ch - 2, line: cursor.line }, { ch: cursor.ch, line: cursor.line });
|
||||
return titleEnd == "](";
|
||||
}
|
||||
static isAfterQuote(editor) {
|
||||
let cursor = editor.getCursor();
|
||||
// Check if the characters before the url are " or ' to indicate we want the url directly
|
||||
// This is common in elements like <a href="linkhere"></a>
|
||||
var beforeChar = editor.getRange({ ch: cursor.ch - 1, line: cursor.line }, { ch: cursor.ch, line: cursor.line });
|
||||
return beforeChar == "\"" || beforeChar == "'";
|
||||
}
|
||||
static isUrl(text) {
|
||||
let urlRegex = new RegExp(DEFAULT_SETTINGS.regex);
|
||||
return urlRegex.test(text);
|
||||
}
|
||||
static isImage(text) {
|
||||
let imageRegex = new RegExp(DEFAULT_SETTINGS.imageRegex);
|
||||
return imageRegex.test(text);
|
||||
}
|
||||
static isLinkedUrl(text) {
|
||||
let urlRegex = new RegExp(DEFAULT_SETTINGS.linkRegex);
|
||||
return urlRegex.test(text);
|
||||
}
|
||||
}
|
||||
|
||||
class EditorExtensions {
|
||||
static getSelectedText(editor) {
|
||||
if (!editor.somethingSelected()) {
|
||||
let wordBoundaries = this.getWordBoundaries(editor);
|
||||
editor.setSelection(wordBoundaries.start, wordBoundaries.end);
|
||||
}
|
||||
return editor.getSelection();
|
||||
}
|
||||
static cursorWithinBoundaries(cursor, match) {
|
||||
let startIndex = match.index;
|
||||
let endIndex = match.index + match[0].length;
|
||||
return startIndex <= cursor.ch && cursor.ch <= endIndex;
|
||||
}
|
||||
static getWordBoundaries(editor) {
|
||||
let cursor = editor.getCursor();
|
||||
// If its a normal URL token this is not a markdown link
|
||||
// In this case we can simply overwrite the link boundaries as-is
|
||||
let lineText = editor.getLine(cursor.line);
|
||||
// First check if we're in a link
|
||||
let linksInLine = lineText.matchAll(DEFAULT_SETTINGS.linkLineRegex);
|
||||
for (let match of linksInLine) {
|
||||
if (this.cursorWithinBoundaries(cursor, match)) {
|
||||
return {
|
||||
start: { line: cursor.line, ch: match.index },
|
||||
end: { line: cursor.line, ch: match.index + match[0].length },
|
||||
};
|
||||
}
|
||||
}
|
||||
// If not, check if we're in just a standard ol' URL.
|
||||
let urlsInLine = lineText.matchAll(DEFAULT_SETTINGS.lineRegex);
|
||||
for (let match of urlsInLine) {
|
||||
if (this.cursorWithinBoundaries(cursor, match)) {
|
||||
return {
|
||||
start: { line: cursor.line, ch: match.index },
|
||||
end: { line: cursor.line, ch: match.index + match[0].length },
|
||||
};
|
||||
}
|
||||
}
|
||||
return {
|
||||
start: cursor,
|
||||
end: cursor,
|
||||
};
|
||||
}
|
||||
static getEditorPositionFromIndex(content, index) {
|
||||
let substr = content.substr(0, index);
|
||||
let l = 0;
|
||||
let offset = -1;
|
||||
let r = -1;
|
||||
for (; (r = substr.indexOf("\n", r + 1)) !== -1; l++, offset = r)
|
||||
;
|
||||
offset += 1;
|
||||
let ch = content.substr(offset, index - offset).length;
|
||||
return { line: l, ch: ch };
|
||||
}
|
||||
}
|
||||
|
||||
function blank$1(text) {
|
||||
return text === undefined || text === null || text === '';
|
||||
}
|
||||
function notBlank$1(text) {
|
||||
return !blank$1(text);
|
||||
}
|
||||
function scrape(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
const response = yield obsidian.requestUrl(url);
|
||||
if (!response.headers['content-type'].includes('text/html'))
|
||||
return getUrlFinalSegment$1(url);
|
||||
const html = response.text;
|
||||
const doc = new DOMParser().parseFromString(html, 'text/html');
|
||||
const title = doc.querySelector('title');
|
||||
if (blank$1(title === null || title === void 0 ? void 0 : title.innerText)) {
|
||||
// If site is javascript based and has a no-title attribute when unloaded, use it.
|
||||
var noTitle = title === null || title === void 0 ? void 0 : title.getAttr('no-title');
|
||||
if (notBlank$1(noTitle)) {
|
||||
return noTitle;
|
||||
}
|
||||
// Otherwise if the site has no title/requires javascript simply return Title Unknown
|
||||
return url;
|
||||
}
|
||||
return title.innerText;
|
||||
}
|
||||
catch (ex) {
|
||||
console.error(ex);
|
||||
return '';
|
||||
}
|
||||
});
|
||||
}
|
||||
function getUrlFinalSegment$1(url) {
|
||||
try {
|
||||
const segments = new URL(url).pathname.split('/');
|
||||
const last = segments.pop() || segments.pop(); // Handle potential trailing slash
|
||||
return last;
|
||||
}
|
||||
catch (_) {
|
||||
return 'File';
|
||||
}
|
||||
}
|
||||
function getPageTitle$1(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (!(url.startsWith('http') || url.startsWith('https'))) {
|
||||
url = 'https://' + url;
|
||||
}
|
||||
return scrape(url);
|
||||
});
|
||||
}
|
||||
|
||||
const electronPkg = require("electron");
|
||||
function blank(text) {
|
||||
return text === undefined || text === null || text === "";
|
||||
}
|
||||
function notBlank(text) {
|
||||
return !blank(text);
|
||||
}
|
||||
// async wrapper to load a url and settle on load finish or fail
|
||||
function load(window, url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return new Promise((resolve, reject) => {
|
||||
window.webContents.on("did-finish-load", (event) => resolve(event));
|
||||
window.webContents.on("did-fail-load", (event) => reject(event));
|
||||
window.loadURL(url);
|
||||
});
|
||||
});
|
||||
}
|
||||
function electronGetPageTitle(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const { remote } = electronPkg;
|
||||
const { BrowserWindow } = remote;
|
||||
try {
|
||||
const window = new BrowserWindow({
|
||||
width: 1000,
|
||||
height: 600,
|
||||
webPreferences: {
|
||||
webSecurity: false,
|
||||
nodeIntegration: true,
|
||||
images: false,
|
||||
},
|
||||
show: false,
|
||||
});
|
||||
window.webContents.setAudioMuted(true);
|
||||
window.webContents.on("will-navigate", (event, newUrl) => {
|
||||
event.preventDefault();
|
||||
window.loadURL(newUrl);
|
||||
});
|
||||
yield load(window, url);
|
||||
try {
|
||||
const title = window.webContents.getTitle();
|
||||
window.destroy();
|
||||
if (notBlank(title)) {
|
||||
return title;
|
||||
}
|
||||
else {
|
||||
return url;
|
||||
}
|
||||
}
|
||||
catch (ex) {
|
||||
window.destroy();
|
||||
return url;
|
||||
}
|
||||
}
|
||||
catch (ex) {
|
||||
console.error(ex);
|
||||
return "";
|
||||
}
|
||||
});
|
||||
}
|
||||
function nonElectronGetPageTitle(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
const html = yield obsidian.request({ url });
|
||||
const doc = new DOMParser().parseFromString(html, "text/html");
|
||||
const title = doc.querySelectorAll("title")[0];
|
||||
if (title == null || blank(title === null || title === void 0 ? void 0 : title.innerText)) {
|
||||
// If site is javascript based and has a no-title attribute when unloaded, use it.
|
||||
var noTitle = title === null || title === void 0 ? void 0 : title.getAttr("no-title");
|
||||
if (notBlank(noTitle)) {
|
||||
return noTitle;
|
||||
}
|
||||
// Otherwise if the site has no title/requires javascript simply return Title Unknown
|
||||
return url;
|
||||
}
|
||||
return title.innerText;
|
||||
}
|
||||
catch (ex) {
|
||||
console.error(ex);
|
||||
return "";
|
||||
}
|
||||
});
|
||||
}
|
||||
function getUrlFinalSegment(url) {
|
||||
try {
|
||||
const segments = new URL(url).pathname.split('/');
|
||||
const last = segments.pop() || segments.pop(); // Handle potential trailing slash
|
||||
return last;
|
||||
}
|
||||
catch (_) {
|
||||
return "File";
|
||||
}
|
||||
}
|
||||
function tryGetFileType(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
const response = yield fetch(url, { method: "HEAD" });
|
||||
// Ensure site returns an ok status code before scraping
|
||||
if (!response.ok) {
|
||||
return "Site Unreachable";
|
||||
}
|
||||
// Ensure site is an actual HTML page and not a pdf or 3 gigabyte video file.
|
||||
let contentType = response.headers.get("content-type");
|
||||
if (!contentType.includes("text/html")) {
|
||||
return getUrlFinalSegment(url);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
catch (err) {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
function getPageTitle(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
// If we're on Desktop use the Electron scraper
|
||||
if (!(url.startsWith("http") || url.startsWith("https"))) {
|
||||
url = "https://" + url;
|
||||
}
|
||||
// Try to do a HEAD request to see if the site is reachable and if it's an HTML page
|
||||
// If we error out due to CORS, we'll just try to scrape the page anyway.
|
||||
let fileType = yield tryGetFileType(url);
|
||||
if (fileType) {
|
||||
return fileType;
|
||||
}
|
||||
if (electronPkg != null) {
|
||||
return electronGetPageTitle(url);
|
||||
}
|
||||
else {
|
||||
return nonElectronGetPageTitle(url);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
class AutoLinkTitle extends obsidian.Plugin {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.shortTitle = (title) => {
|
||||
if (this.settings.maximumTitleLength === 0) {
|
||||
return title;
|
||||
}
|
||||
if (title.length < this.settings.maximumTitleLength + 3) {
|
||||
return title;
|
||||
}
|
||||
const shortenedTitle = `${title.slice(0, this.settings.maximumTitleLength)}...`;
|
||||
return shortenedTitle;
|
||||
};
|
||||
}
|
||||
onload() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
console.log("loading obsidian-auto-link-title");
|
||||
yield this.loadSettings();
|
||||
this.blacklist = this.settings.websiteBlacklist
|
||||
.split(",")
|
||||
.map((s) => s.trim())
|
||||
.filter((s) => s.length > 0);
|
||||
// Listen to paste event
|
||||
this.pasteFunction = this.pasteUrlWithTitle.bind(this);
|
||||
// Listen to drop event
|
||||
this.dropFunction = this.dropUrlWithTitle.bind(this);
|
||||
this.addCommand({
|
||||
id: "auto-link-title-paste",
|
||||
name: "Paste URL and auto fetch title",
|
||||
editorCallback: (editor) => this.manualPasteUrlWithTitle(editor),
|
||||
hotkeys: [],
|
||||
});
|
||||
this.addCommand({
|
||||
id: "auto-link-title-normal-paste",
|
||||
name: "Normal paste (no fetching behavior)",
|
||||
editorCallback: (editor) => this.normalPaste(editor),
|
||||
hotkeys: [
|
||||
{
|
||||
modifiers: ["Mod", "Shift"],
|
||||
key: "v",
|
||||
},
|
||||
],
|
||||
});
|
||||
this.registerEvent(this.app.workspace.on("editor-paste", this.pasteFunction));
|
||||
this.registerEvent(this.app.workspace.on("editor-drop", this.dropFunction));
|
||||
this.addCommand({
|
||||
id: "enhance-url-with-title",
|
||||
name: "Enhance existing URL with link and title",
|
||||
editorCallback: (editor) => this.addTitleToLink(editor),
|
||||
hotkeys: [
|
||||
{
|
||||
modifiers: ["Mod", "Shift"],
|
||||
key: "e",
|
||||
},
|
||||
],
|
||||
});
|
||||
this.addSettingTab(new AutoLinkTitleSettingTab(this.app, this));
|
||||
});
|
||||
}
|
||||
addTitleToLink(editor) {
|
||||
// Only attempt fetch if online
|
||||
if (!navigator.onLine)
|
||||
return;
|
||||
let selectedText = (EditorExtensions.getSelectedText(editor) || "").trim();
|
||||
// If the cursor is on a raw html link, convert to a markdown link and fetch title
|
||||
if (CheckIf.isUrl(selectedText)) {
|
||||
this.convertUrlToTitledLink(editor, selectedText);
|
||||
}
|
||||
// If the cursor is on the URL part of a markdown link, fetch title and replace existing link title
|
||||
else if (CheckIf.isLinkedUrl(selectedText)) {
|
||||
const link = this.getUrlFromLink(selectedText);
|
||||
this.convertUrlToTitledLink(editor, link);
|
||||
}
|
||||
}
|
||||
normalPaste(editor) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
let clipboardText = yield navigator.clipboard.readText();
|
||||
if (clipboardText === null || clipboardText === "")
|
||||
return;
|
||||
editor.replaceSelection(clipboardText);
|
||||
});
|
||||
}
|
||||
// Simulate standard paste but using editor.replaceSelection with clipboard text since we can't seem to dispatch a paste event.
|
||||
manualPasteUrlWithTitle(editor) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const clipboardText = yield navigator.clipboard.readText();
|
||||
// Only attempt fetch if online
|
||||
if (!navigator.onLine) {
|
||||
editor.replaceSelection(clipboardText);
|
||||
return;
|
||||
}
|
||||
if (clipboardText == null || clipboardText == "")
|
||||
return;
|
||||
// If its not a URL, we return false to allow the default paste handler to take care of it.
|
||||
// Similarly, image urls don't have a meaningful <title> attribute so downloading it
|
||||
// to fetch the title is a waste of bandwidth.
|
||||
if (!CheckIf.isUrl(clipboardText) || CheckIf.isImage(clipboardText)) {
|
||||
editor.replaceSelection(clipboardText);
|
||||
return;
|
||||
}
|
||||
// If it looks like we're pasting the url into a markdown link already, don't fetch title
|
||||
// as the user has already probably put a meaningful title, also it would lead to the title
|
||||
// being inside the link.
|
||||
if (CheckIf.isMarkdownLinkAlready(editor) || CheckIf.isAfterQuote(editor)) {
|
||||
editor.replaceSelection(clipboardText);
|
||||
return;
|
||||
}
|
||||
// If url is pasted over selected text and setting is enabled, no need to fetch title,
|
||||
// just insert a link
|
||||
let selectedText = (EditorExtensions.getSelectedText(editor) || "").trim();
|
||||
if (selectedText && this.settings.shouldPreserveSelectionAsTitle) {
|
||||
editor.replaceSelection(`[${selectedText}](${clipboardText})`);
|
||||
return;
|
||||
}
|
||||
// At this point we're just pasting a link in a normal fashion, fetch its title.
|
||||
this.convertUrlToTitledLink(editor, clipboardText);
|
||||
return;
|
||||
});
|
||||
}
|
||||
pasteUrlWithTitle(clipboard, editor) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (!this.settings.enhanceDefaultPaste) {
|
||||
return;
|
||||
}
|
||||
if (clipboard.defaultPrevented)
|
||||
return;
|
||||
// Only attempt fetch if online
|
||||
if (!navigator.onLine)
|
||||
return;
|
||||
let clipboardText = clipboard.clipboardData.getData("text/plain");
|
||||
if (clipboardText === null || clipboardText === "")
|
||||
return;
|
||||
// If its not a URL, we return false to allow the default paste handler to take care of it.
|
||||
// Similarly, image urls don't have a meaningful <title> attribute so downloading it
|
||||
// to fetch the title is a waste of bandwidth.
|
||||
if (!CheckIf.isUrl(clipboardText) || CheckIf.isImage(clipboardText)) {
|
||||
return;
|
||||
}
|
||||
// We've decided to handle the paste, stop propagation to the default handler.
|
||||
clipboard.stopPropagation();
|
||||
clipboard.preventDefault();
|
||||
// If it looks like we're pasting the url into a markdown link already, don't fetch title
|
||||
// as the user has already probably put a meaningful title, also it would lead to the title
|
||||
// being inside the link.
|
||||
if (CheckIf.isMarkdownLinkAlready(editor) || CheckIf.isAfterQuote(editor)) {
|
||||
editor.replaceSelection(clipboardText);
|
||||
return;
|
||||
}
|
||||
// If url is pasted over selected text and setting is enabled, no need to fetch title,
|
||||
// just insert a link
|
||||
let selectedText = (EditorExtensions.getSelectedText(editor) || "").trim();
|
||||
if (selectedText && this.settings.shouldPreserveSelectionAsTitle) {
|
||||
editor.replaceSelection(`[${selectedText}](${clipboardText})`);
|
||||
return;
|
||||
}
|
||||
// At this point we're just pasting a link in a normal fashion, fetch its title.
|
||||
this.convertUrlToTitledLink(editor, clipboardText);
|
||||
return;
|
||||
});
|
||||
}
|
||||
dropUrlWithTitle(dropEvent, editor) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (!this.settings.enhanceDropEvents) {
|
||||
return;
|
||||
}
|
||||
if (dropEvent.defaultPrevented)
|
||||
return;
|
||||
// Only attempt fetch if online
|
||||
if (!navigator.onLine)
|
||||
return;
|
||||
let dropText = dropEvent.dataTransfer.getData("text/plain");
|
||||
if (dropText === null || dropText === "")
|
||||
return;
|
||||
// If its not a URL, we return false to allow the default paste handler to take care of it.
|
||||
// Similarly, image urls don't have a meaningful <title> attribute so downloading it
|
||||
// to fetch the title is a waste of bandwidth.
|
||||
if (!CheckIf.isUrl(dropText) || CheckIf.isImage(dropText)) {
|
||||
return;
|
||||
}
|
||||
// We've decided to handle the paste, stop propagation to the default handler.
|
||||
dropEvent.stopPropagation();
|
||||
dropEvent.preventDefault();
|
||||
// If it looks like we're pasting the url into a markdown link already, don't fetch title
|
||||
// as the user has already probably put a meaningful title, also it would lead to the title
|
||||
// being inside the link.
|
||||
if (CheckIf.isMarkdownLinkAlready(editor) || CheckIf.isAfterQuote(editor)) {
|
||||
editor.replaceSelection(dropText);
|
||||
return;
|
||||
}
|
||||
// If url is pasted over selected text and setting is enabled, no need to fetch title,
|
||||
// just insert a link
|
||||
let selectedText = (EditorExtensions.getSelectedText(editor) || "").trim();
|
||||
if (selectedText && this.settings.shouldPreserveSelectionAsTitle) {
|
||||
editor.replaceSelection(`[${selectedText}](${dropText})`);
|
||||
return;
|
||||
}
|
||||
// At this point we're just pasting a link in a normal fashion, fetch its title.
|
||||
this.convertUrlToTitledLink(editor, dropText);
|
||||
return;
|
||||
});
|
||||
}
|
||||
isBlacklisted(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
yield this.loadSettings();
|
||||
this.blacklist = this.settings.websiteBlacklist
|
||||
.split(/,|\n/)
|
||||
.map((s) => s.trim())
|
||||
.filter((s) => s.length > 0);
|
||||
return this.blacklist.some((site) => url.includes(site));
|
||||
});
|
||||
}
|
||||
convertUrlToTitledLink(editor, url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (yield this.isBlacklisted(url)) {
|
||||
let domain = new URL(url).hostname;
|
||||
editor.replaceSelection(`[${domain}](${url})`);
|
||||
return;
|
||||
}
|
||||
// Generate a unique id for find/replace operations for the title.
|
||||
const pasteId = this.getPasteId();
|
||||
// Instantly paste so you don't wonder if paste is broken
|
||||
editor.replaceSelection(`[${pasteId}](${url})`);
|
||||
// Fetch title from site, replace Fetching Title with actual title
|
||||
const title = yield this.fetchUrlTitle(url);
|
||||
const escapedTitle = this.escapeMarkdown(title);
|
||||
const shortenedTitle = this.shortTitle(escapedTitle);
|
||||
const text = editor.getValue();
|
||||
const start = text.indexOf(pasteId);
|
||||
if (start < 0) {
|
||||
console.log(`Unable to find text "${pasteId}" in current editor, bailing out; link ${url}`);
|
||||
}
|
||||
else {
|
||||
const end = start + pasteId.length;
|
||||
const startPos = EditorExtensions.getEditorPositionFromIndex(text, start);
|
||||
const endPos = EditorExtensions.getEditorPositionFromIndex(text, end);
|
||||
editor.replaceRange(shortenedTitle, startPos, endPos);
|
||||
}
|
||||
});
|
||||
}
|
||||
escapeMarkdown(text) {
|
||||
var unescaped = text.replace(/\\(\*|_|`|~|\\|\[|\])/g, "$1"); // unescape any "backslashed" character
|
||||
var escaped = unescaped.replace(/(\*|_|`|<|>|~|\\|\[|\])/g, "\\$1"); // escape *, _, `, ~, \, [, ], <, and >
|
||||
var escaped = unescaped.replace(/(\*|_|`|\||<|>|~|\\|\[|\])/g, "\\$1"); // escape *, _, `, ~, \, |, [, ], <, and >
|
||||
return escaped;
|
||||
}
|
||||
fetchUrlTitleViaLinkPreview(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (this.settings.linkPreviewApiKey.length !== 32) {
|
||||
console.error("LinkPreview API key is not 32 characters long, please check your settings");
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
const apiEndpoint = `https://api.linkpreview.net/?q=${encodeURIComponent(url)}`;
|
||||
const response = yield fetch(apiEndpoint, {
|
||||
headers: {
|
||||
"X-Linkpreview-Api-Key": this.settings.linkPreviewApiKey,
|
||||
},
|
||||
});
|
||||
const data = yield response.json();
|
||||
return data.title;
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
return "";
|
||||
}
|
||||
});
|
||||
}
|
||||
fetchUrlTitle(url) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
let title = "";
|
||||
title = yield this.fetchUrlTitleViaLinkPreview(url);
|
||||
console.log(`Title via Link Preview: ${title}`);
|
||||
if (title === "") {
|
||||
console.log("Title via Link Preview failed, falling back to scraper");
|
||||
if (this.settings.useNewScraper) {
|
||||
console.log("Using new scraper");
|
||||
title = yield getPageTitle$1(url);
|
||||
}
|
||||
else {
|
||||
console.log("Using old scraper");
|
||||
title = yield getPageTitle(url);
|
||||
}
|
||||
}
|
||||
console.log(`Title: ${title}`);
|
||||
title =
|
||||
title.replace(/(\r\n|\n|\r)/gm, "").trim() ||
|
||||
"Title Unavailable | Site Unreachable";
|
||||
return title;
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
return "Error fetching title";
|
||||
}
|
||||
});
|
||||
}
|
||||
getUrlFromLink(link) {
|
||||
let urlRegex = new RegExp(DEFAULT_SETTINGS.linkRegex);
|
||||
return urlRegex.exec(link)[2];
|
||||
}
|
||||
getPasteId() {
|
||||
var base = "Fetching Title";
|
||||
if (this.settings.useBetterPasteId) {
|
||||
return this.getBetterPasteId(base);
|
||||
}
|
||||
else {
|
||||
return `${base}#${this.createBlockHash()}`;
|
||||
}
|
||||
}
|
||||
getBetterPasteId(base) {
|
||||
// After every character, add 0, 1 or 2 invisible characters
|
||||
// so that to the user it looks just like the base string.
|
||||
// The number of combinations is 3^14 = 4782969
|
||||
let result = "";
|
||||
var invisibleCharacter = "\u200B";
|
||||
var maxInvisibleCharacters = 2;
|
||||
for (var i = 0; i < base.length; i++) {
|
||||
var count = Math.floor(Math.random() * (maxInvisibleCharacters + 1));
|
||||
result += base.charAt(i) + invisibleCharacter.repeat(count);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// Custom hashid by @shabegom
|
||||
createBlockHash() {
|
||||
let result = "";
|
||||
var characters = "abcdefghijklmnopqrstuvwxyz0123456789";
|
||||
var charactersLength = characters.length;
|
||||
for (var i = 0; i < 4; i++) {
|
||||
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
onunload() {
|
||||
console.log("unloading obsidian-auto-link-title");
|
||||
}
|
||||
loadSettings() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
|
||||
});
|
||||
}
|
||||
saveSettings() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
yield this.saveData(this.settings);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AutoLinkTitle;
|
||||
|
||||
|
||||
/* nosourcemap */
|
||||
10
.obsidian/plugins/obsidian-auto-link-title/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-auto-link-title/manifest.json
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "obsidian-auto-link-title",
|
||||
"name": "Auto Link Title",
|
||||
"version": "1.5.5",
|
||||
"minAppVersion": "0.12.17",
|
||||
"description": "This plugin automatically fetches the titles of links from the web",
|
||||
"author": "Matt Furden",
|
||||
"authorUrl": "https://github.com/zolrath",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
1
.obsidian/plugins/obsidian-auto-link-title/styles.css
vendored
Normal file
1
.obsidian/plugins/obsidian-auto-link-title/styles.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
/* no styles */
|
||||
378
.obsidian/workspace.json
vendored
Normal file
378
.obsidian/workspace.json
vendored
Normal file
@ -0,0 +1,378 @@
|
||||
{
|
||||
"main": {
|
||||
"id": "4385dfbff8140aba",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "61cb53a130ddbc76",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "c015ee9dd6a61446",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Arborescence du programme.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Arborescence du programme"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "106e83c672218606",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Notes Obsidian.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Notes Obsidian"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "121bad85c772f16d",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Notes 1er jour support CBAO.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Notes 1er jour support CBAO"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "fdd9ef17ff6d4c46",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Notes projet LLM.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Notes projet LLM"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "1393502582265f4b",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "graph",
|
||||
"state": {},
|
||||
"icon": "lucide-git-fork",
|
||||
"title": "Vue graphique"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "d5f51e8591330f09",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Notes 1er jour support CBAO.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Notes 1er jour support CBAO"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "120d125b9863302b",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Notes Obsidian.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Notes Obsidian"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "55790436b9dcec98",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "ODOO.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "ODOO"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "70097a933971ddc0",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "ODOO.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "ODOO"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "d96de1205e42706c",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Arborescence du programme.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Arborescence du programme"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "1c49710a326fdb9d",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Notes webdev.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Notes webdev"
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 9
|
||||
},
|
||||
{
|
||||
"id": "9c71393f7d46dcbc",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "439d345fc604dffe",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Questions pour Karim.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Questions pour Karim"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
},
|
||||
"left": {
|
||||
"id": "c61819a046dc0388",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "f0494af8b7459f9d",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "82896bc00da71e1f",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-explorer",
|
||||
"state": {
|
||||
"sortOrder": "alphabetical",
|
||||
"autoReveal": false
|
||||
},
|
||||
"icon": "lucide-folder-closed",
|
||||
"title": "Explorateur de fichiers"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "1beb96a8de92add8",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical"
|
||||
},
|
||||
"icon": "lucide-search",
|
||||
"title": "Rechercher"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "7938c06d10b7dd6f",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "bookmarks",
|
||||
"state": {},
|
||||
"icon": "lucide-bookmark",
|
||||
"title": "Signet"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 200
|
||||
},
|
||||
"right": {
|
||||
"id": "ebb2082dfaee6d59",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "2c0f375451e52464",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "6fe716bd518aa117",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"file": "ODOO.md",
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
"showSearch": false,
|
||||
"searchQuery": "",
|
||||
"backlinkCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-coming-in",
|
||||
"title": "Rétrolien pour ODOO"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0b776342a0dffee5",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"file": "ODOO.md",
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-going-out",
|
||||
"title": "Liens sortants de ODOO"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "6fd552df7aaf479b",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "tag",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"useHierarchy": true,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-tags",
|
||||
"title": "Mots-clés"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "80a0b468459ec610",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "ODOO.md",
|
||||
"followCursor": false,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-list",
|
||||
"title": "Plan de ODOO"
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 3
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 200,
|
||||
"collapsed": true
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"switcher:Ouvrir le sélecteur rapide": false,
|
||||
"graph:Ouvrir la vue graphique": false,
|
||||
"canvas:Créer une nouvelle toile": false,
|
||||
"daily-notes:Ouvrir la note quotidienne": false,
|
||||
"templates:Insérer le modèle": false,
|
||||
"command-palette:Ouvrir la palette de commandes": false,
|
||||
"workspaces:Gérer les espaces de travail": false
|
||||
}
|
||||
},
|
||||
"active": "d96de1205e42706c",
|
||||
"lastOpenFiles": [
|
||||
"Node.js.md",
|
||||
"Capture d'écran 2025-03-20 112035.png",
|
||||
"Capture d'écran 2025-03-20 112004.png",
|
||||
"Capture d'écran 2025-03-20 111902.png",
|
||||
"Notes 1er jour support CBAO.md",
|
||||
"Notes Obsidian.md",
|
||||
"Notes projet LLM.md",
|
||||
"Notes RAGFLOW.md",
|
||||
"Notes webdev.md",
|
||||
"Odoo.md",
|
||||
"Questions pour Karim.md",
|
||||
"Scripts requêtes Odoo.md",
|
||||
"Fichier type json récupération odoo.md",
|
||||
"Arborescence du programme.md",
|
||||
"Jour 5 notes support traitement ticket dev.md",
|
||||
"Réunion.md",
|
||||
"Réunion 13 mars.md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/4. Les pièces jointes/Obsidian Facile - Les premiers plugins.png",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/4. Les pièces jointes/Obsidian Facile - Les premiers plugins 3.png",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/4. Les pièces jointes/Obsidian Facile - Les premiers plugins 2.png",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/4. Les pièces jointes/Obsidian Facile - Importer.png",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/4. Les pièces jointes/Obsidian Facile - Importer deepak-n-vNmwqcHMN6g-unsplash.jpg",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/4. Les pièces jointes/Obsidian Facile - Importer deepak-n-vNmwqcHMN6g-unsplash 1.jpg",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/4. Les pièces jointes/Obsidian Facile - Importer 7.gif",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des tags/2 - Recette de poulet au curry (TAGS).md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des tags/1 - Recette de poulet basquaise (TAGS).md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des liens/Vin Blanc.md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des liens/Poulet.md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des liens/Liste de mes recettes.md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des liens/2 - Recette de poulet au curry (LIENS).md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des liens/1 - Recette de poulet basquaise (LIENS).md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Autres notes exemple/Exemple de note vers laquelle créer un lien.md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/1. Les modules/7 - 25 raccourcis clavier indispensables.md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/1. Les modules/6 - Les premiers plugins à installer ( TOP 32 ).md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/1. Les modules/5 - Importer des fichiers, l'essentiel.md",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des tags",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine/Utilisation des liens",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Exemple cuisine",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation/Autres notes exemple",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/3. Les notes utilitaires pour la formation",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/2. Les exercices",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/4. Les pièces jointes",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation/1. Les modules",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile/Supports de formation",
|
||||
"docs cbao/formation OBSIDIAN/Obsidian Facile/Obsidian Facile"
|
||||
]
|
||||
}
|
||||
43
Arborescence du programme.md
Normal file
43
Arborescence du programme.md
Normal file
@ -0,0 +1,43 @@
|
||||
### Fichiers et Fonctions Clés :
|
||||
|
||||
1. main.py :
|
||||
|
||||
- main(): Point d'entrée principal qui appelle run_menu().
|
||||
|
||||
1. menu_principal.py :
|
||||
|
||||
- display_main_menu(): Affiche le menu principal.
|
||||
|
||||
- run_menu(): Gère la boucle du menu principal et appelle les fonctions de menu_handlers.py.
|
||||
|
||||
1. menu_handlers.py :
|
||||
|
||||
- Contient des fonctions pour gérer les actions du menu, telles que handle_list_models(), handle_list_model_fields(), et handle_export_model_fields_to_json().
|
||||
|
||||
1. ticket_manager.py :
|
||||
|
||||
- Contient des méthodes pour gérer les tickets et les modèles, telles que list_models(), list_model_fields(), et export_model_fields_to_json().
|
||||
|
||||
1. ticket_search.py :
|
||||
|
||||
- Contient des fonctions pour rechercher des tickets, mais il faudrait vérifier si toutes sont utilisées.
|
||||
|
||||
1. ticket_classification.py :
|
||||
|
||||
- Contient des fonctions pour classer les tickets, mais il faudrait vérifier si toutes sont utilisées.
|
||||
|
||||
1. ticket_display.py :
|
||||
|
||||
- Utilisé pour afficher les détails des tickets.
|
||||
|
||||
1. odoo_connection.py :
|
||||
|
||||
- Gère la connexion à l'instance Odoo.
|
||||
|
||||
### Fichiers et Fonctions à Vérifier :
|
||||
|
||||
- ticket_search.py et ticket_classification.py : Vérifier si toutes les fonctions sont appelées dans le flux principal.
|
||||
|
||||
- ticket_utils.py : Vérifier l'utilisation de ses fonctions.
|
||||
|
||||
- data_formatter.py et data_filter.py : Vérifier si les fonctions de formatage et de filtrage sont utilisées.
|
||||
BIN
Capture d'écran 2025-03-20 111902.png
Normal file
BIN
Capture d'écran 2025-03-20 111902.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
BIN
Capture d'écran 2025-03-20 112004.png
Normal file
BIN
Capture d'écran 2025-03-20 112004.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
BIN
Capture d'écran 2025-03-20 112035.png
Normal file
BIN
Capture d'écran 2025-03-20 112035.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
382
Fichier type json récupération odoo.md
Normal file
382
Fichier type json récupération odoo.md
Normal file
@ -0,0 +1,382 @@
|
||||
|
||||
{
|
||||
|
||||
"ID du Ticket": 10908,
|
||||
|
||||
"Nom": "TR: MAJ BRGlab",
|
||||
|
||||
"Code": "T10929",
|
||||
|
||||
"Date Limite": false,
|
||||
|
||||
"Champs Simples": {
|
||||
|
||||
"active": true,
|
||||
|
||||
"name": "TR: MAJ BRGlab",
|
||||
|
||||
"description": "",
|
||||
|
||||
"sequence": 0,
|
||||
|
||||
"kanban_state": "normal",
|
||||
|
||||
"kanban_state_label": "En cours",
|
||||
|
||||
"create_date": "2025-02-20 09:37:13",
|
||||
|
||||
"write_date": "2025-03-17 09:05:59",
|
||||
|
||||
"date_start": "2025-02-20 09:37:16",
|
||||
|
||||
"date_end": false,
|
||||
|
||||
"date_assign": "2025-02-20 13:13:32",
|
||||
|
||||
"date_deadline": false,
|
||||
|
||||
"date_last_stage_update": "2025-02-21 15:17:55",
|
||||
|
||||
"notes": false,
|
||||
|
||||
"planned_hours": 0.0,
|
||||
|
||||
"subtask_planned_hours": 0.0,
|
||||
|
||||
"color": 0,
|
||||
|
||||
"user_email": "romuald@cbao.fr",
|
||||
|
||||
"legend_blocked": "Bloquéé",
|
||||
|
||||
"legend_done": "Planifiée",
|
||||
|
||||
"legend_normal": "En cours",
|
||||
|
||||
"subtask_count": 0,
|
||||
|
||||
"email_from": "ANTONI Olivier <Olivier.ANTONI@egis-group.com>",
|
||||
|
||||
"email_cc": "",
|
||||
|
||||
"working_hours_open": 2.379627116111111,
|
||||
|
||||
"working_hours_close": 0.0,
|
||||
|
||||
"working_days_open": 0.09915112983796297,
|
||||
|
||||
"working_days_close": 0.0,
|
||||
|
||||
"analytic_account_active": true,
|
||||
|
||||
"allow_timesheets": true,
|
||||
|
||||
"remaining_hours": 0.0,
|
||||
|
||||
"effective_hours": 0.0,
|
||||
|
||||
"total_hours_spent": 0.0,
|
||||
|
||||
"progress": 0.0,
|
||||
|
||||
"subtask_effective_hours": 0.0,
|
||||
|
||||
"priority": "0",
|
||||
|
||||
"code": "T10929",
|
||||
|
||||
"use_milestones": false,
|
||||
|
||||
"show_time_control": "start",
|
||||
|
||||
"billable_type": "no",
|
||||
|
||||
"is_project_map_empty": true,
|
||||
|
||||
"activity_state": false,
|
||||
|
||||
"activity_date_deadline": false,
|
||||
|
||||
"activity_summary": false,
|
||||
|
||||
"message_is_follower": false,
|
||||
|
||||
"message_unread": false,
|
||||
|
||||
"message_unread_counter": 0,
|
||||
|
||||
"message_needaction": false,
|
||||
|
||||
"message_needaction_counter": 0,
|
||||
|
||||
"message_has_error": false,
|
||||
|
||||
"message_has_error_counter": 0,
|
||||
|
||||
"message_attachment_count": 17,
|
||||
|
||||
"rating_last_value": 0.0,
|
||||
|
||||
"rating_last_feedback": false,
|
||||
|
||||
"rating_last_image": false,
|
||||
|
||||
"rating_count": 0,
|
||||
|
||||
"access_url": "/my/task/10908",
|
||||
|
||||
"access_token": "3307e367-64be-4943-9682-db68a0a1efbd",
|
||||
|
||||
"access_warning": "",
|
||||
|
||||
"id": 10908,
|
||||
|
||||
"display_name": "[T10929] TR: MAJ BRGlab",
|
||||
|
||||
"__last_update": "2025-03-17 09:05:59",
|
||||
|
||||
"x_CBAO_windows_maj_ID": false,
|
||||
|
||||
"x_CBAO_version_signalement": false,
|
||||
|
||||
"x_CBAO_version_correction": false,
|
||||
|
||||
"x_CBAO_DateCorrection": false,
|
||||
|
||||
"x_CBAO_Scoring_Facilite": 0,
|
||||
|
||||
"x_CBAO_Scoring_Importance": 0,
|
||||
|
||||
"x_CBAO_Scoring_Urgence": 0,
|
||||
|
||||
"x_CBAO_Scoring_Incidence": 0,
|
||||
|
||||
"x_CBAO_Scoring_Resultat": 0,
|
||||
|
||||
"x_CBAO_InformationsSup": false
|
||||
|
||||
},
|
||||
|
||||
"Champs Relationnels": {
|
||||
|
||||
"stage_id": [
|
||||
|
||||
5,
|
||||
|
||||
"En attente de résolution"
|
||||
|
||||
],
|
||||
|
||||
"project_id": [
|
||||
|
||||
3,
|
||||
|
||||
"Demandes"
|
||||
|
||||
],
|
||||
|
||||
"user_id": [
|
||||
|
||||
32,
|
||||
|
||||
"Romuald GRUSON"
|
||||
|
||||
],
|
||||
|
||||
"partner_id": [
|
||||
|
||||
5654,
|
||||
|
||||
"EGIS SA, Olivier ANTONI"
|
||||
|
||||
],
|
||||
|
||||
"manager_id": [
|
||||
|
||||
22,
|
||||
|
||||
"Fabien LAFAY"
|
||||
|
||||
],
|
||||
|
||||
"company_id": [
|
||||
|
||||
1,
|
||||
|
||||
"CBAO S.A.R.L."
|
||||
|
||||
],
|
||||
|
||||
"attachment_ids": [],
|
||||
|
||||
"displayed_image_id": false,
|
||||
|
||||
"parent_id": false,
|
||||
|
||||
"child_ids": [],
|
||||
|
||||
"subtask_project_id": [
|
||||
|
||||
3,
|
||||
|
||||
"Demandes"
|
||||
|
||||
],
|
||||
|
||||
"website_message_ids": [
|
||||
|
||||
225765,
|
||||
|
||||
225755,
|
||||
|
||||
225633,
|
||||
|
||||
225612
|
||||
|
||||
],
|
||||
|
||||
"timesheet_ids": [],
|
||||
|
||||
"milestone_id": false,
|
||||
|
||||
"sale_line_id": false,
|
||||
|
||||
"sale_order_id": false,
|
||||
|
||||
"activity_ids": [],
|
||||
|
||||
"activity_user_id": false,
|
||||
|
||||
"activity_type_id": false,
|
||||
|
||||
"message_follower_ids": [
|
||||
|
||||
88384,
|
||||
|
||||
88385,
|
||||
|
||||
88404,
|
||||
|
||||
88405
|
||||
|
||||
],
|
||||
|
||||
"message_ids": [
|
||||
|
||||
227288,
|
||||
|
||||
225765,
|
||||
|
||||
225756,
|
||||
|
||||
225755,
|
||||
|
||||
225636,
|
||||
|
||||
225635,
|
||||
|
||||
225634,
|
||||
|
||||
225633,
|
||||
|
||||
225614,
|
||||
|
||||
225613,
|
||||
|
||||
225612,
|
||||
|
||||
225611
|
||||
|
||||
],
|
||||
|
||||
"message_main_attachment_id": [
|
||||
|
||||
143360,
|
||||
|
||||
"Outlook-nppfhufh"
|
||||
|
||||
],
|
||||
|
||||
"failed_message_ids": [],
|
||||
|
||||
"rating_ids": [],
|
||||
|
||||
"create_uid": [
|
||||
|
||||
1,
|
||||
|
||||
"OdooBot"
|
||||
|
||||
],
|
||||
|
||||
"write_uid": [
|
||||
|
||||
32,
|
||||
|
||||
"Romuald GRUSON"
|
||||
|
||||
]
|
||||
|
||||
},
|
||||
|
||||
"Discussions": [
|
||||
|
||||
{
|
||||
|
||||
"ID Message": 225765,
|
||||
|
||||
"Sujet": "Re: [T10929] - TR: MAJ BRGlab",
|
||||
|
||||
"Contenu": "Bonjour\n,\nJe tiens à m'excuser pour ce désagrément.\nJ'ai relancé Quentin, qui s'engage à le mettre en ligne au plus vite. Je garde ce ticket ouvert jusqu'à sa mise à disposition afin de suivre votre demande de près.\nJe reste à votre entière disposition pour toute information complémentaire.\nCordialement,\n---\nSupport technique\nAfin d'assurer une meilleure traçabilité et vous garantir une prise en charge optimale, nous vous invitons à envoyer vos demandes d'assistance technique à\nsupport@cbao.fr\nL'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.\nConfidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.",
|
||||
|
||||
"Auteur": "Romuald GRUSON",
|
||||
|
||||
"Date": "2025-02-21 15:51:53"
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"ID Message": 225755,
|
||||
|
||||
"Sujet": "RE: [T10929] - TR: MAJ BRGlab",
|
||||
|
||||
"Contenu": "Bonjour,\nL'essai présent dans notre base de données est une tentative d'essai réalisée par moi qui ne fonctionne pas. En cause le module ZK qui ne gère pas efficacement l'affichage des résultats en puissance de 10.\nJ'avais fait un ticket en ce sens il y a 2 ans et demi à ce sujet. Le ticket avait été marqué comme étant une priorité il y a déjà plusieurs mois, et Quentin devait le passer en mode système en le créant en code.\nLors de notre entretien sur Teams le 05/02, Quentin m'avait informé que l'essai serait disponible lors de la mise à jour prévue le lundi 10/02.\nPouvez-vous me donner plus d'informations au sujet de cet essai ?\nJe tiens à préciser qu'après 2 ans et demi d'attente, le critère d'urgence peut paraitre relatif, mais à ce jour nous en avons un besoin impératif.\nCordialement,\nOlivier Antoni\nTechnicien\nEgis Géotechnique\n(\n07 88 25 39 98\nolivier.antoni@egis\n-group.com\nI\nwww.egis.fr\nEgis Géotechnique\n3 rue docteur Schweitzer\n38180 Seyssins\nFRANCE\nSuivez Egis sur :\nP\nAfin de contribuer au respect de l'environnement, merci de n'imprimer ce mail qu'en cas de\r\n nécessité\nDe :\nsupport@cbao.fr <support@cbao.fr>\nEnvoyé :\njeudi 20 février 2025 14:13\nÀ :\nANTONI Olivier <Olivier.ANTONI@egis-group.com>\nObjet :\nRe: [T10929] - TR: MAJ BRGlab\n/!\\\nCourriel externe - Merci d'être prudent avec les liens et les pièces jointes\n/!\\\nExternal email - Please be careful with links and attachments\n/!\\\nBonjour\n,\nJe constate que la norme est déjà présente dans votre base de données. Est-ce sur un type de matériau spécifique que vous ne pouvez pas y accéder ? Pouvez-vous préciser le contexte afin que nous puissions identifier l'origine du problème ?\nJe reste à votre entière disposition pour toute information complémentaire.\nCordialement,\n---\nSupport technique\nAfin d'assurer une meilleure traçabilité et vous garantir une prise en charge optimale, nous vous invitons à envoyer vos demandes d'assistance technique à\nsupport@cbao.fr\nL'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi\r\n de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.\nConfidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le\r\n supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.\nEnvoyé\npar\nCBAO S.A.R.L.\n.\nCe message et ses pièces jointes peuvent contenir des informations confidentielles ou privilégiées et ne doivent donc pas être diffusés, exploités ou copiés sans autorisation.\r\n Si vous avez reçu ce message par erreur, merci de le signaler à l'expéditeur et le détruire ainsi que les pièces jointes. Les messages électroniques étant susceptibles d'altération, Egis décline toute responsabilité si ce message a été altéré, déformé ou falsifié.\r\n Merci.\nThis message and its attachments may contain confidential or privileged information that may be protected by law; they should not be distributed, used or copied without authorisation. If you have received this email in error, please notify the sender and delete\r\n this message and its attachments. As emails may be altered, Egis is not liable for messages that have been modified, changed or falsified. Thank you.",
|
||||
|
||||
"Auteur": "EGIS SA, Olivier ANTONI",
|
||||
|
||||
"Date": "2025-02-21 15:14:30"
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"ID Message": 225633,
|
||||
|
||||
"Sujet": "Re: [T10929] - TR: MAJ BRGlab",
|
||||
|
||||
"Contenu": "Bonjour\n,\nJe constate que la norme est déjà présente dans votre base de données. Est-ce sur un type de matériau spécifique que vous ne pouvez pas y accéder ? Pouvez-vous préciser le contexte afin que nous puissions identifier l'origine du problème ?\nJe reste à votre entière disposition pour toute information complémentaire.\nCordialement,\n---\nSupport technique\nAfin d'assurer une meilleure traçabilité et vous garantir une prise en charge optimale, nous vous invitons à envoyer vos demandes d'assistance technique à\nsupport@cbao.fr\nL'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.\nConfidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.",
|
||||
|
||||
"Auteur": "Romuald GRUSON",
|
||||
|
||||
"Date": "2025-02-20 13:13:30"
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"ID Message": 225612,
|
||||
|
||||
"Sujet": "TR: MAJ BRGlab",
|
||||
|
||||
"Contenu": "Bonjour Quentin,\nJe constate que l'essai de perméabilité n'a pas été ajouté, penses-tu qu'il puisse l'être rapidement ?\nCordialement,\nOlivier Antoni\nTechnicien\nEgis Géotechnique\n(\n07 88 25 39 98\nolivier.antoni@egis\n-group.com\nI\nwww.egis.fr\nEgis Géotechnique\n3 rue docteur Schweitzer\n38180 Seyssins\nFRANCE\nSuivez Egis sur :\nP\nAfin de contribuer au respect de l'environnement, merci de n'imprimer ce mail qu'en cas de\r\n nécessité\nDe :\nANTONI Olivier <Olivier.ANTONI@egis-group.com>\nEnvoyé :\nlundi 17 février 2025 11:23\nÀ :\nQuentin Faivre <quentin.faivre@cbao.fr>\nObjet :\nMAJ BRGlab\nSalut Quentin,\nEst-ce que tu as pu faire la mise à jour de BRGLab, avec notamment l'ajout de l'essai de perméabilité (NF EN ISO 17892-11) ?\nCordialement,\nOlivier.\nOlivier Antoni\nTechnicien\nEgis Géotechnique\n(\n07 88 25 39 98\nolivier.antoni@egis\n-group.com\nI\nwww.egis.fr\nEgis Géotechnique\n3 rue docteur Schweitzer\n38180 Seyssins\nFRANCE\nSuivez Egis sur :\nP\nAfin de contribuer au respect de l'environnement, merci de n'imprimer ce mail qu'en cas de nécessité\nCe message et ses pièces jointes peuvent contenir des informations confidentielles ou privilégiées et ne doivent donc pas être diffusés, exploités ou copiés sans autorisation.\r\n Si vous avez reçu ce message par erreur, merci de le signaler à l'expéditeur et le détruire ainsi que les pièces jointes. Les messages électroniques étant susceptibles d'altération, Egis décline toute responsabilité si ce message a été altéré, déformé ou falsifié.\r\n Merci.\nThis message and its attachments may contain confidential or privileged information that may be protected by law; they should not be distributed, used or copied without authorisation. If you have received this email in error, please notify the sender and delete\r\n this message and its attachments. As emails may be altered, Egis is not liable for messages that have been modified, changed or falsified. Thank you.",
|
||||
|
||||
"Auteur": "EGIS SA, Olivier ANTONI",
|
||||
|
||||
"Date": "2025-02-20 09:36:33"
|
||||
|
||||
}
|
||||
|
||||
]
|
||||
|
||||
}
|
||||
7
Node.js.md
Normal file
7
Node.js.md
Normal file
@ -0,0 +1,7 @@
|
||||
Quels éléments de node.js:
|
||||
Environnemnt d'exécution JavaScript open source
|
||||
JS V8
|
||||
Une application Node.js s'exécute dnas un processus unique, sans créer de nouveau thread pour chaque requête.
|
||||
Fournit un ensemble de primitives E/S asynchrones empêchant le blocage du code JAvascript.
|
||||
lorsque Node.js effectue une opération d'E/S
|
||||
|
||||
95
Notes 1er jour support CBAO.md
Normal file
95
Notes 1er jour support CBAO.md
Normal file
@ -0,0 +1,95 @@
|
||||
# Support
|
||||
Partie vue avec Fabien et Romuald
|
||||
## **Partie** **logiciel**
|
||||
|
||||
### **BRG**-**Lab**
|
||||
Ou l'on va retrouver tout ce qui est essais échantillons béton
|
||||
Différentes normes
|
||||
#### In situ routier
|
||||
test routier (calcul moyenne sur portion en fonction de la norme)
|
||||
Sondages
|
||||
prélèvement et analyse du sol
|
||||
contrôle de production
|
||||
Travail labo et producteurs
|
||||
analyse béton à chaque étape
|
||||
### Formulation
|
||||
Composition du béton en fonction du besoin
|
||||
norme NF EN 206+A2 CN
|
||||
## Fonctionnement global du support
|
||||
|
||||
BHFSQL base de donnée windev/webdev partie cœur de métier (données client, échantillons etc...)
|
||||
- documentation sur ce type de base de donnée
|
||||
- Essayer de récupérer un windev/webdev sur pc perso afin de travailler dessus
|
||||
- Une base de donnée par client et son nom de domaine
|
||||
- base de donnée sur serveur mutaliser ou dédier voir doc CBAO pour ramification serveurs et base de donnée
|
||||
- Accès VPN
|
||||
**La partie serveur Prestataire Adamentis boulou**
|
||||
|
||||
**Egalement partie logiciel gestion du matériel (en laboratoire suivi métrologie matériel)**
|
||||
- Tel vert page support
|
||||
Deux type de demandes possibles:
|
||||
- soit formulaire support avec info utiles qui vont permettre de répondre arrive directement dans Odoo
|
||||
- ou par mail Odoo récupère le mail si non lu
|
||||
- Documentation fonctionnement Odoo
|
||||
- Oddo différentes tâches a effectuer
|
||||
**fabien ticket support demandes**:
|
||||
- qualification de la demande
|
||||
- technique/plus base, dysfonctionnement ou nouvelle fonctionnalités voir si existe sinon voir possibilités et devis si besoin passe en suggestion
|
||||
- sur le traitement si client non référencé le créer
|
||||
|
||||
#### **backoffice**
|
||||
- erreurs qui remonte des clients va permettre de mieux analyser les erreurs au niveau client
|
||||
|
||||
- API qui permet de récupérer les données de production avec leur automate de production
|
||||
- Récupération composition du béton
|
||||
- organigramme du travail
|
||||
- Llm catégorisation de la demande pouvoir la lire le pdf qui s'y rattache essentiellement du webdev voir tuto
|
||||
|
||||
|
||||
- [ ] Dans un premier temps se connecter à l'écosystème
|
||||
- [x] Mot de passe : Cbao!1998
|
||||
- [x] se connecter à odoo (odoo.cbao.fr)
|
||||
- [ ] se connecter au différentes URL logiciel
|
||||
- [ ] Connexion logiciel BRG-lab (demo.brg-lab.com)
|
||||
- [ ] Connexion portail.cbao.lan/FR
|
||||
- [x] création d'un git privé pour les notes obsidian
|
||||
- [x] adresse: fernand@cbao.fr
|
||||
- [x] mail ODOO@fernand66
|
||||
- https://odoo.cbao.fr
|
||||
- fernand@cbao.fr
|
||||
- Lestat66!
|
||||
- [x] Webdev
|
||||
- FERNAND
|
||||
- fernand
|
||||
- ]ke8,9R#qqt7=\rb+)
|
||||
- [ ] Connexion RAGFLOW
|
||||
- [ ] comprendre ragflow
|
||||
- [ ] recuperer espace de travail de laurent
|
||||
- fernand@cbao.fr
|
||||
- Lestat66!
|
||||
- fernand66
|
||||
- [x] OpenVPN
|
||||
- FERNAND
|
||||
- fernand
|
||||
- adresse: 10.8.1.12
|
||||
- [ ] Ollama
|
||||
- [ ] ubuntu
|
||||
- [ ] 217.182.105.173
|
||||
- [ ] hl00-380-grall
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
****
|
||||
|
||||
71
Notes Obsidian.md
Normal file
71
Notes Obsidian.md
Normal file
@ -0,0 +1,71 @@
|
||||
- Création note: ctrl + N
|
||||
- Palette de commande: ctrl + P
|
||||
- Ctrl + Alt + clic pour créer une note et diviser l'interface
|
||||
- Ouvrir certaines notes shift pour ouvrir plusieurs notes dans les onglets
|
||||
- On peut déplacer intuitivement les fichiers, dossiers et sous-dossiers
|
||||
- On peut également gérer les fichiers depuis gestionnaire des dossiers OS
|
||||
- Sauvegarde espace de travail activation plugin et "espace de travail"
|
||||
- Marquage des notes, dossiers, vue graphique, recherche, titre, section spécifique
|
||||
- Ctrl E changement de mode (edition, visualisation)
|
||||
- ctrl + tab et ctrl+shift+tab navigation dans les onglets
|
||||
#### Format Markdown
|
||||
- Petit livre en haut à droite, en bas à droite stylo changement de mode
|
||||
- Explorer click droit en sélectionnant un partie du texte différentes possibilités
|
||||
- Math block pour faire des maths avec obsidian
|
||||
- On peut utiliser le format html dans obsidian ajout d'autres possibilités
|
||||
- Activation pluggin Active toolbar
|
||||
- ajout couleur etc ...
|
||||
- Niveaux de titre accéssibles en haut à droite
|
||||
- On peut configurer (personalisation) les niveau de titre (couleur , taille)
|
||||
- Mettre en forme le texte
|
||||
- Italique ctrl + i ou 1 *
|
||||
- gras ctrl + b 2 *
|
||||
- Italique + gras 3 *
|
||||
- barrer texte ~
|
||||
- Surligner ==
|
||||
- <u></u> souligner le texte \<u> <\u>
|
||||
- Crétion d'une citation
|
||||
- chevron >
|
||||
- ou callout avec - (citation un peu plus travaillé on peut personnaliser un peu tout)
|
||||
- liste à puce - deux fois entrée pour la quitter
|
||||
- liste numéroté 1. et espace
|
||||
- liste de tâches - [ ]
|
||||
- \%% pour rendre un commentaire invisible
|
||||
- Création tableau click droite
|
||||
- ligne \---
|
||||
|
||||
#### Création de liens
|
||||
- Permet de faire ressortir les informations où qu'elles soient
|
||||
- Différences entre les tags et les liens
|
||||
- Dans Obsidian les liens sont plus pertinents
|
||||
- On peut retrouver toutes les occurences d'une réference taggué rapidement
|
||||
- On peut aussi vue graphique visualiser directement les mots clés
|
||||
- Liens permettent de créer une note index et l'éditer permet de relier les notes entre elles de manière plus interactive
|
||||
- En haut à droite accès au liens
|
||||
- Différents types de liens
|
||||
- \[[]] vers notes ou nouvelle note
|
||||
- \[[Notes Obsidian#]] choix par titre
|
||||
- \[[Notes Obsidian^]] choix endroit précis
|
||||
- Voici l'information important \[[Notes Obsidian#^9cdda1| ce que je veux afficher]]
|
||||
- affichage le contenu d'une note dans une autre note \![[]]
|
||||
- Utiliser la vue graphique et ses différentes options peut etre judicieux
|
||||
- mot-clé
|
||||
- pièces-jointes
|
||||
- fichiers orphelins (pas rattâchés)
|
||||
|
||||
#### Importation de fichiers
|
||||
- Paramètres/fichiers et liens : création du dossier pièces jointes
|
||||
- On peut coller les liens directements
|
||||
- pluggin Auto link title va permettre d'automatiser le nom du lien
|
||||
- \| ordre de grandeur modifie la taille de la pièce (ex image on peut également longueur x largeur )
|
||||
- image aligné automatiquement déportée sur la gauche
|
||||
- lien image en ligne \! devant l'image et \| pour la taille
|
||||
- Iframe
|
||||
- exemple youtube partager et intégrer copie iframe et intégrable dans obsidian
|
||||
- Embarsuer un résultat de recherche altgr+7 permet d'intégrer une recherche récurrente si pertinent à utiliser dans la note pour rechercher
|
||||
|
||||
#### Pluggins
|
||||
- Auto link title permet de gérer automatiquement les titres des liens
|
||||
- Editing ToolBar (html) va permettre édition plus classique (couleur, etc ...)
|
||||
|
||||
|
||||
11
Notes RAGFLOW.md
Normal file
11
Notes RAGFLOW.md
Normal file
@ -0,0 +1,11 @@
|
||||
Il s'agit d'un moteur open-source de génération augmentée par récupération (RAG) basé sur une compréhension approfondie des documents. Il offre un flux de travail RAG rationalisé pour les entreprises, combinant des modèles de langage de grande taille.
|
||||
|
||||
**Caractéristiques:**
|
||||
- **Compréhension approfondie des documents**: Extraction de conaissances à partir de données non structurées avec des formats complexes, permettant de trouver des informations précises dans de vastes enembles de données.
|
||||
- **Segmentation basée sur des modèles** : Propose des options de segmentation intelligentes et explicables pour divers formats de documents, garantissant l'intégrité sémantique.
|
||||
|
||||
- **Citations fondées avec réduction des hallucinations** : Visualisation de la segmentation du texte permettant une intervention humaine, avec des références clés traçables pour des réponses fiables.
|
||||
|
||||
- **Compatibilité avec des sources de données hétérogènes** : Prend en charge divers formats tels que Word, diapositives, Excel, texte, images, copies numérisées, données structurées, pages web, etc.[GitHub](https://github.com/infiniflow/ragflow)
|
||||
|
||||
- **Flux de travail RAG automatisé et sans effort** : Orchestration RAG simplifiée adaptée aux besoins individuels et aux grandes entreprises, avec des LLM et des modèles d'embedding configurables, ainsi que des API intuitives pour une intégration transparente.[GitHub](https://github.com/infiniflow/ragflow)
|
||||
25
Notes projet LLM.md
Normal file
25
Notes projet LLM.md
Normal file
@ -0,0 +1,25 @@
|
||||
- [ ] Basé sur une base de donnée Postgress (documentation)
|
||||
- [ ] Création d'un middleware entre LLM et node.js fichier pip.js
|
||||
Dans WEBDEV : procédure globale W-GET REST-LLM
|
||||
10.103.0.100:3000
|
||||
- [ ] Utilisation OLLAMA
|
||||
Création de requetes dans Tables
|
||||
- [ ] Voir RAGFLOW
|
||||
- [ ] Utilisation de OpenWebUI
|
||||
- [ ] Création d'agents
|
||||
- [ ] Voir node.js
|
||||
- [ ] Il n'existe pas de stream sur webdev voir pour serveur node + unifast et intégration uniframe
|
||||
- [ ] Ecosystème de l'entreprise WEBDEV, ODOO, abonnement serveur pour LLM
|
||||
|
||||
- Les iframes dans webdev
|
||||
- Les iframes en webdev permettent d'afficher du contenu externe dans une page Webdev. Cela peut être utile si tu veux intégrer une application Node.js ou un autre service web dans ton projet webdev intégration:
|
||||
- Un Iframe (Inline Frame) permet d'intégrer:
|
||||
- Une page externe (ex. un site tiers ou un service web)
|
||||
- Une application Web hébergée sur un autre serveur(ex. un serveur node.js)
|
||||
- Un dashboard interactif ("x. un monitoring en temps réel, une WebApp)
|
||||
- Un contenu dynamique généré en dehors de WebDev
|
||||
- **Cas d’usage avec WebDev + Node.js :** Si ton serveur **Node.js** génère une interface web sur **[http://10.103.0.100:3000](http://10.103.0.100:3000)**, tu peux l’intégrer directement dans WebDev via un IFrame.
|
||||
- Comment intégrer un iframe dans webdev
|
||||
- Ajouter un champ IFrame en WLangage
|
||||
- Générer dynamiquement un IFrame dans du code html
|
||||
- Changer dynamiquement l’URL de l’IFrame
|
||||
81
Notes webdev.md
Normal file
81
Notes webdev.md
Normal file
@ -0,0 +1,81 @@
|
||||
## - **Basé sur Wlangage**
|
||||
- Langage commun de WINDEV, WEBDEV, WINDEV mobile
|
||||
- Variables, instructions conditionnelles, procédures, etc.
|
||||
- Programmation évènementielle, la saisie du code s'effectue dans l'événement WLangage concerné (champ, page, état, etc). Possibilité d'ajouter des événements supplémentaires et gérer par programmation des cas particuliers.
|
||||
- Possibilité de POO (membre, méthode, constructeur, destructeur, héritage multiple, méthode virtuelle, polymorphisme, etc)
|
||||
- Programmation des champs et des objets simpliste (taper le nom dans l'éditeur de code pour voir apparaitre toutes les fonctions ou propriétés utilisables)
|
||||
- Deux syntaxes:
|
||||
- [ ] classique les fonctions WLangage commencent par le nom de la famille correspondante. TableAjouteLigne(TABLE_TableProduit, "Dubois", "Pierre")
|
||||
- [ ] Une syntaxe préfixée, dans ce cas le nom de l"élément manipulé est indiqué en premier. TABLE_TableProduit.AjouteLigne("Dubois", "Pierre")
|
||||
|
||||
##### Trace (fonction)
|
||||
Affiche des informations demandées dans une fenêtre ouverte en parallèle de la fenêtre en cours.
|
||||
- syntaxe:
|
||||
`-Trace(<Informations> [, <Informations complémentaires 1> [... [, <Informations complémentaires N>]]])`
|
||||
### Les variables
|
||||
- Une variable est représentée par:
|
||||
- Un nom
|
||||
- un type: Nature de la donnée stockée dans la variable
|
||||
- une valeur
|
||||
- une portée: limite d'utilisation de la variable dans le programme. la portée est définie proncipalement par l'endroit où la variable est déclarée.
|
||||
- Possiblité de déclarer à n'importe quel endroit dans le code attention à son positionnement concernant sa visibilité pour effectuer des traitements ou des calculs. On parle alors de portée des variables:
|
||||
- **Globale** (visibilité étendue dans le code) plusieurs niveaux de globalité:
|
||||
- niveau Projet et Collection de procédures
|
||||
- niveau fenêtre, fenêtre mobile, page, Etat
|
||||
- niveau Champ
|
||||
- Une variable au niveau du projet a la visibilité la plus importante dans le programme. Dans ce cas est déclare dans l'événement "initialisation du projet", variable visible partout (mémoire réservée pour cette variable attention à ne pas trop l'utiliser)
|
||||
- au niveau collection de procédures même visibilité qu'une variable dclarée au niveau du prjet. Avantage est de regrouper (ou classer) les variables par thème(collection) afin de rendre plus visible l'événement "Initialisation" du projet
|
||||
- Une variable déclarée **au niveau d'une Fenêtre, Fenêtre Mobile, Page ou Etat** limite la portée de la variable aux événements ou traitements de l'élément (Fenêtre, Fenêtre Mobile, Page ou Etat) et de ses champs. Cela permet d'encapsuler et de limiter les utilisations.
|
||||
- Une variable globale déclarée au niveau d'un champ limite la portée de la variable aux événements du champ. Cela permet de regrouper les variables par champ et ainsi de rendre plus lisible l'événement "Initialisation" de la fenêtre.
|
||||
- **Portée locale** siginifie que la variable a une visibilité très limitée dans le code. La variable est visible uniquemenr où elle a étét déclarée. Cela permet ainsi de restreindre l'utilisation de la variable au traitment ou à l'évènement.
|
||||
|
||||
**Exemple de déclaration de variables:**
|
||||
|
||||
Prix est un monétaire
|
||||
Nom, Prénom sont des chaînes
|
||||
// Affectation d'une variable de type monétaire
|
||||
Prix = 1256.67
|
||||
// Affichage du contenu de la variable
|
||||
Trace(Prix)
|
||||
// Affectation d'une variable de type chaîne
|
||||
Nom = "Dupont"
|
||||
// Affichage du contenu de la variable
|
||||
Trace(Nom)
|
||||
###### Les types de variables
|
||||
- bolléen
|
||||
- chaîne
|
||||
- entier
|
||||
- monétaire
|
||||
- réel
|
||||
- Le WLangage propose égalment des variables de type "avancé" regroupant toutes les caractéristiques de l'élément manipulé en une seule variable. Ces types avancés permettent par exmple de manipuler les documents XML, les emails, les fichiers XLS, etc. (voir [Les différents types de variables](https://doc.pcsoft.fr/?1514013&name=les_types_wlangage "Les types du WLangage")).
|
||||
|
||||
###### Opérations simples sur les variables
|
||||
|
||||
Pour effectuer des calculs sur des variables, le WLangage met à disposition les opérateurs mathématiques classiques :
|
||||
|
||||
- + pour faire une addition.
|
||||
- - pour faire une soustraction.
|
||||
- * pour faire une multiplication.
|
||||
- / pour faire une division.
|
||||
|
||||
**D'autres opérateurs peuvent être utilisés pour réaliser des calculs :**
|
||||
|
||||
- ++ pour incrémenter de 1 (additionner 1 à la variable).
|
||||
- - - pour décrémenter de 1 (soustraire 1 à la variable).
|
||||
- += pour affecter en additionnant une valeur.
|
||||
- - = pour affecter en soustrayant une valeur.
|
||||
|
||||
**Des opérateurs de comparaison sont également disponibles :**
|
||||
|
||||
- < inférieur strict
|
||||
- > supérieur strict
|
||||
- <= inférieur ou égal
|
||||
- >= supérieur ou égal
|
||||
- <> différent de
|
||||
- = égal à
|
||||
|
||||
D'autres opérateurs sont disponibles. Pour plus de détails sur les opérateurs, consultez [Liste des opérateurs](https://doc.pcsoft.fr/?1512010&name=liste_des_operateurs "Liste des opérateurs").
|
||||
|
||||
|
||||
|
||||
|
||||
107
Odoo.md
Normal file
107
Odoo.md
Normal file
@ -0,0 +1,107 @@
|
||||
##### Exporter et importer des données dans Odoo et accéder aux commandes:
|
||||
- Vue liste, exporter
|
||||
- [ ] Voir quels éléments sont important à récupérer
|
||||
- [ ] Accéder à la base de donnée grâce à un script
|
||||
- [ ] Afficher la liste des modèles disponibles
|
||||
- [ ] Visualiser les champs d'un modèle
|
||||
- [ ] Identifier les modèles utiles
|
||||
- projet.task(tickets)
|
||||
- contact: res.partner
|
||||
- pour le moment tickets
|
||||
- conexion au servuer oddo: ODOO_CBAO_SUPPORT = _OdooPortail(portail: 'odoo.cbao.fr', login: 'support@cbao.fr', mdp: '80rueLouisBraille', db: 'production_cbao')
|
||||
- Identifiants perso: fernand@cbao.fr mdp: Lestat66!
|
||||
- Récupération des données par un script python
|
||||
- [ ] Voir comment traité au mieux les données
|
||||
- [ ] Voir comment les récupérer
|
||||
- [ ] Voir comment si nécessaire les traiter (conversion json ou markdown)
|
||||
- info important récupération odoo une requête 1sec mais 30 requêtes 30 seconde, plus interessant de tout recupérer et traiter
|
||||
- Dans l'interface ODOO penser à activer le pluggin google odoo
|
||||
- mode admin débloqué accès technique
|
||||
- modèles
|
||||
- champs
|
||||
- etc...
|
||||
- project.task
|
||||
- [ ] Récupération des données d'un ticket
|
||||
- [ ] filtrage des données
|
||||
- [ ] répérerer les champs permettant la claissification des tickets
|
||||
- champ "sequence":
|
||||
- id différent du code qui correspond au T"int"
|
||||
- voir si accession par id ou code
|
||||
- 1:
|
||||
- 0: en attente de résolution
|
||||
- champ relationnels:
|
||||
- stage_id, project_id voir récupération et traitement en fonction de ces parmètres
|
||||
- stage_id:
|
||||
- ID: 1 - Nom: Arrivée sur le support
|
||||
- ID: 5 - Nom: En attente de résolution
|
||||
- ID: 49 - Nom: A développer
|
||||
- ID: 63 - Nom: Commande verbale
|
||||
- ID: 67 - Nom: Attente Date
|
||||
- ID: 71 - Nom: Attente RDV / Qualif
|
||||
- ID: 76 - Nom: Demande orale
|
||||
- ID: 87 - Nom: A récupérer
|
||||
- ID: 90 - Nom: A TRAITER
|
||||
- ID: 96 - Nom: DEVIS A REALISER
|
||||
- ID: 99 - Nom: Ouvert
|
||||
- ID: 16 - Nom: Suggestion à qualifier
|
||||
- ID: 18 - Nom: Devis à chiffrer
|
||||
- ID: 43 - Nom: COMMANDÉ
|
||||
- ID: 46 - Nom: Tickets existants
|
||||
- ID: 50 - Nom: En cours de développement
|
||||
- ID: 55 - Nom: Arrivée depuis BRG-LAB
|
||||
- ID: 66 - Nom: Attente SEPA
|
||||
- ID: 69 - Nom: Attente Plateforme
|
||||
- ID: 72 - Nom: Attente Feuille Inscrip
|
||||
- ID: 77 - Nom: Attente qualification
|
||||
- ID: 83 - Nom: Temps restant
|
||||
- ID: 86 - Nom: En attente de prise en charge
|
||||
- ID: 88 - Nom: Demande faite
|
||||
- ID: 91 - Nom: DEMANDE FAITE
|
||||
- ID: 97 - Nom: ATTENTE RETOUR
|
||||
- ID: 100 - Nom: En attente d'informations
|
||||
- ID: 3 - Nom: En souffrance
|
||||
- ID: 19 - Nom: Moyen terme
|
||||
- ID: 22 - Nom: En cours
|
||||
- ID: 32 - Nom: En attente d'infos / retours
|
||||
- ID: 64 - Nom: Attente SEPA + CONTRAT
|
||||
- ID: 68 - Nom: Attente Base
|
||||
- ID: 73 - Nom: Attente Convention
|
||||
- ID: 78 - Nom: Attente acceptation
|
||||
- ID: 92 - Nom: RELANCE 1 FAITE
|
||||
- ID: 101 - Nom: A publier
|
||||
- ID: 105 - Nom: FACTURE A ENVOYER
|
||||
- ID: 20 - Nom: Long terme
|
||||
- ID: 34 - Nom: Attente formation
|
||||
- ID: 47 - Nom: À planifier
|
||||
- ID: 52 - Nom: A réceptionner par le client
|
||||
- ID: 62 - Nom: Workflow Digiforma Ok ?
|
||||
- ID: 65 - Nom: Attente CONTRAT
|
||||
- ID: 79 - Nom: Attente début projet
|
||||
- ID: 85 - Nom: Corrigé
|
||||
- ID: 89 - Nom: Attente formation
|
||||
- ID: 95 - Nom: BLOCAGE ADMINISTRATIF
|
||||
- ID: 102 - Nom: A valider
|
||||
- ID: 12 - Nom: À planifier
|
||||
- project_id:
|
||||
- ID: 11 - Nom: ACHAT ABONNEMENT BRG-LAB
|
||||
- ID: 23 - Nom: Assistance téléphonique
|
||||
- ID: 25 - Nom: Bons de commandes
|
||||
- ID: 22 - Nom: DEVELOPPEMENT SPECIFIQUE
|
||||
- ID: 3 - Nom: Demandes
|
||||
- ID: 8 - Nom: Formations
|
||||
- ID: 9 - Nom: Installations / Migrations
|
||||
- ID: 26 - Nom: OBTENTION BON DE COMMANDE
|
||||
- ID: 28 - Nom: Projet SIGIL
|
||||
- ID: 7 - Nom: R&D
|
||||
- ID: 27 - Nom: RENOUVELLEMENT OPEN
|
||||
- ID: 6 - Nom: Suggestions
|
||||
- ID: 4 - Nom: Tickets
|
||||
- Pour simplifier la recherche des tickets on peut recouper
|
||||
|
||||
- Méthodes appel odoo
|
||||
- En réalité, `odoorpc` permet d'exécuter des requêtes sous cette forme :
|
||||
- self.odoo.execute(model, method, params)
|
||||
- Mais la bonne manière d'appeler une méthode Odoo via `odoorpc` est :
|
||||
- self.odoo.env[model].method_name(*params)
|
||||
- mais dans notre cas seul la première méthode fonctionne
|
||||
|
||||
16
Questions pour Karim.md
Normal file
16
Questions pour Karim.md
Normal file
@ -0,0 +1,16 @@
|
||||
- [ ] Validation format JSON
|
||||
- [ ] Pipeline nodes vs FastAPI
|
||||
- [ ] Mise en place de scripts
|
||||
- [ ] argument + script pour execution
|
||||
- [ ] bibliothèque de scripts bien précis pour la récupération des données
|
||||
- [ ] Petit script tâche précise
|
||||
- [ ] scripts 100% autonomes?
|
||||
- [ ] Plus gros script pour recherche plus large
|
||||
- [ ] Création d'une base de donnée à partir des tickets récupérer et résolu
|
||||
- [ ] Déplacement des données receuillis une fois résolu?
|
||||
- [ ] Création d'un JSON final et suppression des fichiers inutiles
|
||||
- [ ] Quel LLM dans un premier temps pour l'execution des scripts
|
||||
- [ ] langchain, ...
|
||||
- [ ] besoin fine-tuning?
|
||||
- [ ] Voir efficacité de guider l'utilisateur pour récupérer les informations plus rapidement
|
||||
- [ ] Mise en place d'une interface locale? (Gradio ou autre) avec enregistrement des conversations pour tests et ajout des conversations au JSON pour regrouper es données concernant la demande
|
||||
83
Scripts requêtes Odoo.md
Normal file
83
Scripts requêtes Odoo.md
Normal file
@ -0,0 +1,83 @@
|
||||
#### La connexion à Odoo s'effectue par son API
|
||||
- Les requête sont en python
|
||||
- Création de scripts en python
|
||||
|
||||
##### **Création d'un programme en python pour récupérer les informations concernant les tickets et demandes**
|
||||
Modèle de la base de donnée identifié "project.task" qui par son project_id va permettre de récupérer les informations présentes sur Odoo dans le suite d'un ticket ou d'une demande.
|
||||
|
||||
- project_id:
|
||||
- ID: 11 - Nom: ACHAT ABONNEMENT BRG-LAB
|
||||
- ID: 23 - Nom: Assistance téléphonique
|
||||
- ID: 25 - Nom: Bons de commandes
|
||||
- ID: 22 - Nom: DEVELOPPEMENT SPECIFIQUE
|
||||
- ID: 3 - Nom: Demandes
|
||||
- ID: 8 - Nom: Formations
|
||||
- ID: 9 - Nom: Installations / Migrations
|
||||
- ID: 26 - Nom: OBTENTION BON DE COMMANDE
|
||||
- ID: 28 - Nom: Projet SIGIL
|
||||
- ID: 7 - Nom: R&D
|
||||
- ID: 27 - Nom: RENOUVELLEMENT OPEN
|
||||
- ID: 6 - Nom: Suggestions
|
||||
- ID: 4 - Nom: Tickets
|
||||
Ensuite autre champ important stage_id qui va nous permettre de récupérer tous les tickets ou demandes par catégorie.
|
||||
|
||||
- stage_id:
|
||||
- ID: 1 - Nom: Arrivée sur le support
|
||||
- ID: 5 - Nom: En attente de résolution
|
||||
- ID: 49 - Nom: A développer
|
||||
- ID: 63 - Nom: Commande verbale
|
||||
- ID: 67 - Nom: Attente Date
|
||||
- ID: 71 - Nom: Attente RDV / Qualif
|
||||
- ID: 76 - Nom: Demande orale
|
||||
- ID: 87 - Nom: A récupérer
|
||||
- ID: 90 - Nom: A TRAITER
|
||||
- ID: 96 - Nom: DEVIS A REALISER
|
||||
- ID: 99 - Nom: Ouvert
|
||||
- ID: 16 - Nom: Suggestion à qualifier
|
||||
- ID: 18 - Nom: Devis à chiffrer
|
||||
- ID: 43 - Nom: COMMANDÉ
|
||||
- ID: 46 - Nom: Tickets existants
|
||||
- ID: 50 - Nom: En cours de développement
|
||||
- ID: 55 - Nom: Arrivée depuis BRG-LAB
|
||||
- ID: 66 - Nom: Attente SEPA
|
||||
- ID: 69 - Nom: Attente Plateforme
|
||||
- ID: 72 - Nom: Attente Feuille Inscrip
|
||||
- ID: 77 - Nom: Attente qualification
|
||||
- ID: 83 - Nom: Temps restant
|
||||
- ID: 86 - Nom: En attente de prise en charge
|
||||
- ID: 88 - Nom: Demande faite
|
||||
- ID: 91 - Nom: DEMANDE FAITE
|
||||
- ID: 97 - Nom: ATTENTE RETOUR
|
||||
- ID: 100 - Nom: En attente d'informations
|
||||
- ID: 3 - Nom: En souffrance
|
||||
- ID: 19 - Nom: Moyen terme
|
||||
- ID: 22 - Nom: En cours
|
||||
- ID: 32 - Nom: En attente d'infos / retours
|
||||
- ID: 64 - Nom: Attente SEPA + CONTRAT
|
||||
- ID: 68 - Nom: Attente Base
|
||||
- ID: 73 - Nom: Attente Convention
|
||||
- ID: 78 - Nom: Attente acceptation
|
||||
- ID: 92 - Nom: RELANCE 1 FAITE
|
||||
- ID: 101 - Nom: A publier
|
||||
- ID: 105 - Nom: FACTURE A ENVOYER
|
||||
- ID: 20 - Nom: Long terme
|
||||
- ID: 34 - Nom: Attente formation
|
||||
- ID: 47 - Nom: À planifier
|
||||
- ID: 52 - Nom: A réceptionner par le client
|
||||
- ID: 62 - Nom: Workflow Digiforma Ok ?
|
||||
- ID: 65 - Nom: Attente CONTRAT
|
||||
- ID: 79 - Nom: Attente début projet
|
||||
- ID: 85 - Nom: Corrigé
|
||||
- ID: 89 - Nom: Attente formation
|
||||
- ID: 95 - Nom: BLOCAGE ADMINISTRATIF
|
||||
- ID: 102 - Nom: A valider
|
||||
- ID: 12 - Nom: À planifier
|
||||
Ce qui va nous permmettre de récupérer tous les tickets par exemple des demandes entrantes et les traités.
|
||||
|
||||
Structure du programme
|
||||
|
||||
Celui-ci va nous permettre la récupération d'un ticket donné, d'extaire l'historique de discussion et récupérer les pièces-jointes (récupération dans des répertoires précis).
|
||||
|
||||
Nous allons par la suite lister des actions précices et récupérer ses différentes fonctions et les utiliser (argument + script).
|
||||
|
||||
Il reste un travail de filtrage des données selon les demandes ce qu'il est nécessaire de conserver, le filtre va synthétiser un JSON final par ordre chronologique des conversation et les pièces jointes dans un sous répertoire en vue d'une analyse.
|
||||
BIN
signature.png
Normal file
BIN
signature.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
14
testnode/server.js
Normal file
14
testnode/server.js
Normal file
@ -0,0 +1,14 @@
|
||||
const { createServer } = require('node:http');
|
||||
|
||||
const hostname = '127.0.0.1';
|
||||
const port = 30000;
|
||||
|
||||
const server = createServer((req, res) => {
|
||||
res.statusCode = 200;
|
||||
res.setHeader('Content-Type', 'text/plain');
|
||||
res.end('Hello World');
|
||||
});
|
||||
|
||||
server.listen(port, hostname, () => {
|
||||
console.log(`Server running at http://${hostname}:${port}/`);
|
||||
});
|
||||
Loading…
x
Reference in New Issue
Block a user