[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