Note : Obtenez une palette prête à l'emploi grâce à cette fonctionnalité aquí .
La solution d'Arnoud m'a excité et rendu impatient, alors voici une amélioration de celle-ci. Je n'aurais pas pu le faire sans étudier son code. Cette version semble être un peu plus fiable et moins sujette aux erreurs de timeout, mais pour être honnête, je ne connais pas du tout Java, donc toute amélioration est la bienvenue.
Le plus important : cette version télécharge vers stack.imgur.com
directement, ce qui permet de l'utiliser en toute sécurité sur StackOverflow, sans avoir à craindre que les images téléchargées ne disparaissent au bout d'un certain temps.
J'assure trois fonctions :
-
stackImage
télécharge l'expression, exportée en PNG, et renvoie l'URL
-
stackMarkdown
renvoie le texte de démarquage, prêt à être copié
-
stackCopyMarkdown
Copie le texte de démarquage dans le presse-papiers
Prochaine étape : créer un bouton de palette qui fait cela automatiquement pour le graphique sélectionné dans le carnet de notes. Les améliorations du code sont les bienvenues.
Needs["JLink`"]
stackImage::httperr = "Server returned respose code: `1`";
stackImage::err = "Server returner error: `1`";
stackImage[g_] :=
Module[
{getVal, url, client, method, data, partSource, part, entity, code,
response, error, result},
(* this function attempts to parse the response fro the SO server *)
getVal[res_, key_String] :=
With[{k = "var " <> key <> " = "},
StringTrim[
First@StringCases[First@Select[res, StringMatchQ[#, k ~~ ___] &],
k ~~ v___ ~~ ";" :> v],
"'"]
];
data = ExportString[g, "PNG"];
JavaBlock[
url = "https://stackoverflow.com/upload/image";
client = JavaNew["org.apache.commons.httpclient.HttpClient"];
method = JavaNew["org.apache.commons.httpclient.methods.PostMethod", url];
partSource = JavaNew["org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource", "mmagraphics.png", MakeJavaObject[data]@toCharArray[]];
part = JavaNew["org.apache.commons.httpclient.methods.multipart.FilePart", "name", partSource];
part@setContentType["image/png"];
entity = JavaNew["org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity", {part}, method@getParams[]];
method@setRequestEntity[entity];
code = client@executeMethod[method];
response = method@getResponseBodyAsString[];
]
If[code =!= 200, Message[stackImage::httperr, code]; Return[$Failed]];
response = StringTrim /@ StringSplit[response, "\n"];
error = getVal[response, "error"];
result = getVal[response, "result"];
If[StringMatchQ[result, "http*"],
result,
Message[stackImage::err, error]; $Failed]
]
stackMarkdown[g_] := ""
stackCopyMarkdown[g_] := Module[{nb, markdown},
markdown = Check[stackMarkdown[g], $Failed];
If[markdown =!= $Failed,
nb = NotebookCreate[Visible -> False];
NotebookWrite[nb, Cell[markdown, "Text"]];
SelectionMove[nb, All, Notebook];
FrontEndTokenExecute[nb, "Copy"];
NotebookClose[nb];
]
]
Mise à jour :
Voici un bouton qui affichera un aperçu de la sélection et proposera le téléchargement (ou l'annulation). Il nécessite que les fonctions précédentes soient définies.
Button["Upload to SO",
Module[{cell = NotebookRead@InputNotebook[], img},
If[cell =!= {}, img = Rasterize[cell];
MessageDialog[
Column[{"Upload image to StackExchange sites?",
img}], {"Upload and copy MarkDown" :> stackCopyMarkdown[img],
"Cancel" :> Null}, WindowTitle -> "Upload to StackExchange"]]]]
Malheureusement, je ne peux pas placer le bouton dans une palette ( CreatePalette
) car les dimensions de la palette vont influencer le tramage. Les solutions à ce problème sont les bienvenues.
Mise à jour 2 :
En fonction de la réponse à la question cette question Voici un bouton de palette fonctionnant uniquement sous Windows :
button = Button["Upload to SO",
Module[{sel},
FrontEndExecute[
FrontEndToken[FrontEnd`SelectedNotebook[], "CopySpecial", "MGF"]];
sel = Cases[NotebookGet@ClipboardNotebook[],
RasterBox[data_, ___] :>
Image[data, "Byte", ColorSpace -> "RGB", Magnification -> 1],
Infinity];
If[sel =!= {},
With[{img = First[sel]},
MessageDialog[
Column[{"Upload image to StackExchange sites?",
img}], {"Upload and copy MarkDown" :> stackCopyMarkdown[img],
"Cancel" :> Null}, WindowTitle -> "Upload to StackExchange"]
]
]
]
]
CreatePalette[button]
Attention : il détruit le contenu du presse-papiers même si vous cliquez sur annuler dans la boîte d'aperçu.
2 votes
Veuillez noter que le téléchargement vers
http://i.stack.imgur.com/
est plus difficile (vous devrez "conduire" l'interface SO)0 votes
@belisarius Oups, je n'avais pas réalisé que StackOverflow utilise un site imgur séparé ... Sur le site principal d'imgur, les images peuvent ne pas être conservées pour toujours, donc ce n'est peut-être pas une bonne idée de l'utiliser pour SO imgur.com/faq#long (il faut au moins 1 vue / 6 mois pour qu'elles soient conservées)
4 votes
Publier des graphiques manuellement n'est pas vraiment si difficile (dans V8). Faites un clic droit sur un graphique, choisissez "Enregistrer l'image sous...". La boîte de dialogue du fichier s'ouvre alors à l'endroit où il se trouvait la dernière fois, c'est-à-dire généralement sur mon bureau où un fichier appelé output.png attend déjà d'être écrasé par sa prochaine incarnation. Deux clics suffisent, deux autres clics et il est affiché dans ma boîte de réponse SO. Cela prend 15 secondes au maximum. Obtenir la ligne Markdown et la coller prendra à peu près le même temps.
0 votes
@Sjoerd Lorsque je poste dans la balise <tag>image-processing</tag>, je dois répéter cela encore et encore....
0 votes
@belisarius Mais avec la solution proposée, il faudrait taper
imgur[g]
pour chaque figure que vous voulez inclure également, ainsi que copier et coller le texte de démarquage. Il ne semble pas y avoir une grande différence en termes d'effort.0 votes
@Sjoerd Oui, mais ce n'est que la première étape d'une autre histoire. L'idée est dans les commentaires ici stackoverflow.com/questions/8034298/
0 votes
@Sjoerd On peut aussi le transformer en palette et le faire fonctionner en un seul clic.
0 votes
@belisarius Malheureusement, il n'y a pas de moyen officiel de télécharger vers
stack.imgur.com
en ce moment. Voir ici : stackapps.com/questions/2664/