poe

Уређивач .po фајлова
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 5ba662b56983e43c4a8c3ba769dd73adf32d8bd7
родитељ e5af08f756af7c5f8c7ae58280256a7ace6d1e29
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Mon, 17 May 2021 23:09:27 +0200

Added flags, test entries, entry drawing routine and more

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mpoe.c | 151++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
измењених датотека: 1, додавања: 126(+), брисања: 25(-)

diff --git a/poe.c b/poe.c @@ -35,11 +35,18 @@ #define BORDER_SE u'\u2518' #define BORDER_VER u'\u2502' #define BORDER_HOR u'\u2500' -#define PROGRAMNAME "poe" + #define ERROR_FG TB_WHITE | TB_BOLD #define ERROR_BG TB_RED +#define FLAG_FG TB_YELLOW | TB_BOLD +#define FLAG_BG TB_DEFAULT +#define MSGID_FG TB_GREEN +#define MSGID_BG TB_DEFAULT +#define MSGSTR_FG TB_WHITE +#define MSGSTR_BG TB_DEFAULT #define SHADOW_FG TB_BLACK #define SHADOW_BG TB_BLACK | TB_BOLD + #define LEN(x) (sizeof(x) / sizeof(x[0])) typedef enum { @@ -48,11 +55,17 @@ typedef enum { RIGHT } Alignment; +typedef enum { + FL_NONE = 0, + FL_C_FORMAT = 1, + FL_FUZZY = 1 << 1, +} Flags; + enum { ERR_UNKNOWN_KEY, ERR_NO_PREV, ERR_NO_NEXT, - ERR_EXITKEY + ERR_EXIT_KEY }; typedef struct { @@ -63,20 +76,35 @@ typedef struct { Alignment alignment; } StatusSegment; +typedef struct { + Flags flags; + char* msgid; + char* msgstr; +} PoEntry; + static const char* title = " poe - .po File Editor "; static const char* help[] = { - "ESC - Close dialog, clear error", - "H | F1 - Show this screen", - "k | ↑ - Previous entry", - "j | ↓ - Next entry", - "q - Quit" + "ESC - Close dialog, clear error", + "H | F1 - Show this screen", + "g | Home - First entry", + "k | \u2191 - Previous entry", + "j | \u2193 - Next entry", + "G | End - Last entry", + "q - Quit" }; static const char* errors[] = { - [ERR_UNKNOWN_KEY] = "Unknown key (press F1 for help)", - [ERR_NO_PREV] = "No previous entry", - [ERR_NO_NEXT] = "No next entry", - [ERR_EXITKEY] = "Press q to quit" + [ERR_UNKNOWN_KEY] = "Unknown key (press H for help)", + [ERR_NO_PREV] = "No previous entry", + [ERR_NO_NEXT] = "No next entry", + [ERR_EXIT_KEY] = "Press q to quit" +}; +static const char* flag_strings[] = { + [FL_C_FORMAT] = "c-format", + [FL_FUZZY] = "fuzzy" }; +static const char* empty_msgid = "*** No msgid ***"; +static const char* empty_msgstr = "*** No msgstr ***"; +static const char* program_name = "poe"; void format_filename(char* result, size_t result_size, const char* format); void format_msgs(char* result, size_t result_size, const char* format); @@ -92,10 +120,19 @@ static const StatusSegment status_segments[] = { char filename[MAXPATH]; char error[MAXBUF]; +/* Test */ +static PoEntry entries[] = { + { flags: FL_C_FORMAT | FL_FUZZY, msgid: "First msgid: %s", + msgstr: "Први msgid: %s" }, + { flags: FL_NONE, msgid: "Test msgid", + msgstr: "Пробни msgstr" }, + { flags: FL_FUZZY, msgid: "Final text", + msgstr: "Последњи текст" }, +}; -long msgid_count = 0; -long msgid_index = 0; -int show_help = 0; +long msgid_count = 0; +long msgid_number = 0; +int show_help = 0; int maxx, maxy; int @@ -106,7 +143,7 @@ print_error(const int code, const char* msg, ...) va_start(args, msg); vsnprintf(buf, sizeof(buf), msg, args); va_end(args); - fprintf(stderr, "%s: %s\n", PROGRAMNAME, buf); + fprintf(stderr, "%s: %s\n", program_name, buf); return code; } @@ -125,7 +162,7 @@ format_msgs(char* result, size_t result_size, const char* format) if (!result) return; - snprintf(result, result_size, format, msgid_index, msgid_count); + snprintf(result, result_size, format, msgid_number, msgid_count); } void @@ -248,7 +285,7 @@ draw_help() draw_box(startx, endx, starty, endy, TB_BLACK, TB_WHITE); draw_string(startx+1, starty, TB_BLACK | TB_BOLD | TB_REVERSE, TB_WHITE, title, w-2, strlen(title)+2, 1, CENTER); - while (row < sizeof(help)/sizeof(*help)) + while (row < LEN(help)) { draw_string(startx+2, starty+3+row, TB_BLACK, TB_WHITE, help[row], w-4, w-4, 2, LEFT); @@ -264,7 +301,7 @@ draw_status() int current_start = 0; const StatusSegment* pseg = status_segments; - if (*error) + if (error[0]) draw_string(0, maxy-1, ERROR_FG, ERROR_BG, error, maxx, maxx, 1, CENTER); else @@ -284,10 +321,55 @@ draw_status() } void +draw_entry(PoEntry* entry) +{ + char flags_buf[MAXBUF]; + uint16_t flags; + + if (entry) + { + draw_string(0, maxy/3, MSGID_FG, MSGID_BG, entry->msgid, + maxx, maxx, maxx/4, LEFT); + flags = entry->flags; + flags_buf[0] = 0; + while (flags) + { + if (flags & FL_C_FORMAT) + { + flags &= ~FL_C_FORMAT; + draw_string(0, 1, FLAG_FG, FLAG_BG, + flag_strings[FL_C_FORMAT], maxx, maxx, 1, LEFT); + } + else if (flags & FL_FUZZY) + { + flags &= ~FL_FUZZY; + draw_string(10, 1, FLAG_FG, FLAG_BG, + flag_strings[FL_FUZZY], maxx-10, maxx-10, 1, LEFT); + } + } + draw_string(0, 2*maxy/3, MSGSTR_FG, MSGSTR_BG, entry->msgstr, + maxx, maxx, maxx/4, LEFT); + } + else + { + draw_string(0, maxy/3, MSGID_FG, MSGID_BG, empty_msgid, + maxx, maxx, maxx/4, LEFT); + draw_string(0, 2*maxy/3, MSGSTR_FG, MSGSTR_BG, empty_msgstr, + maxx, maxx, maxx/4, LEFT); + } +} + +void draw() { + if (msgid_number > 0) + draw_entry(&entries[msgid_number-1]); + else + draw_entry(NULL); + if (show_help) draw_help(); + draw_status(); } @@ -317,6 +399,8 @@ main(int argc, char** argv) tb_init(); error[0] = 0; + msgid_count = LEN(entries); + msgid_number = msgid_count > 0 ? 1 : 0; while (running) { tb_clear(); @@ -334,10 +418,10 @@ main(int argc, char** argv) { if (show_help) show_help = 0; - else if (*error) + else if (error[0]) error[0] = 0; else - strcpy(error, errors[ERR_EXITKEY]); + strcpy(error, errors[ERR_EXIT_KEY]); } else if (ev.key == TB_KEY_F1 || ev.ch == 'H') @@ -347,22 +431,39 @@ main(int argc, char** argv) } else if (ev.ch == 'q') running = 0; + else if (ev.key == TB_KEY_HOME + || ev.ch == 'g') + { + error[0] = 0; + msgid_number = msgid_count ? 1 : 0; + } else if (ev.key == TB_KEY_ARROW_UP || ev.ch == 'k') { - if (msgid_index == 0) + if (msgid_number < 2) strcpy(error, errors[ERR_NO_PREV]); else - msgid_index--; + { + error[0] = 0; + msgid_number--; + } } else if (ev.key == TB_KEY_ARROW_DOWN || ev.ch == 'j') { - if (!msgid_count || msgid_index - == msgid_count-1) + if (msgid_number == msgid_count) strcpy(error, errors[ERR_NO_NEXT]); else - msgid_index++; + { + error[0] = 0; + msgid_number++; + } + } + else if (ev.key == TB_KEY_END + || ev.ch == 'G') + { + error[0] = 0; + msgid_number = msgid_count; } else strcpy(error, errors[ERR_UNKNOWN_KEY]);