2017-01-31 5 views
0

Я пытаюсь центрировать текст по горизонтали и вертикали в xml doc, разделе комментариев (необходимо автоматизировать это, когда текст транслируется в po-файлах).libxml2: center text в разделе комментариев

Для этого я смешал бойкий и libxml2 API:

static const xmlChar *text[] = { 
    N_("Configuration file"), 
    N_("This file was automatically generated."), 
    N_("Please MAKE SURE TO BACKUP THIS FILE before making changes."), 
    NULL 
}; 

xmlChar *centered_text (const xmlChar **array) 
{ 
    GString *string; 
    guint i; 

    string = g_string_new ("\n"); 
    for (i = 0; array[i]; i++) 
    { 
     gint width; 

     width = (80 - strlen (array[i]))/2 + strlen (array[i]); 
     g_string_append_printf (string, "%*s\n", width, array[i]); 
    } 

    return g_string_free (string, FALSE); 
} 

....................... 

xmlDocPtr doc; 
xmlChar *content; 
xmlNodePtr comment; 

doc = xmlNewDoc ((const xmlChar *) "1.0"); 

content = centered_text (text); 
comment = xmlNewDocComment (doc, (const xmlChar *) content); 
xmlFree (content); 

xmlAddChild ((xmlNodePtr) doc, comment); 

И выходной файл выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<!--         
           Configuration file 
        This file was automatically generated. 
      Please MAKE SURE TO BACKUP THIS FILE before making changes. 
--> 

Вот, например, итальянский перевод без выравнивания:

File di configurazione 
Questo file è stato generato automaticamente. 
Assicurati di file di questo backup prima di apportare modifiche. 

Есть ли способ сделать это, используя только libxml2?

+0

XML - это не язык, используемый для стилизации текста, так что вы уверены, что libxml2 делает это? – Rob

ответ

0

Вы можете добавить текстовое содержимое для комментариев узлов с xmlNodeAddContent и xmlNodeAddContentLen. libxml2 также поддерживает пару functions for string manipulation, но нет никакого эквивалента g_string_append_printf. Я бы пошел со следующим подходом:

xmlDocPtr doc; 
xmlNodePtr comment; 
int i; 

doc = xmlNewDoc((const xmlChar *)"1.0"); 
comment = xmlNewDocComment(doc, (const xmlChar *)""); 

for (i = 0; array[i]; i++) { 
    /* 40 space characters. */ 
    static const char space[] = "          "; 
    int len = strlen(array[i]); 

    if (len < 80) 
     xmlNodeAddContentLen(comment, (const xmlChar *)space, (80 - len)/2); 
    xmlNodeAddContentLen(comment, (const xmlChar *)array[i], len); 
    xmlNodeAddContentLen(comment, (const xmlChar *)"\n", 1); 
} 
Смежные вопросы