'smart qotes' now will replace '<', '>' and '&' inside 'pre' and 'code' tags
[k8lowj.git] / src / html_markup.c
blobe98af21f0f9bdfea5f5e22d21201b4f73f991c6e
1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2005 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
5 */
7 #include "gtk-all.h"
9 #include <string.h>
10 #include "html_markup.h"
13 void
14 html_mark_tag(JamDoc *doc, const char* tag, ...) {
15 GtkTextBuffer *buffer;
16 GtkTextIter start, end;
17 GtkTextMark *ins;
18 char * startTag, * endTag;
19 int tagLen;
20 va_list ap;
22 if (!strcmp(tag, "span")) {
23 va_start(ap, tag);
24 startTag = g_strdup_printf("<%s %s>", tag, va_arg(ap, const char *));
25 va_end(ap);
26 } else {
27 startTag = g_strdup_printf("<%s>", tag);
29 endTag = g_strdup_printf("</%s>", tag);
30 tagLen = (int)strlen(endTag);
32 buffer = jam_doc_get_text_buffer(doc);
34 gtk_text_buffer_begin_user_action(buffer); /* start undo action */
36 if (!gtk_text_buffer_get_selection_bounds(buffer, &start, &end)) {
37 gtk_text_buffer_insert_at_cursor(buffer, startTag, -1);
38 gtk_text_buffer_insert_at_cursor(buffer, endTag, -1);
40 ins = gtk_text_buffer_get_mark(buffer, "insert");
41 gtk_text_buffer_get_iter_at_mark(buffer, &start, ins);
42 gtk_text_iter_backward_chars(&start, tagLen);
43 gtk_text_buffer_move_mark_by_name(buffer, "insert", &start);
44 gtk_text_buffer_move_mark_by_name(buffer, "selection_bound", &start);
45 } else {
46 gtk_text_buffer_insert(buffer, &start, startTag, -1);
47 gtk_text_buffer_get_selection_bounds(buffer, &start, &end);
48 gtk_text_buffer_insert(buffer, &end, endTag, -1);
49 gtk_text_buffer_move_mark_by_name(buffer, "insert", &end);
50 gtk_text_buffer_move_mark_by_name(buffer, "selection_bound", &end);
53 g_free(startTag);
54 g_free(endTag);
55 gtk_text_buffer_end_user_action(buffer);
59 void
60 html_mark_bold(JamDoc *doc) {
61 html_mark_tag(doc, "b");
64 void
65 html_mark_italic(JamDoc *doc) {
66 html_mark_tag(doc, "i");
69 void
70 html_mark_underline(JamDoc *doc) {
71 html_mark_tag(doc, "u");
74 void
75 html_mark_strikeout(JamDoc *doc) {
76 html_mark_tag(doc, "s");
79 void
80 html_mark_monospaced(JamDoc *doc) {
81 html_mark_tag(doc, "tt");
84 void
85 html_mark_para(JamDoc *doc) {
86 html_mark_tag(doc, "p");
89 void
90 html_mark_smallcaps(JamDoc *doc) {
91 html_mark_tag(doc, "span", "style=\"font-variant: small-caps\"");
94 void
95 html_mark_blockquote(JamDoc *doc) {
96 html_mark_tag(doc, "blockquote");
99 void
100 html_mark_small(JamDoc *doc) {
101 html_mark_tag(doc, "small");
104 void
105 html_mark_big(JamDoc *doc) {
106 html_mark_tag(doc, "big");
109 void
110 html_mark_superscript(JamDoc *doc) {
111 html_mark_tag(doc, "small");
112 html_mark_tag(doc, "sup");
115 void
116 html_mark_subscript(JamDoc *doc) {
117 html_mark_tag(doc, "small");
118 html_mark_tag(doc, "sub");
121 void
122 html_mark_ulist(JamDoc *doc) {
123 html_mark_tag(doc, "ul");
126 void
127 html_mark_olist(JamDoc *doc) {
128 html_mark_tag(doc, "ol");
131 void
132 html_mark_listitem(JamDoc *doc) {
133 html_mark_tag(doc, "li");
136 void
137 html_mark_h2(JamDoc *doc) {
138 html_mark_tag(doc, "h2");
141 void
142 html_mark_h3(JamDoc *doc) {
143 html_mark_tag(doc, "h3");
146 void
147 html_mark_h4(JamDoc *doc) {
148 html_mark_tag(doc, "h4");