Actualiser une macro JavaScript


#1

Bonjour,
Après moult recherches sur le forum anglais, je ne comprends pas très bien si il est vraiment possible d’actualiser/rafraichir une macro JavaScript.
Pour exemple j’ai une macro JavaScript qui s’exécute en fonction de paramètres contenu dans un dataTiddler. Si je modifie les valeurs du dataTiddler, la macro JavaScript ne s’actualise pas tant que je ne rafraichis pas la page.

Y a t-il un moyen d’actualiser la macro via un bouton par exemple ?


#2

Effectivement, pour que les modifications d’une macro javascript soient prises en compte il faut d’abord rafraichir TiddlyWiki (et s’il y a un bug dans ton javaScript, ça fait potentiellement planter TW)

Une fois que ceci est fait, tu peux mettre à jour les données de ton DataTiddler, et là, la mise à jour se fait en live sans avoir à rafraichir TW.

Exemple :
SI tu modifies une donnée du fichier http://d3jsv5trial.tiddlyspot.com/#flare.json (ex : multiplie par 100 la “size” d’un élément) , alors http://d3jsv5trial.tiddlyspot.com/#D3%20Zoomable%20Circle%20Pack%20Widget, qui appelle ce json, est mis à jour immédiatement.


#3

Je suis d’accord pour ton exemple, lorsqu’on édite un tiddler puis qu’on le valide, cela actualise les données. Mais ce que j’aurai dû indiquer dans mon premier message, c’est que je modifie les données du dataTiddler avec le widget EditTextWidget. Et là, cela ne fonctionne pas :confused:


#4

Je suis confronté au même problème que toi. En attendant je fais les mises à jour via un bouton
le code que j’ai mis en place est le suivant (tu peux le voir en action ici: http://archipel.tiddlyspot.com, dans le tiddler “Archipel”

\define selaction()
<$wikify name=myvalue text={{maMacroEnWikiText}} output="text">
<$fieldmangler tiddler="toto.csv">
<$action-setfield $tiddler="toto.csv" text=<<myvalue>> />
<$action-setfield  $tiddler="toto.csv" $field="type" $value="text/csv"/>
</$fieldmangler>
</$wikify>
\end

<$button actions=<<selaction>>>
Update button
</$button>

Mais cela ne me satisfait pas, je voudrais complètement me passer de bouton. J’avais laissé tombé l’affaire depuis quelques jours, mais je vais m’y replonger prochainement.
Je me dis qu’il doit y avoir moyen de créer un javascript qui reprend le code du widget Wikify…

Tiens moi au courant si tu trouves le truc…


#5

Je sais pas si on a exactement le même problème, en tous cas moi je voulais par exemple que ma macro Javascript additionne des données à partir de valeur contenus dans un dataTiddler. Et je voulais aussi, quelle s’actualise en même temps que les valeurs du dataTiddler changes.
Avec le Widget “EditTextWidget” cela fonctionne :

<dl>
  Valeur 1 : 
  <dd><$edit-text tiddler="$:/temp/data/variable" index="V1" tag="input"/></dd>
  Valeur 2 :
  <dd><$edit-text tiddler="$:/temp/data/variable" index="V2" tag="input"/></dd>
  Valeur 3 :
  <dd><$edit-text tiddler="$:/temp/data/variable" index="V3" tag="input"/></dd>
</dl>

Résultat = <$macrocall $name="maMacroJavascript"
V1={{$:/temp/data/variable##V1}}
V2={{$:/temp/data/variable##V2}}
V3={{$:/temp/data/variable##V3}}/>

Dans mon cas il me semble que c’est “EditTextWidget” qui actualise les macros du tiddlywiki.
Pour ton cas, j’ai lu sur le forum anglais une astuce pour actualiser une macro javascript en fonction d’une horloge (toute les deux seconde par exemple). Mais je ne la retrouve plus… :frowning:


#6

Bonsoir,
en fait pour développer un macro javascript j’utilise l’onglet “Console” javascript du navigateur (sous chrome: CTRL+MAJ+I)

J’écris la macro dans un tiddler mais avant de l’enregistrer je vais la copié collé dans la console puis je valide et hop elle automatiquement dispo !!

Par contre il faut utiliser une autre syntaxe, qui permet cette utilisation en temps réel.
Par exemple pour une macro nommée “updated”, avec un paramètres nommé param1 :

Ensuite la macro doit être ré-écrite proprement pour ne pas générer des erreurs à la sauvegarde du tiddlywiki

J’ai pas encore tester sous Node pas sous la main ici


#7

Bonjour,

Je ne sais pas si cela correspond à ton problème, mais pour rafraîchir un tiddler, j’utilise ce code trouvé sur le net :

<$button>
<$action-setfield $tiddler="$:/temp/trigger" $value=<<now "0hh:0mm:0ss">>/>
Refresh
</$button>

Ensuite, pour faire des calculs, je n’ai pas trouvé mieux que le plugin eval de @tobibeer
http://tobibeer.github.io/tw5-plugins/#eval
Bien suivre la doc, pour le configure :

[
    {"type":"math.js", "require": "$:/lib/math.js"},
    {"type":"math.js", "id":"mklauber/math.js", "require":"$:/plugins/mklauber/math.js/math.js"},
    {"type":"js"}
]

Et merci tout plein pour ton explication du bac à sable très utile, tu es formidable !


#8

Bonjour @luxool,

En fait tu expliques parfaitement en quelques lignes comment on fait, une fois JavaScript assimilé :tired_face:, pour l’intégrer dans un tiddler typé application/javascript

Super-intéressant en ce qui me concerne :heart_eyes:

Si tu as d’autres idées pour vulgariser JavaScript/TidlyWiki j’en serai un lecteur assidu.

Grand merci pour ce post!


#9

Merci a toi prolegomenes et aussi à oxydum

En fait, je galère un peu avec le langage de macro par contre je connais très bien Javascript donc je pense que mes développements futurs vont vite s’orienter dans ce genre là !


#10

Bonjour @luxool

Étant bien décidé à améliorer mes connaissances en JavaScript à la sauce TiddlyWiki, j’ai reproduit ton excellent exemple sur mon wiki.

Et je tombe sur le problème suivant :

En copiant le code JavaScript “brut” sur la console, je n’ai pas d’erreur et la macro fonctionne bien dans mon wiki (j’étais donc super content :grinning:)

Puis après la sauvegarde du wiki et au redémarrage, rien ne va plus et la macro ne fonctionne pas.

Donc je me dis qu’il doit y avoir un souci dans la macro TiddlyWiki. Ai-je raté quelque chose ?

En tout cas je comprend maintenant beaucoup mieux pourquoi il est important de tester les macros dans la console avant de la présenter façon TiddlyWiki :laughing:

Peux tu avoir la gentillesse de regarder ce que j’ai fait et de me dire où se trouve le problème ?

Tout le dossier (3 tiddlers) se trouve ICI

J’ai certainement fait une boulette quelque part mais je n’arrive pas à trouver où :rage:

Je continue à piocher …

Merci infiniment d’avance.


#11

Salut Eric,

Si j’ai bien lu :
https://prolegomenes.github.io/learn/Learn2215117.html#JavaScript%20Macros

Il faut “fielder” la macro avec un champ module-type avec la valeur macro


#12

Si je fais ce que tu dis je plante le wiki avec ce message:

nternal JavaScript Error

Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser

Syntax error in boot module Macro TiddlyWiki:22: _boot/$tw.utils.evalGlobal@file:///E:/WikiPerso/Learn2215119.html:93371:8 _boot/$tw.modules.execute@file:///E:/WikiPerso/Learn2215119.html:93660:5 _boot/$tw.modules.forEachModuleOfType/<@file:///E:/WikiPerso/Learn2215119.html:93700:18 _boot/$tw.utils.each@file:///E:/WikiPerso/Learn2215119.html:93006:12 _boot/$tw.modules.forEachModuleOfType@file:///E:/WikiPerso/Learn2215119.html:93699:2 _boot/$tw.modules.getModulesByTypeAsHashmap@file:///E:/WikiPerso/Learn2215119.html:93710:


#13

Salut Jean-Bernard

Je vois que je ne t’ai pas même salué :disappointed_relieved: C’est que ce problème me tracasse


#14

Tu es tout pardonné Eric, l’essentiel, c’est aussi de progresser par l’erreur. Ici nous en avons une qui nous indique que la macro s’active avec un code incorrect.
Plutôt que de te servir une solution tirée de mon chapeau, je te propose de réaliser par toi-même une autre façon d’adapter et de packager cette macro. Pourquoi ? J’ai vu que dans la proposition de @luxool il y avait des “export” au lieu d’un “exports”… Bref.

  1. Rendez-vous dans Plus et Explorer à la recherche de :
    $:/core/modules/macros/qualify.js

  2. Cloner (tu l’appelles Macro TiddlyWiki.js par exemple)

  3. tu adaptes à ta sauce,

    exports.name = “qualify”; devient
    exports.name = “updated”;
    en option les deux “title” peuvent être renommé en “param1”
    et enfin

  4. tu remplaces return title + "-" + this.getStateQualifier(); par return "Mise a jour "+ param1+" !!" ;

  5. tu testes et tu nous dis ce que tu penses de cette démarche. :smiley:


#15

Bonjour Jean-Bernard,

Aujourd’hui dans mon coin du globe, c’est soleil… mais ça caille!!

Peux tu préciser cette partie:

Mon code source indique:

this.setVariable(this.qualifyName,this.qualifyTitle + "-" + this.getStateQualifier());

Est-ce cela que je dois remplacer par :

?

Pour le reste:

J’ai remplacé:

exports.qualify = QualifyWidget;

Par:

Puis:

this.qualifyTitle = this.getAttribute("title");

Par:

this.qualifyTitle = this.getAttribute(“param1”);

Et:

if(changedAttributes.name || changedAttributes.title) {

par:

if(changedAttributes.name || changedAttributes.param1) {

Je t’avoue que je marche un peu sur des oeufs!!

À te lire cher Professeur !


#16

Désolé Eric, c’est de ma faute.
C’est celui-ci qu’il faut cloner :
$:/core/modules/macros/qualify.js


#17

Jean-Bernard,

Ah bon ! Je me sens mieux tout d’un coup :sweat_smile:

OK je regarde tout ceci et je reviens vers toi.


#18

Jean Bernard

Tu es lumineux et indispensable!!:drum:

J’ai ré-écrit tout ceci correctement et en détail sur mon wiki…

Pour peut-être clôturer ce topic, voici donc le code de la macro et le tiddler de visualisation:

1- Macro (Type application/javascript + champ module-type “macro”)

/*
title: Macro TiddlyWiki.js
type: application/javascript
module-type: macro

*/
(function(){

/*jslint node: true, browser: true */
/*global $tw: false */
“use strict”;

/*
Informations sur la macro
*/

exports.name = “updated”;

exports.params = [
{name: “param1”}
];

/*
Exécuter la macro
*/
exports.run = function(param1) {
return “est rendue disponible le “+ param1+” !!” ;
};

})();

2- Tiddler d’utilisation de la macro (exemple):

La version<> de TiddlyWiki <<updated “21 décembre 2018”>>

Il n’en demeure pas moins que l’idée de @luxool de préalablement tester les macros sur la console est très intéressante. Au moins pour éviter les plantages sauvages du wiki!!

Dans cet exemple comment isoler le javascript “brut” pour faire un test préalable ?. Et peut on tout tester ainsi ?


#19

Bravo Éric pour tes partages, tes efforts et tes progrès !

Pour l’approche de @luxool, j’avais essayé ça :

(function(){
toto=
{ name : "toto",
  params : [ { name : "param1" } ] ,
  run : function (param1)
  {
    return "Mise a jour  "+ param1+" !!" ;
  }
}
exports.name=toto.name;
exports.params=toto.params;
exports.run=toto.run;
})();

Je crois que les variables de type tableau en JS ce n’est pas simple !
Par exemple si on veut passer deux params, il faut coder :
params : [ { name : "param1" }, { name : "param2" } ] ,

J’ai fouillé et trouvé ça ici :

Décidément, j’adore tiddlywiki ! :sunglasses: