aboutsummaryrefslogblamecommitdiffstats
path: root/modules/text-highlight/languages.c
blob: 7875cd6e1df20a5912b84eed1c7e9c09ec4b8ff6 (plain) (tree)































                                                                             

                                                           



                                                            

                                                                


                            
                                                                       

                                                                              
                                                                






                                                                        
                                                                     



                                                                               
                                                              


                              

                                                                   


                                            

                                                              


                              
                                                                         
                                                                                   


                                                                                  


                              
                                                                           
                                                          
                                                                      


                                  

                                                              



                                                                              


                                                                                  


                              
                                                                       


                                                                        
                                                                 





                                                                           
                                                                        

                                                                         






                                                                             


                                  

                                                                          


                              
                                                                       

                                                                      
                                                                        


                               
                                                                        
                                                           
                                                                


                                  
                                                                       
                                                          
                                                                


                              

                                                                 


                                    
                                                                      

                                                                        
                                    


                            
                                                                       







                                                                        
                                                       







                                                                       

                                                         


                              



                                                                        


                                   

                                                          


                               

                                                                


                                

                                                                               


                                  

                                                                               


                        

                                                        


                                  

                                                                               


                                         
                                                                     
                                                          
                                                                    


                                         

                                                                               


                              

                                                                              


                          

                                                               


                                    

                                                                    


                            

                                                                


                              
                                                                        


                                                                        
                                                                       


                                

                                                                                 


                            

                                                                


                                

                                                          


                                  

                                                                   


                              

                                                          


                                  

                                                          


                                     

                                                             



                                                                    

                                                                              


                                  

                                                             


                                     

                                                         


                                  

                                                                   


                                

                                                          


                               

                                                          


                                  

                                                                            


                        

                                                        


                                  

                                                                     


                                

                                                                  


                                        
                                                                      
                                                         
                                    


                              

                                                           


                             

                                                                 























                                                      
                                           









































                                                                                      
                                                 








































                                                                                    





























































                                                                                              
/*
 * 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;
}