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:
print("’");
break;
case QUOTE_LEFT_SINGLE:
- switch (language) {
+ switch (scratch->quotes_lang) {
case SWEDISH:
print( "’");
break;
}
break;
case QUOTE_RIGHT_SINGLE:
- switch (language) {
+ switch (scratch->quotes_lang) {
case GERMAN:
print("‘");
break;
}
break;
case QUOTE_LEFT_DOUBLE:
- switch (language) {
+ switch (scratch->quotes_lang) {
case DUTCH:
case GERMAN:
print("„");
}
break;
case QUOTE_RIGHT_DOUBLE:
- switch (language) {
+ switch (scratch->quotes_lang) {
case GERMAN:
print("“");
break;
#include <stdlib.h>
-#define kNumberOfLanguages 2
+#define kNumberOfLanguages 3
#define kNumberOfStrings 3
#define kLanguage 0
#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
};
// 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
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
/// Define smart typography languages -- first in list is default
-enum smart_language {
- ENGLISH,
+enum smart_quotes_language {
+ ENGLISH = 0,
DUTCH,
FRENCH,
GERMAN,
#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() {
}
-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("");
int exitcode = EXIT_SUCCESS;
char * binname = "multimarkdown";
short format = 0;
+ short language = LC_EN;
// Initialize argtable structs
void *argtable[] = {
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),
};
}
}
+ if (a_lang->count > 0) {
+ language = LANG_FROM_STR(a_lang->sval[0]);
+ }
+
// Determine input
if (a_file->count == 0) {
// Read from stdin
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
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) {
#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"
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);
}
+/// 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)
stack * header_stack;
stack * footnote_stack;
stack * link_stack;
+
+ short language;
+ short quotes_lang;
};
}
-
p->extensions = e->extensions;
+ p->quotes_lang = e->quotes_lang;
+ p->language = e->language;
}
return p;
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;