vault backup: 2025-04-12 14:47:24

This commit is contained in:
Miguel 2025-04-12 14:47:25 +02:00
parent 0ec7dfedc3
commit 515951f026
261 changed files with 69583 additions and 566 deletions

4
.obsidian/app.json vendored
View File

@ -10,5 +10,7 @@
"spellcheck": true,
"alwaysUpdateLinks": true,
"readableLineLength": false,
"showLineNumber": false
"showLineNumber": false,
"newFileLocation": "current",
"showInlineTitle": true
}

View File

@ -2,5 +2,10 @@
"accentColor": "",
"baseFontSize": 16,
"theme": "obsidian",
"cssTheme": "Minimal"
"cssTheme": "",
"showViewHeader": true,
"showRibbon": true,
"enabledCssSnippets": [
"nav-wrap"
]
}

View File

@ -20,7 +20,8 @@
"markitdown",
"obsidian-importer",
"obsidian-icon-folder",
"obsidian-minimal-settings",
"recent-files-obsidian",
"obsidian-projects"
"obsidian-auto-link-title",
"advanced-canvas",
"obsidian-minimal-settings"
]

3
.obsidian/page-preview.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"preview": true
}

8157
.obsidian/plugins/advanced-canvas/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
{
"id": "advanced-canvas",
"name": "Advanced Canvas",
"version": "4.0.2",
"minAppVersion": "1.1.0",
"description": "Supercharge your canvas experience! Create presentations, flowcharts and more!",
"author": "Developer-Mike",
"authorUrl": "https://github.com/Developer-Mike",
"fundingUrl": "https://ko-fi.com/X8X27IA08",
"isDesktopOnly": false
}

View File

@ -0,0 +1,521 @@
/* src/styles.scss */
.properties-field > .setting-item-info {
flex: 0;
margin: 0;
padding: var(--size-4-1) var(--size-4-2);
border: var(--input-border-width) solid var(--background-modifier-border);
border-radius: var(--input-radius) 0 0 var(--input-radius);
}
.properties-field > .setting-item-control > input {
width: 100%;
border-radius: 0 var(--input-radius) var(--input-radius) 0;
}
.ac-settings-heading {
border-bottom: 1px solid var(--color-accent);
}
.ac-settings-heading:not(:first-child) {
margin-top: var(--size-4-10) !important;
}
.ac-settings-heading .setting-item-description {
margin-inline-end: 20px;
}
.ac-settings-heading:has(.checkbox-container:not(.is-enabled)) + .settings-header-children {
opacity: 0.5;
pointer-events: none;
}
details.setting-item[open] > summary {
margin-bottom: 0.75em;
}
details.setting-item > *:not(summary) {
padding-left: 1em;
border-left: 1px solid var(--color-accent);
}
body.is-mobile .kofi-button.sticky {
display: none;
}
.kofi-button {
height: 30px;
max-height: 30px;
}
.kofi-button.sticky {
z-index: 10;
position: absolute;
bottom: var(--size-4-5);
right: var(--size-4-5);
}
.kofi-button img {
height: 100%;
}
.kofi-overlay {
z-index: 100;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.kofi-overlay::before {
content: "";
z-index: -1;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: var(--color-base-00);
opacity: 0.95;
}
.kofi-overlay h1 {
margin-bottom: 0;
}
.kofi-overlay p {
max-width: 50%;
color: var(--text-muted);
text-align: center;
}
.kofi-overlay p b {
color: var(--text-primary);
}
.kofi-overlay progress {
margin-top: var(--size-4-8);
background: transparent;
}
.kofi-overlay progress::-webkit-progress-bar {
background-color: var(--background-modifier-border);
border-radius: var(--input-radius);
}
.kofi-overlay progress::-webkit-progress-value {
background-color: var(--color-accent);
border-radius: var(--input-radius);
}
.kofi-overlay .kofi-button {
margin-top: var(--size-4-10);
margin-bottom: var(--size-4-5);
}
.kofi-overlay .no-button {
cursor: pointer;
}
.quicksettings-suggestion {
display: flex;
flex-direction: column;
}
.quicksettings-suggestion .quicksettings-suggestion-label {
font-weight: 500;
}
.quicksettings-suggestion .quicksettings-suggestion-description {
color: var(--text-muted);
}
.canvas-wrapper:not(.mod-readonly) .show-while-readonly {
display: none;
}
.canvas-control-item[data-toggled=true] {
background-color: var(--color-accent);
}
.canvas-control-item[data-toggled=true] svg {
stroke: var(--text-on-accent);
}
.reactive-node,
.canvas-node[data-shape=database],
.canvas-node[data-shape=document],
.canvas-node[data-shape=predefined-process],
.canvas-node[data-shape=diamond] {
--border-color: rgb(var(--canvas-color));
--border-width: 3px;
--box-shadow: none;
}
.reactive-node.is-focused,
.is-focused.canvas-node[data-shape=database],
.is-focused.canvas-node[data-shape=document],
.is-focused.canvas-node[data-shape=predefined-process],
.is-focused.canvas-node[data-shape=diamond],
.reactive-node.is-selected,
.is-selected.canvas-node[data-shape=database],
.is-selected.canvas-node[data-shape=document],
.is-selected.canvas-node[data-shape=predefined-process],
.is-selected.canvas-node[data-shape=diamond] {
--border-color: var(--color-accent);
--border-width: 5px;
--box-shadow: var(--shadow-border-accent);
}
.reactive-node.is-themed,
.is-themed.canvas-node[data-shape=database],
.is-themed.canvas-node[data-shape=document],
.is-themed.canvas-node[data-shape=predefined-process],
.is-themed.canvas-node[data-shape=diamond] {
--border-color: rgba(var(--canvas-color), 0.7);
}
.reactive-node.is-themed.is-focused,
.is-themed.is-focused.canvas-node[data-shape=database],
.is-themed.is-focused.canvas-node[data-shape=document],
.is-themed.is-focused.canvas-node[data-shape=predefined-process],
.is-themed.is-focused.canvas-node[data-shape=diamond],
.reactive-node.is-themed.is-selected,
.is-themed.is-selected.canvas-node[data-shape=database],
.is-themed.is-selected.canvas-node[data-shape=document],
.is-themed.is-selected.canvas-node[data-shape=predefined-process],
.is-themed.is-selected.canvas-node[data-shape=diamond] {
--border-color: rgb(var(--canvas-color));
--box-shadow: var(--shadow-border-themed);
}
.canvas-node[data-text-align=center] .markdown-preview-view {
padding: 0 !important;
overflow-y: initial;
}
.canvas-node[data-text-align=center] .markdown-preview-view .markdown-preview-section {
display: flex;
flex-direction: column;
justify-content: center;
min-height: 0 !important;
text-align: center;
vertical-align: middle;
}
.canvas-node[data-text-align=right] {
text-align: right;
}
.canvas-node[data-shape=pill] .canvas-node-container {
border-radius: 5000px;
}
.canvas-node[data-shape=diamond] {
}
.canvas-node[data-shape=diamond].is-focused,
.canvas-node[data-shape=diamond].is-selected {
border-radius: var(--radius-m);
outline: 2px solid var(--color-accent);
outline-offset: 5px;
}
.canvas-node[data-shape=diamond] .canvas-node-container {
border: none;
box-shadow: none !important;
}
.canvas-node[data-shape=diamond] .canvas-node-container:not(:has(.embed-iframe)) {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: 100%;
-webkit-mask-size: 100%;
}
.canvas-node[data-shape=diamond] .canvas-node-container .canvas-node-placeholder::after {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: 100%;
-webkit-mask-size: 100%;
}
.canvas-node[data-shape=diamond]::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: 100%;
-webkit-mask-size: 100%;
content: "";
position: absolute;
top: calc(var(--border-width) * -1);
left: calc(var(--border-width) * -1);
width: calc(100% + var(--border-width) * 2);
height: calc(100% + var(--border-width) * 2);
background-color: var(--border-color);
}
.canvas-node[data-shape=parallelogram] .canvas-node-container {
transform: skewX(-20deg);
backface-visibility: hidden;
}
.canvas-node[data-shape=parallelogram] .canvas-node-container .canvas-node-content .markdown-embed-content {
transform: skewX(20deg);
}
.canvas-node[data-shape=circle] .canvas-node-container {
border-radius: 50%;
}
.canvas-node[data-shape=circle] .canvas-node-container .markdown-preview-view {
padding: 0 !important;
overflow-y: initial;
}
.canvas-node[data-shape=predefined-process] .canvas-node-container .canvas-node-content {
padding: 0 10px;
}
.canvas-node[data-shape=predefined-process] .canvas-node-container::before,
.canvas-node[data-shape=predefined-process] .canvas-node-container::after {
content: "";
z-index: 1;
position: absolute;
top: 0;
width: 0;
height: 100%;
border-left: var(--border-width) solid var(--border-color);
}
.canvas-node[data-shape=predefined-process] .canvas-node-container::before {
left: calc(10px - var(--border-width));
}
.canvas-node[data-shape=predefined-process] .canvas-node-container::after {
right: calc(10px - var(--border-width));
}
.canvas-node[data-shape=document] {
--border-width: 2.5px;
filter: drop-shadow(0 var(--border-width) 0 var(--border-color)) drop-shadow(0 calc(var(--border-width) * -1) 0 var(--border-color));
}
.canvas-node[data-shape=document] .canvas-node-container {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 75 45' preserveAspectRatio='none'%3E%3Cpath d='M75 0 75 39.375Q56.25 29.25 37.5 39.375 18.75 49.5 0 39.375L0 0Z' /%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 75 45' preserveAspectRatio='none'%3E%3Cpath d='M75 0 75 39.375Q56.25 29.25 37.5 39.375 18.75 49.5 0 39.375L0 0Z' /%3E%3C/svg%3E");
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: 100%;
-webkit-mask-size: 100%;
border: var(--border-width) solid var(--border-color);
border-top: none;
border-bottom: none;
}
.canvas-node[data-shape=document].is-focused,
.canvas-node[data-shape=document].is-selected {
--border-width: 4px;
}
.canvas-node[data-shape=database] {
}
.canvas-node[data-shape=database] .canvas-node-container {
border: var(--border-width) solid var(--border-color);
border-bottom: 0;
border-top: 0;
border-radius: 0;
box-shadow: none !important;
}
.canvas-node[data-shape=database] .canvas-node-container .canvas-node-placeholder {
transform: translateY(25px);
}
.canvas-node[data-shape=database]::before,
.canvas-node[data-shape=database]::after {
content: "";
position: absolute;
left: 0;
box-sizing: border-box;
width: 100%;
height: 50px;
border-radius: 50%;
border: var(--border-width) solid var(--border-color);
background-color: var(--background-primary);
}
.canvas-node[data-shape=database]::after {
top: -25px;
}
.canvas-node[data-shape=database]::before {
bottom: -25px;
}
.canvas-node[data-shape=database].is-themed .canvas-node-content {
background-color: transparent;
}
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe)) .canvas-node-container,
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe))::after,
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe))::before {
box-shadow: inset 0 0 0 1000px rgba(var(--canvas-color), 0.07) !important;
}
.canvas-node[data-shape=database] .canvas-node-content:not(:has(.embed-iframe)) {
transform: translateY(20px);
}
.canvas-node[data-shape=database]:has(.embed-iframe)::after {
z-index: -1;
}
.canvas-node[data-border=dashed] .canvas-node-container {
box-shadow: none;
border-style: dashed;
}
.canvas-node[data-border=dotted] .canvas-node-container {
box-shadow: none;
border-style: dotted;
}
.canvas-node[data-border=invisible] {
box-shadow: none;
}
.canvas-node[data-border=invisible]:not(.is-focused):not(.is-selected) .canvas-node-container {
border-color: transparent !important;
}
.canvas-node[data-border=invisible] .canvas-node-label {
display: none;
}
.canvas-node[data-border=invisible] .canvas-node-container {
background-color: transparent;
box-shadow: none;
}
.canvas-node[data-border][data-shape=predefined-process] {
--border-width: 2px;
}
.canvas-node[data-border][data-shape=predefined-process] .is-focused,
.canvas-node[data-border][data-shape=predefined-process] .is-selected {
--border-width: 2px;
}
.canvas-node[data-border=dashed][data-shape=predefined-process] .canvas-node-container::before,
.canvas-node[data-border=dashed][data-shape=predefined-process] .canvas-node-container::after {
border-left: var(--border-width) dashed var(--border-color);
}
.canvas-node[data-border=dotted][data-shape=predefined-process] .canvas-node-container::before,
.canvas-node[data-border=dotted][data-shape=predefined-process] .canvas-node-container::after {
border-left: var(--border-width) dotted var(--border-color);
}
.canvas-node[data-border][data-shape=document] .canvas-node-container {
border-top: none;
border-bottom: none;
}
.canvas-edges path[data-path=dotted] {
stroke-dasharray: calc(3px * var(--zoom-multiplier));
}
.canvas-edges path[data-path=short-dashed] {
stroke-dasharray: 9px;
}
.canvas-edges path[data-path=long-dashed] {
stroke-dasharray: 18px;
}
.canvas-edges [data-arrow=triangle-outline] polygon,
.canvas-edges [data-arrow=diamond-outline] polygon,
.canvas-edges [data-arrow=circle-outline] polygon {
fill: var(--canvas-background);
stroke: rgb(var(--canvas-color));
stroke-width: calc(3px * var(--zoom-multiplier));
}
.canvas-edges [data-arrow=thin-triangle] polygon {
fill: transparent;
stroke: rgb(var(--canvas-color));
stroke-width: calc(4px * var(--zoom-multiplier));
}
.canvas.is-exporting {
--zoom-multiplier: 1;
}
.canvas.is-exporting * {
pointer-events: none !important;
transition: none !important;
}
.canvas.is-exporting #group-collapse-button {
display: none;
}
.canvas.is-exporting #watermark-ac {
z-index: 9999999;
position: absolute;
}
.canvas-wrapper[data-collapsible-groups-feature-enabled=true] .canvas.is-exporting .canvas-node .canvas-group-label {
left: 0;
}
.progress-bar-modal-ac {
margin-top: 0.75em;
}
.progress-bar-modal-ac.error .setting-progress-bar {
color: var(--color-error);
}
.canvas-wrapper[data-disable-font-size-relative-to-zoom=true] {
--zoom-multiplier: 1 !important;
}
.canvas-wrapper.mod-readonly[data-hide-background-grid-when-in-readonly=true] .canvas-background {
visibility: hidden;
}
#group-collapse-button {
position: absolute;
left: 0;
top: calc(-1 * var(--size-4-1) * var(--zoom-multiplier));
padding: var(--size-4-1) var(--size-4-2);
transform-origin: bottom left;
transform: translate(0, -100%) scale(var(--zoom-multiplier));
border-radius: var(--radius-s);
color: var(--text-muted);
background-color: rgba(var(--canvas-color), 0.1);
font-size: 1.5em;
line-height: 1;
pointer-events: initial;
cursor: pointer;
transition: transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
}
.canvas-wrapper[data-collapsible-groups-feature-enabled=true] .canvas-node .canvas-group-label {
left: calc(40px * var(--zoom-multiplier));
}
.canvas-node[data-is-collapsed] .canvas-node-container {
display: none;
}
.canvas-node[data-is-collapsed] .canvas-group-label {
max-width: initial;
}
.canvas-wrapper[data-collapsed-group-preview-on-drag=true][data-is-dragging] .canvas-node[data-is-collapsed] .canvas-node-container {
display: block;
opacity: 0.5;
border-style: dashed;
}
.canvas-wrapper[data-collapsed-group-preview-on-drag=true][data-is-dragging] .canvas-node[data-is-collapsed] .canvas-node-container .canvas-node-content {
background-color: transparent;
}
.canvas-node-interaction-layer[data-target-is-collapsed] .canvas-node-resizer {
pointer-events: none;
cursor: inherit;
}
.canvas-node-interaction-layer[data-target-is-collapsed] .canvas-node-resizer .canvas-node-connection-point {
display: none;
pointer-events: none;
}
.canvas-wrapper[data-floating-edge-feature-enabled=true] .canvas.is-connecting .canvas-node:not(.canvas-node-group)::after {
all: unset;
content: "";
z-index: 100;
position: absolute;
top: 50%;
left: 50%;
width: max(10px, 100% - 50px * var(--zoom-multiplier) * 2);
height: max(10px, 100% - 50px * var(--zoom-multiplier) * 2);
transform: translate(-50%, -50%);
border-radius: var(--radius-m);
outline: calc(4px * var(--zoom-multiplier)) dashed hsla(var(--color-accent-hsl), 0.5);
}
.canvas-wrapper[data-floating-edge-feature-enabled=true] .canvas.is-connecting .canvas-node:not(.canvas-node-group).hovering-floating-edge-zone::after {
outline-color: var(--color-accent);
outline-style: solid;
background-color: hsla(var(--color-accent-hsl), 0.1);
}
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-node:not(.is-focused) {
filter: blur(5px);
}
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-edges {
filter: blur(5px);
}
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-path-label-wrapper {
filter: blur(5px);
}
.canvas-wrapper.presentation-mode .canvas-controls {
visibility: hidden;
}
.canvas-wrapper.presentation-mode .canvas-card-menu {
visibility: hidden;
}
.canvas-wrapper:not(.presentation-mode) .canvas-node[data-is-start-node=true]::before {
content: "Start";
position: absolute;
top: calc(-1 * var(--size-4-1) * var(--zoom-multiplier));
right: 0;
transform: translate(0, -100%) scale(var(--zoom-multiplier));
transform-origin: bottom right;
max-width: calc(100% / var(--zoom-multiplier));
padding: var(--size-4-1) var(--size-4-2);
font-size: 1em;
border-radius: var(--radius-s);
color: var(--color-green);
background-color: rgba(var(--color-green-rgb), 0.1);
}
.canvas-node[data-portal-to-file] {
pointer-events: all;
}
.canvas-node[data-portal-to-file]:not(.is-focused) {
pointer-events: none;
}
.canvas-node[data-portal-to-file]:not(.is-focused) .canvas-node-label {
pointer-events: all;
}
.canvas-node[data-portal-to-file] .canvas-node-container {
background-color: transparent;
border-style: dashed;
}
.canvas-node[data-portal-to-file] .canvas-node-container .canvas-node-content {
display: none;
}
.canvas-node-interaction-layer[data-target-portal-id] .canvas-node-resizer {
pointer-events: none;
cursor: inherit;
}
.canvas-node-interaction-layer[data-target-portal-id] .canvas-node-resizer .canvas-node-connection-point {
pointer-events: all;
}

View File

@ -0,0 +1,55 @@
{
"aestheticStyle": "glass",
"menuCommands": [
{
"id": "cmenu-plugin:editor:toggle-bold",
"name": "cMenu: Toggle bold",
"icon": "bold-glyph"
},
{
"id": "cmenu-plugin:editor:toggle-italics",
"name": "cMenu: Toggle italics",
"icon": "italic-glyph"
},
{
"id": "cmenu-plugin:editor:toggle-strikethrough",
"name": "cMenu: Toggle strikethrough",
"icon": "strikethrough-glyph"
},
{
"id": "cmenu-plugin:underline",
"name": "cMenu: Toggle underline",
"icon": "underline-glyph"
},
{
"id": "cmenu-plugin:superscript",
"name": "cMenu: Toggle superscript",
"icon": "superscript-glyph"
},
{
"id": "cmenu-plugin:subscript",
"name": "cMenu: Toggle subscript",
"icon": "subscript-glyph"
},
{
"id": "cmenu-plugin:editor:toggle-code",
"name": "cMenu: Toggle code",
"icon": "code-glyph"
},
{
"id": "cmenu-plugin:codeblock",
"name": "cMenu: Toggle codeblock",
"icon": "codeblock-glyph"
},
{
"id": "cmenu-plugin:editor:toggle-blockquote",
"name": "cMenu: Toggle blockquote",
"icon": "quote-glyph"
}
],
"appendMethod": "workspace",
"shouldShowMenuOnSelect": false,
"cMenuVisibility": true,
"cMenuBottomValue": 4.25,
"cMenuNumRows": 9
}

19823
.obsidian/plugins/cmenu-plugin/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"id": "cmenu-plugin",
"name": "cMenu",
"version": "1.1.2",
"minAppVersion": "0.9.12",
"description": "cMenu is a plugin that adds a minimal text editor modal for a smoother writing/editing experience ✍🏽.",
"author": "chetachi",
"authorUrl": "https://github.com/chetachiezikeuzor",
"isDesktopOnly": true
}

View File

@ -0,0 +1,234 @@
/*----------------------------------------------------------------
CMENU TOOLBAR
----------------------------------------------------------------*/
#cMenuModalBar {
width: auto;
height: auto;
padding: 3px;
display: grid;
user-select: none;
border-radius: 6px;
position: absolute;
transition: 200ms ease;
min-width: fit-content;
justify-content: space-around;
z-index: var(--layer-status-bar);
box-shadow: 0px 3px 32px rgb(31 38 135 / 15%);
border: 1px solid var(--background-modifier-border);
}
#cMenuModalBar .cMenuCommandItem {
margin: 2px;
border: none;
display: flex;
cursor: pointer;
padding: 5px 6px;
box-shadow: none;
margin-left: 3px;
margin-right: 3px;
position: relative;
border-radius: 3px;
font-size: initial !important;
background-color: var(--background-primary-alt);
}
#cMenuModalBar button.cMenuCommandItem:hover {
background-color: var(--background-secondary);
}
#cMenuModalBar button.cMenuCommandItem svg {
width: 1.3em;
height: 1.3em;
}
/*----------------------------------------------------------------
CMENU SETTINGS BUTTONS
----------------------------------------------------------------*/
.modal.mod-settings
button:not(.mod-cta):not(.mod-warning).cMenuSettingsButton.cMenuSettingsButtonAdd,
button:not(.mod-cta):not(.mod-warning).cMenuSettingsButton.cMenuSettingsButtonAdd {
background-color: var(--interactive-accent);
}
.modal.mod-settings
button:not(.mod-cta):not(.mod-warning).cMenuSettingsButton.cMenuSettingsButtonDelete,
button:not(.mod-cta):not(.mod-warning).cMenuSettingsButton.cMenuSettingsButtonDelete {
background-color: #989cab;
}
.modal.mod-settings
button:not(.mod-cta):not(.mod-warning).cMenuSettingsButton.cMenuSettingsButtonRefresh,
button:not(.mod-cta):not(.mod-warning).cMenuSettingsButton.cMenuSettingsButtonRefresh {
background-color: var(--text-accent);
}
button.cMenuSettingsButton {
padding: 4px 14px;
border-radius: 6px;
}
.cMenuSettingsButton svg {
width: 1.3em;
height: 1.3em;
display: flex;
}
/*----------------------------------------------------------------
CMENU SETTING ITEMS
----------------------------------------------------------------*/
.setting-item.cMenuCommandItem:first-child {
padding-top: 18px;
}
.cMenuCommandItem {
cursor: grab;
padding: 18px 0 18px 0;
}
.sortable-fallback {
cursor: grabbing;
box-shadow: 0px 3px 32px rgb(31 38 135 / 15%);
}
.sortable-grab {
cursor: grabbing !important;
}
.sortable-ghost {
opacity: 0.4;
cursor: grabbing;
}
.sortable-chosen {
cursor: grabbing;
padding: 18px 0 18px 18px;
background-color: var(--background-primary);
}
.sortable-drag {
cursor: grabbing;
box-shadow: 0px 3px 32px rgb(31 38 135 / 15%);
}
.cMenuSettingsTabsContainer {
border-top: 1px solid var(--background-modifier-border);
border-bottom: 1px solid var(--background-modifier-border);
}
/*----------------------------------------------------------------
CMENU CLASS CHANGES
----------------------------------------------------------------*/
.cMenuGlassAesthetic {
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
.cMenuDefaultAesthetic {
background-color: var(--background-primary);
}
/*----------------------------------------------------------------
CMENU ICONS
----------------------------------------------------------------*/
.cMenuIconPick {
line-height: normal;
vertical-align: middle;
margin-right: 8px;
}
.cMenuIconPick svg {
width: 17px;
height: 17px;
}
/*----------------------------------------------------------------
CMENU STATUS BAR MENU
----------------------------------------------------------------*/
.cMenu-statusbar-menu {
width: 200px;
}
.cMenu-statusbar-menu .menu-item-icon {
display: none;
}
.cMenu-statusbar-menu .menu-item {
display: flex;
align-items: center;
justify-content: space-between;
flex-direction: row;
}
.cMenu-statusbar-menu .menu-item.settings-item {
font-size: 12px;
text-align: center;
line-height: 1;
border-radius: 5px;
height: auto;
padding: 8px 5px 0px 5px;
margin: 0 auto;
width: fit-content;
color: var(--text-faint);
}
.cMenu-statusbar-menu .menu-item.settings-item .menu-item-title {
text-align: center;
}
.cMenu-statusbar-menu .menu-item:hover,
.cMenu-statusbar-menu .menu-item .selected:hover,
.cMenu-statusbar-menu .menu-item.selected:not(.is-disabled):not(.is-label) {
background-color: transparent;
}
.cMenu-statusbar-menu .menu-item-title {
margin-right: 10px;
}
.cMenu-statusbar-menu .slider {
width: 100%;
}
.cMenu-statusbar-menu .menu-item.buttonitem {
padding-top: 10px;
padding-bottom: 4px;
height: fit-content;
}
.cMenu-statusbar-menu .menu-item.buttonitem button.cMenuSettingsButton {
margin: 0;
}
/*----------------------------------------------------------------
CMENU STATUS BAR BUTTONS
----------------------------------------------------------------*/
.cMenu-statusbar-button {
cursor: pointer;
display: flex;
align-items: center;
line-height: 1;
}
.cMenu-statusbar-button svg {
display: flex;
width: 1.3em;
height: 1.3em;
}
/*----------------------------------------------------------------
CMENU SUPPORT
----------------------------------------------------------------*/
.cDonationSection {
width: 60%;
height: 50vh;
margin: 0 auto;
text-align: center;
color: var(--text-normal);
}

View File

@ -14,7 +14,7 @@
"googleApiKey": "",
"openRouterAiApiKey": "",
"defaultChainType": "llm_chain",
"defaultModelKey": "gpt-4o|openai",
"defaultModelKey": "claude-3-5-sonnet-latest|anthropic",
"embeddingModelKey": "text-embedding-3-small|openai",
"temperature": 0.1,
"maxTokens": 1000,
@ -221,8 +221,8 @@
"showInContextMenu": true
},
{
"name": "Translate to Chinese",
"prompt": "<instruction>Translate the text below into Chinese:\n 1. Preserve the meaning and tone\n 2. Maintain appropriate cultural context\n 3. Keep formatting and structure\n Return only the translated text.</instruction>\n\n<text>{copilot-selection}</text>",
"name": "Traducir al Ingles",
"prompt": "<instruction>Translate the text below into English:\n 1. Preserve the meaning and tone\n 2. Maintain appropriate cultural context\n 3. Keep formatting and structure\n Return only the translated text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
},
{
@ -238,7 +238,7 @@
{
"name": "Emojify",
"prompt": "<instruction>Add relevant emojis to enhance the text below. Follow these rules:\n 1. Insert emojis at natural breaks in the text\n 2. Never place two emojis next to each other\n 3. Keep all original text unchanged\n 4. Choose emojis that match the context and tone\n Return only the emojified text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
"showInContextMenu": false
},
{
"name": "Make shorter",
@ -253,7 +253,7 @@
{
"name": "Generate table of contents",
"prompt": "<instruction>Generate a hierarchical table of contents for the text below. Use appropriate heading levels (H1, H2, H3, etc.). Include page numbers if present. Return only the table of contents.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": false
"showInContextMenu": true
},
{
"name": "Generate glossary",

View 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 */

View 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
}

View File

@ -0,0 +1 @@
/* no styles */

View File

@ -102,6 +102,313 @@
"version": 2,
"source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.9.2",
"libraryItems": [
{
"id": "qLdU5G5F49LoCvIYKf21c",
"status": "unpublished",
"elements": [
{
"id": "DOV_rQrBwfJeFVUbp851b",
"type": "rectangle",
"x": 657.2116854259567,
"y": -561.3354566111242,
"width": 265.2407106758809,
"height": 330.32186728606655,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"WiWc5IKbwLIWkwC4pDm9L"
],
"frameId": null,
"index": "b08",
"roundness": null,
"seed": 396183245,
"version": 198,
"versionNonce": 981639578,
"isDeleted": false,
"boundElements": [],
"updated": 1744204665979,
"link": null,
"locked": false
},
{
"id": "3EpwEd3aqQk0hdwVmDAOn",
"type": "line",
"x": 657.4018389484526,
"y": -561.3244844993892,
"width": 132.93788108469778,
"height": 17.99742586458163,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"WiWc5IKbwLIWkwC4pDm9L"
],
"frameId": null,
"index": "b09",
"roundness": null,
"seed": 1932841434,
"version": 114,
"versionNonce": 497376518,
"isDeleted": false,
"boundElements": null,
"updated": 1744204665979,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
132.93788108469778,
-17.99742586458163
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "40IjAa2FHenrytVS5WGnw",
"type": "line",
"x": 922.1888238759999,
"y": -561.5496610049935,
"width": 131.80680723148777,
"height": 17.75255163320298,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"WiWc5IKbwLIWkwC4pDm9L"
],
"frameId": null,
"index": "b0A",
"roundness": null,
"seed": 592843034,
"version": 128,
"versionNonce": 2142199386,
"isDeleted": false,
"boundElements": null,
"updated": 1744204665979,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
-131.80680723148777,
-17.75255163320298
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "6TGdGoDUjqJ6tbtiMHFf_",
"type": "line",
"x": 789.9521125883024,
"y": -215.60770584600448,
"width": 133.327054809344,
"height": 15.423625531079834,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"WiWc5IKbwLIWkwC4pDm9L"
],
"frameId": null,
"index": "b0B",
"roundness": null,
"seed": 2121082310,
"version": 121,
"versionNonce": 473943110,
"isDeleted": false,
"boundElements": null,
"updated": 1744204665979,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
-133.327054809344,
-15.423625531079834
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "km0ECG9VkEZiuf02zirKy",
"type": "line",
"x": 922.6023390794901,
"y": -230.8360911799865,
"width": 132.44956606166298,
"height": 15.272104179986563,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"WiWc5IKbwLIWkwC4pDm9L"
],
"frameId": null,
"index": "b0C",
"roundness": null,
"seed": 717082714,
"version": 130,
"versionNonce": 564560666,
"isDeleted": false,
"boundElements": null,
"updated": 1744204665979,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
-132.44956606166298,
15.272104179986563
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "MHJ11pT6X560cvQ90zpmd",
"type": "line",
"x": 789.998867,
"y": -579.9222670158669,
"width": 3.194759301550221e-8,
"height": 1.8444951427460807e-8,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"WiWc5IKbwLIWkwC4pDm9L"
],
"frameId": null,
"index": "b0D",
"roundness": null,
"seed": 649919898,
"version": 30,
"versionNonce": 340415366,
"isDeleted": false,
"boundElements": null,
"updated": 1744204665979,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
0,
18.660508526112608
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "6mIhXwI97w41tBTdm-7p3",
"type": "line",
"x": 790.0817788707072,
"y": -215.5492938412429,
"width": 2.1686625473194e-7,
"height": 5.810913782098546e-8,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"WiWc5IKbwLIWkwC4pDm9L"
],
"frameId": null,
"index": "b0E",
"roundness": null,
"seed": 1396803994,
"version": 22,
"versionNonce": 1792741338,
"isDeleted": false,
"boundElements": null,
"updated": 1744204665979,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
0,
-15.789231879221944
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
}
],
"created": 1744204672767
},
{
"id": "AqXQC3pXrxv328BPDxGGl",
"status": "published",

View File

@ -2,7 +2,7 @@
"lightStyle": "minimal-light",
"darkStyle": "minimal-dark",
"lightScheme": "minimal-default-light",
"darkScheme": "minimal-things-dark",
"darkScheme": "minimal-dracula-dark",
"editorFont": "",
"lineHeight": 1.5,
"lineWidth": 40,
@ -18,7 +18,7 @@
"chartWidth": "chart-default-width",
"colorfulHeadings": false,
"colorfulFrame": false,
"colorfulActiveStates": true,
"colorfulActiveStates": false,
"trimNames": false,
"labeledNav": false,
"fullWidthMedia": false,

View File

@ -11,7 +11,7 @@
"kind": "folder",
"config": {
"path": "04-SIDEL",
"recursive": true
"recursive": false
}
},
"newNotesFolder": "",
@ -20,7 +20,7 @@
"config": {
"fieldConfig": {
"path": {
"width": 327
"width": 315
}
}
},
@ -34,7 +34,7 @@
"sort": {
"criteria": []
},
"id": "7ad4208a-e37e-4c07-a22b-dbe8d0d1a9be",
"id": "f1d33699-cb97-4a13-af28-6130d27a0e6b",
"name": "Table",
"type": "table"
},
@ -50,14 +50,12 @@
"sort": {
"criteria": []
},
"id": "39dde3ca-913a-477d-a055-316385d6ba62",
"id": "1306baf9-4db3-47ae-b3fe-01e9b1b3678a",
"name": "Board",
"type": "board"
},
{
"config": {
"interval": "month"
},
"config": {},
"filter": {
"conjunction": "and",
"conditions": []
@ -68,7 +66,7 @@
"sort": {
"criteria": []
},
"id": "dbd5c65f-ab8a-4155-b175-c2b4b4731183",
"id": "c3cbabc5-ba40-4833-b844-92a21f568063",
"name": "Calendar",
"type": "calendar"
},
@ -84,12 +82,12 @@
"sort": {
"criteria": []
},
"id": "a9f5fc98-1213-4d13-9d95-1a054f405c7b",
"id": "e89b3e38-4b6f-4e0e-9bd5-e6ae38a0ffc9",
"name": "Gallery",
"type": "gallery"
}
],
"id": "1eb3d7fb-21dc-4f10-995e-1fe76b949d0e",
"id": "45b9266a-4f16-4d27-a585-50245cbc07fb",
"name": "SIDEL"
}
],

View File

@ -1,24 +1,204 @@
{
"recentFiles": [
{
"basename": "9.4006 - Feedback flow - Notes for technician on site TL22 - Q3-Q1",
"path": "03-VM/HENKEL/93040 - HENKEL - BowlingGreen/TL22-L25/24 - 9.4006 - Feedback flow - TL22-L25 Q3/9.4006 - Feedback flow - Notes for technician on site TL22 - Q3-Q1.md"
"basename": "Como usar PublicApiGenerator - Nuget - Documentator",
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Como usar PublicApiGenerator - Nuget - Documentator.md"
},
{
"basename": "E5.007161 - Modifica O&U - SAE346 - Notes",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/E5.007161 - Modifica O&U - SAE346 - Notes.md"
"basename": "Endress+Hauser WEB Access",
"path": "01-Documentation/Endress+Houser/Endress+Hauser WEB Access.md"
},
{
"basename": "E5.007161 - Modifica O&U - SAE346 - Modified on PLC",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/E5.007161 - Modifica O&U - SAE346 - Modified on PLC.md"
"basename": "Optional - Concentration measurement",
"path": "01-Documentation/Endress+Houser/Optional - Concentration measurement.md"
},
{
"basename": "Drawing 2025-04-02 11.05.14.excalidraw",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/Drawing 2025-04-02 11.05.14.excalidraw.md"
"basename": "Download Software",
"path": "01-Documentation/WEB/Download Software.md"
},
{
"basename": "Drawing 2025-03-26 13.28.27.excalidraw",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/Drawing 2025-03-26 13.28.27.excalidraw.md"
"basename": "RNF032 - Difference between Hardware on S7 and the Electrical scheme",
"path": "04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/RNF032 - Difference between Hardware on S7 and the Electrical scheme.md"
},
{
"basename": "Endress+Hauser Concentration Optional",
"path": "01-Documentation/Endress+Houser/Endress+Hauser Concentration Optional.md"
},
{
"basename": "Notes for Windows - Chris Titus Tool - Online - Offline",
"path": "01-Documentation/Windows/Notes for Windows - Chris Titus Tool - Online - Offline.md"
},
{
"basename": "E5.007299 - RNF032 - FDM",
"path": "04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/E5.007299 - RNF032 - FDM.md"
},
{
"basename": "FDM RNF032 E5.007299",
"path": "04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/FDM RNF032 E5.007299.md"
},
{
"basename": "5.007382-EXMU01UF - RVU008 - EQPT24731 - Notes",
"path": "04-SIDEL/03 - 5.007382-EXMU01UF - RVU008 - EQPT24731/5.007382-EXMU01UF - RVU008 - EQPT24731 - Notes.md"
},
{
"basename": "E5.007363 - Modifica O&U - SAE196 - Notes",
"path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/E5.007363 - Modifica O&U - SAE196 - Notes.md"
},
{
"basename": "IM Siemens - Profibus - Comissioning",
"path": "01-Documentation/Siemens/IM Siemens - Profibus - Comissioning.md"
},
{
"basename": "SIDEL - Passwords",
"path": "01-Documentation/SIDEL/SIDEL - Passwords.md"
},
{
"basename": "Mixer - Notes",
"path": "01-Documentation/SIDEL/Master Mixer/Mixer - Notes.md"
},
{
"basename": "5.007382-EXMU01UF - RVU008 - EQPT24731 - Initial Data",
"path": "04-SIDEL/03 - 5.007382-EXMU01UF - RVU008 - EQPT24731/5.007382-EXMU01UF - RVU008 - EQPT24731 - Initial Data.md"
},
{
"basename": "SAE346 - Software adaptation from Master - Notes",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Software adaptation from Master - Notes.md"
},
{
"basename": "SAE346 - Signals - CIP - Filler - Syrop",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Signals - CIP - Filler - Syrop.md"
},
{
"basename": "S7 Software Calls",
"path": "04-SIDEL/00 - MASTER/MIXER/S7 Software Calls.md"
},
{
"basename": "SAE346 - Process diagram",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Process diagram.md"
},
{
"basename": "SAE346 - HMI - Machine Configuration",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - HMI - Machine Configuration.md"
},
{
"basename": "SAE346 - IO from Electrical Diagram",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - IO from Electrical Diagram.md"
},
{
"basename": "SAE346 - Master adaptation to compile",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Master adaptation to compile.md"
},
{
"basename": "SAE346 P&ID",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 P&ID.md"
},
{
"basename": "SIDEL - Mixer - Equivalences",
"path": "04-SIDEL/00 - MASTER/MIXER/SIDEL - Mixer - Equivalences.md"
},
{
"basename": "Fieldbus Communication - Profibus",
"path": "01-Documentation/Anton Paar/Fieldbus Communication - Profibus.md"
},
{
"basename": "SIDEL - Software Versions",
"path": "01-Documentation/SIDEL/SIDEL - Software Versions.md"
},
{
"basename": "Anton Paar - Cobrix 5500",
"path": "01-Documentation/Anton Paar/Cobrix 5500/Anton Paar - Cobrix 5500.md"
},
{
"basename": "Serial - Lecense",
"path": "01-Documentation/B&R/Serial - Lecense.md"
},
{
"basename": "B&R Software",
"path": "01-Documentation/B&R/B&R Software.md"
},
{
"basename": "Versions of MASTERs",
"path": "04-SIDEL/00 - MASTER/Versions of MASTERs.md"
},
{
"basename": "SIDEL - Master - IPs",
"path": "04-SIDEL/00 - MASTER/SIDEL - Master - IPs.md"
},
{
"basename": "Danfoss PPO",
"path": "01-Documentation/Inverters/Danfoss/Danfoss PPO.md"
},
{
"basename": "SIDEL - FLD",
"path": "01-Documentation/SIDEL/SIDEL - FLD.md"
},
{
"basename": "Master Filler - Notes",
"path": "01-Documentation/SIDEL/Master Filler/Master Filler - Notes.md"
},
{
"basename": "Calculo de Offsets de DBs",
"path": "01-Documentation/Siemens/Scripts/Calculo de Offsets de DBs.md"
},
{
"basename": "Script Python DB to Excel",
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Script Python DB to Excel.md"
},
{
"basename": "Untitled",
"path": "01-Documentation/Siemens/Scripts/Untitled.md"
},
{
"basename": "Group Scripts Manager",
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Group Scripts Manager.md"
},
{
"basename": "Parameters for communication",
"path": "01-Documentation/Inverters/Danfoss/Parameters for communication.md"
},
{
"basename": "Pasted Image 20250310155912_626",
"path": "04-SIDEL/01 - SAE463 - E5.006894-EXMU01UM - New Anton Paar/adjuntos/Pasted Image 20250310155912_626.png"
},
{
"basename": "Pasted Image 20250310155818_479",
"path": "04-SIDEL/01 - SAE463 - E5.006894-EXMU01UM - New Anton Paar/adjuntos/Pasted Image 20250310155818_479.png"
},
{
"basename": "Pasted image 20250311115714",
"path": "04-SIDEL/01 - SAE463 - E5.006894-EXMU01UM - New Anton Paar/adjuntos/Pasted image 20250311115714.png"
},
{
"basename": "Pasted image 20250310160926",
"path": "04-SIDEL/01 - SAE463 - E5.006894-EXMU01UM - New Anton Paar/adjuntos/Pasted image 20250310160926.png"
},
{
"basename": "Pasted image 20250310160812",
"path": "04-SIDEL/01 - SAE463 - E5.006894-EXMU01UM - New Anton Paar/adjuntos/Pasted image 20250310160812.png"
},
{
"basename": "Pasted image 20250310160616",
"path": "04-SIDEL/01 - SAE463 - E5.006894-EXMU01UM - New Anton Paar/adjuntos/Pasted image 20250310160616.png"
},
{
"basename": "Pasted image 20250310160355",
"path": "04-SIDEL/01 - SAE463 - E5.006894-EXMU01UM - New Anton Paar/adjuntos/Pasted image 20250310160355.png"
},
{
"basename": "Pasted image 20250407095858",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/adjuntos/Pasted image 20250407095858.png"
},
{
"basename": "Comm - Mixer - Filler",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/COMM - FILLER - MIXER/Comm - Mixer - Filler.md"
},
{
"basename": "E5.007299 - Modifica O&U - RNF032 - NOTES",
"path": "04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/E5.007299 - Modifica O&U - RNF032 - NOTES.md"
},
{
"basename": "Problems to Migration to TIA",
"path": "04-SIDEL/00 - MASTER/adjuntos/Problems to Migration to TIA.md"
}
],
"omittedPaths": [],

2762
.obsidian/plugins/whisper/main.js vendored Normal file

File diff suppressed because it is too large Load Diff

11
.obsidian/plugins/whisper/manifest.json vendored Normal file
View File

@ -0,0 +1,11 @@
{
"id": "whisper",
"name": "Whisper",
"version": "1.5.5",
"minAppVersion": "0.15.0",
"description": "Speech-to-text in Obsidian using OpenAI Whisper",
"author": "Nik Danilov",
"authorUrl": "https://nikdanilov.com",
"fundingUrl": "patreon.com/nikdanilov",
"isDesktopOnly": false
}

32
.obsidian/plugins/whisper/styles.css vendored Normal file
View File

@ -0,0 +1,32 @@
.recording-controls .modal-content {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 16px;
}
.recording-controls .button-group {
display: flex;
justify-content: center;
gap: 10px;
}
.recording-controls .button-component {
padding: 5px 10px;
}
.recording-controls .button-component {
background-color: var(--text-accent);
color: var(--text-light);
cursor: pointer;
}
.recording-controls .button-component:hover {
background-color: var(--text-accent-hover);
}
.recording-controls .button-component:disabled {
pointer-events: none;
background-color: var(--text-accent-muted);
color: var(--text-muted);
cursor: not-allowed;
}

11
.obsidian/snippets/nav-wrap.css vendored Normal file
View File

@ -0,0 +1,11 @@
.nav-file-title-content, .nav-folder-title-content {
white-space: normal; /* This produces the text wrapping */
}
.nav-file-title {
color: #DDDCEF; /* Color for files */
}
.nav-folder-title {
color: #f83a598; /* Color for folders */
}

7
.obsidian/themes/Apex/manifest.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"name": "Apex",
"version": "1.1.0",
"minAppVersion": "1.5.0",
"author": "clearlysid",
"authorUrl": "https://www.twitter.com/clearlysid"
}

244
.obsidian/themes/Apex/theme.css vendored Normal file

File diff suppressed because one or more lines are too long

6
.obsidian/themes/Atom/manifest.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"name": "Atom",
"version": "0.0.0",
"minAppVersion": "0.16.0",
"author": "kognise"
}

339
.obsidian/themes/Atom/theme.css vendored Normal file
View File

@ -0,0 +1,339 @@
/* Base colors - TODO: are grey 1 and grey 2 used? */
.theme-dark {
--accent-h: 219;
--accent-s: 56%;
--accent-l: 55%;
--background-primary: #272b34;
--background-primary-alt: #20242b;
--background-secondary: #20242b;
--background-secondary-alt: #1a1e24;
--background-accent: #000;
--background-modifier-border: #424958;
--background-modifier-form-field: rgba(0, 0, 0, 0.3);
--background-modifier-form-field-highlighted: rgba(0, 0, 0, 0.22);
--background-modifier-box-shadow: rgba(0, 0, 0, 0.3);
--background-modifier-success: #539126;
--background-modifier-error: #3d0000;
--background-modifier-error-rgb: 61, 0, 0;
--background-modifier-error-hover: #470000;
--background-modifier-cover: rgba(0, 0, 0, 0.6);
--text-accent: #61afef;
--text-accent-hover: #70bdfc;
--text-normal: #dcddde;
--text-muted: #888;
--text-faint: rgb(81, 86, 99);
--text-error: #e16d76;
--text-error-hover: #c9626a;
--text-highlight-bg: rgba(255, 255, 0, 0.4);
--text-selection: rgba(0, 122, 255, 0.2);
--text-on-accent: #dcddde;
--interactive-normal: #20242b;
--interactive-hover: #353b47;
--interactive-accent-hover: hsl(var(--accent-h), calc(var(--accent-s) + 5%), calc(var(--accent-l) - 10%));
--scrollbar-active-thumb-bg: rgba(255, 255, 255, 0.2);
--scrollbar-bg: rgba(255, 255, 255, 0.05);
--scrollbar-thumb-bg: rgba(255, 255, 255, 0.1);
--panel-border-color: #18191e;
--gray-1: #5C6370;
--gray-2: #abb2bf;
--red: #e06c75;
--orange: #d19a66;
--green: #98c379;
--aqua: #56b6c2;
--purple: #c678dd;
--blue: #61afef;
--yellow: #e5c07b;
--background-modifier-hover: hsla(var(--accent-h), calc(var(--accent-s) - 35%), var(--accent-l), 0.06);
--divider-color-hover: #404754;
}
.theme-light {
--accent-h: 230;
--accent-s: 83%;
--accent-l: 64%;
--background-primary: #fafafa;
--background-primary-alt: #eaeaeb;
--background-secondary: #eaeaeb;
--background-secondary-alt: #dbdbdc;
--background-accent: #fff;
--background-modifier-border: #dbdbdc;
--background-modifier-form-field: #fff;
--background-modifier-form-field-highlighted: #fff;
--background-modifier-box-shadow: rgba(0, 0, 0, 0.1);
--background-modifier-success: #A4E7C3;
--background-modifier-error: #e68787;
--background-modifier-error-rgb: 230, 135, 135;
--background-modifier-error-hover: #FF9494;
--background-modifier-cover: rgba(0, 0, 0, 0.8);
--text-accent: #1592ff;
--text-accent-hover: #097add;
--text-normal: #383a42;
--text-muted: #8e8e90;
--text-faint: #999999;
--text-error: #e75545;
--text-error-hover: #f86959;
--text-highlight-bg: rgba(255, 255, 0, 0.4);
--text-selection: rgba(0, 122, 255, 0.15);
--text-on-accent: #f2f2f2;
--interactive-normal: #eaeaeb;
--interactive-hover: #dbdbdc;
--interactive-accent-rgb: 21, 146, 255;
--interactive-accent-hover: hsl(var(--accent-h), calc(var(--accent-s) - 10%), calc(var(--accent-l) - 4%));
--scrollbar-active-thumb-bg: rgba(0, 0, 0, 0.2);
--scrollbar-bg: rgba(0, 0, 0, 0.05);
--scrollbar-thumb-bg: rgba(0, 0, 0, 0.1);
--panel-border-color: #dbdbdc;
--gray-1: #383a42;
--gray-2: #383a42;
--red: #e75545;
--green: #4ea24c;
--blue: #3d74f6;
--purple: #a625a4;
--aqua: #0084bc;
--yellow: #e35649;
--orange: #986800;
}
.theme-dark, .theme-light {
--ribbon-background: var(--background-primary);
--drag-ghost-background: var(--background-secondary-alt);
--background-modifier-message: var(--background-secondary-alt);
--tab-outline-color: transparent;
--divider-color: transparent;
--prompt-border-color: var(--panel-border-color);
--modal-border-color: var(--panel-border-color);
--background-modifier-border-hover: var(--interactive-hover);
--background-modifier-border-focus: var(--interactive-hover);
--checkbox-color: var(--text-accent);
--checkbox-color-hover: var(--text-accent-hover);
--nav-item-background-active: var(--interactive-accent);
--nav-item-color-active: #ffffff;
--tag-color: var(--yellow);
--tag-background: var(--background-primary-alt);
--tag-color-hover: var(--yellow);
--tag-background-hover: var(--background-primary-alt);
--tag-padding-x: 4px;
--tag-padding-y: 2px;
--tag-radius: 4px;
--inline-title-weight: var(--bold-weight);
--link-decoration: none;
--link-external-decoration: none;
--embed-padding: 0 0 0 var(--size-4-4);
}
/* Search */
.search-result .search-result-file-title {
cursor: pointer;
}
.search-result .collapse-icon {
cursor: var(--cursor);
}
.search-result:not(.is-collapsed) .search-result-file-title {
color: var(--blue);
}
/* File tab separators */
.workspace .mod-root .workspace-tab-header-inner::after {
right: unset;
left: -0.5px;
}
.workspace .mod-root .workspace-tab-header:last-child .workspace-tab-header-inner::before {
position: absolute;
right: -0.5px;
width: 1px;
background-color: var(--tab-divider-color);
content: '';
height: 20px;
}
.workspace .mod-root .workspace-tab-header.is-active .workspace-tab-header-inner::after,
.workspace .mod-root .workspace-tab-header.is-active .workspace-tab-header-inner::before,
.workspace .mod-root .workspace-tab-header:first-child .workspace-tab-header-inner::after,
.workspace .mod-root .workspace-tab-header.is-active + .workspace-tab-header .workspace-tab-header-inner::after {
opacity: 0;
}
/* Editor and output */
.markdown-rendered blockquote {
padding: var(--embed-padding);
}
mjx-container {
text-align: left !important;
}
.math-block {
font-size: 1.3em;
}
.theme-light :not(pre)>code,
.theme-light pre {
background: var(--background-primary);
box-shadow: inset 0 0 0 1px var(--background-primary-alt);
border-radius: 4px;
}
.markdown-preview-section > div h1,
.markdown-preview-section > div h2,
.markdown-preview-section > div h3,
.markdown-preview-section > div h4,
.markdown-preview-section > div h5,
.markdown-preview-section > div h6 {
margin-top: 40px;
}
.mod-header + div h1,
.mod-header + div h2,
.mod-header + div h3,
.mod-header + div h4,
.mod-header + div h5,
.mod-header + div h6 {
margin-top: 30px;
}
.cm-sizer > .inline-title {
margin-bottom: 20px;
}
/* Miscellaneous */
.theme-dark .dropdown:hover {
background-color: var(--background-modifier-form-field);
}
.tooltip {
color: var(--text-muted);
}
.nav-file, .nav-folder {
padding: 1px 2px;
}
body:not(.is-grabbing) .nav-file-title.is-being-dragged,
body:not(.is-grabbing) .nav-folder-title.is-being-dragged,
.nav-file-title.is-being-dragged,
.nav-folder-title.is-being-dragged {
background-color: var(--background-primary-alt);
color: var(--nav-item-color);
}
.view-header-title {
text-decoration: underline;
text-decoration-color: var(--text-muted);
text-underline-offset: 1.5px;
}
.status-bar {
border-color: var(--panel-border-color);
border-width: 1px;
padding: 4px 8px;
}
.theme-dark button.mod-warning {
--background-modifier-error: #d42020;
--background-modifier-error-hover: #b01515;
}
.theme-light button.mod-warning {
--background-modifier-error: #f23f3f;
--background-modifier-error-hover: #d72020;
}
/* Code syntax highlighting */
code[class*='language-'], pre[class*='language-'] {
text-align: left !important;
white-space: pre !important;
word-spacing: normal !important;
word-break: normal !important;
word-wrap: normal !important;
line-height: 1.5 !important;
tab-size: 4 !important;
hyphens: none !important;
}
pre[class*='language-'] {
/* Code blocks */
padding: 1em !important;
margin: .5em 0 !important;
overflow: auto !important;
}
:not(pre)>code[class*='language-'] {
/* Inline code */
padding: .1em !important;
border-radius: .3em !important;
white-space: normal !important;
}
.token.comment, .token.prolog, .token.doctype, .token.cdata,
.HyperMD-codeblock .cm-comment {
color: var(--gray-1) !important;
}
.token.punctuation,
.HyperMD-codeblock .cm-hmd-codeblock, .HyperMD-codeblock .cm-bracket {
color: var(--gray-2) !important;
}
.token.selector, .token.tag,
.HyperMD-codeblock .cm-tag, .HyperMD-codeblock .cm-property, .HyperMD-codeblock .cm-meta, .HyperMD-codeblock .cm-qualifier, .HyperMD-codeblock .cm-header, .HyperMD-codeblock .cm-quote, .HyperMD-codeblock .cm-hr, .HyperMD-codeblock .cm-link {
color: var(--red) !important;
}
.token.property, .token.boolean, .token.number, .token.constant, .token.symbol, .token.attr-name, .token.deleted,
.HyperMD-codeblock .cm-number, .HyperMD-codeblock .cm-atom, .HyperMD-codeblock .cm-attribute {
color: var(--orange) !important;
}
.token.string, .token.char, .token.attr-value, .token.builtin, .token.inserted,
.HyperMD-codeblock .cm-string, .HyperMD-codeblock .cm-builtin {
color: var(--green) !important;
}
.token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string,
.HyperMD-codeblock .cm-string-2, .HyperMD-codeblock .cm-operator {
color: var(--aqua) !important;
}
.token.atrule, .token.keyword,
.HyperMD-codeblock .cm-keyword {
color: var(--purple) !important;
}
.token.function, .token.macro.property,
.HyperMD-codeblock .cm-def, .HyperMD-codeblock .cm-variable {
color: var(--blue) !important;
}
.token.class-name,
.HyperMD-codeblock .cm-variable-2, .HyperMD-codeblock .cm-variable-3 {
color: var(--yellow) !important;
}
.token.regex, .token.important, .token.variable {
color: var(--purple) !important;
}
.token.important, .token.bold {
font-weight: bold !important;
}
.token.italic {
font-style: italic !important;
}
.token.entity {
cursor: help !important;
}

View File

@ -0,0 +1,7 @@
{
"name": "Blue Topaz",
"version": "2024121301",
"minAppVersion": "1.0.0",
"author": "WhyI & Pkmer",
"authorUrl": "https://github.com/whyt-byte"
}

29700
.obsidian/themes/Blue Topaz/theme.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,6 @@
{
"name": "Everforest",
"version": "0.0.0",
"minAppVersion": "0.16.0",
"author": "MrGlitchByte"
}

675
.obsidian/themes/Everforest/theme.css vendored Normal file
View File

@ -0,0 +1,675 @@
/***** TABLE OF CONTENTS *****/
/* TODO: Reformat entire CSS file as below.
/* 1. Font
/* 2. Colours
/* 2.1. Dark theme color variables
/* 2.2. Light theme color variables
/* 2.3. Dark theme implementation
/* 2.4. Light theme implementation
/* 3. General UI
/* 3.1. Title Bar
/* 4. Markdown (editor / preview)
/* 4.1. Headings
/* 4.1.1. Fix font weights
/* 4.2. Links
/* 4.2.1. Nifty arrow before internal links (also applies to embeds)
/* 4.3. Embeds
/* 4.4. Tables
/* 4.5. Popovers
/* 4.6. Task Lists
/* 4.7. Blockquotes
/* 4.8. Code
/* 4.9. Bulleted lists
/* 4.10. Misc Fixes
/* 5. Graph view colours
/* 6. Notion Colour Blocks
/* 7. In-document header (scrolls with the document) [remove for compatibility with Andy's mode]
/* 7.1. Adjustments for non-in-document headers (graphs, etc)\
/* 7.2. Active pane border
/* 7.3. Misc fixes
/* 8. Tags
/* 8.1. Tag custom colours
/***** *****/
/* 1. Font */
body {
/* font stacks taken directly from Notion */
--font-monospace: "Hack Nerd Font", "Source Code Pro", monospace;
-webkit-font-smoothing: auto;
--h1-color: var(--text-title-h1);
--h2-color: var(--text-title-h2);
--h3-color: var(--text-title-h3);
--h4-color: var(--text-title-h4);
--h5-color: var(--text-title-h5);
--h6-color: var(--text-title-h6);
}
/* 2. Colours */
:root
{
/* 2.1 Dark theme color variables */
--bg0-dark: #22282c;
--bg1-dark: #272f34;
--bg-dark: #2f383e;
--bg2-dark: #374247;
--bg3-dark: #404c51;
--bg4-dark: #4a555b;
--bg5-dark: #525c62;
--bg_visual: #503946;
--bg_red: #4e3e43;
--bg_green: #404d44;
--bg_blue: #394f5a;
--bg_yellow: #4a4940;
--shadow: #00000070;
--fg-dark: #d3c6aa;
--grey0-dark: #7f897d;
--grey1-dark: #859289;
--grey2-dark: #9aa79d;
--faded-red: #e67e80;
--faded-orange: #e69875;
--faded-yellow: #dbbc7f;
--faded-green: #a7c080;
--faded-aqua: #83c092;
--faded-blue: #7fbbb3;
--faded-purple: #d699b6;
--dim-red: #da6362;
--dim-orange: #d77f48;
--dim-yellow: #bf983d;
--dim-green: #899c40;
--dim-aqua: #569d79;
--dim-blue: #5a93a2;
--dim-purple: #b87b9d;
/* 2.2 Light theme color variables */
--bg0-light: #f0edd8;
--bg1-light: #f6f1dd;
--bg-light: #fdf6e3;
--bg2-light: #f3efda;
--bg3-light: #edead5;
--bg4-light: #e4e1cd;
--bg5-light: #dfdbc8;
--grey0-light: #a4ad9e;
--grey1-light: #939f91;
--grey2-light: #879686;
--shadow-light: #3c474d20;
--bg_visual_light: #eaedc8;
--bg_red_light: #fbe3da;
--bg_green_light: #f0f1d2;
--bg_blue_light: #e9f0e9;
--bg_yellow_light: #faedcd;
--fg-light: #5c6a72;
--light-red: #f85552;
--light-orange: #f57d26;
--light-yellow: #bf983d;
--light-green: #899c40;
--light-aqua: #569d79;
--light-blue: #5a93a2;
--light-purple: #b87b9d;
--light-dim-red: #f1706f;
--light-dim-orange: #f39459;
--light-dim-yellow: #e4b649;
--light-dim-green: #a4bb4a;
--light-dim-aqua: #6ec398;
--light-dim-blue: #6cb3c6;
--light-dim-purple: #e092be;
}
/* 2.3 Dark theme implementation */
.theme-dark
{
--background-primary: var(--bg-dark);
--background-primary-alt: var(--bg-dark);
--background-secondary: var(--bg-dark);
--background-secondary-alt: var(--bg-dark);
--text-normal: var(--fg-dark);
--text-faint: var(--grey1-dark);
--text-title-h1: var(--dim-red);
--text-title-h2: var(--dim-orange);
--text-title-h3: var(--dim-yellow);
--text-title-h4: var(--dim-green);
--text-title-h5: var(--dim-aqua);
--text-title-h6: var(--dim-purple);
--text-link: var(--faded-blue);
--text-a: var(--dim-aqua);
--text-a-hover: var(--faded-aqua);
--text-mark: rgba(215, 153, 33, 0.4); /* light-yellow */
--pre-code: var(--bg1-dark);
--text-highlight-bg: var(--bg_green);
--interactive-accent: var(--dim-aqua);
--interactive-before: var(--bg5-dark);
--background-modifier-border: var(--bg5-dark);
--text-accent: var(--dim-blue);
--interactive-accent-rgb: var(--dim-blue);
--inline-code: var(--dim-blue);
--code-block: var(--fg-dark);
--vim-cursor: var(--faded-blue);
--text-selection: var(--bg5-dark);
}
/* 2.4 Light theme implementation */
.theme-light
{
--background-primary: var(--bg-light);
--background-primary-alt: var(--bg-light);
--background-secondary: var(--bg-light);
--background-secondary-alt: var(--bg-light);
--text-normal: var(--fg-light);
--text-faint: var(--grey1-light);
--text-title-h1: var(--light-red);
--text-title-h2: var(--light-orange);
--text-title-h3: var(--light-yellow);
--text-title-h4: var(--light-green);
--text-title-h5: var(--light-aqua);
--text-title-h6: var(--light-purple);
--text-link: var(--light-blue);
--text-a: var(--light-dim-blue);
--text-a-hover: var(--light-blue);
--text-mark: rgba(215, 153, 33, 0.4); /* light-yellow */
--pre-code: var(--bg1-light);
--text-highlight-bg: var(--light-dim-green);
--interactive-accent: var(--bg5-light);
--interactive-before: var(--bg5-light);
--background-modifier-border: var(--bg5-light);
--text-accent: var(--light-dim-green);
--interactive-accent-rgb: var(--light-dim-green);
--inline-code: var(--light-blue);
--code-block: var(--fg-light);
--vim-cursor: var(--light-blue);
--text-selection: rgba(189, 174, 147, 0.5); /* light3 */
}
.theme-dark code[class*="language-"],
.theme-dark pre[class*="language-"],
.theme-light code[class*="language-"],
.theme-light pre[class*="language-"]
{
text-shadow: none ;
background-color: var(--pre-code) ;
}
/* 3. General UI */
.view-header-title {
font-weight: 700;
}
/* 3.1. Title bar */
.titlebar {
background-color: var(--background-secondary-alt);
}
.titlebar-inner {
color: var(--text-normal);
}
.graph-view.color-circle,
.graph-view.color-fill-highlight,
.graph-view.color-line-highlight
{
color: var(--interactive-accent-rgb) ;
}
.graph-view.color-text
{
color: var(--text-a-hover) ;
}
/*
.graph-view.color-fill
{
color: var(--background-secondary);
}
.graph-view.color-line
{
color: var(--background-modifier-border);
}
*/
html,
body
{
font-size: 16px ;
}
strong
{
font-weight: 600 ;
}
a,
.cm-hmd-internal-link
{
color: var(--text-a) ;
text-decoration: none ;
}
a:hover,
.cm-hmd-internal-link:hover,
.cm-url
{
color: var(--text-a-hover) ;
text-decoration: none ;
}
/*----------------------------------------------------------------
TAGS
----------------------------------------------------------------*/
.token.tag {
padding: 0px 0px;
background-color: transparent;
border: none;
}
.token.tag:hover {
background: transparent;
color: var(--text-a-hover) !important;
}
/*----------------------------------------------------------------
TAG PILLS
----------------------------------------------------------------*/
.markdown-preview-section h1 a.tag,
.markdown-preview-section h2 a.tag,
.markdown-preview-section h3 a.tag,
.markdown-preview-section h4 a.tag,
.markdown-preview-section h5 a.tag,
.markdown-preview-section h4 a.tag {
font-weight: inherit;
}
.tag {
background-color: var(--tag-base);
border: 1px solid var(--interactive-accent);
color: var(--text-a);
font-weight: 500;
padding: 1.5px 6px;
padding-left: 6px;
padding-right: 6px;
text-align: center;
text-decoration: none !important;
display: inline-block;
cursor: pointer;
border-radius: 8px;
transition: 0.2s ease-in-out;
}
.tag:hover {
color: var(--interactive-accent);
}
/*----------------------------------------------------------------
TAG REF STYLING
----------------------------------------------------------------*/
.tag[href^="#❗️"],
.tag[href^="#important❗"] {
background-color: var(--tag-base);
border: 1px solid var(--boldred);
}
.tag[href^="#📓"],
.tag[href^="#journal📓"] {
background-color: var(--tag-base);
border: 1px solid var(--purple);
}
.tag[href^="#🌱"],
.tag[href^="#seedling🌱"],
.tag[href^="#🌿"],
.tag[href^="#budding🌿"],
.tag[href^="#🌳"],
.tag[href^="#evergreen🌳"] {
background-color: var(--tag-base);
border: 1px solid var(--boldgreen);
}
mark
{
background-color: var(--text-mark) ;
}
.view-actions a
{
color: var(--text-normal) ;
}
.view-actions a:hover
{
color: var(--text-a) ;
}
.HyperMD-codeblock-bg
{
background-color: var(--pre-code) ;
}
.HyperMD-codeblock
{
line-height: 1.4em ;
color: var(--code-block) ;
}
.HyperMD-codeblock-begin
{
border-top-left-radius: 4px ;
border-top-right-radius: 4px ;
}
.HyperMD-codeblock-end
{
border-bottom-left-radius: 4px ;
border-bottom-right-radius: 4px ;
}
th
{
font-weight: 600 ;
}
thead
{
border-bottom: 2px solid var(--background-modifier-border) ;
}
.HyperMD-table-row
{
line-height: normal ;
padding-left: 4px ;
padding-right: 4px ;
/* background-color: var(--pre-code) ; */
}
.HyperMD-table-row-0
{
padding-top: 4px ;
}
.CodeMirror-foldgutter-folded,
.is-collapsed .nav-folder-collapse-indicator
{
color: var(--text-a) ;
}
.nav-file-tag
{
color: var(--text-a) ;
}
.is-active .nav-file-title
{
color: var(--text-a) ;
background-color: var(--background-primary-alt) ;
}
.nav-file-title
{
border-bottom-left-radius: 0 ;
border-bottom-right-radius: 0 ;
border-top-left-radius: 0 ;
border-top-right-radius: 0 ;
}
img
{
display: block ;
margin-left: auto ;
margin-right: auto ;
}
.HyperMD-list-line
{
padding-top: 0 ;
}
.CodeMirror-code,
.CodeMirror-linenumber,
.cm-formatting
{
font-family: var(--font-monospace) ;
font-size: 0.9em;
}
.markdown-preview-section pre code,
.markdown-preview-section code
{
font-size: 0.9em ;
background-color: var(--pre-code) ;
}
.markdown-preview-section pre code
{
padding: 4px ;
line-height: 1.4em ;
display: block ;
color: var(--code-block) ;
}
.markdown-preview-section code
{
color: var(--inline-code) ;
}
.cm-s-obsidian,
.cm-inline-code
{
-webkit-font-smoothing: auto ;
}
.cm-inline-code
{
color: var(--inline-code) ;
background-color: var(--pre-code) ;
padding: 1px ;
}
.workspace-leaf-header-title
{
font-weight: 600 ;
}
.side-dock-title
{
padding-top: 15px ;
font-size: 20px ;
}
.side-dock-ribbon-tab:hover,
.side-dock-ribbon-action:hover,
.side-dock-ribbon-action.is-active:hover,
.nav-action-button:hover,
.side-dock-collapse-btn:hover
{
color: var(--text-a);
}
.side-dock
{
border-right: 0 ;
}
.cm-s-obsidian,
.markdown-preview-view
{
/* padding-left: 10px ; */
padding-right: 10px ;
}
/* vertical resize-handle */
.workspace-split.mod-vertical > * > .workspace-leaf-resize-handle,
.workspace-split.mod-left-split > .workspace-leaf-resize-handle,
.workspace-split.mod-right-split > .workspace-leaf-resize-handle
{
width: 1px ;
background-color: var(--dim-aqua);
}
/* horizontal resize-handle */
.workspace-split.mod-horizontal > * > .workspace-leaf-resize-handle
{
height: 1px ;
background-color: var(--dim-aqua);
}
/* Remove vertical split padding */
.workspace-split.mod-root .workspace-split.mod-vertical .workspace-leaf-content,
.workspace-split.mod-vertical > .workspace-split,
.workspace-split.mod-vertical > .workspace-leaf,
.workspace-tabs
{
padding-right: 0px;
}
.markdown-embed-title
{
font-weight: 600 ;
}
.markdown-embed
{
padding-left: 10px ;
padding-right: 10px ;
margin-left: 10px ;
margin-right: 10px ;
}
.cm-header-1,
.markdown-preview-section h1
{
font-weight: 500 ;
font-size: 34px ;
color: var(--text-title-h1) ;
}
.cm-header-2,
.markdown-preview-section h2
{
font-weight: 500 ;
font-size: 26px ;
color: var(--text-title-h2) ;
}
.cm-header-3,
.markdown-preview-section h3
{
font-weight: 500 ;
font-size: 22px ;
color: var(--text-title-h3) ;
}
.cm-header-4,
.markdown-preview-section h4
{
font-weight: 500 ;
font-size: 20px ;
color: var(--text-title-h4) ;
}
.cm-header-5,
.markdown-preview-section h5
{
font-weight: 500 ;
font-size: 18px ;
color: var(--text-title-h5) ;
}
.cm-header-6,
.markdown-preview-section h6
{
font-weight: 500 ;
font-size: 18px ;
color: var(--text-title-h6) ;
}
.suggestion-item.is-selected
{
background-color: var(--text-selection);
}
.empty-state-container:hover
{
background-color: var(--background-secondary-alt);
border: 5px solid var(--interactive-accent) ;
}
.checkbox-container
{
background-color: var(--interactive-before);
}
.checkbox-container:after
{
background-color: var(--interactive-accent);
}
.checkbox-container.is-enabled:after
{
background-color: var(--bg5-dark);
}
.mod-cta
{
color: var(--background-secondary-alt) ;
font-weight: 600 ;
}
.mod-cta a
{
color: var(--background-secondary-alt) ;
font-weight: 600 ;
}
.mod-cta:hover
{
background-color: var(--interactive-before) ;
font-weight: 600 ;
}
.CodeMirror-cursor
{
background-color: var(--vim-cursor) ;
opacity: 60% ;
}
input.task-list-item-checkbox {
border: 1px solid var(--faded-blue);
appearance: none;
-webkit-appearance: none;
}
input.task-list-item-checkbox:checked
{
background-color: var(--faded-blue);
box-shadow: inset 0 0 0 2px var(--background-primary);
}
::selection
{
background-color: var(--text-selection) ;
}
.mermaid .note
{
fill: var(--dark3) ;
}
.frontmatter-container {
display: none;
}
/* Bullet point relationship lines */
.markdown-source-view.mod-cm6 .cm-indent::before,
.markdown-rendered.show-indentation-guide li > ul::before,
.markdown-rendered.show-indentation-guide li > ol::before {
position: absolute;
border-right: 1px solid var(--dim-blue);
}

6
.obsidian/themes/Obuntu/manifest.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"name": "Obuntu",
"version": "0.0.0",
"minAppVersion": "0.16.0",
"author": "Dubinin Dmitry"
}

1982
.obsidian/themes/Obuntu/theme.css vendored Normal file

File diff suppressed because it is too large Load Diff

7
.obsidian/themes/Things/manifest.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"name": "Things",
"version": "2.1.20",
"minAppVersion": "1.0.0",
"author": "@colineckert",
"authorUrl": "https://twitter.com/colineckert"
}

1628
.obsidian/themes/Things/theme.css vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,39 +4,95 @@
"type": "split",
"children": [
{
"id": "63158942a4984cd3",
"id": "129706cddff31cc9",
"type": "tabs",
"children": [
{
"id": "7e19a0f648386a7a",
"id": "0b0b8b496de176cf",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/E5.007161 - Modifica O&U - SAE346 - Notes.md",
"file": "04-SIDEL/00 - MASTER/MIXER/S7 Software Calls.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "E5.007161 - Modifica O&U - SAE346 - Notes"
"title": "S7 Software Calls"
}
},
{
"id": "0ff3b5b4d36c0278",
"id": "9c8cab4a3ddaf461",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "03-VM/HENKEL/93040 - HENKEL - BowlingGreen/TL22-L25/24 - 9.4006 - Feedback flow - TL22-L25 Q3/9.4006 - Feedback flow - Notes for technician on site TL22 - Q3-Q1.md",
"file": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Software adaptation from Master - Notes.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "9.4006 - Feedback flow - Notes for technician on site TL22 - Q3-Q1"
"title": "SAE346 - Software adaptation from Master - Notes"
}
},
{
"id": "1e202b75a5de872a",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/RNF032 - Difference between Hardware on S7 and the Electrical scheme.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "RNF032 - Difference between Hardware on S7 and the Electrical scheme"
}
},
{
"id": "918600f76a580457",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "01-Documentation/WEB/Download Software.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Download Software"
}
},
{
"id": "5dcd1b7c3c365cae",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "01-Documentation/Endress+Houser/Endress+Hauser WEB Access.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Endress+Hauser WEB Access"
}
},
{
"id": "5b164e8442f63142",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Como usar PublicApiGenerator - Nuget - Documentator.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Como usar PublicApiGenerator - Nuget - Documentator"
}
}
],
"currentTab": 1
"currentTab": 5
}
],
"direction": "vertical"
@ -56,7 +112,7 @@
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": true
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
@ -68,7 +124,7 @@
"state": {
"type": "search",
"state": {
"query": "tilter",
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
@ -79,16 +135,6 @@
"title": "Search"
}
},
{
"id": "ab1a0c411f525576",
"type": "leaf",
"state": {
"type": "starred",
"state": {},
"icon": "lucide-file",
"title": "Plugin no longer active"
}
},
{
"id": "3a8e83d46c0e5d99",
"type": "leaf",
@ -113,7 +159,7 @@
}
],
"direction": "horizontal",
"width": 306.5
"width": 288.5
},
"right": {
"id": "403186784ae0fd88",
@ -212,11 +258,12 @@
}
}
],
"currentTab": 5
"currentTab": 4
}
],
"direction": "horizontal",
"width": 369.5
"width": 369.5,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
@ -227,107 +274,66 @@
"templates:Insert template": false,
"command-palette:Open command palette": false,
"workspaces:Manage workspace layouts": false,
"publish:Publish changes...": false,
"table-editor-obsidian:Advanced Tables Toolbar": false,
"omnisearch:Omnisearch": false,
"pdf-plus:PDF++: Toggle auto-copy": false,
"pdf-plus:PDF++: Toggle auto-focus": false,
"pdf-plus:PDF++: Toggle auto-paste": false,
"publish:Publish changes...": false,
"obsidian-excalidraw-plugin:New drawing": false,
"obsidian-git:Open Git source control": false,
"copilot:Open Copilot Chat": false,
"markitdown:Convert to Markdown with Markitdown": false,
"obsidian-importer:Open Importer": false,
"obsidian-projects:Open projects": false
"obsidian-importer:Open Importer": false
}
},
"floating": {
"id": "bc3bc23273d2c426",
"type": "floating",
"children": [
{
"id": "c4fa51c5f1c19078",
"type": "window",
"children": [
{
"id": "39e6acdae102d48a",
"type": "tabs",
"children": [
{
"id": "60a3a46515a8104b",
"type": "leaf",
"state": {
"type": "webviewer",
"state": {
"url": "https://florianwoelki.github.io/obsidian-iconize/files-and-folders/icon-before-file-or-folder.html",
"title": "Icon before file or folder name | Obsidian Iconize",
"mode": "webview"
},
"icon": "globe-2",
"title": "Icon before file or folder name | Obsidian Iconize"
}
}
]
}
],
"direction": "vertical",
"x": 448,
"y": 116,
"width": 1024,
"height": 800,
"maximize": false,
"zoom": 0
}
]
},
"active": "0ff3b5b4d36c0278",
"active": "5b164e8442f63142",
"lastOpenFiles": [
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/E5.007161 - Modifica O&U - SAE346 - Notes.md",
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/E5.007161 - Modifica O&U - SAE346 - Modified on PLC.md",
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/Drawing 2025-04-02 11.05.14.excalidraw.md",
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/Drawing 2025-03-26 13.28.27.excalidraw.md",
"Excalidraw/Drawing 2025-04-05 23.12.18.excalidraw.md",
"03-VM/HENKEL/93040 - HENKEL - BowlingGreen/TL22-L25/24 - 9.4006 - Feedback flow - TL22-L25 Q3/9.4006 - Feedback flow - Notes for technician on site TL22 - Q3-Q1.md",
"Excalidraw",
"03-VM/HENKEL/93040 - HENKEL - BowlingGreen/Backups/HENKEL Backup Versions.md",
"03-VM/HENKEL/93040 - HENKEL - BowlingGreen/9.3976 - Interlock FormatChange/9.3976 - From factory feedback - Prohibit simultaneous changeover on all lines.md",
"04-SIDEL/00 - MASTER/SIDEL - Mixer - Equivalences.md",
"04-SIDEL/00 - MASTER/SIDEL - Mixer - Master - IO Tags.md",
"04-SIDEL/03 - 5.007382-EXMU01UF - RVU008 - EQPT24731/5.007382-EXMU01UF - RVU008 - EQPT24731 - Initial Data.md",
"04-SIDEL/03 - 5.007382-EXMU01UF - RVU008 - EQPT24731/5.007382-EXMU01UF - RVU008 - EQPT24731 - Notes.md",
"04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/FDM RNF032 E5.007299.md",
"01-Documentation/Endress+Houser/Endress+Hauser WEB Access.md",
"01-Documentation/Endress+Houser/Optional - Concentration measurement.md",
"01-Documentation/WEB/Download Software.md",
"04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/RNF032 - Difference between Hardware on S7 and the Electrical scheme.md",
"01-Documentation/Endress+Houser/adjuntos/Pasted image 20250411154541.png",
"01-Documentation/Endress+Houser/adjuntos/Pasted image 20250411154441.png",
"01-Documentation/Endress+Houser/Endress+Hauser Concentration Optional.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/markdown/192_168_1_212-192_168_1_212.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/markdown/index.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/post_login.png",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/initial_page.png",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/before_click_xpath_Menu.png",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/before_click_xpath_Measured values.png",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/after_click_xpath_Menu.png",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/after_click_xpath_Measured values.png",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/192_168_1_212-192_168_1_212-pid_38_2.png",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/192_168_1_212-192_168_1_212-pid_38_1.png",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/markdown/192_168_1_212-192_168_1_212-ulPID_38_ulAccCode_235767257.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/markdown/192_168_1_212-192_168_1_212-ulPID_18_ulAccCode_235767257.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/markdown/192_168_1_212-192_168_1_212-ulPID_149_ulAccCode_235767257.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/markdown/192_168_1_212-192_168_1_212-pid_38.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/markdown/192_168_1_212-192_168_1_212-pid_18.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/markdown",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/html/192_168_1_212-192_168_1_212.html",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/html/192_168_1_212-192_168_1_212-ulPID_38_ulAccCode_235767257.html",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/html/192_168_1_212-192_168_1_212-ulPID_18_ulAccCode_235767257.html",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/html/192_168_1_212-192_168_1_212-ulPID_149_ulAccCode_235767257.html",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/html/192_168_1_212-192_168_1_212-pid_38.html",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/html/192_168_1_212-192_168_1_212-pid_18.html",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/html",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/index.json",
"01-Documentation/Windows/Notes for Windows - Chris Titus Tool - Online - Offline.md",
"04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/E5.007299 - RNF032 - FDM.md",
"04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/E5.007299 - Modifica O&U - RNF032 - NOTES.md",
"01-Documentation/SIDEL/Master Mixer/Mixer - Notes.md",
"01-Documentation/SIDEL/SIDEL - FLD.md",
"04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/FDM RNF032 E5.007299.md",
"04-SIDEL/03 - 5.007382-EXMU01UF - RVU008 - EQPT24731/5.007382-EXMU01UF - RVU008 - EQPT24731 - Notes.md",
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/E5.007363 - Modifica O&U - SAE196 - Notes.md",
"01-Documentation/Siemens/IM Siemens - Profibus - Comissioning.md",
"01-Documentation/SIDEL/SIDEL - Passwords.md",
"TODY - Punti da vedere.md",
"Palabras Tecnicas/Lista.md",
"Temporales/NAT - Switch.md",
"Temporales/Drawing 2024-10-13 20.08.30.excalidraw.md",
"Excalidraw/Drawing 2025-01-27 16.50.21.excalidraw.md",
"cronologiaI-93040-3074-ALPLA-BG-open-points.md",
"markitdown-output/adjuntos/TIA Portal Ethernet communication Rules V0.1.pdf",
"HTML import/TIA Portal Ethernet communication Rules V0.1.md",
"HTML import/Attachments/image051.jpg",
"HTML import/Attachments/image047.jpg",
"01-Documentation/SIDEL/MASTER/Communication/Untitled.md",
"HTML import/Attachments/image154.gif",
"HTML import/Attachments/image151.jpg",
"HTML import/Attachments/image149.jpg",
"HTML import/Attachments/image147.gif",
"HTML import/Attachments/image145.gif",
"HTML import/Attachments/image141.gif",
"HTML import/Attachments/image138.gif",
"HTML import/Attachments/image131.gif",
"HTML import/Attachments",
"HTML import",
"01-Documentation/SIDEL/MASTER/Communication/adjuntos/temp_conversion.html",
"01-Documentation/SIDEL/MASTER/Communication/adjuntos/header.htm",
"01-Documentation/SIDEL/MASTER/Communication/adjuntos",
"01-Documentation/SIDEL/MASTER/Communication",
"01-Documentation/SIDEL/MASTER",
"04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/data.json",
"01-Documentation/SIDEL/Master Mixer/Mixer - Notes.md",
"04-SIDEL/03 - 5.007382-EXMU01UF - RVU008 - EQPT24731/5.007382-EXMU01UF - RVU008 - EQPT24731 - Initial Data.md",
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Software adaptation from Master - Notes.md",
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Signals - CIP - Filler - Syrop.md",
"04-SIDEL/00 - MASTER/MIXER/S7 Software Calls.md",
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Process diagram.md",
"03-Revised/93789 Sipa Italia - Tinny - HSCounters - Piattaforma/Divider/Untitled.canvas",
"04-InLavoro/9..... MASTER Transport/Standard Transport/FB500 Logic.canvas",
"04-InLavoro/HENKEL/93040 - HENKEL - BowlingGreen/TL22-L25/Synoptic Change/Q3.canvas",

View File

@ -0,0 +1,501 @@
# PROFIBUS Communication with Siemens S7-1500 PLC: Implementation Guide
## 1. Introduction
This document serves as a technical reference for configuring and programming a Siemens S7-1500 PLC to communicate with PROFIBUS devices, with a specific focus on devices using a GSD file configured with 4 blocks of 32 bytes each for input and output data transfer. The document assumes the reader has basic knowledge of TIA Portal and PLC programming.
## 2. PROFIBUS Configuration Overview
### 2.1 GSD Configuration
The GSD (General Station Description) file for this implementation is configured with:
- 4 blocks of 32 bytes each for input (total 128 bytes)
- 4 blocks of 32 bytes each for output (total 128 bytes)
This configuration allows consistent data exchange between the S7-1500 PLC (master) and the PROFIBUS device (slave).
### 2.2 Hardware Requirements
- Siemens S7-1500 PLC with CM 1542-5 or CP 1542-5 PROFIBUS interface
- TIA Portal V16 or later
- GSD file for the PROFIBUS device
- PROFIBUS cable and connectors
## 3. TIA Portal Configuration
### 3.1 Importing the GSD File
1. Open TIA Portal and your project
2. Navigate to "Options" → "Manage general station description files (GSD)"
3. Click "Install" and select the GSD file for your device
4. Click "Install" and close the dialog
### 3.2 Hardware Configuration
1. Open the device configuration view
2. Add your S7-1500 CPU to the project if not already present
3. From the hardware catalog, select "PROFIBUS DP" → "Additional Field Devices" → find your device
4. Add the PROFIBUS device to the PROFIBUS network
5. Configure the PROFIBUS address (must be unique on the network)
6. Select the proper I/O configuration (4 blocks x 32 bytes for inputs and outputs)
7. Compile and download the hardware configuration
### 3.3 Setting PROFIBUS Parameters
1. Select the PROFIBUS interface of your S7-1500 PLC
2. Set the PROFIBUS address (typically 2, as 0 is reserved for programming devices and 1 often for master devices)
3. Configure the operating mode as "DP master"
4. Set the transmission rate (usually 1.5 Mbps, but ensure it matches all devices)
5. Set the highest station address (HSA) to cover all planned device addresses
## 4. Data Structure Organization
### 4.1 Input Data Structure (Device to PLC)
The 128 bytes of input data is organized in 4 blocks of 32 bytes each. Based on the provided documentation, a typical structure might be:
#### Block 1 (Bytes 0-31)
```
Byte 0: Status mPDS 5 (0=Initialization, 1=OK, 2=Warning, 4=Error)
Byte 1: Not used
Byte 2-3: Production line status
Byte 4-5: Product number (0-65535)
Byte 6-7: Product type number
Byte 8-11: Requested parameter 1 (Real)
Byte 12-15: Requested parameter 2 (Real)
Byte 16-19: Requested parameter 3 (Real)
Byte 20-23: Requested parameter 4 (Real)
Byte 24-27: Measurement value 1 (Real)
Byte 28-31: Measurement value 2 (Real)
```
#### Block 2 (Bytes 32-63)
```
Byte 32-35: Measurement value 3 (Real)
Byte 36-39: Measurement value 4 (Real)
Byte 40-43: Measurement value 5 (Real)
Byte 44-47: Measurement value 6 (Real)
Byte 48-51: Measurement value 7 (Real)
Byte 52-55: Measurement value 8 (Real)
Byte 56-59: Measurement value 9 (Real)
Byte 60-63: Measurement value 10 (Real)
```
#### Block 3 (Bytes 64-95)
```
Byte 64-67: Measurement value 11 (Real)
Byte 68-71: Measurement value 12 (Real)
Byte 72-75: Measurement value 13 (Real)
Byte 76-79: Measurement value 14 (Real)
Byte 80-83: Measurement value 15 (Real)
Byte 84-87: Measurement value 16 (Real)
Byte 88-91: Measurement value 17 (Real)
Byte 92-95: Measurement value 18 (Real)
```
#### Block 4 (Bytes 96-127)
```
Byte 96-99: Measurement value 19 (Real)
Byte 100-103: Measurement value 20 (Real)
Byte 104-107: Measurement value 21 (Real)
Byte 108-111: Measurement value 22 (Real)
Byte 112-115: Measurement value 23 (Real)
Byte 116-119: Measurement value 24 (Real)
Byte 120-123: Measurement value 25 (Real)
Byte 124-127: Measurement value 26 (Real)
```
### 4.2 Output Data Structure (PLC to Device)
The 128 bytes of output data is also organized in 4 blocks of 32 bytes each:
#### Block 1 (Bytes 0-31)
```
Byte 0-1: Product number (Word)
Byte 2-3: DI1-DI16 from PLC (16 bits)
Byte 4: Type of requested parameter 1
Byte 5: Index of requested parameter 1
Byte 6: Type of requested parameter 2
Byte 7: Index of requested parameter 2
Byte 8: Type of requested parameter 3
Byte 9: Index of requested parameter 3
Byte 10: Type of requested parameter 4
Byte 11: Index of requested parameter 4
Byte 12-13: "Enter" command for requested parameters
Byte 14-17: Measurement value 1 from PLC (Real) - Optional
Byte 18-21: Measurement value 2 from PLC (Real) - Optional
Byte 22-25: Measurement value 3 from PLC (Real) - Optional
Byte 26-29: Measurement value 4 from PLC (Real) - Optional
Byte 30-31: Type and index of parameter 1 to transfer
```
#### Block 2 (Bytes 32-63)
```
Byte 32-35: Value of parameter 1 to transfer (Real)
Byte 36-37: Type and index of parameter 2 to transfer
Byte 38-41: Value of parameter 2 to transfer (Real)
Byte 42-43: Type and index of parameter 3 to transfer
Byte 44-47: Value of parameter 3 to transfer (Real)
Byte 48-49: Type and index of parameter 4 to transfer
Byte 50-53: Value of parameter 4 to transfer (Real)
Byte 54-55: Type and index of parameter 5 to transfer
Byte 56-59: Value of parameter 5 to transfer (Real)
Byte 60-63: Type and index of parameter 6 to transfer
```
#### Block 3 (Bytes 64-95)
```
Byte 64-67: Value of parameter 6 to transfer (Real)
Byte 68-69: Type and index of parameter 7 to transfer
Byte 70-73: Value of parameter 7 to transfer (Real)
Byte 74-75: Type and index of parameter 8 to transfer
Byte 76-79: Value of parameter 8 to transfer (Real)
Byte 80-81: Type and index of parameter 9 to transfer
Byte 82-85: Value of parameter 9 to transfer (Real)
Byte 86-87: Type and index of parameter 10 to transfer
Byte 88-91: Value of parameter 10 to transfer (Real)
Byte 92-93: Type and index of parameter 11 to transfer
Byte 94-95: Beginning of value of parameter 11
```
#### Block 4 (Bytes 96-127)
```
Byte 96-97: Remaining bytes of parameter 11 value
Byte 98-99: Type and index of parameter 12 to transfer
Byte 100-103: Value of parameter 12 to transfer
Byte 104-105: Type and index of parameter 13 to transfer
Byte 106-109: Value of parameter 13 to transfer
Byte 110-111: Type and index of parameter 14 to transfer
Byte 112-115: Value of parameter 14 to transfer
Byte 116-117: Type and index of parameter 15 to transfer
Byte 118-121: Value of parameter 15 to transfer
Byte 122-125: Type and index of parameter 16 to transfer
Byte 126-127: "Enter" command for parameters to be transferred
```
## 5. TIA Portal Implementation
### 5.1 Creating Data Blocks
For better organization, create the following data blocks (DBs):
1. **DB_PROFIBUS_Config**: For configuration parameters
2. **DB_PROFIBUS_Input**: For storing input data from the device
3. **DB_PROFIBUS_Output**: For preparing output data to the device
4. **DB_PROFIBUS_Parameters**: For parameter management
#### Sample DB_PROFIBUS_Input Structure
```
// Block 1
"Status_mPDS" : Byte // Status byte
"NotUsed" : Byte // Not used
"ProductionLineStatus" : Word // Status of production line
"ProductNumber" : Word // Current product number
"ProductTypeNumber" : Word // Product type number
"RequestedParam1" : Real // Requested parameter 1
"RequestedParam2" : Real // Requested parameter 2
"RequestedParam3" : Real // Requested parameter 3
"RequestedParam4" : Real // Requested parameter 4
"MeasValue1" : Real // Measurement value 1
"MeasValue2" : Real // Measurement value 2
// Continue for all measurement values through Block 4
```
#### Sample DB_PROFIBUS_Output Structure
```
// Block 1
"ProductNumber" : Word // Product number to set
"DigitalInputs" : Word // DI1-DI16 from PLC
"ReqParamType1" : Byte // Type of requested parameter 1
"ReqParamIndex1" : Byte // Index of requested parameter 1
"ReqParamType2" : Byte // Type of requested parameter 2
"ReqParamIndex2" : Byte // Index of requested parameter 2
"ReqParamType3" : Byte // Type of requested parameter 3
"ReqParamIndex3" : Byte // Index of requested parameter 3
"ReqParamType4" : Byte // Type of requested parameter 4
"ReqParamIndex4" : Byte // Index of requested parameter 4
"EnterCommand" : Word // "Enter" command for requested parameters
"PLCMeasValue1" : Real // Measurement value 1 from PLC
"PLCMeasValue2" : Real // Measurement value 2 from PLC
"PLCMeasValue3" : Real // Measurement value 3 from PLC
"PLCMeasValue4" : Real // Measurement value 4 from PLC
"ParamTypeIndex1" : Word // Type and index of parameter 1 to transfer
// Continue for all parameters through Block 4
```
### 5.2 Hardware Addressing
In the device properties, you'll see I/O addresses assigned to the device. Note these addresses as they'll be used for data exchange.
For example:
- Input address: %IB0 to %IB127 (for 128 bytes of input data)
- Output address: %QB0 to %QB127 (for 128 bytes of output data)
### 5.3 Programming for Data Exchange
#### Reading Input Data (OB Cyclic Interrupt)
```
// Create a cyclic interrupt OB (e.g., OB30) that executes every 100ms
// Read block 1 (bytes 0-31)
MOVE %IB0 #DB_PROFIBUS_Input.Status_mPDS
MOVE %IB1 #DB_PROFIBUS_Input.NotUsed
MOVE %IW2 #DB_PROFIBUS_Input.ProductionLineStatus
MOVE %IW4 #DB_PROFIBUS_Input.ProductNumber
MOVE %IW6 #DB_PROFIBUS_Input.ProductTypeNumber
MOVE %ID8 #DB_PROFIBUS_Input.RequestedParam1
MOVE %ID12 #DB_PROFIBUS_Input.RequestedParam2
MOVE %ID16 #DB_PROFIBUS_Input.RequestedParam3
MOVE %ID20 #DB_PROFIBUS_Input.RequestedParam4
MOVE %ID24 #DB_PROFIBUS_Input.MeasValue1
MOVE %ID28 #DB_PROFIBUS_Input.MeasValue2
// Continue for all blocks
```
For SCL programming, you can use a more efficient approach with UDTs and AT constructs:
```SCL
// In OB30 (cyclic interrupt)
// Map the entire input area to the DB structure
DB_PROFIBUS_Input.InputData := %IB0;
```
#### Writing Output Data (FC or FB)
```
// Create a function (FC) or function block (FB) for writing data
// Set product number
MOVE #DB_PROFIBUS_Output.ProductNumber %QW0
// Set digital inputs
MOVE #DB_PROFIBUS_Output.DigitalInputs %QW2
// Set request parameters
MOVE #DB_PROFIBUS_Output.ReqParamType1 %QB4
MOVE #DB_PROFIBUS_Output.ReqParamIndex1 %QB5
MOVE #DB_PROFIBUS_Output.ReqParamType2 %QB6
MOVE #DB_PROFIBUS_Output.ReqParamIndex2 %QB7
MOVE #DB_PROFIBUS_Output.ReqParamType3 %QB8
MOVE #DB_PROFIBUS_Output.ReqParamIndex3 %QB9
MOVE #DB_PROFIBUS_Output.ReqParamType4 %QB10
MOVE #DB_PROFIBUS_Output.ReqParamIndex4 %QB11
// Set "Enter" command
MOVE #DB_PROFIBUS_Output.EnterCommand %QW12
// Continue for all blocks
```
For SCL programming:
```SCL
// In a function block
%QB0 := DB_PROFIBUS_Output.OutputData;
```
## 6. Programming Examples
### 6.1 Example: Reading CO2 Measurement
```SCL
// Assuming MeasValue1 contains CO2 concentration in g/L
// Read the value and check for alarm conditions
#CO2_Concentration := "DB_PROFIBUS_Input".MeasValue1;
// Check for alarm condition
IF #CO2_Concentration > #CO2_HighLimit THEN
#AlarmHighCO2 := TRUE;
ELSE
#AlarmHighCO2 := FALSE;
END_IF;
IF #CO2_Concentration < #CO2_LowLimit THEN
#AlarmLowCO2 := TRUE;
ELSE
#AlarmLowCO2 := FALSE;
END_IF;
```
### 6.2 Example: Changing a Parameter
```SCL
// Change the offset parameter for Original Extract measurement
// Assuming parameter type 3 = Offset and index 2 = Original Extract
// Prepare data
"DB_PROFIBUS_Output".ParamTypeIndex1.%B0 := 3; // Type: Offset
"DB_PROFIBUS_Output".ParamTypeIndex1.%B1 := 2; // Index: Original Extract
"DB_PROFIBUS_Output".ParamValue1 := 0.15; // New offset value: 0.15
// Generate Enter command trigger (change the value)
IF "DB_LastEnterCommand" = 0 THEN
"DB_PROFIBUS_Output".EnterCommandParams := 1;
ELSE
"DB_PROFIBUS_Output".EnterCommandParams := 0;
END_IF;
"DB_LastEnterCommand" := "DB_PROFIBUS_Output".EnterCommandParams;
// Wait for 2 seconds before next parameter change (using a timer)
```
### 6.3 Example: Setting a Product
```SCL
// Set product number 12
"DB_PROFIBUS_Output".ProductNumber := 12;
// Verify the product was set correctly by checking input data
IF "DB_PROFIBUS_Input".ProductNumber = 12 THEN
"ProductSetCorrectly" := TRUE;
ELSE
"ProductSetCorrectly" := FALSE;
END_IF;
```
## 7. Working with PROFIBUS Data Types
### 7.1 Data Types Reference
|Data Type|Size|Description|
|---|---|---|
|Byte|8 bits|Single byte value (0-255)|
|Word|16 bits|Two-byte value (0-65535, binary coded)|
|Real|32 bits|Floating point value, MSB,...,LSB format|
|Bit|1 bit|Single binary value (0 or 1) for digital I/O|
### 7.2 Byte Order Considerations
The device uses the MSB (Most Significant Byte) first order for multi-byte values. In the S7-1500, all data is stored in little-endian format. This is handled automatically by the PLC for standard data types, but should be considered when working with custom byte manipulations.
For 32-bit Real values, the byte order is:
- MSB (Most Significant Byte) first in PROFIBUS transmission
- The S7-1500 automatically handles the conversion when using REAL data types
### 7.3 Accessing Individual Bits
To access individual bits in the digital inputs/outputs:
```SCL
// Check if digital input 1 is active
IF "DB_PROFIBUS_Input".ProductionLineStatus.%X0 THEN
// DI1 is active
END_IF;
// Activate digital output 3
"DB_PROFIBUS_Output".DigitalInputs.%X2 := TRUE;
```
## 8. Diagnostics and Troubleshooting
### 8.1 PROFIBUS Diagnostics
1. In TIA Portal, go to the device view
2. Right-click on the PROFIBUS device and select "Online & Diagnostics"
3. Check "PROFIBUS Interface" for general communication status
4. Check "I/O Addresses" for address assignment
5. Check "Module information" for module status
### 8.2 Common Error Codes
|Error|Description|Solution|
|---|---|---|
|Error #1|Valve error (Gas pressure too high)|Check valves, ensure proper line pressure|
|Error #2|Concentration out of range|Check measurement conditions|
|Error #4|Pressure Gas out of range|Check pressure sensor, ensure proper range|
|Error #8|Temperature out of range|Check temperature sensor|
|Error #16|Line pressure out of range|Check line pressure sensor|
|Error #64|Degassing error|Check impeller/oscillator|
|Error #128|Air in measuring chamber|Ensure proper liquid flow, purge air|
### 8.3 Status Monitoring
Create a status monitoring view in your HMI application with:
- Communication status indicators
- Error code display and interpretation
- Parameter request status
- Parameter change status
### 8.4 Testing Communication
Use the "Force table" in TIA Portal to:
1. Force input values to test PLC reactions
2. Force output values to test device reactions
3. Monitor data exchange in real-time
## 9. Best Practices
1. **Consistent Data Handling**: Ensure you maintain data consistency by not interrupting parameter writes
2. **Buffer Time**: Wait 2 seconds after sending the "Enter" command before sending new parameters
3. **Validation**: Always validate data received from the device before using it in calculations
4. **Error Handling**: Implement proper error handling and status monitoring
5. **Documentation**: Document the meaning and purpose of each data point in your application
6. **Periodic Testing**: Periodically test the communication during normal operation
## 10. Appendix
### 10.1 Parameter Types Reference (Type values used in data exchange)
|Type|Description|
|---|---|
|3|Offset|
|4|Adjustment factor|
|5|Hi limit|
|6|HiHi limit|
|7|Lo limit|
|8|LoLo limit|
|9|Product parameter|
|10|Target value|
### 10.2 Sample Configuration Data Block
```SCL
// DB_PROFIBUS_Config
DATA_BLOCK "DB_PROFIBUS_Config"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
NON_RETAIN
STRUCT
DeviceAddress : USInt := 3; // PROFIBUS address of the device
UpdateRate : Time := T#100MS; // Update rate for data exchange
WaitTimeAfterEnter : Time := T#2S; // Wait time after Enter command
MaxProductNumber : UInt := 65535; // Maximum product number
// Parameter limits
MaxParameters : USInt := 16; // Maximum number of parameters
MaxParamIndex : USInt := 255; // Maximum parameter index
// Communication status
CommStatus : Bool; // TRUE if communication is OK
LastErrorCode : Word; // Last error code
ErrorCount : UDInt; // Error counter
END_STRUCT;
END_DATA_BLOCK
```
### 10.3 Further Resources
- Siemens Industry Online Support (SIOS): [https://support.industry.siemens.com](https://support.industry.siemens.com/)
- TIA Portal documentation
- PROFIBUS PA System Description
- S7-1500 Programming Manual

View File

@ -0,0 +1,19 @@
The following dialog box opens after selecting option Automation Studio (Legacy).
The provided B&R serial number must be entered in the first input field. Once a valid serial number is entered, all of the other buttons will become active.
Choose Automatio Studio (Legacy)
B&R serial number: 12345678901
Serial Maker : [B_R](file:///D:%5CInstalad%5CB&R%5CLisence%5CB_R)
![[Pasted image 20250409130815.png]]
License manually (offline)
Clicking button "License manually (offline)" opens the licensing dialog box. A licensing code can be requested by selecting menu option Service / Software registration on the B&R website.
![[Pasted image 20250409131238.png]]
After entering the Sys-ID and pressing the Register button, you will get an activation code that you can then enter in the License code (Sec-ID) input field in the Automation Studio licensing dialog box

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,5 @@
``
62397586
![[Pasted image 20250411104020.png|800]]

View File

@ -0,0 +1,9 @@
***
Default IP: 192.168.1.212
Default Password: 0000
Service: Password: 4685
Software download: [Loading...](https://software-products.endress.com/ui/private/softwaredownload)

View File

@ -0,0 +1,26 @@
![[Pasted image 20250411154441.png]]
![[Pasted image 20250411154541.png]]
**Configuración de parámetros**: En el menú `Configuración avanzada → Concentración`, puede establecer:[Endress Portal](https://portal.endress.com/wa001/dla/5001055/5729/000/00/SD01644DEN_0116.pdf?utm_source=chatgpt.com)
- **Unidad de concentración**: Por ejemplo, `% en peso (WT-%)`.[Endress Portal+1Instrumart+1](https://portal.endress.com/wa001/dla/5001055/5729/000/00/SD01644DEN_0116.pdf?utm_source=chatgpt.com)
- **Texto personalizado para la unidad**: Define una descripción específica para la unidad de concentración.
- **Factor y offset personalizados**: Permiten ajustar la escala y el punto cero de la medición.
- **Coeficientes A0A4 y B1B3**: Se utilizan en la fórmula de cálculo de concentración:[Endress Portal+1Smith Meter+1](https://portal.endress.com/wa001/dla/5001055/5729/000/00/SD01644DEN_0116.pdf?utm_source=chatgpt.com)
C = A0 + A1·ρ + A2·ρ² + A3·ρ³ + A4·ρ⁴ + B1·T + B2·T² + B3·T³
Donde:
- C: Concentración
- ρ: Densidad medida
- T: Temperatura medida en °C

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -0,0 +1 @@
![[Pasted image 20250408124202.png]]

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 KiB

View File

@ -0,0 +1,7 @@
***
* B&R 4.2
* Zenon 10
* Twincat 2.8
* Siemens Tia Portal 18
* Simatic S7 5.7

Some files were not shown because too many files have changed in this diff Show More