Journal d'un Terrien

Web log de Serge Boisse

On line depuis 1992 !

Publicité
Si cette page vous a plu, Copiez son adresse et partagez-la !
http://sboisse.free.fr/trucs et astuces/Obsidian/Plugins/obsidian-execute-code.php
Savez-vous quels sont les articles les plus vendus sur Amazon.fr ?
obsidian-execute-code
trucs et astuces > Obsidian > Plugins > obsidian-execute-code

obsidian-execute-code

Auteur : Serge Boisse
Voir aussi:

Ce plugin permet d'exécuter des extraits de code dans des blocs de code dans vos notes. Le plugin ajoute un bouton "Run" pour les blocs de code dans les langues prises en charge. En cliquant dessus, le code du bloc est exécuté. Après l'exécution, le résultat de l'exécution est affiché. Un élément d'entrée interactif est créé lorsque vos extraits de code lus attendent une entrée de l'utilisateur.

Le résultat n'est affiché qu'une fois l'exécution terminée. Il n'est pas possible d'entrer du texte sur la ligne de commande dans le programme exécuté. A noter que console.log(..) affiche le contenu dans la note après après le bloc js.

Les langages suivants sont pris en charge : CPP, Golang, Groovy, Kotlin, Java, JavaScript, TypeScript, Lua, CSharp, Tau-Prolog, Rust, Python, R, Shell et Powershell.

Python et Rust supportent les tracés intégrés. Tous les langages prennent en charge les commandes "magiques" qui vous aident à accéder aux chemins dans Obsidian ou à afficher des images dans vos notes.

Vous pouvez créer des blocs de code qui sont exécutés avant ou après chaque bloc de code du même langage et définir des injections de code globales.

doc :

paramètres

ils sont stockés dans le fichier data.json du plugin
il faut remplacer les / par des \ dans le path de node.js ( C:\Program Files\nodejs) et celui de python. En fait c'est pas nécessaire d'entrer ces paramètres.

Exemples :

il faut les éditer pour que le bouton run (re)apparaisse

javascript

cf javascript
On utilise donc le plugin obsidian-execute-code
Pour que ça marche j'ai dû installer node.js sur l'ordi.

console.log("hello"); 
var g="serge";
function ajoute(x,y) {return x+y; }
console.log(g); 
function hello(name) {
	console.log(`Hello ${name}!`); // ici on utilise les string litterals (pas obligé)
}
hello(ajoute(3,4));
hello("Bob");

Hélas, la variable g n'est pas utilisable dans un autre snippet... SI ! C'est OK avec le notebook mode

le texte de cette div devrait pouvoir être remplacé
//b = new Element("div")
madiv = document.querySelector("#madiv");
madiv.innerHTML="ce texte vient de javascript !"

ne marche pas... window et document inconnus. 😭

Il semble que l'on puisse créer des éléments HTML à la volée !
sauf qu'ils sont dans le bloc de code et ne sont pas interprétés par le navigateur. Comment faire de l'interactivité ? La solution c'est DataviewJS...

console.log(`$\\pi$ = 3.14`); // oK mais mathsjax pas reconnu
console.log('<input type="text" id="name" name="name" required   minlength="4" maxlength="20" size="20" oninput="mydiv.innerHTML=this.value;">');
console.log("<div id='mydiv'>Type some text above</div>");
console.log("<b>bold ?</b>") // no...

hmm... j'ai trouvé un truc. console.log(this) ! Cela permet d'accèder aux variables définies dans un autre bloc mais c'est déjà le cas "en natif." avec le mode notebook...

console.log(this.g);
console.log(this.ownerDocument);

Pas super utile a priori... Sauf qu'il existe une commande magique @html(source)

ajout d'éléments html : experimentations

@html("<i>HTML Caption</i>")
@html('<button onclick="fn(this)">coucou</button>');
texte = @html("bonjour");
function fn(el) {
	el.innerHTML = "hello";// marche pas...
}

marche pas.

texte = `
<svg width="100%" height="100%" viewBox="0 0 600 600" xmlns="http://www.w3.org/2000/svg">
  <circle cx="300" cy="300" r="250" style="fill:peru;" />
  <circle cx="200" cy="250" r="50" style="fill:black;" />
  <circle cx="400" cy="250" r="50" style="fill:black;" />
  <circle cx="190" cy="230" r="20" style="fill:white;" />
  <circle cx="390" cy="230" r="20" style="fill:white;" />
  <circle cx="250" cy="400" r="85" style="fill:saddlebrown;" />
  <circle cx="350" cy="400" r="85" style="fill:saddlebrown;" />
  <ellipse cx="300" cy="380" rx="50" ry="35" style="fill:black;" />
  <ellipse cx="130" cy="100" rx="110" ry="70" style="fill:saddlebrown;"/>
<ellipse cx="470" cy="100" rx="110" ry="70" style="fill:saddlebrown;" />
</svg> 
`;
@html(texte)

YES ! Mais il faut utiliser des backticks

@html('<input type ="button" value="coucou"/>');
@html('<button>Add to favorites</button>');

OK

function coucou() {console.log("hello");}
@html(`
<button onclick='coucou();'>Add to favorites</button>
`);

Marche pas... affiche ");'>Add to favorites</button>

function coucou() { 
	console.log("coucou");
}
texte = `<button onclick="hello()">Clique !</button>`;
@html(texte);

Pas d'erreur mais pas d'interaction... Erreur dans la console du debugger coucou is not defined

texte = `
<button onclick="console.log('toto'+window)">Clique !</button>
`;
@html(texte);

Pas d'erreur, pas d'interaction visible mais dans la console on a
toto[object HTMLButtonElement] pour this dans les user messages. window et document sont également reconnus..

texte = `
<button onclick="window.serge=this;console.log('coucou')">Clique !</button>
`;
@html(texte);
@html("on a "+window.serge)

1er run erreur, 2eme affiche le bouton et coucou dans la console du debugger si cliqué

texte = `
<button onclick="console.log('Hello')">Clique !</button>
`;
@html(texte);

log le document dans la console js. Mais pas possible de le récupérer dans le code...

texte = `
<script>
function coucou() {
	console.log("coucou");
}
</script>
<button onclick="coucou()">Clique !</button>
`;
@html(texte);

clic sur le bouton affiche coucou.... dans la console

texte = `
function coucou() {
	console.log("coucou");
}
`
<button onclick= "texte">Clique !</button>
`;
@html(texte);

Python

  • Python doit être installé sur l'ordi
  • By default, Python runs in #notebook Mode. You can turn this off in the settings.
  • Plots with matplotlib/seaborn are embedded in the note by default. You can turn this off in the settings.
def hello(name):
	n = input("bonjour")
	print("Hello", name+n)

if __name__ == "__main__":
	hello("Serge")

en cliquant "Run" ça marche !
Un autre exemple avec des graphiques

import warnings # sinon on a des deprecated dans seaborn
warnings.filterwarnings("ignore") # idem
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_style("darkgrid")
iris = sns.load_dataset('iris')
sns.FacetGrid(iris, hue ="species", height = 5) \
	.map(plt.scatter,'sepal_length','petal_length') \
	.add_legend()
plt.show()

ça marche !

(Tau-)Prolog

cf prolog
l'incroyable est qu'il ne faut rien installer pour que ça marche
cf la doc Tau-Prolog (page web)

pere(serge,sylvain).
pere(serge,remi).
pere(remi,nathan).
pere(remi,olivia).
pere(sylvain,erin).
pere(sylvain,anaelle).
grandPere(G,P) :- pere(G,F), pere(F,P).

% query
grandPere(X,Y).

Résultat :

X = serge, Y = erin 
X = serge, Y = anaelle 
X = serge, Y = nathan
X = serge, Y = olivia

Ca fonctionne ! Impossible néanmoins de faire des query en "input"
remarque : les diacritiques (accents, etc.) ne marchent pas dans les noms de variable.
Il semble possible d'appeler tu-prolog depuis javascript... cf http://tau-prolog.org/manual/a-simple-tutorial

shell

dir

j'ai paramétré cmd, faute de bash...

Rust

Je ne connais pas mais normalement ça marche.

commandes magiques

  • @vault: Inserts the vault path as string.
  • @note: Inserts the note path as string.
  • @title: Inserts the note title as string.
  • @show(ImagePath): Displays an image at the given path in the note.
  • @show(ImagePath, Width, Height): Displays an image at the given path in the note.
  • @show(ImagePath, Width, Height, Alignment[center|left|right]): Displays an image at the given path in the note. (only in javascript and python)
  • @html(HtmlSource): Displays HTML in the note
Note

the magic commands are resolved before running the code, otherwise we would have to implement each magic command separately for each programming language

print("le titre de cette note est ",@title)
@show("https://upload.wikimedia.org/wikipedia/commons/a/aa/Philips_PM5544.svg",400px, 300px);

OK

@html("<h1>HTML Caption</h1>")

OK

Publicité
Commentaires

Commentaires (0) :

Page :



Ajouter un commentaire (pas besoin de s'enregistrer)

Pseudo :
Message :


image de protection
En cliquant sur le bouton "Envoyer" vous acceptez les conditions suivantes : Ne pas poster de message injurieux, obscène ou contraire à la loi, ni de liens vers de tels sites. Respecter la "netiquette", ne pas usurper le pseudo d'une autre personne, respecter les posts faits par les autres. L'auteur du site se réserve le droit de supprimer un ou plusieurs posts à tout moment. Merci !
Ah oui : le bbcode et le html genre <br>, <a href=...>, <b>b etc. ne fonctionnent pas dans les commentaires. C'est voulu.
< Retour en haut de la page