]> granicus.if.org Git - multimarkdown/commitdiff
ADDED: German translations; command line option to select language
authorFletcher T. Penney <fletcher@fletcherpenney.net>
Fri, 20 Jan 2017 18:53:22 +0000 (13:53 -0500)
committerFletcher T. Penney <fletcher@fletcherpenney.net>
Fri, 20 Jan 2017 18:53:22 +0000 (13:53 -0500)
src/html.c
src/i18n.h
src/libMultiMarkdown.h
src/main.c
src/mmd.c
src/mmd.h
src/writer.c
src/writer.h

index 37f758a95c5a537b6e2335a6e6f52e7a25552d16..35b9cd726ae0df317f2fc44f1f01d8655f839cd5 100644 (file)
@@ -114,8 +114,7 @@ void mmd_print_string_html(DString * out, const char * str, bool obfuscate) {
 
 
 void mmd_print_localized_char_html(DString * out, unsigned short type, scratch_pad * scratch) {
-       // TODO: Is smart typography enabled?  Which language?
-       int language = 0;
+       // TODO: Is smart typography enabled?
 
        switch (type) {
                case DASH_N:
@@ -131,7 +130,7 @@ void mmd_print_localized_char_html(DString * out, unsigned short type, scratch_p
                        print("&#8217;");
                        break;
                case QUOTE_LEFT_SINGLE:
-                       switch (language) {
+                       switch (scratch->quotes_lang) {
                                case SWEDISH:
                                        print( "&#8217;");
                                        break;
@@ -149,7 +148,7 @@ void mmd_print_localized_char_html(DString * out, unsigned short type, scratch_p
                                }
                        break;
                case QUOTE_RIGHT_SINGLE:
-                       switch (language) {
+                       switch (scratch->quotes_lang) {
                                case GERMAN:
                                        print("&#8216;");
                                        break;
@@ -161,7 +160,7 @@ void mmd_print_localized_char_html(DString * out, unsigned short type, scratch_p
                                }
                        break;
                case QUOTE_LEFT_DOUBLE:
-                       switch (language) {
+                       switch (scratch->quotes_lang) {
                                case DUTCH:
                                case GERMAN:
                                        print("&#8222;");
@@ -180,7 +179,7 @@ void mmd_print_localized_char_html(DString * out, unsigned short type, scratch_p
                                }
                        break;
                case QUOTE_RIGHT_DOUBLE:
-                       switch (language) {
+                       switch (scratch->quotes_lang) {
                                case GERMAN:
                                        print("&#8220;");
                                        break;
index a6f09af6fa65907d445c42634e2375f1f8c982d1..1a489dfa9a68e6dabc3555201f0b877ff4b269d4 100644 (file)
@@ -29,7 +29,7 @@
 #include <stdlib.h>
 
 
-#define kNumberOfLanguages 2
+#define kNumberOfLanguages 3
 #define kNumberOfStrings 3
 #define kLanguage 0
 
@@ -42,6 +42,7 @@
 
 #ifdef I18N_DISABLED
        #define LC(x) x
+       #define LANG_FROM_STR(x) 0
 #else
        #define H1(s,i,x)   (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
        #define H4(s,i,x)   H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
 
        #define HASH(s)    ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
 
-       #define LC(x) Translate(HASH(x), kLanguage)
+       #define LC(x) Translate(HASH(x), scratch->language)
 
        //#define LC(x) TranslateTest(__COUNTER__, __FILE__, __LINE__, __FUNCTION__ , x)
 
+       #define LANG_FROM_STR(x) i18n_language_from_string(x)
+       
 static const char * lc_lookup[kNumberOfLanguages * kNumberOfStrings] = {
        "return to body",                               // English
-       "return to body",                               // Spanish
+       "return to body",                               // Español
+       "zum Haupttext",                                // Deutsch
 
        "see footnote",                                 // English
-       "Ver nota de pie",                              // Spanish
+       "Ver nota de pie",                              // Español
+       "siehe Fußnote",                               // Deutsch
 
        "see citation",                                 // English
-       "see citation",                                 // Spanish
+       "see citation",                                 // Español
+       "siehe Zitat",                                  // Deutsch
 };
 
 
@@ -93,10 +99,22 @@ static inline const char * Translate(unsigned long x, int l) {
 // https://en.wikipedia.org/wiki/ISO_639-1
 enum lc_languages {
        LC_EN = 0,                      //!< English is default
-       LC_ES,
+       LC_ES,                          //!< Español
+       LC_DE,                          //!< Deutsch
 };
 
 
+static inline short i18n_language_from_string(const char * l) { 
+       if (strcmp(l, "de") == 0) {
+               return LC_DE;
+       } else if (strcmp(l, "es") == 0) {
+               return LC_ES;
+       }
+
+       return 0;
+}
+
+
 #endif
 
 #endif
index a0bcfe8a04cf27a407431a70887b4878b248c39c..9da0f829f7ca93fd9f22d434a9c9e01242c0b112 100644 (file)
@@ -101,6 +101,10 @@ void mmd_engine_parse_string(mmd_engine * e);
 void mmd_export_token_tree(DString * out, mmd_engine * e, short format);
 
 
+/// Set language and smart quotes language
+void mmd_engine_set_language(mmd_engine * e, short language);
+
+
 /// Token types for parse tree
 enum token_types {
        DOC_START_TOKEN = 0,    //!< DOC_START_TOKEN must be type 0
@@ -255,8 +259,8 @@ enum token_types {
 
 
 /// Define smart typography languages -- first in list is default
-enum smart_language {
-       ENGLISH,
+enum smart_quotes_language {
+       ENGLISH = 0,
        DUTCH,
        FRENCH,
        GERMAN,
index 1ad3e8fc3ab67d84ab605b7b31d70ac0e9eb7331..9d4211f0f5dac694c553d6991be02b6b44acdcc7 100644 (file)
@@ -61,6 +61,7 @@
 
 #include "argtable3.h"
 #include "d_string.h"
+#include "i18n.h"
 #include "libMultiMarkdown.h"
 #include "html.h"
 #include "mmd.h"
 
 // argtable structs
 struct arg_lit *a_help, *a_version, *a_compatibility, *a_nolabels, *a_batch, *a_accept, *a_reject;
-struct arg_str *a_format;
+struct arg_str *a_format, *a_lang;
 struct arg_file *a_file, *a_o;
 struct arg_end *a_end;
-struct arg_rem *a_rem1, *a_rem2, *a_rem3;
+struct arg_rem *a_rem1, *a_rem2, *a_rem3, *a_rem4;
 
 
 DString * stdin_buffer() {
@@ -151,11 +152,13 @@ char * filename_with_extension(const char * original, const char * new_extension
 }
 
 
-char * mmd_process(DString * buffer, unsigned long extensions, short format) {
+char * mmd_process(DString * buffer, unsigned long extensions, short format, short language) {
        char * result;
 
        mmd_engine * e = mmd_engine_create_with_dstring(buffer, extensions);
 
+       mmd_engine_set_language(e, language);
+
        mmd_engine_parse_string(e);
 
        DString * output = d_string_new("");
@@ -175,6 +178,7 @@ int main(int argc, char** argv) {
        int exitcode = EXIT_SUCCESS;
        char * binname = "multimarkdown";
        short format = 0;
+       short language = LC_EN;
 
        // Initialize argtable structs
        void *argtable[] = {
@@ -199,6 +203,10 @@ int main(int argc, char** argv) {
                a_nolabels              = arg_lit0(NULL, "nolabels", "Disable id attributes for headers"),
                
                a_file                  = arg_filen(NULL, NULL, "<FILE>", 0, argc+2, "read input from file(s)"),
+
+               a_rem4                  = arg_rem("", ""),
+
+               a_lang                  = arg_str0("l", "lang", "LANG", "language localization, LANG = en|es|de"),
                a_end                   = arg_end(20),
        };
 
@@ -276,6 +284,10 @@ int main(int argc, char** argv) {
                }
        }
 
+       if (a_lang->count > 0) {
+               language = LANG_FROM_STR(a_lang->sval[0]);
+       }
+
        // Determine input
        if (a_file->count == 0) {
                // Read from stdin
@@ -314,7 +326,7 @@ int main(int argc, char** argv) {
                                        break;
                        }
 
-                       result = mmd_process(buffer, extensions, format);
+                       result = mmd_process(buffer, extensions, format, language);
 
                        if (!(output_stream = fopen(output_filename, "w"))) {
                                // Failed to open file
@@ -354,7 +366,7 @@ int main(int argc, char** argv) {
                        buffer = stdin_buffer();
                }
 
-               result = mmd_process(buffer, extensions, format);
+               result = mmd_process(buffer, extensions, format, language);
 
                // Where does output go?
                if (strcmp(a_o->filename[0], "-") == 0) {
index d94fe08c5b73517b108edf16fc7356e0cddc6444..30689bd95b4ae9c02fedc7f78650ae323f450927 100644 (file)
--- a/src/mmd.c
+++ b/src/mmd.c
@@ -59,6 +59,7 @@
 #include "char.h"
 #include "d_string.h"
 #include "html.h"      /// \todo: Remove this for production
+#include "i18n.h"
 #include "lexer.h"
 #include "libMultiMarkdown.h"
 #include "mmd.h"
@@ -90,6 +91,9 @@ mmd_engine * mmd_engine_create(DString * d, unsigned long extensions) {
 
                e->extensions = extensions;
 
+               e->language = LC_EN;
+               e->quotes_lang = ENGLISH;
+
                e->citation_stack = stack_new(0);
                e->definition_stack = stack_new(0);
                e->footnote_stack = stack_new(0);
@@ -165,6 +169,26 @@ mmd_engine * mmd_engine_create_with_string(const char * str, unsigned long exten
 }
 
 
+/// Set language and smart quotes language
+void mmd_engine_set_language(mmd_engine * e, short language) {
+       e->language = language;
+
+       switch (language) {
+               case LC_EN:
+                       e->quotes_lang = ENGLISH;
+                       break;
+               case LC_DE:
+                       e->quotes_lang = GERMAN;
+                       break;
+               case LC_ES:
+                       e->quotes_lang = ENGLISH;
+                       break;
+               default:
+                       e->quotes_lang = ENGLISH;
+       }
+}
+
+
 /// Free an existing MMD Engine
 void mmd_engine_free(mmd_engine * e, bool freeDString) {
        if (e == NULL)
index f44ee8233187af56b32b7b9f7538a4ac6c284847..61733d79cff43b2ea7ee17ae56e1f98c54aba085 100644 (file)
--- a/src/mmd.h
+++ b/src/mmd.h
@@ -76,6 +76,9 @@ struct mmd_engine {
        stack *                                 header_stack;
        stack *                                 footnote_stack;
        stack *                                 link_stack;
+
+       short                                   language;
+       short                                   quotes_lang;
 };
 
 
index 5c7e3de8092b6845aa57d14214924dbfacc37968..4b229e2007b5285cc0c6690fbc229897d8af3fe5 100644 (file)
@@ -125,8 +125,9 @@ scratch_pad * scratch_pad_new(mmd_engine * e) {
                }
 
 
-
                p->extensions = e->extensions;
+               p->quotes_lang = e->quotes_lang;
+               p->language = e->language;
        }
 
        return p;
index 83f4829fb2a2a1a203076a242fd802dcf612d989..db288b3e2c165599d04543393544c0f6da3736ca 100644 (file)
@@ -86,7 +86,11 @@ typedef struct {
        struct fn_holder *      citation_hash;
        short                           citation_being_printed;
 
-       char                            _PADDING[6];    //!< pad struct for alignment
+       short                           language;
+       short                           quotes_lang;
+       
+       char                            _PADDING[4];    //!< pad struct for alignment
+
 } scratch_pad;