runeblog 0.3.02

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. checksums.yaml +7 -0
  2. data/README.lt3 +279 -0
  3. data/README.md +312 -0
  4. data/bin/blog +200 -0
  5. data/bin/mkwidget +164 -0
  6. data/data/EDITOR +1 -0
  7. data/data/ROOT +1 -0
  8. data/data/VIEW +1 -0
  9. data/data/features.txt +18 -0
  10. data/data/global.lt3 +20 -0
  11. data/data/universal.lt3 +18 -0
  12. data/empty_view/assets/austin-pano.jpg +0 -0
  13. data/empty_view/assets/sky2.jpg +0 -0
  14. data/empty_view/config/exper/2svg.lt3 +38 -0
  15. data/empty_view/config/exper/gen_svg.rb +60 -0
  16. data/empty_view/config/exper/meta.html +10 -0
  17. data/empty_view/config/exper/s2.html +25 -0
  18. data/empty_view/config/exper/varmint.rb +50 -0
  19. data/empty_view/config/facebook/credentials.txt +7 -0
  20. data/empty_view/config/facebook/facebook.rb +42 -0
  21. data/empty_view/config/facebook/fb.html +10 -0
  22. data/empty_view/config/facebook/fb.js.lt3 +15 -0
  23. data/empty_view/config/reddit/credentials.txt +6 -0
  24. data/empty_view/config/reddit/notes.txt +4 -0
  25. data/empty_view/config/reddit/reddit_post_url.py +34 -0
  26. data/empty_view/config/reddit/redpost.rb +43 -0
  27. data/empty_view/config/reddit/the-graffiti-wall.html +91 -0
  28. data/empty_view/config/twitter/credentials.txt +3 -0
  29. data/empty_view/config/twitter/tw.html +12 -0
  30. data/empty_view/config/twitter/tw.js +5 -0
  31. data/empty_view/config/twitter/twitter.rb +35 -0
  32. data/empty_view/posts/GIT_IS_DUMB +1 -0
  33. data/empty_view/remote/assets/GIT_IS_DUMB +1 -0
  34. data/empty_view/remote/banner/navbar/GIT_IS_DUMB +0 -0
  35. data/empty_view/remote/etc/GIT_IS_DUMB +1 -0
  36. data/empty_view/remote/permalink/GIT_IS_DUMB +1 -0
  37. data/empty_view/remote/widgets/ad/GIT_IS_DUMB +2 -0
  38. data/empty_view/remote/widgets/links/GIT_IS_DUMB +2 -0
  39. data/empty_view/remote/widgets/news/GIT_IS_DUMB +2 -0
  40. data/empty_view/remote/widgets/pages/GIT_IS_DUMB +2 -0
  41. data/empty_view/remote/widgets/pinned/GIT_IS_DUMB +2 -0
  42. data/empty_view/settings/features.txt +18 -0
  43. data/empty_view/settings/publish.txt +5 -0
  44. data/empty_view/settings/recent.txt +6 -0
  45. data/empty_view/settings/view.txt +4 -0
  46. data/empty_view/themes/standard/README +59 -0
  47. data/empty_view/themes/standard/banner/banner.lt3 +5 -0
  48. data/empty_view/themes/standard/banner/navbar/about.lt3 +18 -0
  49. data/empty_view/themes/standard/banner/navbar/contact.lt3 +18 -0
  50. data/empty_view/themes/standard/banner/navbar/faq.lt3 +1 -0
  51. data/empty_view/themes/standard/banner/navbar/list.data +3 -0
  52. data/empty_view/themes/standard/banner/top.lt3 +20 -0
  53. data/empty_view/themes/standard/blog/generate.lt3 +21 -0
  54. data/empty_view/themes/standard/blog/head.lt3 +16 -0
  55. data/empty_view/themes/standard/blog/index.lt3 +17 -0
  56. data/empty_view/themes/standard/blog/post_entry.lt3 +21 -0
  57. data/empty_view/themes/standard/etc/blog.css.lt3 +62 -0
  58. data/empty_view/themes/standard/etc/externals.lt3 +24 -0
  59. data/empty_view/themes/standard/etc/favicon.ico +0 -0
  60. data/empty_view/themes/standard/etc/misc.js +20 -0
  61. data/empty_view/themes/standard/post/generate.lt3 +38 -0
  62. data/empty_view/themes/standard/post/head.lt3 +7 -0
  63. data/empty_view/themes/standard/post/index.lt3 +24 -0
  64. data/empty_view/themes/standard/post/permalink.lt3 +32 -0
  65. data/empty_view/themes/standard/widgets/README +4 -0
  66. data/empty_view/themes/standard/widgets/ad/ad.lt3 +22 -0
  67. data/empty_view/themes/standard/widgets/ad/ad1.png +0 -0
  68. data/empty_view/themes/standard/widgets/ad/ad2.png +0 -0
  69. data/empty_view/themes/standard/widgets/ad/ad3.png +0 -0
  70. data/empty_view/themes/standard/widgets/ad/ad4.png +0 -0
  71. data/empty_view/themes/standard/widgets/bydates/README +2 -0
  72. data/empty_view/themes/standard/widgets/bydates/bydates.rb +18 -0
  73. data/empty_view/themes/standard/widgets/bydates/card.css +1 -0
  74. data/empty_view/themes/standard/widgets/bydates/custom.rb +1 -0
  75. data/empty_view/themes/standard/widgets/bydates/main.css +2 -0
  76. data/empty_view/themes/standard/widgets/links/README +2 -0
  77. data/empty_view/themes/standard/widgets/links/card.css +1 -0
  78. data/empty_view/themes/standard/widgets/links/custom.rb +1 -0
  79. data/empty_view/themes/standard/widgets/links/links.rb +90 -0
  80. data/empty_view/themes/standard/widgets/links/list.data +3 -0
  81. data/empty_view/themes/standard/widgets/links/main.css +2 -0
  82. data/empty_view/themes/standard/widgets/news/README +2 -0
  83. data/empty_view/themes/standard/widgets/news/card.css +1 -0
  84. data/empty_view/themes/standard/widgets/news/custom.rb +1 -0
  85. data/empty_view/themes/standard/widgets/news/list.data +4 -0
  86. data/empty_view/themes/standard/widgets/news/main.css +2 -0
  87. data/empty_view/themes/standard/widgets/news/news.rb +88 -0
  88. data/empty_view/themes/standard/widgets/pages/README +2 -0
  89. data/empty_view/themes/standard/widgets/pages/card.css +1 -0
  90. data/empty_view/themes/standard/widgets/pages/custom.rb +1 -0
  91. data/empty_view/themes/standard/widgets/pages/disclaim.lt3 +10 -0
  92. data/empty_view/themes/standard/widgets/pages/faq.lt3 +40 -0
  93. data/empty_view/themes/standard/widgets/pages/like-dislike.lt3 +11 -0
  94. data/empty_view/themes/standard/widgets/pages/list.data +4 -0
  95. data/empty_view/themes/standard/widgets/pages/local.rb +0 -0
  96. data/empty_view/themes/standard/widgets/pages/main.css +2 -0
  97. data/empty_view/themes/standard/widgets/pages/other-stuff.lt3 +10 -0
  98. data/empty_view/themes/standard/widgets/pages/pages.rb +95 -0
  99. data/empty_view/themes/standard/widgets/pinned/README +2 -0
  100. data/empty_view/themes/standard/widgets/pinned/card.css +1 -0
  101. data/empty_view/themes/standard/widgets/pinned/custom.rb +1 -0
  102. data/empty_view/themes/standard/widgets/pinned/main.css +2 -0
  103. data/empty_view/themes/standard/widgets/pinned/pinned.rb +99 -0
  104. data/empty_view/themes/standard/widgets/search/README +2 -0
  105. data/empty_view/themes/standard/widgets/search/card.css +1 -0
  106. data/empty_view/themes/standard/widgets/search/custom.rb +1 -0
  107. data/empty_view/themes/standard/widgets/search/main.css +2 -0
  108. data/empty_view/themes/standard/widgets/search/search.rb +18 -0
  109. data/empty_view/themes/standard/widgets/sitemap/README +2 -0
  110. data/empty_view/themes/standard/widgets/sitemap/card.css +1 -0
  111. data/empty_view/themes/standard/widgets/sitemap/custom.rb +1 -0
  112. data/empty_view/themes/standard/widgets/sitemap/main.css +2 -0
  113. data/empty_view/themes/standard/widgets/sitemap/sitemap.rb +18 -0
  114. data/empty_view/themes/standard/widgets/tag-cloud/OLD-example.lt3 +12 -0
  115. data/empty_view/themes/standard/widgets/tag-cloud/README +2 -0
  116. data/empty_view/themes/standard/widgets/tag-cloud/card.css +1 -0
  117. data/empty_view/themes/standard/widgets/tag-cloud/custom.rb +1 -0
  118. data/empty_view/themes/standard/widgets/tag-cloud/main.css +2 -0
  119. data/empty_view/themes/standard/widgets/tag-cloud/tag-cloud.lt3 +3 -0
  120. data/empty_view/themes/standard/widgets/tag-cloud/tag-cloud.rb +18 -0
  121. data/lib/Javascript.stuff +69 -0
  122. data/lib/helpers-blog.rb +155 -0
  123. data/lib/helpers-repl.rb +201 -0
  124. data/lib/liveblog.rb +825 -0
  125. data/lib/logging.rb +44 -0
  126. data/lib/lowlevel.rb +73 -0
  127. data/lib/pathmagic.rb +14 -0
  128. data/lib/post.rb +211 -0
  129. data/lib/processing.rb +60 -0
  130. data/lib/publish.rb +73 -0
  131. data/lib/repl.rb +597 -0
  132. data/lib/runeblog.rb +773 -0
  133. data/lib/runeblog_version.rb +50 -0
  134. data/lib/view.rb +69 -0
  135. data/runeblog.gemspec +42 -0
  136. data/test/austin.rb +158 -0
  137. data/test/fakeimage.jpg +0 -0
  138. data/test/general_test.rb +304 -0
  139. data/test/make_blog.rb +196 -0
  140. data/test/test +3 -0
  141. metadata +242 -0
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # $LOAD_PATH << "./lib"
4
+
5
+ require 'runeblog'
6
+ require 'rubytext'
7
+
8
+ require 'repl'
9
+
10
+ include RuneBlog::REPL
11
+
12
+ def yesno(question, noskip=false)
13
+ puts fx("\n #{question}", :bold)
14
+ puts unless noskip
15
+ STDSCR.yesno
16
+ end
17
+
18
+ def pick_editor
19
+ choices = %w[vim emacs vi nano]
20
+ r, c = STDSCR.rc
21
+ num, name = STDSCR.menu(r: r, c: c+6, title: "Default editor", items: choices)
22
+ file = `which #{name}`.chomp
23
+ end
24
+
25
+ def get_universal
26
+ univ = "#{@blog.root}/data/universal.lt3"
27
+ if yesno("Faster initial setup? (no: edit universal.lt3)")
28
+ author = ask!(" Author name: ")
29
+ site = ask!(" Site/domain: ")
30
+ # Now stash it...
31
+ str = File.read(univ)
32
+ str = str.gsub(/AUTHOR/, author)
33
+ str = str.gsub(/SITE_DOMAIN/, site)
34
+ File.write(univ, str)
35
+ # STDERR.puts "------ universal ------\n#{`cat #{univ}`}\n------------------------"
36
+ else
37
+ vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(AUTHOR.*\|SITE.*\)"'
38
+ edit_file(univ, vim: vim_params)
39
+ end
40
+ end
41
+
42
+ def get_global
43
+ if yesno("Faster view setup? (no: edit global.lt3)")
44
+ view_name = ask!("\n Filename: ")
45
+ @blog.create_view(view_name) # call change_view??
46
+ title = ask!(" View title: ")
47
+ subtitle = ask!(" Subtitle : ")
48
+ domain = ask!(" Domain : ")
49
+
50
+ vfile = "#{@blog.root}/views/#{view_name}/settings/view.txt"
51
+ hash = {/VIEW_NAME/ => view_name,
52
+ /VIEW_TITLE/ => title,
53
+ /VIEW_SUBTITLE/ => subtitle,
54
+ /VIEW_DOMAIN/ => domain}
55
+ @blog.complete_file(vfile, nil, hash)
56
+ else
57
+ view_name = ask!("\n Filename: ")
58
+ @blog.create_view(view_name) # call change_view??
59
+ vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(VIEW_.*\|SITE.*\)"'
60
+ edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
61
+ end
62
+ end
63
+
64
+ def get_started
65
+ if yesno("Do you want to qo a quick setup?")
66
+ puts " First choose your editor."
67
+ @blog.editor = pick_editor
68
+ File.write("#{@blog.root}/data/EDITOR", @blog.editor)
69
+
70
+ get_universal
71
+ # Now create a custom global.lt3
72
+ @blog._generate_global
73
+ puts fx("\n Quick setup complete!", :bold)
74
+ if yesno("Create your first view now?")
75
+ get_global
76
+ puts "\n View #{@blog.view} created!\n "
77
+ end
78
+ end
79
+
80
+ puts
81
+ print fx(" For help", :bold)
82
+ puts " type h or help."
83
+ print fx(" Create a view", :bold)
84
+ puts " with: new view"
85
+ print fx(" Create a post", :bold)
86
+ puts " (within current view): new post"
87
+ end
88
+
89
+ def mainloop
90
+ info = @blog.view || "no view"
91
+ print fx("[#{info}] ", Red, :bold)
92
+ cmd = STDSCR.gets(history: @cmdhist, tab: @tabcom)
93
+ cmd_quit(nil) if cmd.nil? # ^D
94
+ cmd.chomp!
95
+ return if cmd.empty? # CR does nothing
96
+ meth, params = RuneBlog::REPL.choose_method(cmd)
97
+ ret, str = send(meth, params)
98
+ rescue => err
99
+ puts err
100
+ end
101
+
102
+ def cmdline_preview
103
+ _need_view
104
+ local = @blog.view.local_index
105
+ result = system("open #{local}")
106
+ end
107
+
108
+ def cmdline_publish
109
+ abort "Nor implemented yet"
110
+ _need_view
111
+ end
112
+
113
+ def cmdline_browse
114
+ abort "Nor implemented yet"
115
+ _need_view
116
+ end
117
+
118
+ def _need_view
119
+ @view = ARGV[1]
120
+ abort "Need 'view' parameter" if @view.nil?
121
+ abort "No such view '#{view}'" unless @blog.view?(@view)
122
+ end
123
+
124
+ def cmdline_rebuild
125
+ _need_view
126
+ print "Generating view... "
127
+ @blog.generate_view(@view)
128
+ print "Generating index... "
129
+ num = @blog.generate_index(@view)
130
+ puts "#{num} posts\n "
131
+ end
132
+
133
+ def handle_cmdline
134
+ cmd = ARGV[0]
135
+ @blog = RuneBlog.new
136
+ abort "No blog found" if @blog.nil?
137
+
138
+ case cmd
139
+ when "rebuild"; cmdline_rebuild
140
+ when "publish"; cmdline_publish
141
+ when "preview"; cmdline_preview
142
+ when "browse"; cmdline_browse
143
+ else
144
+ puts "Command '#{cmd}' is unknown"
145
+ end
146
+ exit
147
+ end
148
+
149
+ ### Main
150
+
151
+ major, minor = RUBY_VERSION.split(".").values_at(0,1)
152
+ ver = major.to_i*10 + minor.to_i
153
+ unless ver >= 24
154
+ RubyText.stop
155
+ abort "Need Ruby 2.4 or greater"
156
+ end
157
+
158
+ include RuneBlog::Helpers # for try_read_config
159
+
160
+ handle_cmdline unless ARGV.empty?
161
+
162
+ errfile = File.new("stderr.out", "w")
163
+ STDERR.reopen(errfile)
164
+
165
+ # read a .rubytext file here?? Call it something else?
166
+ home = ENV['HOME']
167
+ @fg, @bg = Blue, White ## FIXME!! try_read_config("#{home}/.rubytext", fg: Blue, bg: White)
168
+ @fg = @fg.downcase.to_sym
169
+ @bg = @bg.downcase.to_sym
170
+
171
+ RubyText.start(:_echo, :keypad, scroll: true, log: "binblog.txt", fg: @fg, bg: @bg)
172
+
173
+
174
+ new_repo = false
175
+ if ! RuneBlog.exist?
176
+ exit unless yesno("No blog repo found. Create new one?")
177
+ RuneBlog.create_new_blog_repo
178
+ puts fx(" Blog repo successfully created.", :bold)
179
+ new_repo = true
180
+ end
181
+
182
+ @blog = RuneBlog.new
183
+ get_started if new_repo
184
+
185
+ print fx(" For help", :bold)
186
+ puts " type h or help.\n "
187
+
188
+ puts fx("\n RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red)
189
+
190
+ @cmdhist = []
191
+ @tabcom = RuneBlog::REPL::Patterns.keys.uniq - RuneBlog::REPL::Abbr.keys
192
+ @tabcom.map! {|x| x.sub(/ [\$\>].*/, "") + " " }
193
+ @tabcom.sort!
194
+
195
+ loop { mainloop }
196
+
197
+ system("tput clear")
198
+ sleep 0.2
199
+ puts
200
+
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ def write_css
5
+ # Need .lt3 file?
6
+ File.open("std_widget/card.css", "w") do |f|
7
+ f.puts <<~LIVE
8
+ # CSS for sidebar card
9
+ LIVE
10
+ end
11
+ File.open("std_widget/main.css", "w") do |f|
12
+ f.puts <<~LIVE
13
+ # CSS for main area page
14
+ LIVE
15
+ end
16
+ end
17
+
18
+ def _make_class_name(app)
19
+ if app =~ /[-_]/
20
+ words = app.split(/[-_]/)
21
+ name = words.map(&:capitalize).join
22
+ else
23
+ name = app.capitalize
24
+ end
25
+ return name
26
+ end
27
+
28
+ def write_widget_ruby
29
+ File.open("std_widget/#@app.rb", "w") do |f|
30
+ f.puts <<~LIVE
31
+ # Custom code for '#@app' widget
32
+
33
+ class ::RuneBlog::Widget
34
+ class #{_make_class_name(@app)}
35
+ Type, Title = "#@app", "#@title"
36
+
37
+ def initialize(repo)
38
+ @blog = repo
39
+ @datafile = "list.data"
40
+ @lines = File.exist?(@datafile) ? File.readlines(@datafile) : []
41
+ end
42
+
43
+ def _html_body(file, css = nil) # FIXME move to common file
44
+ file.puts "<html>"
45
+ if css
46
+ file.puts " <head>"
47
+ file.puts " <style>\n#{css}\n </style>"
48
+ file.puts " </head>"
49
+ end
50
+ file.puts " <body>"
51
+ yield
52
+ file.puts " </body>\n</html>"
53
+ end
54
+
55
+ def build
56
+ # ...insert logic here
57
+ write_main
58
+ write_card
59
+ end
60
+
61
+ def write_main
62
+ tag = Type
63
+ card_title = Title
64
+ css = "* { font-family: verdana }"
65
+ mainfile = "#{tag}-main"
66
+ File.open("#{mainfile}.html", "w") do |f|
67
+ _html_body(f, css) do
68
+ f.puts "<h1>#{card_title}</h1><br><hr>"
69
+ # ...insert logic here
70
+ end
71
+ end
72
+ end
73
+
74
+ def write_card
75
+ tag = Type
76
+ url = :widgets/tag/tag+"-main.html"
77
+ card_title = Title
78
+ cardfile = "#{tag}-card"
79
+ File.open("#{cardfile}.html", "w") do |f|
80
+ f.puts <<-EOS
81
+ <div class="card mb-3">
82
+ <div class="card-body">
83
+ <h5 class="card-title">
84
+ <button type="button" class="btn btn-primary" data-toggle="collapse" data-target="##{tag}">+</button>
85
+ <a href="javascript: void(0)"
86
+ onclick="javascript:open_main('#{url}')"
87
+ style="text-decoration: none; color: black"> #{card_title}</a>
88
+ </h5>
89
+ <div class="collapse" id="#{tag}">
90
+ EOS
91
+ # ...insert logic here
92
+ f.puts <<-EOS
93
+ </div>
94
+ </div>
95
+ </div>
96
+ EOS
97
+ end
98
+ end
99
+
100
+ def edit_menu
101
+ end
102
+
103
+ def refresh
104
+ end
105
+ end
106
+ end
107
+ LIVE
108
+ end
109
+ end
110
+
111
+ def write_custom_ruby
112
+ File.open("std_widget/custom.rb", "w") do |f|
113
+ f.puts <<~LIVE
114
+ # This is for specialized livetext add-ons (Ruby methods)
115
+ LIVE
116
+ end
117
+ end
118
+
119
+ def write_README
120
+ File.open("std_widget/README", "w") do |f|
121
+ f.puts <<~LIVE
122
+ This is for a "standard" Runeblog widget
123
+ Code and docs are a work in progress
124
+ LIVE
125
+ end
126
+ end
127
+
128
+ def safe_copy(src)
129
+ dst = src.sub(/std_widget/, "empty_view/themes/standard/widgets/#@app")
130
+ if File.exist?(dst)
131
+ puts "Skip: #{src}"
132
+ return
133
+ else
134
+ puts "Copying: #{src}"
135
+ system("cp #{src} #{dst}")
136
+ end
137
+ end
138
+
139
+ def copy_over
140
+ here, there = "std_widget", "empty_view/themes/standard/widgets/#@app"
141
+ slist = Dir["#{here}/*"].reject {|x| File.directory?(x) }
142
+ slist.each {|src| safe_copy(src) }
143
+
144
+ here, there = "std_widget/pieces", "empty_view/themes/standard/widgets/#@app/pieces"
145
+ system("mkdir #{there}") unless Dir.exist?(there)
146
+ slist = Dir["#{here}/*"]
147
+ slist.each {|src| safe_copy(src) }
148
+ end
149
+
150
+
151
+ ### "Main"
152
+
153
+ abort 'Need app, "title..."' if ARGV.empty?
154
+ @app, @title = *ARGV
155
+
156
+ system("rm -rf std_widget")
157
+ system("mkdir -p std_widget/pieces")
158
+
159
+ write_css
160
+ write_widget_ruby
161
+ write_custom_ruby
162
+ write_README
163
+
164
+ copy_over
@@ -0,0 +1 @@
1
+ /usr/local/bin/vim
@@ -0,0 +1 @@
1
+ /FULL/PATH/.blogs
@@ -0,0 +1 @@
1
+ [no view]
@@ -0,0 +1,18 @@
1
+ # 0 = disabled (installed but disabled)
2
+ # 1 = enabled (implies installed)
3
+ # x = excluded (not installed; does it even exist?)
4
+
5
+ reddit 1 # autopost, embed thread after blog post
6
+ facebook 0 # reader-like, reader post, autopost?
7
+ twitter 0 # reader-tweet, reader-follow, autotweet?
8
+
9
+ links 1 # widget: external links
10
+ news 1 # widget: news (external)
11
+ pages 1 # widget: internal pages
12
+ pinned 1 # widget: pinned posts
13
+
14
+ ad x # widget: embed advertising
15
+ bydates x # widget: browse posts by date
16
+ search x # widget: search posts
17
+ sitemap x # widget: site map
18
+ tag_cloud x # widget: tag cloud (clickable)
@@ -0,0 +1,20 @@
1
+ . --------------------------------------------------
2
+ . Global settings are stored here in the form
3
+ . <variable> <value>
4
+ . --------------------------------------------------
5
+
6
+ .variables view ../../settings/view.txt
7
+
8
+ .variables recent ../../settings/recent.txt
9
+
10
+ .variables publish ../../settings/publish.txt
11
+
12
+ .variables
13
+ host http://SITE
14
+ charset utf-8
15
+ url http://SITE
16
+ locale en_US
17
+
18
+ font.family verdana
19
+ .end
20
+
@@ -0,0 +1,18 @@
1
+ . "Universal" settings -- new defaults for global.lt3
2
+ . work in progress - defaults for each global.lt3
3
+
4
+ . --------------------------------------------------
5
+ . Global settings are stored here in the form
6
+ . <variable> <value>
7
+ . --------------------------------------------------
8
+ .nopara
9
+
10
+ .variables
11
+ univ.author AUTHOR
12
+ univ.site SITE_DOMAIN
13
+
14
+ font.family verdana
15
+
16
+ charset utf-8
17
+ locale en_US
18
+ .end
@@ -0,0 +1,38 @@
1
+ .nopara
2
+ .variables
3
+ blog Around Austin
4
+ blog.desc The view from downtown
5
+
6
+ viewbox.wide 550
7
+ viewbox.high 90
8
+
9
+ rect.wide 550
10
+ rect.high 90
11
+ rect.fill blue
12
+
13
+ title.font bold 58px sans-serif
14
+ title.fill white
15
+ title.xoff 280
16
+ title.yoff 55
17
+
18
+ subtitle.font italic 24px sans-serif
19
+ subtitle.fill lightblue
20
+ subtitle.xoff 280
21
+ subtitle.yoff 80
22
+ .end
23
+
24
+ <svg width=$viewbox.wide height=$viewbox.high
25
+ viewBox="0 0 $viewbox.wide $viewbox.high"
26
+ xmlns="http://www.w3.org/2000/svg">
27
+ <style>
28
+ .subtitle { font: $subtitle.font; fill: $subtitle.fill }
29
+ .title { font: $title.font; fill: $title.fill }
30
+ </style>
31
+
32
+ <rect x="0" y="0" rx="10" ry="10" width="$rect.wide" height="$rect.high" fill="$rect.fill"/>
33
+
34
+ <text text-anchor="middle" x=$title.xoff y=$title.yoff class=title>$blog</text>
35
+ <text text-anchor="middle" x=$subtitle.xoff y=$subtitle.yoff class=subtitle>$blog.desc</text>
36
+ </svg>
37
+ <br>
38
+ Here we are