[geany/geany-plugins] c07e2d: Merge pull request #551 from b4n/geniuspaste/update-pastebins

Frank Lanitz git-noreply at xxxxx
Sat Apr 8 14:40:14 UTC 2017


Branch:      refs/heads/master
Author:      Frank Lanitz <frank at frank.uvena.de>
Committer:   GitHub <noreply at github.com>
Date:        Sat, 08 Apr 2017 14:40:14 UTC
Commit:      c07e2ddce906b121c117076b5e41eb825ff3d6db
             https://github.com/geany/geany-plugins/commit/c07e2ddce906b121c117076b5e41eb825ff3d6db

Log Message:
-----------
Merge pull request #551 from b4n/geniuspaste/update-pastebins

geniuspaste: Update pastebins


Modified Paths:
--------------
    geniuspaste/README
    geniuspaste/data/Makefile.am
    geniuspaste/data/dpaste.de.conf
    geniuspaste/data/fpaste.org.conf
    geniuspaste/data/tinypaste.com.conf
    geniuspaste/src/geniuspaste.c

Modified: geniuspaste/README
9 lines changed, 6 insertions(+), 3 deletions(-)
===================================================================
@@ -15,7 +15,6 @@ services, but more can be added:
 	* pastebin.geany.org
 	* paste.debian.net
 	* sprunge.us
-	* tinypaste.com
 
 GeniusPaste detects automatically the syntax of the code and pastes it
 with syntax highlighting enabled.
@@ -67,7 +66,7 @@ Placeholders
 
 Values from the `[format] section`_ and the *replace* key in the `[parse]
 section`_ can contain references to placeholders with the syntax ``%name%``
-(i.e. ``%contents%``).
+(e.g. ``%contents%``).
 Custom placeholders can be defined in the `[defaults] section`_.
 
 The builtin placeholders are:
@@ -95,6 +94,10 @@ The *pastebin* section is required, and must contain at least the *name* and
 	The URL to which submit the data.  This key is required.
 *method*
 	The HTTP method to use to submit the data.  Defaults to ``POST``.
+*content-type*
+	The Content-Type the request body should be sent in.  Currently supported
+	types include ``application/x-www-form-urlencoded`` and ``application/json``.
+	Defaults to ``application/x-www-form-urlencoded``.
 
 *[format]* section
 ++++++++++++++++++
@@ -121,7 +124,7 @@ enable response body parsing, and it will use the default *search* and
 *search*
 	A regular expression (PCRE) pattern to match against the pastebin
 	service's raw response data.
-	Defaults to ``^[[:space:]]*(.+?)[[:space:]]*$``, e.g. capture everything
+	Defaults to ``^[[:space:]]*(.+?)[[:space:]]*$``, i.e. capture everything
 	but the leading and trailing whitespaces.
 *replace*
 	The final URL, with regular expression capture groups from *search*


Modified: geniuspaste/data/Makefile.am
3 lines changed, 1 insertions(+), 2 deletions(-)
===================================================================
@@ -8,5 +8,4 @@ dist_pastebins_DATA = \
 	fpaste.org.conf \
 	pastebin.geany.org.conf \
 	paste.debian.net.conf \
-	sprunge.us.conf \
-	tinypaste.com.conf
+	sprunge.us.conf


Modified: geniuspaste/data/dpaste.de.conf
4 lines changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -1,9 +1,9 @@
 [pastebin]
 name=dpaste.de
-url=http://dpaste.de/api/
+url=https://dpaste.de/api/
 
 [format]
-title=%title%
+filename=%title%
 content=%contents%
 lexer=%language%
 #expires=%expire%


Modified: geniuspaste/data/fpaste.org.conf
98 lines changed, 43 insertions(+), 55 deletions(-)
===================================================================
@@ -1,67 +1,55 @@
 [pastebin]
 name=fpaste.org
-url=http://fpaste.org/
+url=https://paste.fedoraproject.org/api/paste/submit
+content-type=application/json
 
 [format]
-paste_data=%contents%
-paste_lang=%language%
-api_submit=true
-mode=xml
+contents=%contents%
+language=%language%
+title=%title%
 
 # Optional stuff
 
-paste_user=%user%
-# expiration in seconds
-#paste_expire=0
+# expiration date in UNIX timestamp
+#expiry_time=1453355837
+# Password for accessing the paste
+#password=password123
 
 [parse]
-search=<id>(.+?)</id>
-replace=http://fpaste.org/\1
+search="url" *: *"([^"]+)"
+replace=\1
 
 # map GeanyFileType=PastebinFileType
 [languages]
-# map for GeSHi 2015-01-14
-ActionScript=Actionscript
-Ada=ADA
-ASM=ASM
-C=C
-C#=C#
-C++=C++
-COBOL=COBOL
-Conf=INI
-CSS=CSS
-CUDA=C
-Cython=Python
-D=D
-Diff=Diff
-Docbook=XML
-F77=Fortran
-Fortran=Fortran
-FreeBasic=FreeBasic
-GLSL=C
-Haskell=Haskell
-HTML=HTML
-Java=Java
-Javascript=Javascript
-JSON=Javascript
-LaTeX=LaTeX
-Lisp=Lisp
-Lua=Lua
-Make=Make
-NSIS=NSIS
-Objective-C=Objective-C
-Pascal=Pascal
-Perl=Perl
-PHP=PHP
-Po=GetText
-PowerShell=PowerShell
-Prolog=Prolog
-Python=Python
-Ruby=Ruby
-Scala=Scala
-Sh=Bash
-SQL=SQL
-Tcl=TCL
-Verilog=Verilog
-VHDL=VHDL
-XML=XML
+# based off the list on the pastebin's web frontend
+CMake=cmake
+CoffeeScript=coffeescript
+CSS=css
+D=d
+Diff=diff
+Elm=elm
+Erlang=erlang
+Factor=factor
+F77=fortran
+Fortran=fortran
+Go=go
+Haskell=haskell
+HTML=htmlmixed
+Javascript=javascript
+Jinja2=jinja2
+Markdown=markdown
+Matlab/Octave=octave
+PHP=php
+Python=python
+RPM=rpm
+Ruby=ruby
+Rust=rust
+SASS=sass
+Sh=shell
+Smalltalk=smalltalk
+SQL=sql
+Swift=swift
+Verilog=verilog
+VHDL=vhdl
+XML=xml
+YAML=yaml


Modified: geniuspaste/data/tinypaste.com.conf
20 lines changed, 0 insertions(+), 20 deletions(-)
===================================================================
@@ -1,20 +0,0 @@
-# FIXME: outdated, this leads to a 404 on http://pasted.co/
-[pastebin]
-name=tinypaste.com
-url=http://tinypaste.com/api/create.xml
-
-[format]
-paste=%contents%
-title=%title%
-is_code=%language%
-
-[parse]
-search=<response>(.*)</response>
-replace=\1
-
-[defaults]
-language=1
-
-# map GeanyFileType=PastebinFileType
-[languages]
-None=0


Modified: geniuspaste/src/geniuspaste.c
133 lines changed, 118 insertions(+), 15 deletions(-)
===================================================================
@@ -50,16 +50,17 @@
 #define GTK_COMBO_BOX_TEXT             GTK_COMBO_BOX
 #endif
 
-#define PASTEBIN_GROUP_DEFAULTS             "defaults"
-#define PASTEBIN_GROUP_FORMAT               "format"
-#define PASTEBIN_GROUP_LANGUAGES            "languages"
-#define PASTEBIN_GROUP_PARSE                "parse"
-#define PASTEBIN_GROUP_PARSE_KEY_SEARCH     "search"
-#define PASTEBIN_GROUP_PARSE_KEY_REPLACE    "replace"
-#define PASTEBIN_GROUP_PASTEBIN             "pastebin"
-#define PASTEBIN_GROUP_PASTEBIN_KEY_NAME    "name"
-#define PASTEBIN_GROUP_PASTEBIN_KEY_URL     "url"
-#define PASTEBIN_GROUP_PASTEBIN_KEY_METHOD  "method"
+#define PASTEBIN_GROUP_DEFAULTS                     "defaults"
+#define PASTEBIN_GROUP_FORMAT                       "format"
+#define PASTEBIN_GROUP_LANGUAGES                    "languages"
+#define PASTEBIN_GROUP_PARSE                        "parse"
+#define PASTEBIN_GROUP_PARSE_KEY_SEARCH             "search"
+#define PASTEBIN_GROUP_PARSE_KEY_REPLACE            "replace"
+#define PASTEBIN_GROUP_PASTEBIN                     "pastebin"
+#define PASTEBIN_GROUP_PASTEBIN_KEY_NAME            "name"
+#define PASTEBIN_GROUP_PASTEBIN_KEY_URL             "url"
+#define PASTEBIN_GROUP_PASTEBIN_KEY_METHOD          "method"
+#define PASTEBIN_GROUP_PASTEBIN_KEY_CONTENT_TYPE    "content-type"
 
 GeanyPlugin *geany_plugin;
 GeanyData *geany_data;
@@ -73,6 +74,13 @@ typedef struct
 }
 Pastebin;
 
+typedef enum
+{
+    FORMAT_HTML_FORM_URLENCODED,
+    FORMAT_JSON
+}
+Format;
+
 GSList *pastebins = NULL;
 
 static struct
@@ -503,9 +511,93 @@ static gchar *regex_replace(const gchar  *pattern,
     return result;
 }
 
-static void free_data_item(GQuark id, gpointer data, gpointer user_data)
+static Format pastebin_get_format(const Pastebin *pastebin)
 {
-    g_free(data);
+    static const struct
+    {
+        const gchar *name;
+        Format       format;
+    } formats[] = {
+        { "application/x-www-form-urlencoded",  FORMAT_HTML_FORM_URLENCODED },
+        { "application/json",                   FORMAT_JSON }
+    };
+    Format result = FORMAT_HTML_FORM_URLENCODED;
+    gchar *format = utils_get_setting_string(pastebin->config, PASTEBIN_GROUP_PASTEBIN,
+                                             PASTEBIN_GROUP_PASTEBIN_KEY_CONTENT_TYPE, NULL);
+
+    if (format)
+    {
+        for (guint i = 0; i < G_N_ELEMENTS(formats); i++)
+        {
+            if (strcmp(formats[i].name, format) == 0)
+            {
+                result = formats[i].format;
+                break;
+            }
+        }
+
+        g_free(format);
+    }
+
+    return result;
+}
+
+/* Appends a JSON string.  See:
+ * http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf */
+static void append_json_string(GString *str, const gchar *value)
+{
+    g_string_append_c(str, '"');
+    for (; *value; value++)
+    {
+        if (*value == '"' || *value == '\\')
+        {
+            g_string_append_c(str, '\\');
+            g_string_append_c(str, *value);
+        }
+        else if (*value == '\b')
+            g_string_append(str, "\\b");
+        else if (*value == '\f')
+            g_string_append(str, "\\f");
+        else if (*value == '\n')
+            g_string_append(str, "\\n");
+        else if (*value == '\r')
+            g_string_append(str, "\\r");
+        else if (*value == '\t')
+            g_string_append(str, "\\t");
+        else if (*value >= 0x00 && *value <= 0x1F)
+            g_string_append_printf(str, "\\u%04d", *value);
+        else
+            g_string_append_c(str, *value);
+    }
+    g_string_append_c(str, '"');
+}
+
+static void append_json_data_item(GQuark id, gpointer data, gpointer user_data)
+{
+    GString *str = user_data;
+
+    if (str->len > 1) /* if there's more than the first "{" */
+        g_string_append_c(str, ',');
+    append_json_string(str, g_quark_to_string(id));
+    g_string_append_c(str, ':');
+    append_json_string(str, data);
+}
+
+static SoupMessage *json_request_new(const gchar *method,
+                                     const gchar *url,
+                                     GData **fields)
+{
+    SoupMessage  *msg = soup_message_new(method, url);
+    GString      *str = g_string_new(NULL);
+
+    g_string_append_c(str, '{');
+    g_datalist_foreach(fields, append_json_data_item, str);
+    g_string_append_c(str, '}');
+    soup_message_set_request(msg, "application/json", SOUP_MEMORY_TAKE,
+                             str->str, str->len);
+    g_string_free(str, FALSE);
+
+    return msg;
 }
 
 /* sends data to @pastebin and returns the raw response */
@@ -516,6 +608,7 @@ static SoupMessage *pastebin_soup_message_new(const Pastebin  *pastebin,
     SoupMessage *msg;
     gchar *url;
     gchar *method;
+    Format format;
     gsize n_fields;
     gchar **fields;
     GData *data;
@@ -527,6 +620,7 @@ static SoupMessage *pastebin_soup_message_new(const Pastebin  *pastebin,
                                    PASTEBIN_GROUP_PASTEBIN_KEY_URL, NULL);
     method = utils_get_setting_string(pastebin->config, PASTEBIN_GROUP_PASTEBIN,
                                       PASTEBIN_GROUP_PASTEBIN_KEY_METHOD, "POST");
+    format = pastebin_get_format(pastebin);
     /* prepare the form data */
     fields = g_key_file_get_keys(pastebin->config, PASTEBIN_GROUP_FORMAT, &n_fields, NULL);
     g_datalist_init(&data);
@@ -536,11 +630,20 @@ static SoupMessage *pastebin_soup_message_new(const Pastebin  *pastebin,
                                              fields[i], NULL);
 
         SETPTR(value, expand_placeholders(value, pastebin, doc, contents));
-        g_datalist_set_data(&data, fields[i], value);
+        g_datalist_set_data_full(&data, fields[i], value, g_free);
     }
     g_strfreev(fields);
-    msg = soup_form_request_new_from_datalist(method, url, &data);
-    g_datalist_foreach(&data, free_data_item, NULL);
+    switch (format)
+    {
+        case FORMAT_JSON:
+            msg = json_request_new(method, url, &data);
+            break;
+
+        default:
+        case FORMAT_HTML_FORM_URLENCODED:
+            msg = soup_form_request_new_from_datalist(method, url, &data);
+            break;
+    }
     g_datalist_clear(&data);
 
     return msg;



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list