runeblog 0.3.02

Sign up to get free protection for your applications and to get access to all the features.
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