1
1
module GtkMarkdownTextView
2
2
3
- using Gtk, GtkExtensions
3
+ using Gtk
4
4
import Gtk. GtkTextIter
5
5
6
6
using Markdown
7
7
8
8
export MarkdownTextView, MarkdownColors
9
9
10
10
struct MarkdownColors
11
+ font_size:: Int
11
12
color:: String
12
13
background:: String
13
14
highlight_color:: String
14
15
highlight_background:: String
15
16
end
16
17
17
- MarkdownColors () = MarkdownColors (" #000" ," #fff" ," #111" ," #eee" )
18
+ MarkdownColors () = MarkdownColors (13 , " #000" , " #fff" , " #111" , " #eee" )
18
19
19
20
mutable struct MarkdownTextView <: GtkTextView
20
21
@@ -25,133 +26,151 @@ module GtkMarkdownTextView
25
26
function MarkdownTextView (m:: Markdown.MD , prelude:: String , mc:: MarkdownColors = MarkdownColors ())
26
27
27
28
buffer = GtkTextBuffer ()
28
- set_gtk_property! ( buffer, : text,prelude)
29
+ buffer. text[String] = prelude
29
30
view = GtkTextView (buffer)
30
31
31
- GtkExtensions. style_css (view," window, view, textview, buffer, text {
32
- background-color: $(mc. background) ;
33
- color: $(mc. color) ;
34
- font-family: Monaco, Consolas, Courier, monospace;
35
- margin:0px;
36
- }"
32
+ style_css (view,
33
+ " window, view, textview, buffer, text {
34
+ background-color: $(mc. background) ;
35
+ color: $(mc. color) ;
36
+ font-family: Monaco, Consolas, Courier, monospace;
37
+ margin:0px;
38
+ }"
37
39
)
38
40
39
- # set_gtk_property!(view,:margin_left,1)
40
- set_gtk_property! (view,:monospace ,true )
41
- set_gtk_property! (view,:wrap_mode ,true )
42
-
43
- Gtk. create_tag (buffer, " normal" , font= " 13" )
44
- Gtk. create_tag (buffer, " h1" , font= " bold 15" )
45
- Gtk. create_tag (buffer, " h2" , font= " bold 14" )
46
- Gtk. create_tag (buffer, " bold" , font= " bold" )
47
- Gtk. create_tag (buffer, " italic" , font= " italic" )
48
- Gtk. create_tag (buffer, " code" , font= " bold" , foreground= mc. highlight_color, background= mc. highlight_background)
49
-
50
- insert_MD! (buffer,m)
51
- # tag(buffer,"normal",1,length(buffer))
41
+ # set_gtk_property!(view, :margin_left, 1)
42
+ view. monospace[Bool] = true
43
+ view. wrap_mode[Bool] = true
44
+
45
+ fs = mc. font_size
46
+
47
+ Gtk. create_tag (buffer, " normal" , font = " $fs " )
48
+ Gtk. create_tag (buffer, " h1" , font = " bold $(fs+ 3 ) " )
49
+ Gtk. create_tag (buffer, " h2" , font = " bold $(fs+ 2 ) " )
50
+ Gtk. create_tag (buffer, " h3" , font = " bold $(fs+ 1 ) " )
51
+ Gtk. create_tag (buffer, " h4" , font = " bold $(fs) " )
52
+ Gtk. create_tag (buffer, " h5" , font = " $(fs) " )
53
+ Gtk. create_tag (buffer, " h6" , font = " $(fs- 1 ) " )
54
+ Gtk. create_tag (buffer, " bold" , font = " bold $(fs) " )
55
+ Gtk. create_tag (buffer, " italic" , font = " italic $fs " )
56
+ Gtk. create_tag (buffer, " code" , font = " bold $fs " ,
57
+ foreground= mc. highlight_color, background= mc. highlight_background)
58
+
59
+ insert_MD! (buffer, m)
60
+ # tag(buffer, "normal", 1, length(buffer))
52
61
53
- n = new (view. handle,view,buffer)
62
+ n = new (view. handle, view, buffer)
54
63
Gtk. gobject_move_ref (n, view)
55
64
end
56
65
57
- MarkdownTextView (m:: String ) = MarkdownTextView (Markdown. parse (m)," " )
58
- MarkdownTextView (m:: String ,prelude:: String , mc:: MarkdownColors ) = MarkdownTextView (Markdown. parse (m),prelude,mc)
59
- MarkdownTextView (m:: String , mc:: MarkdownColors ) = MarkdownTextView (Markdown. parse (m)," " ,mc)
66
+ MarkdownTextView (m:: String ) = MarkdownTextView (Markdown. parse (m), " " )
67
+ MarkdownTextView (m:: String , prelude:: String , mc:: MarkdownColors = MarkdownColors ()) = MarkdownTextView (Markdown. parse (m), prelude, mc)
68
+ MarkdownTextView (m:: String , mc:: MarkdownColors ) = MarkdownTextView (Markdown. parse (m), " " , mc)
60
69
61
70
end
62
71
63
- function tag (buffer,what,i, j)
64
- Gtk. apply_tag (buffer,what,
65
- GtkTextIter (buffer,i) , GtkTextIter (buffer,j)
72
+ function tag (buffer, what, i, j)
73
+ Gtk. apply_tag (buffer, what,
74
+ GtkTextIter (buffer, i) , GtkTextIter (buffer, j)
66
75
)
67
76
end
68
77
69
- function insert_MD! (buffer,m:: Markdown.Header ,i)
78
+ function style_css (w:: Gtk.GtkWidget , css:: String )
79
+ sc = Gtk. G_. style_context (w)
80
+ push! (sc, GtkCssProvider (data= css), 600 )
81
+ end
82
+
83
+ function insert_MD! (buffer, m:: Markdown.Header{N} , i) where N
70
84
ip = i
71
85
72
- insert! (buffer," " )
86
+ insert! (buffer, " " )
73
87
i += 4
74
88
for el in m. text
75
- i = insert_MD! (buffer,el,i)
89
+ i = insert_MD! (buffer, el, i)
90
+ end
91
+ tag (buffer, " h$(min (N,4 )) " , ip, i)
92
+ i
93
+ end
94
+
95
+ function insert_MD! (buffer, m:: Markdown.BlockQuote , i)
96
+ insert! (buffer, " │ " )
97
+ i += 3
98
+ for el in m. content
99
+ i = insert_MD! (buffer, el, i)
76
100
end
77
- tag (buffer, " h1" , ip, i)
78
101
i
79
102
end
80
103
81
- function insert_MD! (buffer,m:: String ,i)
82
- insert! (buffer,m)
104
+ function insert_MD! (buffer, m:: String , i)
105
+ insert! (buffer, m)
83
106
i += length (m)
84
107
end
85
108
86
- function insert_MD! (buffer,m:: Markdown.LaTeX ,i)
87
- i = insert_MD! (buffer,m. formula,i)
109
+ function insert_MD! (buffer, m:: Markdown.LaTeX , i)
110
+ i = insert_MD! (buffer, m. formula, i)
88
111
end
89
112
90
- function insert_MD! (buffer,m:: Markdown.Paragraph ,i)
91
- # insert!(buffer,"\n\n")
113
+ function insert_MD! (buffer, m:: Markdown.Paragraph , i)
114
+ # insert!(buffer, "\n\n")
92
115
# i += 2
93
116
for el in m. content
94
- i = insert_MD! (buffer,el,i)
117
+ i = insert_MD! (buffer, el, i)
95
118
end
96
119
i
97
120
end
98
121
99
- function insert_MD! (buffer,m:: Markdown.Code ,i)
100
- insert! (buffer,m. code)
122
+ function insert_MD! (buffer, m:: Markdown.Code , i)
123
+ insert! (buffer, m. code)
101
124
tag (buffer, " code" , i, i+ sizeof (m. code))
102
125
i += length (m. code)
103
126
end
104
127
105
- function insert_MD! (buffer,m:: Markdown.List ,i)
106
- for it in m. items
107
- insert! (buffer," - " )
108
- i += 6
128
+ function insert_MD! (buffer, m:: Markdown.List , i)
129
+
130
+ marker = k -> m. ordered == - 1 ? " •" : " $(k) ."
131
+ for (k, it) in enumerate (m. items)
132
+ insert! (buffer, " $(marker (k)) " )
133
+ i += 6 + (m. ordered == 1 )
109
134
for el in it
110
- i = insert_MD! (buffer,el,i)
135
+ i = insert_MD! (buffer, el, i)
111
136
end
112
- insert! (buffer," \n " )
137
+ insert! (buffer, " \n " )
113
138
i += 1
114
139
end
115
140
i
116
141
end
117
142
118
- function insert_MD! (buffer,m:: Markdown.Italic ,i)
119
- ip = i
120
- for el in m. text
121
- i = insert_MD! (buffer,el,i)
122
- end
123
- tag (buffer, " italic" , ip, i)
124
- i
125
- end
126
-
127
- function insert_MD! (buffer,m:: Markdown.Bold ,i)
143
+ tagname (m:: Markdown.Italic ) = " italic"
144
+ tagname (m:: Markdown.Bold ) = " bold"
145
+
146
+ function insert_MD! (buffer, m:: T , i) where T <: Union{Markdown.Italic, Markdown.Bold}
128
147
ip = i
129
148
for el in m. text
130
- i = insert_MD! (buffer,el,i)
149
+ i = insert_MD! (buffer, el, i)
131
150
end
132
- tag (buffer, " bold " , ip, i)
151
+ tag (buffer, tagname (m) , ip, i)
133
152
i
134
153
end
135
154
136
- function insert_MD! (buffer,m, i)
137
- if isdefined (m,:text )
155
+ function insert_MD! (buffer, m, i)
156
+ if isdefined (m, :text )
138
157
for el in m. text
139
- i = insert_MD! (buffer,el,i)
158
+ i = insert_MD! (buffer, el, i)
140
159
end
141
160
end
142
- if isdefined (m,:content )
161
+ if isdefined (m, :content )
143
162
for el in m. content
144
- i = insert_MD! (buffer,el,i)
163
+ i = insert_MD! (buffer, el, i)
145
164
end
146
165
end
147
166
i
148
167
end
149
168
150
- function insert_MD! (buffer,m:: Markdown.MD )
169
+ function insert_MD! (buffer, m:: Markdown.MD )
151
170
i = length (buffer)+ 1
152
171
for el in m. content
153
- i = insert_MD! (buffer,el,i)
154
- insert! (buffer," \n\n " )
172
+ i = insert_MD! (buffer, el, i)
173
+ insert! (buffer, " \n\n " )
155
174
i += 2
156
175
end
157
176
end
0 commit comments