Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédenteProchaine révisionLes deux révisions suivantes | ||
fr:logiciel:internet:dokuwiki:plugins:cli:start [2021/02/15 12:08] – ↷ Page déplacée de logiciel:internet:dokuwiki:plugins:cli:start à fr:logiciel:internet:dokuwiki:plugins:cli:start admin | logiciel:internet:dokuwiki:plugins:cli:start [2022/08/25 14:46] – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | {{tag> | ||
- | ====== CLI : plugin Command Line Interface pour Dokuwiki ====== | ||
- | |||
- | Ce plugin formate la sortie d'une ligne de commande, par exemple pour un manuel d' | ||
- | Il est conçu pour fonctionner avec la sortie d'un shell Unix standard, mais devrait convenir pour documenter d' | ||
- | |||
- | Sa conception permet d' | ||
- | |||
- | On peut ajuster le style de l' | ||
- | |||
- | ====== Introduction ====== | ||
- | |||
- | ====== Pré-requis ====== | ||
- | |||
- | On suppose que : | ||
- | * toutes les commandes utilisateur commencent par une invite | ||
- | * l' | ||
- | * les commandes utilisateur suivent l' | ||
- | * les lignes qui ne commencent pas par une invite sont des sorties de CLI ((c' | ||
- | |||
- | <WRAP center round important 60%> | ||
- | **Avec PHP 7** | ||
- | |||
- | Pour les plugins qui donnent des erreurs, | ||
- | éditez le fichier **lib/ | ||
- | * remplacez tous les **& | ||
- | * remplacez tous les **& | ||
- | |||
- | comme indiqué dans les messages d' | ||
- | </ | ||
- | |||
- | ====== Installation ====== | ||
- | |||
- | Le code source de ce plugin est hébergé chez GitHub à [[https:// | ||
- | |||
- | Pour installer le plugin lorsque **git** est installé sur votre serveur DokuWiki, il vous suffit de lancer depuis votre serveur : | ||
- | * < | ||
- | $ git clone git:// | ||
- | |||
- | Le dossier contiendra : | ||
- | ? style.css | ||
- | : tous les styles pour cli | ||
- | ? syntax.php | ||
- | : plugin script | ||
- | |||
- | Le plugin est maintenant installé. | ||
- | |||
- | Details | ||
- | |||
- | <code php syntax.php> | ||
- | <?php | ||
- | /** | ||
- | * Command Line Interface (CLI) Plugin | ||
- | | ||
- | * Syntax: | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | * | ||
- | * Acknowledgements: | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | * @license | ||
- | * @author | ||
- | */ | ||
- | |||
- | if(!defined(' | ||
- | if(!defined(' | ||
- | require_once(DOKU_PLUGIN.' | ||
- | |||
- | /** | ||
- | * All DokuWiki plugins to extend the parser/ | ||
- | * need to inherit from this class | ||
- | */ | ||
- | class syntax_plugin_cli extends DokuWiki_Syntax_Plugin { | ||
- | |||
- | var $prompt_str = '$ '; | ||
- | var $prompt_cont = '/ | ||
- | var $prompt_continues = false; | ||
- | var $comment_str = '#'; | ||
- | |||
- | /** | ||
- | * return some info | ||
- | */ | ||
- | function getInfo(){ | ||
- | return array( | ||
- | ' | ||
- | ' | ||
- | ' | ||
- | ' | ||
- | ' | ||
- | ' | ||
- | ); | ||
- | } | ||
- | |||
- | /** | ||
- | * What kind of syntax are we? | ||
- | */ | ||
- | function getType(){ | ||
- | return ' | ||
- | } | ||
- | |||
- | /** | ||
- | * What kind of syntax do we allow (optional) | ||
- | */ | ||
- | // function getAllowedTypes() { | ||
- | // return array(); | ||
- | // } | ||
- | |||
- | // override default accepts() method to allow nesting | ||
- | // - ie, to get the plugin accepts its own entry syntax | ||
- | function accepts($mode) { | ||
- | if ($mode == substr(get_class($this), | ||
- | return parent:: | ||
- | } | ||
- | |||
- | /** | ||
- | * What about paragraphs? (optional) | ||
- | */ | ||
- | function getPType(){ | ||
- | return ' | ||
- | } | ||
- | |||
- | /** | ||
- | * Where to sort in? | ||
- | | ||
- | function getSort(){ | ||
- | return 601; | ||
- | } | ||
- | |||
- | |||
- | /** | ||
- | * Connect pattern to lexer | ||
- | */ | ||
- | function connectTo($mode) { | ||
- | | ||
- | '" | ||
- | ' | ||
- | ' | ||
- | ' | ||
- | /* | ||
- | * The [)]? and |[(?:] is to work around a bug in lexer.php | ||
- | * wrt nested (...) | ||
- | */ | ||
- | } | ||
- | |||
- | function postConnect() { | ||
- | | ||
- | } | ||
- | |||
- | |||
- | /** | ||
- | * Handle the match | ||
- | */ | ||
- | function handle($match, | ||
- | switch ($state) { | ||
- | case DOKU_LEXER_ENTER : | ||
- | $args = substr($match, | ||
- | return array($state, | ||
- | case DOKU_LEXER_MATCHED : | ||
- | break; | ||
- | case DOKU_LEXER_UNMATCHED : | ||
- | return array($state, | ||
- | case DOKU_LEXER_EXIT : | ||
- | return array($state, | ||
- | case DOKU_LEXER_SPECIAL : | ||
- | break; | ||
- | } | ||
- | return array(); | ||
- | } | ||
- | |||
- | /** | ||
- | * Create output | ||
- | */ | ||
- | function render($mode, | ||
- | if($mode == ' | ||
- | | ||
- | | ||
- | case DOKU_LEXER_ENTER : | ||
- | $args = $match; | ||
- | | ||
- | | ||
- | | ||
- | case DOKU_LEXER_UNMATCHED : | ||
- | | ||
- | | ||
- | case DOKU_LEXER_EXIT : | ||
- | | ||
- | | ||
- | } | ||
- | | ||
- | } | ||
- | return false; | ||
- | } | ||
- | |||
- | | ||
- | /* | ||
- | * extracts value from $args for $param | ||
- | * xxx = " | ||
- | * xxx = a\ b -> a b | ||
- | * xxx = ' | ||
- | * | ||
- | * returns null if value is empty. | ||
- | */ | ||
- | if (preg_match("/ | ||
- | '" | ||
- | ' | ||
- | ' | ||
- | ' | ||
- | | ||
- | case "'": | ||
- | | ||
- | | ||
- | | ||
- | case '"': | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | } | ||
- | if ($result != "" | ||
- | | ||
- | } | ||
- | } | ||
- | |||
- | | ||
- | // process args to CLI tag: sets $comment_str and $prompt_str | ||
- | if (!is_null($prompt = $this-> | ||
- | | ||
- | if (!is_null($comment = $this-> | ||
- | | ||
- | } | ||
- | |||
- | function _render_conversation($match, | ||
- | $prompt_continues = false; | ||
- | $lines = preg_split('/ | ||
- | if ( trim($lines[0]) == "" | ||
- | if ( trim($lines[count($lines)]) == "" | ||
- | foreach ($lines as $line) { | ||
- | $index = strpos($line, | ||
- | if ($index === false) { | ||
- | if ($this-> | ||
- | if (preg_match($this-> | ||
- | } | ||
- | if ($this-> | ||
- | // format prompt | ||
- | $renderer-> | ||
- | // Split line into command + optional comment (only end-of-line comments supported) | ||
- | $command = preg_split($this-> | ||
- | $commands = explode($this-> | ||
- | // Render command | ||
- | $renderer-> | ||
- | // Render comment if there is one | ||
- | if ($commands[1]) { | ||
- | $renderer-> | ||
- | $renderer-> | ||
- | } | ||
- | $renderer-> | ||
- | } else { | ||
- | // render as output | ||
- | $renderer-> | ||
- | $this-> | ||
- | } | ||
- | } else { | ||
- | $this-> | ||
- | // format prompt | ||
- | $prompt = substr($line, | ||
- | $renderer-> | ||
- | // Split line into command + optional comment (only end-of-line comments supported) | ||
- | $commands = explode($this-> | ||
- | // Render command | ||
- | | ||
- | // Render comment if there is one | ||
- | if ($commands[1]) { | ||
- | | ||
- | $renderer-> | ||
- | } | ||
- | | ||
- | } | ||
- | } | ||
- | } | ||
- | } | ||
- | //Setup VIM: ex: et ts=4 enc=utf-8 sw=4 : | ||
- | ?> | ||
- | </ | ||
- | |||
- | style.css | ||
- | |||
- | These may be modified to suit your own requirements. | ||
- | |||
- | <code css style.css> | ||
- | /* plugin:cli */ | ||
- | |||
- | .cli_output { | ||
- | color: blue; | ||
- | } | ||
- | |||
- | .cli_comment { | ||
- | color: brown; | ||
- | } | ||
- | |||
- | .cli_prompt { | ||
- | color: green; | ||
- | } | ||
- | |||
- | .cli_command { | ||
- | color: red; | ||
- | } | ||
- | |||
- | // nested CLI | ||
- | pre.cli pre.cli { | ||
- | background-color: | ||
- | } | ||
- | |||
- | /* end plugin:cli */ | ||
- | </ | ||
- | |||
- | ====== Configuration ====== | ||
- | |||
- | Le plugin n'a pas de paramètres de configuration, | ||
- | |||
- | ====== Utilisation ====== | ||
- | |||
- | ===== Syntaxe ===== | ||
- | |||
- | Une interaction Bash simple : | ||
- | <code - > | ||
- | <cli> | ||
- | user@host: | ||
- | conf lang | ||
- | info.txt | ||
- | user@host: | ||
- | </ | ||
- | </ | ||
- | |||
- | s' | ||
- | <cli> | ||
- | user@host: | ||
- | conf lang | ||
- | info.txt | ||
- | user@host: | ||
- | </ | ||
- | |||
- | Syntaxe complète : | ||
- | |||
- | <code - > | ||
- | <cli prompt=' | ||
- | transcript | ||
- | </ | ||
- | </ | ||
- | s' | ||
- | <cli prompt=' | ||
- | transcript | ||
- | </ | ||
- | ? prompt — [facultatif] | ||
- | : invite utilisée par CLI. ((En pratique, seul le caractère final est nécessaire, | ||
- | ? comment — [facultatif] | ||
- | : chaîne de commentaire utilisée par CLI. Si omis, '#' | ||
- | ? continue – [facultatif] | ||
- | : invite utilisée pour les marqueurs de continuation: | ||
- | * Les valeurs par défaut ci-dessus correspondent aux invites et commentaires $ {PS1} et $ {PS2} de Bourne shell | ||
- | |||
- | Le %%<cli … >%% du début doit apparaître sur une seule ligne. Le contenu de la transcription peut apparaître sur autant de lignes que nécessaire. | ||
- | |||
- | ===== Exemples ===== | ||
- | |||
- | Cette page fournit un ensemble de tests pour cli et sert également d' | ||
- | |||
- | ==== Script shell de base ==== | ||
- | |||
- | Texte : | ||
- | <code - > | ||
- | <cli> | ||
- | user@host: | ||
- | conf lang | ||
- | info.txt | ||
- | user@host: | ||
- | 55 108 1032 info.txt | ||
- | user@host: | ||
- | </ | ||
- | </ | ||
- | |||
- | Résultat : | ||
- | <cli> | ||
- | user@host: | ||
- | conf lang | ||
- | info.txt | ||
- | user@host: | ||
- | 55 108 1032 info.txt | ||
- | user@host: | ||
- | </ | ||
- | |||
- | ==== Script shell avec commentaires ==== | ||
- | |||
- | Texte : | ||
- | <code - > | ||
- | <cli comment="#"> | ||
- | user@host: | ||
- | conf lang | ||
- | info.txt | ||
- | user@host: | ||
- | </ | ||
- | </ | ||
- | |||
- | ==== Script shell root avec commentaires ==== | ||
- | |||
- | Texte : (caractère de commentaire shell par défaut): | ||
- | <code - > | ||
- | <cli prompt="#"> | ||
- | root@host: | ||
- | conf lang | ||
- | info.txt | ||
- | root@host: | ||
- | </ | ||
- | </ | ||
- | |||
- | Résultat : | ||
- | <cli prompt="#"> | ||
- | root@host: | ||
- | conf lang | ||
- | info.txt | ||
- | root@host: | ||
- | </ | ||
- | |||
- | Ceci est également valable : | ||
- | <code - > | ||
- | <cli prompt="# | ||
- | root@host: | ||
- | conf lang | ||
- | info.txt | ||
- | root@host: | ||
- | </ | ||
- | </ | ||
- | |||
- | <cli prompt="# | ||
- | root@host: | ||
- | conf lang | ||
- | info.txt | ||
- | root@host: | ||
- | </ | ||
- | |||
- | Exemple avec une invite de continuation: | ||
- | |||
- | <code - > | ||
- | <cli prompt=" | ||
- | user@host: | ||
- | > # List directory | ||
- | file1 file2 | ||
- | </ | ||
- | </ | ||
- | |||
- | <cli prompt=" | ||
- | user@host: | ||
- | > # List directory | ||
- | file1 file2 | ||
- | </ | ||
- | |||
- | ==== Script shell avec commentaires ==== | ||
- | |||
- | <code - > | ||
- | <cli prompt=" | ||
- | user@host: | ||
- | conf lang | ||
- | info.txt | ||
- | user@host: | ||
- | </ | ||
- | </ | ||
- | |||
- | ==== Fenêtre de commande Windows ==== | ||
- | |||
- | Texte : | ||
- | <code - > | ||
- | <cli prompt=">" | ||
- | C: | ||
- | C: | ||
- | 'hello world!' | ||
- | </ | ||
- | </ | ||
- | |||
- | Résultat : | ||
- | <cli prompt=">" | ||
- | C: | ||
- | C: | ||
- | 'hello world!' | ||
- | </ | ||
- | |||
- | ==== Ruby irb ==== | ||
- | |||
- | Une implémentation simple ne fonctionnera pas pour les résultats car la fin de l' | ||
- | |||
- | <code - > | ||
- | <cli prompt=">"> | ||
- | irb(main): | ||
- | => 4 | ||
- | irb(main): | ||
- | </ | ||
- | </ | ||
- | |||
- | ==== Python ==== | ||
- | |||
- | <code - > | ||
- | <cli prompt=">>>"> | ||
- | ActivePython 2.5.1.1 (ActiveState Software Inc.) based on | ||
- | Python 2.5.1 (r251: | ||
- | win32 | ||
- | Type " | ||
- | >>> | ||
- | 4 | ||
- | >>> | ||
- | </ | ||
- | </ | ||
- | |||
- | ==== Python + Windows Shell (Nested CLIs) ==== | ||
- | |||
- | Texte : | ||
- | <code - > | ||
- | <cli prompt=">"> | ||
- | C: | ||
- | <cli prompt=">>>"> | ||
- | ActivePython 2.5.1.1 (ActiveState Software Inc.) based on | ||
- | Python 2.5.1 (r251: | ||
- | win32 | ||
- | Type " | ||
- | >>> | ||
- | 4 | ||
- | >>> | ||
- | |||
- | </ | ||
- | C: | ||
- | </ | ||
- | </ | ||
- | |||
- | Résultat : | ||
- | <cli prompt=">"> | ||
- | C: | ||
- | <cli prompt=">"> | ||
- | ActivePython 2.5.1.1 (ActiveState Software Inc.) based on | ||
- | Python 2.5.1 (r251: | ||
- | win32 | ||
- | Type " | ||
- | >>> | ||
- | 4 | ||
- | >>> | ||
- | |||
- | </ | ||
- | C: | ||
- | </ | ||
- | |||
- | ==== Cas particuliers ==== | ||
- | |||
- | * Les codes suivants ne s' | ||
- | < | ||
- | <cli prompt="#"> | ||
- | # rpm -ivh darcs-1.0.9-3.fc6.i386.rpm | ||
- | Preparing... | ||
- | | ||
- | </ | ||
- | </ | ||
- | |||
- | <cli prompt="#"> | ||
- | # rpm -ivh darcs-1.0.9-3.fc6.i386.rpm | ||
- | Preparing... | ||
- | | ||
- | </ | ||
- | |||
- | Pas sûr de pouvoir résoudre ce problème car le marqueur de progression de téléchargement utilise le même caractère que l' | ||
- | |||
- | * CLI ne doit pas supprimer silencieusement des lignes blanches intentionnelles: | ||
- | |||
- | <cli prompt=" | ||
- | user@host: | ||
- | conf lang | ||
- | info.txt | ||
- | |||
- | |||
- | user@host: | ||
- | </ | ||
- | |||
- | ====== Désinstallation ====== | ||
- | |||
- | ====== Voir aussi ====== | ||
- | |||
- | * **(fr)** [[https:// | ||
- | * **(en)** [[http:// | ||
- | * **(en)** [[https:// | ||
- | * **(en)** [[http:// | ||
- | * **(fr)** [[https:// | ||
- | |||
- | ---- | ||
- | //Basé sur << [[http:// |