/*
* languages.c
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with the program; if not, see <http://www.gnu.org/licenses/>
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "languages.h"
#include <glib/gi18n-lib.h>
static const gchar **mime_types = NULL;
G_LOCK_DEFINE_STATIC (mime_types);
static Language languages[] = {
{ "txt", N_("_Plain text"),
(const gchar *[]) { (gchar[]) { "text" }, NULL },
(const gchar *[]) { (gchar[]) { "text/plain" },
(gchar[]) { "text/*" }, NULL }
},
{ "assembler", N_("_Assembler"),
(const gchar *[]) { (gchar[]) { "asm" } , NULL },
(const gchar *[]) { (gchar[]) { "text/x-asm" }, NULL }
},
{ "sh", N_("_Bash"),
(const gchar *[]) { (gchar[]) { "bash" }, (gchar[]) { "sh" },
(gchar[]) { "ebuild" }, (gchar[]) {"eclass" },
NULL },
(const gchar *[]) { (gchar[]) { "application/x-bsh" },
(gchar[]) { "application/x-sh" },
(gchar[]) { "application/x-shar" },
(gchar[]) { "application/x-shellscript" },
(gchar[]) { "text/x-script.sh" }, NULL }
},
{ "c", N_("_C/C++"),
(const gchar *[]) { (gchar[]) { "c" }, (gchar[]) { "c++" },
(gchar[]) { "cc" }, (gchar[]) { "cpp" },
(gchar[]) { "cu" }, (gchar[]) { "cxx" },
(gchar[]) { "h" }, (gchar[]) { "hh" },
(gchar[]) { "hpp" }, (gchar[]) { "hxx" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-c" }, NULL }
},
{ "csharp", N_("_C#"),
(const gchar *[]) { (gchar[]) { "cs" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-csharp" }, NULL }
},
{ "css", N_("_Cascade Style Sheet"),
(const gchar *[]) { (gchar[]) { "css" }, NULL },
(const gchar *[]) { (gchar[]) { "text/css" }, NULL }
},
{ "html", N_("_HTML"),
(const gchar *[]) { (gchar[]) { "html" }, (gchar[]) { "html" },
(gchar[]) { "xhtml" }, (gchar[]) { "dhtml" }, NULL },
(const gchar *[]) { NULL } /* Don't register text-highlight as formatter
or parser of text / html as it would break
all text / html emails. */
},
{ "java", N_("_Java"),
(const gchar *[]) { (gchar[]) { "java" }, (gchar[]) { "groovy" },
(gchar[]) { "grv" }, NULL },
(const gchar *[]) { (gchar[]) { "text/java-source" }, NULL }
},
{ "js", N_("_JavaScript"),
(const gchar *[]) { (gchar[]) { "js" }, NULL },
(const gchar *[]) { (gchar[]) { "text/javascript" },
(gchar[]) { "application/x-javascript" }, NULL }
},
{ "diff", N_("_Patch/diff"),
(const gchar *[]) { (gchar[]) { "diff" }, (gchar[]) { "patch" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-diff" },
(gchar[]) { "text/x-patch" }, NULL }
},
{ "perl", N_("_Perl"),
(const gchar *[]) { (gchar[]) { "perl" }, (gchar[]) { "cgi"},
(gchar[]) { "perl" }, (gchar[]) { "pl" },
(gchar[]) { "plex" }, (gchar[]) { "plx" },
(gchar[]) { "pm" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-script.perl" },
(gchar[]) { "text/x-script.perl-module" },
(gchar[]) { "application/x-pixclscript" },
(gchar[]) { "application/x-xpixmap" }, NULL }
},
{ "php", N_("_PHP"),
(const gchar *[]) { (gchar[]) { "php" }, (gchar[]) { "php3" },
(gchar[]) { "php4" }, (gchar[]) { "php5" },
(gchar[]) { "php6" }, NULL },
(const gchar *[]) { (gchar[]) { "text/php" },
(gchar[]) { "text/x-php" },
(gchar[]) { "application/php" },
(gchar[]) { "application/x-php" },
(gchar[]) { "application/x-httpd-php" },
(gchar[]) { "application/x-httpd-php-source" },
NULL }
},
{ "python", N_("_Python"),
(const gchar *[]) { (gchar[]) { "py" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-script.python" }, NULL }
},
{ "ruby", N_("_Ruby"),
(const gchar *[]) { (gchar[]) { "ruby" }, (gchar[]) { "pp" },
(gchar[]) { "rb" }, (gchar[]) { "rjs" },
(gchar[]) { "ruby" }, NULL },
(const gchar *[]) { (gchar[]) { "application/x-ruby" }, NULL }
},
{ "tcl", N_("_Tcl/Tk"),
(const gchar *[]) { (gchar[]) { "tcl" }, (gchar[]) { "ictl" },
(gchar[]) { "wish" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-tcl" }, NULL }
},
{ "tex", N_("_TeX/LaTeX"),
(const gchar *[]) { (gchar[]) { "tex" }, (gchar[]) { "csl" },
(gchar[]) { "sty" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-tex" }, NULL }
},
{ "vala", N_("_Vala"),
(const gchar *[]) { (gchar[]) { "vala" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-vala" }, NULL }
},
{ "vb", N_("_Visual Basic"),
(const gchar *[]) { (gchar[]) { "vb" }, (gchar[]) { "bas" },
(gchar[]) { "basic" }, (gchar[]) { "bi" },
(gchar[]) { "vbs" }, NULL },
(const gchar *[]) { NULL }
},
{ "xml", N_("_XML"),
(const gchar *[]) { (gchar[]) { "xml" }, (gchar[]) { "dtd" },
(gchar[]) { "ecf" }, (gchar[]) { "ent" },
(gchar[]) { "hdr" }, (gchar[]) { "hub" },
(gchar[]) { "jnlp" }, (gchar[]) { "nrm" },
(gchar[]) { "resx" }, (gchar[]) { "sgm" },
(gchar[]) { "sgml" }, (gchar[]) { "svg" },
(gchar[]) { "tld" }, (gchar[]) { "vxml" },
(gchar[]) { "wml" }, (gchar[]) { "xsd" },
(gchar[]) { "xsl" }, NULL },
(const gchar *[]) { (gchar[]) { "text/xml" },
(gchar[]) { "application/xml" },
(gchar[]) { "application/x-xml" }, NULL }
}
};
static struct Language other_languages[] = {
{ "actionscript", N_("_ActionScript"),
(const gchar *[]) { (gchar[]) { "as" }, NULL },
(const gchar *[]) { NULL }
},
{ "ada", N_("_ADA95"),
(const gchar *[]) { (gchar[]) { "a" }, (gchar[]) { "adb" },
(gchar[]) { "ads" }, (gchar[]) { "gnad" },
NULL },
(const gchar *[]) { (gchar[]) { "text/x-adasrc" }, NULL }
},
{ "algol", N_("_ALGOL 68"),
(const gchar *[]) { (gchar[]) { "alg" }, NULL },
(const gchar *[]) { NULL }
},
{ "awk", N_("(_G)AWK"),
(const gchar *[]) { (gchar[]) { "awk" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-awk" }, NULL }
},
{ "cobol", N_("_COBOL"),
(const gchar *[]) { (gchar[]) { "cbl" }, (gchar[]) { "cob" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-cobol" }, NULL }
},
{ "bat", N_("_DOS Batch"),
(const gchar *[]) { (gchar[]) { "bat" }, (gchar[]) { "cmd" }, NULL },
(const gchar *[]) { NULL }
},
{ "d", N_("_D"),
(const gchar *[]) { (gchar[]) { "d" }, NULL },
(const gchar *[]) { NULL }
},
{ "erlang", N_("_Erlang"),
(const gchar *[]) { (gchar[]) { "erl" }, (gchar[]) { "hrl" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-erlang" }, NULL }
},
{ "fortran77", N_("_FORTRAN 77"),
(const gchar *[]) { (gchar[]) { "f" }, (gchar[]) { "for" },
(gchar[]) { "ftn" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-fortran" }, NULL }
},
{ "fortran90", N_("_FORTRAN 90"),
(const gchar *[]) { (gchar[]) { "f90" }, (gchar[]) { "f95" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-fortran" }, NULL }
},
{ "fsharp", N_("_F#"),
(const gchar *[]) { (gchar[]) { "fs" }, (gchar[]) { "fsx" }, NULL },
(const gchar *[]) { NULL }
},
{ "go", N_("_Go"),
(const gchar *[]) { (gchar[]) { "go" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-go" }, NULL }
},
{ "haskell", N_("_Haskell"),
(const gchar *[]) { (gchar[]) { "hs" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-haskell" }, NULL }
},
{ "jsp", N_("_JSP"),
(const gchar *[]) { (gchar[]) { "jsp" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-jsp" }, NULL }
},
{ "lisp", N_("_Lisp"),
(const gchar *[]) { (gchar[]) { "cl" }, (gchar[]) { "clisp" },
(gchar[]) { "el" }, (gchar[]) { "lsp" },
(gchar[]) { "sbcl"}, (gchar[]) { "scom" },
NULL },
(const gchar *[]) { (gchar[]) { "text/x-emacs-lisp" }, NULL }
},
{ "lotus", N_("_Lotus"),
(const gchar *[]) { (gchar[]) { "ls" }, NULL },
(const gchar *[]) { (gchar[]) { "application/vnd.lotus-1-2-3" }, NULL }
},
{ "lua", N_("_Lua"),
(const gchar *[]) { (gchar[]) { "lua" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-lua" }, NULL }
},
{ "maple", N_("_Maple"),
(const gchar *[]) { (gchar[]) { "mpl" }, NULL },
(const gchar *[]) { NULL }
},
{ "matlab", N_("_Matlab"),
(const gchar *[]) { (gchar[]) { "m" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-matlab" }, NULL }
},
{ "maya", N_("_Maya"),
(const gchar *[]) { (gchar[]) { "mel" }, NULL },
(const gchar *[]) { NULL }
},
{ "oberon", N_("_Oberon"),
(const gchar *[]) { (gchar[]) { "ooc" }, NULL },
(const gchar *[]) { NULL }
},
{ "objc", N_("_Objective C"),
(const gchar *[]) { (gchar[]) { "objc" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-objchdr" },
(gchar[]) { "text/x-objcsrc" }, NULL }
},
{ "ocaml", N_("_OCaml"),
(const gchar *[]) { (gchar[]) { "ml" }, (gchar[]) { "mli" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-ocaml" }, NULL }
},
{ "octave", N_("_Octave"),
(const gchar *[]) { (gchar[]) { "octave" }, NULL },
(const gchar *[]) { NULL }
},
{ "os", N_("_Object Script"),
(const gchar *[]) { (gchar[]) { "os" }, NULL },
(const gchar *[]) { NULL }
},
{ "pascal", N_("_Pascal"),
(const gchar *[]) { (gchar[]) { "pas" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-pascal" }, NULL }
},
{ "pov", N_("_POV-Ray"),
(const gchar *[]) { (gchar[]) { "pov" }, NULL },
(const gchar *[]) { NULL }
},
{ "pro", N_("_Prolog"),
(const gchar *[]) { (gchar[]) { "pro" }, NULL },
(const gchar *[]) { NULL }
},
{ "ps", N_("_PostScript"),
(const gchar *[]) { (gchar[]) { "ps" } , NULL },
(const gchar *[]) { (gchar[]) { "application/postscript" }, NULL }
},
{ "r", N_("_R"),
(const gchar *[]) { (gchar[]) { "r" }, NULL },
(const gchar *[]) { NULL }
},
{ "spec", N_("_RPM Spec"),
(const gchar *[]) { (gchar[]) { "spec" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-rpm-spec" }, NULL }
},
{ "scala", N_("_Scala"),
(const gchar *[]) { (gchar[]) { "scala" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-scala" }, NULL }
},
{ "smalltalk", N_("_Smalltalk"),
(const gchar *[]) { (gchar[]) { "gst" }, (gchar[]) { "sq" },
(gchar[]) { "st" }, NULL },
(const gchar *[]) { NULL }
},
{ "tcsh", N_("_TCSH"),
(const gchar *[]) { (gchar[]) { "tcsh" }, NULL },
(const gchar *[]) { NULL }
},
{ "vhd", N_("_VHDL"),
(const gchar *[]) { (gchar[]) { "vhd" }, NULL },
(const gchar *[]) { (gchar[]) { "text/x-vhdl" }, NULL }
}
};
Language *
get_default_langauges (gsize *len)
{
if (len) {
*len = G_N_ELEMENTS (languages);
}
return languages;
}
Language *
get_additinal_languages (gsize *len)
{
if (len) {
*len = G_N_ELEMENTS (other_languages);
}
return other_languages;
}
const gchar *
get_syntax_for_ext (const gchar *extension)
{
gint i;
gint j;
for (i = 0; i < G_N_ELEMENTS (languages); i++) {
Language *lang = &languages[i];
const gchar *ext;
j = 0;
ext = lang->extensions[j];
while (ext) {
if (g_ascii_strncasecmp (ext, extension, strlen (ext)) == 0) {
return lang->action_name;
}
j++;
ext = lang->extensions[j];
}
}
for (i = 0; i < G_N_ELEMENTS (other_languages); i++) {
Language *lang = &other_languages[i];
const gchar *ext;
j = 0;
ext = lang->extensions[j];
while (ext) {
if (g_ascii_strncasecmp (ext, extension, strlen (ext)) == 0) {
return lang->action_name;
}
j++;
ext = lang->extensions[j];
}
}
return NULL;
}
const gchar *
get_syntax_for_mime_type (const gchar *mime_type)
{
gint i;
gint j;
for (i = 0; i < G_N_ELEMENTS (languages); i++) {
Language *lang = &languages[i];
const gchar *mt;
j = 0;
mt = lang->mime_types[j];
while (mt) {
if (g_ascii_strncasecmp (mt, mime_type, strlen (mt)) == 0) {
return lang->action_name;
}
j++;
mt = lang->mime_types[j];
}
}
for (i = 0; i < G_N_ELEMENTS (other_languages); i++) {
Language *lang = &other_languages[i];
const gchar *mt;
j = 0;
mt = lang->mime_types[j];
while (mt) {
if (g_ascii_strncasecmp (mt, mime_type, strlen (mt)) == 0) {
return lang->action_name;
}
j++;
mt = lang->mime_types[j];
}
}
return NULL;
}
const gchar **
get_mime_types (void)
{
G_LOCK (mime_types);
if (mime_types == NULL) {
gchar **list;
gsize array_len;
gint i, pos;
array_len = G_N_ELEMENTS (languages);
pos = 0;
list = g_malloc (array_len * sizeof (gchar *));
for (i = 0; i < G_N_ELEMENTS (languages); i++) {
Language *lang = &languages[i];
gint j = 0;
while (lang->mime_types[j] != NULL) {
if (pos == array_len) {
array_len += 10;
list = g_realloc (list, array_len * sizeof (gchar *));
}
list[pos] = (gchar *) lang->mime_types[j];
pos++;
j++;
}
}
for (i = 0; i < G_N_ELEMENTS (other_languages); i++) {
Language *lang = &other_languages[i];
gint j = 0;
while (lang->mime_types[j] != NULL) {
if (pos == array_len) {
array_len += 10;
list = g_realloc (list, array_len * sizeof (gchar *));
}
list[pos] = (gchar *) lang->mime_types[j];
pos++;
j++;
}
}
if (pos == array_len) {
array_len += 1;
list = g_realloc (list, array_len * sizeof (gchar *));
}
/* Ensure the array is null-terminated */
for (i = pos; i < array_len; i++) {
list[i] = NULL;
}
mime_types = (const gchar **) list;
}
G_UNLOCK (mime_types);
return mime_types;
}