runeblog 0.2.43 → 0.2.44
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.
- checksums.yaml +4 -4
- data/empty_view/themes/standard/etc/blog.css.lt3 +6 -0
- data/empty_view/themes/standard/navbar/faq.lt3 +1 -0
- data/empty_view/themes/standard/navbar/navbar.lt3 +1 -0
- data/empty_view/themes/standard/widgets/ad/ad.lt3 +8 -1
- data/empty_view/themes/standard/widgets/ad/ad1.png +0 -0
- data/empty_view/themes/standard/widgets/ad/ad2.png +0 -0
- data/empty_view/themes/standard/widgets/ad/ad3.png +0 -0
- data/empty_view/themes/standard/widgets/ad/ad4.png +0 -0
- data/empty_view/themes/standard/widgets/pages/pages.rb +3 -0
- data/lib/default.rb +1 -1
- data/lib/global.rb +8 -7
- data/lib/helpers-blog.rb +15 -15
- data/lib/liveblog.rb +22 -16
- data/lib/logging.rb +17 -8
- data/lib/post.rb +6 -6
- data/lib/publish.rb +4 -4
- data/lib/runeblog.rb +45 -40
- data/lib/runeblog_version.rb +1 -1
- data/lib/view.rb +2 -8
- data/lib/xlate.rb +2 -2
- data/test/austin.rb +7 -7
- metadata +7 -5
- data/empty_view/remote/widgets/links/list.data +0 -3
- data/empty_view/remote/widgets/news/list.data +0 -4
- data/empty_view/remote/widgets/pages/list.data +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0b81363110b0cb0392e016c289ee76b841d05a2d4ed2167ce26b9f08bb2e1ae
|
4
|
+
data.tar.gz: c57eedabc749e9bee009dd3dc68c9f5ad8f430ae858ff6e307b027cd90fbf147
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20a947a5d88018aa3a9942b559cba915f15c733120ffbdd46433e50ea018bd9997184a194220a530882c9bcfab818a364c141b3ba62a4d36411b4241617521b4
|
7
|
+
data.tar.gz: '019e9d9fbff78f670ea225014e3ec9208aa9fb0fd31fbc4241262d9f4ed39c365f5be14c6d3439e9bb996a9cea568ef81ddd1b1a41ad369b14279339160f91a8'
|
@@ -0,0 +1 @@
|
|
1
|
+
.include ../widgets/pages/faq.lt3
|
@@ -1,15 +1,22 @@
|
|
1
1
|
. In real life, ads won't work this way...
|
2
2
|
|
3
|
+
.include vars.lt3
|
4
|
+
|
3
5
|
.set classname="btn btn-light float-right"
|
4
6
|
.set card.title="Advertisement"
|
5
7
|
.set card.text="Build your amazing website with blabla.com."
|
6
|
-
.set extra="bg-dark text-white"
|
8
|
+
. set extra="bg-dark text-white"
|
9
|
+
|
10
|
+
<!-- "$ad.image" -->
|
7
11
|
|
8
12
|
<div class="card $extra mb-3">
|
9
13
|
<div class="card-body">
|
14
|
+
<!--
|
10
15
|
<h5 class="card-title">$card.title</h5>
|
11
16
|
<p class="card-text">$card.text</p>
|
12
17
|
<a href="javascript: void(0)" onclick="javascript:open_main('widgets/ad/ad.html')" class="$classname">Visit page</a>
|
18
|
+
-->
|
19
|
+
<img style="max-height: 100%; max-width: 100%" src="$ad.image"></img>
|
13
20
|
</div>
|
14
21
|
</div>
|
15
22
|
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -5,11 +5,14 @@
|
|
5
5
|
class ::RuneBlog::Widget
|
6
6
|
class Pages
|
7
7
|
def self.build
|
8
|
+
# build child pages
|
8
9
|
children = Dir["*.lt3"] - ["pages.lt3"]
|
9
10
|
children.each do |child|
|
10
11
|
dest = child.sub(/.lt3$/, ".html")
|
11
12
|
xlate src: child, dst: dest # , debug: true
|
12
13
|
end
|
14
|
+
# build mainfile
|
15
|
+
# build cardfile
|
13
16
|
end
|
14
17
|
|
15
18
|
def self.edit_menu
|
data/lib/default.rb
CHANGED
@@ -5,7 +5,7 @@ class RuneBlog::Default
|
|
5
5
|
def RuneBlog.post_template(num: 0, title: "No title", date: nil, view: "test_view",
|
6
6
|
teaser: "No teaser", body: "No body", tags: ["untagged"],
|
7
7
|
views: [], back: "javascript:history.go(-1)", home: "no url")
|
8
|
-
log!(enter: __method__, args: [num, title, date, view, teaser, body, tags, views, back, home])
|
8
|
+
log!(enter: __method__, args: [num, title, date, view, teaser, body, tags, views, back, home], level: 3)
|
9
9
|
viewlist = (views + [view.to_s]).join(" ")
|
10
10
|
taglist = ".tags " + tags.join(" ")
|
11
11
|
<<-TEXT
|
data/lib/global.rb
CHANGED
@@ -20,7 +20,7 @@ end
|
|
20
20
|
# Refactor, move stuff elsewhere?
|
21
21
|
|
22
22
|
def make_exception(sym, str)
|
23
|
-
log!(enter: __method__, args: [sym, str])
|
23
|
+
log!(enter: __method__, args: [sym, str], level: 3)
|
24
24
|
return if Object.constants.include?(sym)
|
25
25
|
Object.const_set(sym, StandardError.dup)
|
26
26
|
define_method(sym) do |*args|
|
@@ -30,8 +30,9 @@ def make_exception(sym, str)
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def system!(str)
|
34
|
-
log!(enter: __method__, args: [str])
|
33
|
+
def system!(str, show: false)
|
34
|
+
log!(enter: __method__, args: [str], level: 2)
|
35
|
+
STDERR.puts str if show
|
35
36
|
rc = system(str)
|
36
37
|
if rc
|
37
38
|
return rc
|
@@ -44,12 +45,12 @@ end
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def prefix(num)
|
47
|
-
log!(enter: __method__, args: [num])
|
48
|
+
log!(enter: __method__, args: [num], level: 3)
|
48
49
|
"#{'%04d' % num.to_i}"
|
49
50
|
end
|
50
51
|
|
51
52
|
def check_meta(meta, where = "")
|
52
|
-
log!(enter: __method__, args: [meta, where])
|
53
|
+
log!(enter: __method__, args: [meta, where], level: 3)
|
53
54
|
str = "--- #{where}\n"
|
54
55
|
str << "\ncheck_meta: \n" + caller.join("\n") + "\n meta = #{meta.inspect}\n"
|
55
56
|
str << " title missing!\n" unless meta.title
|
@@ -62,14 +63,14 @@ def check_meta(meta, where = "")
|
|
62
63
|
end
|
63
64
|
|
64
65
|
def verify(hash)
|
65
|
-
log!(enter: __method__, args: [hash])
|
66
|
+
log!(enter: __method__, args: [hash], level: 3)
|
66
67
|
hash.each_pair do |expr, msg|
|
67
68
|
puts "<< #{msg}" unless expr
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
71
72
|
def assure(hash) # really the same as verify for now...
|
72
|
-
log!(enter: __method__, args: [hash])
|
73
|
+
log!(enter: __method__, args: [hash], level: 3)
|
73
74
|
hash.each_pair do |expr, msg|
|
74
75
|
puts "<< #{msg}" unless expr
|
75
76
|
end
|
data/lib/helpers-blog.rb
CHANGED
@@ -6,14 +6,14 @@ require 'xlate'
|
|
6
6
|
module RuneBlog::Helpers
|
7
7
|
|
8
8
|
def copy(src, dst)
|
9
|
-
log!(enter: __method__, args: [src, dst])
|
9
|
+
log!(enter: __method__, args: [src, dst], level: 2)
|
10
10
|
cmd = "cp #{src} #{dst} 2>/dev/null"
|
11
11
|
rc = system!(cmd)
|
12
12
|
puts " Failed: #{cmd} - from #{caller[0]}" unless rc
|
13
13
|
end
|
14
14
|
|
15
15
|
def copy!(src, dst)
|
16
|
-
log!(enter: __method__, args: [src, dst])
|
16
|
+
log!(enter: __method__, args: [src, dst], level: 2)
|
17
17
|
cmd = "cp -r #{src} #{dst} 2>/dev/null"
|
18
18
|
rc = system!(cmd)
|
19
19
|
puts " Failed: #{cmd} - from #{caller[0]}" unless rc
|
@@ -36,7 +36,7 @@ module RuneBlog::Helpers
|
|
36
36
|
# end
|
37
37
|
|
38
38
|
def read_config(file, *syms)
|
39
|
-
log!(enter: __method__, args: [file, *syms])
|
39
|
+
log!(enter: __method__, args: [file, *syms], level: 3)
|
40
40
|
lines = File.readlines(file).map(&:chomp)
|
41
41
|
obj = ::OpenStruct.new
|
42
42
|
lines.each do |line|
|
@@ -61,7 +61,7 @@ module RuneBlog::Helpers
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def try_read_config(file, hash)
|
64
|
-
log!(enter: __method__, args: [file, hash])
|
64
|
+
log!(enter: __method__, args: [file, hash], level: 3)
|
65
65
|
return hash.values unless File.exist?(file)
|
66
66
|
vals = read_config(file, *hash.keys)
|
67
67
|
vals
|
@@ -80,7 +80,7 @@ module RuneBlog::Helpers
|
|
80
80
|
# end
|
81
81
|
|
82
82
|
def write_config(obj, file)
|
83
|
-
log!(enter: __method__, args: [obj, file])
|
83
|
+
log!(enter: __method__, args: [obj, file], level: 2)
|
84
84
|
hash = obj.to_h
|
85
85
|
File.open(file, "w") do |out|
|
86
86
|
hash.each_pair {|key, val| out.puts "#{key}: #{val}" }
|
@@ -88,13 +88,13 @@ module RuneBlog::Helpers
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def get_views # read from filesystem
|
91
|
-
log!(enter: __method__)
|
91
|
+
log!(enter: __method__, level: 3)
|
92
92
|
dirs = subdirs("#@root/views/").sort
|
93
93
|
dirs.map {|name| RuneBlog::View.new(name) }
|
94
94
|
end
|
95
95
|
|
96
96
|
def new_dotfile(root: ".blogs", current_view: "test_view", editor: "vi")
|
97
|
-
log!(enter: __method__, args: [root, current_view, editor])
|
97
|
+
log!(enter: __method__, args: [root, current_view, editor], level: 3)
|
98
98
|
root = Dir.pwd/root
|
99
99
|
x = OpenStruct.new
|
100
100
|
x.root, x.current_view, x.editor = root, current_view, editor
|
@@ -102,21 +102,21 @@ module RuneBlog::Helpers
|
|
102
102
|
end
|
103
103
|
|
104
104
|
def new_sequence
|
105
|
-
log!(enter: __method__)
|
105
|
+
log!(enter: __method__, level: 3)
|
106
106
|
dump(0, "sequence")
|
107
107
|
version_info = "#{RuneBlog::VERSION}\nBlog created: #{Time.now.to_s}"
|
108
108
|
dump(version_info, "VERSION")
|
109
109
|
end
|
110
110
|
|
111
111
|
def subdirs(dir)
|
112
|
-
log!(enter: __method__, args: [dir])
|
112
|
+
log!(enter: __method__, args: [dir], level: 3)
|
113
113
|
dirs = Dir.entries(dir) - %w[. ..]
|
114
114
|
dirs.reject! {|x| ! File.directory?("#@root/views/#{x}") }
|
115
115
|
dirs
|
116
116
|
end
|
117
117
|
|
118
118
|
def find_draft_slugs
|
119
|
-
log!(enter: __method__)
|
119
|
+
log!(enter: __method__, level: 3)
|
120
120
|
files = Dir["#@root/drafts/**"].grep /\d{4}.*.lt3$/
|
121
121
|
flagfile = "#@root/drafts/last_rebuild"
|
122
122
|
last = File.exist?(flagfile) ? File.mtime(flagfile) : (Time.now - 86_400)
|
@@ -128,7 +128,7 @@ module RuneBlog::Helpers
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def create_dirs(*dirs)
|
131
|
-
log!(enter: __method__, args: [*dirs])
|
131
|
+
log!(enter: __method__, args: [*dirs], level: 3)
|
132
132
|
dirs.each do |dir|
|
133
133
|
dir = dir.to_s # symbols allowed
|
134
134
|
next if Dir.exist?(dir)
|
@@ -139,27 +139,27 @@ module RuneBlog::Helpers
|
|
139
139
|
end
|
140
140
|
|
141
141
|
def interpolate(str, bind)
|
142
|
-
log!(enter: __method__, args: [str, bind])
|
142
|
+
log!(enter: __method__, args: [str, bind], level: 3)
|
143
143
|
wrap = "<<-EOS\n#{str}\nEOS"
|
144
144
|
eval wrap, bind
|
145
145
|
end
|
146
146
|
|
147
147
|
def error(err) # Hmm, this is duplicated
|
148
|
-
log!(str: "duplicated method", enter: __method__, args: [err])
|
148
|
+
log!(str: "duplicated method", enter: __method__, args: [err], level: 2)
|
149
149
|
str = "\n Error: #{err}"
|
150
150
|
puts str
|
151
151
|
puts err.backtrace.join("\n")
|
152
152
|
end
|
153
153
|
|
154
154
|
def dump(obj, name)
|
155
|
-
log!(enter: __method__, args: [obj, name])
|
155
|
+
log!(enter: __method__, args: [obj, name], level: 3)
|
156
156
|
File.write(name, obj)
|
157
157
|
end
|
158
158
|
|
159
159
|
end
|
160
160
|
|
161
161
|
def dump(obj, name) # FIXME scope
|
162
|
-
log!(str: "scope problem", enter: __method__, args: [obj, name])
|
162
|
+
log!(str: "scope problem", enter: __method__, args: [obj, name], level: 3)
|
163
163
|
File.write(name, obj)
|
164
164
|
end
|
165
165
|
|
data/lib/liveblog.rb
CHANGED
@@ -128,17 +128,17 @@ end
|
|
128
128
|
|
129
129
|
|
130
130
|
def make_main_links
|
131
|
-
log!(enter: __method__)
|
131
|
+
log!(enter: __method__, level: 1)
|
132
132
|
# FIXME remember strings may not be safe
|
133
133
|
line = _data.chomp
|
134
134
|
tag, card_title = *line.split(" ", 2)
|
135
135
|
cardfile, mainfile = "#{tag}-card", "#{tag}-main"
|
136
136
|
input = "list.data"
|
137
|
-
log!(str: "Reading #{input}", pwd: true)
|
137
|
+
log!(str: "Reading #{input}", pwd: true, level: 3)
|
138
138
|
pairs = File.readlines(input).map {|line| line.chomp.split(/, */, 2) }
|
139
139
|
_write_main(mainfile, pairs, card_title, tag)
|
140
140
|
_write_card(cardfile, mainfile, pairs, card_title, tag)
|
141
|
-
log!(str: "...returning from method", pwd: true)
|
141
|
+
log!(str: "...returning from method", pwd: true, level: 3)
|
142
142
|
end
|
143
143
|
|
144
144
|
### inset
|
@@ -375,16 +375,22 @@ def sidebar
|
|
375
375
|
tcard = "#{tag}-card.html"
|
376
376
|
|
377
377
|
code = _load_local(tag)
|
378
|
-
code &&
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
#
|
386
|
-
|
387
|
-
|
378
|
+
if code && tag == "pages"
|
379
|
+
Dir.chdir(wtag) { code.build }
|
380
|
+
else
|
381
|
+
end
|
382
|
+
|
383
|
+
if tag == "ad"
|
384
|
+
num = rand(1..4)
|
385
|
+
img = "widgets/ad/ad#{num}.png"
|
386
|
+
src, dst = img, @root/:views/@view_name/"remote/widgets/ad/"
|
387
|
+
system!("cp #{src} #{dst}") # , show: true)
|
388
|
+
File.open(wtag/"vars.lt3", "w") do |f|
|
389
|
+
f.puts ".set ad.image = #{img}"
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
xlate cwd: wtag, src: tag, dst: tcard # , debug: (tag == "ad")
|
388
394
|
_include_file wtag/tcard
|
389
395
|
end
|
390
396
|
_out %[</div>]
|
@@ -593,7 +599,7 @@ def _html_body(file, css = nil)
|
|
593
599
|
end
|
594
600
|
|
595
601
|
def _write_card(cardfile, mainfile, pairs, card_title, tag)
|
596
|
-
log!(str: "Creating #{cardfile}.html", pwd: true)
|
602
|
+
log!(str: "Creating #{cardfile}.html", pwd: true, level: 2)
|
597
603
|
url = mainfile
|
598
604
|
url = :widgets/tag/mainfile + ".html"
|
599
605
|
File.open("#{cardfile}.html", "w") do |f|
|
@@ -608,7 +614,7 @@ def _write_card(cardfile, mainfile, pairs, card_title, tag)
|
|
608
614
|
</h5>
|
609
615
|
<div class="collapse" id="#{tag}">
|
610
616
|
EOS
|
611
|
-
log!(str: "Writing data pairs to #{cardfile}.html", pwd: true)
|
617
|
+
log!(str: "Writing data pairs to #{cardfile}.html", pwd: true, level: 2)
|
612
618
|
local = _local_tag?(tag)
|
613
619
|
pairs.each do |file, title|
|
614
620
|
url = file
|
@@ -681,7 +687,7 @@ def _write_main_pages(mainfile, pairs, card_title, tag)
|
|
681
687
|
end
|
682
688
|
|
683
689
|
def _write_main(mainfile, pairs, card_title, tag)
|
684
|
-
log!(str: "Creating #{mainfile}.html", pwd: true)
|
690
|
+
log!(str: "Creating #{mainfile}.html", pwd: true, level: 2)
|
685
691
|
|
686
692
|
if tag == "pages" # temporary experiment
|
687
693
|
_write_main_pages(mainfile, pairs, card_title, tag)
|
data/lib/logging.rb
CHANGED
@@ -2,8 +2,17 @@ unless self.respond_to?("log!")
|
|
2
2
|
$logging = true
|
3
3
|
$log = File.new("/tmp/runeblog.log","w")
|
4
4
|
|
5
|
-
def
|
5
|
+
def outlog(str = "", stderr: false)
|
6
|
+
$log.puts str
|
7
|
+
STDERR.puts str if stderr
|
8
|
+
end
|
9
|
+
|
10
|
+
def log!(str: "", enter: nil, args: [], pwd: false, dir: false, level: 0, stderr: false)
|
6
11
|
return unless $logging
|
12
|
+
@err_level ||= ENV['RUNEBLOG_ERROR_LEVEL']
|
13
|
+
@err_level ||= 0
|
14
|
+
return if level < @err_level
|
15
|
+
|
7
16
|
time = Time.now.strftime("%H:%M:%S")
|
8
17
|
|
9
18
|
meth = ""
|
@@ -17,16 +26,16 @@ unless self.respond_to?("log!")
|
|
17
26
|
str = " ... #{str}" unless str.empty?
|
18
27
|
indent = " "*12
|
19
28
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
29
|
+
outlog "#{time} #{meth}#{para}"
|
30
|
+
outlog "#{indent} #{str} " unless str.empty?
|
31
|
+
outlog "#{indent} #{source}"
|
32
|
+
outlog "#{indent} pwd = #{Dir.pwd} " if pwd
|
24
33
|
if dir
|
25
34
|
files = (Dir.entries('.') - %w[. ..]).join(" ")
|
26
|
-
|
35
|
+
outlog "#{indent} dir/* = #{files}"
|
27
36
|
end
|
28
|
-
#
|
29
|
-
|
37
|
+
# outlog "#{indent} livetext params = #{livedata.inpect} " unless livedata.nil?
|
38
|
+
outlog
|
30
39
|
$log.close
|
31
40
|
$log = File.new("/tmp/runeblog.log","a")
|
32
41
|
end
|
data/lib/post.rb
CHANGED
@@ -10,14 +10,14 @@ class RuneBlog::Post
|
|
10
10
|
include RuneBlog::Helpers
|
11
11
|
|
12
12
|
def self.files(num, root)
|
13
|
-
log!(enter: __method__, args: [num, root])
|
13
|
+
log!(enter: __method__, args: [num, root], level: 3)
|
14
14
|
files = Find.find(root).to_a
|
15
15
|
result = files.grep(/#{prefix(num)}-/)
|
16
16
|
result
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.load(post)
|
20
|
-
log!(enter: __method__, args: [post])
|
20
|
+
log!(enter: __method__, args: [post], level: 3)
|
21
21
|
raise "Doesn't work right now"
|
22
22
|
raise NoBlogAccessor if RuneBlog.blog.nil?
|
23
23
|
# "post" is a slug
|
@@ -36,7 +36,7 @@ class RuneBlog::Post
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def write_metadata(meta) # FIXME ???
|
39
|
-
log!(enter: __method__, args: [meta])
|
39
|
+
log!(enter: __method__, args: [meta], level: 3)
|
40
40
|
debug "=== write_metadata:"
|
41
41
|
debug "-----\n#{meta.inspect}\n-----"
|
42
42
|
fname2 = "metadata.txt"
|
@@ -57,7 +57,7 @@ class RuneBlog::Post
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def initialize
|
60
|
-
log!(enter: __method__)
|
60
|
+
log!(enter: __method__, level: 3)
|
61
61
|
@blog = RuneBlog.blog || raise(NoBlogAccessor)
|
62
62
|
@meta = OpenStruct.new
|
63
63
|
end
|
@@ -115,7 +115,7 @@ class RuneBlog::ViewPost
|
|
115
115
|
:teaser_text
|
116
116
|
|
117
117
|
def initialize(view, postdir)
|
118
|
-
log!(enter: __method__, args: [view, postdir])
|
118
|
+
log!(enter: __method__, args: [view, postdir], level: 3)
|
119
119
|
# Assumes already parsed/processed
|
120
120
|
@blog = RuneBlog.blog || raise(NoBlogAccessor)
|
121
121
|
@path = postdir.dup
|
@@ -131,7 +131,7 @@ class RuneBlog::ViewPost
|
|
131
131
|
end
|
132
132
|
|
133
133
|
def get_dirs
|
134
|
-
log!(enter: __method__, args: [view, postdir])
|
134
|
+
log!(enter: __method__, args: [view, postdir], level: 3)
|
135
135
|
fname = File.basename(draft)
|
136
136
|
noext = fname.sub(/.lt3$/, "")
|
137
137
|
vdir = @root/:views/view
|
data/lib/publish.rb
CHANGED
@@ -21,25 +21,25 @@ class RuneBlog::Publishing
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def to_h
|
24
|
-
log!(enter: __method__)
|
24
|
+
log!(enter: __method__, level: 3)
|
25
25
|
{user: @user, server: @server, docroot: @docroot,
|
26
26
|
path: @path, proto: @proto}
|
27
27
|
end
|
28
28
|
|
29
29
|
def url
|
30
|
-
log!(enter: __method__)
|
30
|
+
log!(enter: __method__, level: 3)
|
31
31
|
vname = @blog.view.name # .gsub(/_/, "\\_")
|
32
32
|
url = "#@proto://#@server/#@path" # /#{vname}"
|
33
33
|
end
|
34
34
|
|
35
35
|
def system!(str)
|
36
|
-
log!(enter: __method__, args: [str])
|
36
|
+
log!(enter: __method__, args: [str], level: 1)
|
37
37
|
rc = system(str)
|
38
38
|
rc
|
39
39
|
end
|
40
40
|
|
41
41
|
def publish(files, assets=[])
|
42
|
-
log!(enter: __method__, args: [files, assets])
|
42
|
+
log!(enter: __method__, args: [files, assets], level: 1)
|
43
43
|
dir = @docroot/@path
|
44
44
|
view_name = @blog.view.name
|
45
45
|
viewpath = dir # /view_name
|
data/lib/runeblog.rb
CHANGED
@@ -53,7 +53,7 @@ class RuneBlog
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def self.create(root = ".blogs")
|
56
|
-
log!(enter: __method__, args: [root])
|
56
|
+
log!(enter: __method__, args: [root], level: 1)
|
57
57
|
# Crude - FIXME later - # What views are there? Publishing, etc.
|
58
58
|
self.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
59
59
|
root = Dir.pwd/root
|
@@ -101,7 +101,7 @@ class RuneBlog
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def _deploy_local(dir)
|
104
|
-
log!(enter: __method__, args: [dir])
|
104
|
+
log!(enter: __method__, args: [dir], level: 1)
|
105
105
|
Dir.chdir(dir) do
|
106
106
|
views = _retrieve_metadata(:views)
|
107
107
|
views.each {|v| system!("cp *html #@root/views/#{v}/remote") }
|
@@ -132,7 +132,7 @@ class RuneBlog
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def process_post(sourcefile)
|
135
|
-
log!(enter: __method__, args: [dir])
|
135
|
+
log!(enter: __method__, args: [dir], level: 2)
|
136
136
|
nslug = sourcefile.sub(/.lt3/, "")
|
137
137
|
dir = @root/:posts/nslug
|
138
138
|
create_dir(dir)
|
@@ -141,7 +141,7 @@ class RuneBlog
|
|
141
141
|
end
|
142
142
|
|
143
143
|
def inspect
|
144
|
-
log!(enter: __method__)
|
144
|
+
log!(enter: __method__, level: 3)
|
145
145
|
str = "blog: "
|
146
146
|
ivars = ["@root", "@sequence"] # self.instance_variables
|
147
147
|
ivars.each do |iv|
|
@@ -152,30 +152,30 @@ class RuneBlog
|
|
152
152
|
end
|
153
153
|
|
154
154
|
def view?(name)
|
155
|
-
log!(enter: __method__, args: [name])
|
155
|
+
log!(enter: __method__, args: [name], level: 3)
|
156
156
|
raise ArgumentError unless name.is_a?(String) && ! name.empty?
|
157
157
|
views.any? {|x| x.name == name }
|
158
158
|
end
|
159
159
|
|
160
160
|
def view(name = nil)
|
161
|
-
log!(enter: __method__, args: [name])
|
161
|
+
log!(enter: __method__, args: [name], level: 3)
|
162
162
|
raise ArgumentError unless name.nil? || (name.is_a?(String) && ! name.empty?)
|
163
163
|
name.nil? ? @view : str2view(name)
|
164
164
|
end
|
165
165
|
|
166
166
|
def str2view(str)
|
167
|
-
log!(enter: __method__, args: [str])
|
167
|
+
log!(enter: __method__, args: [str], level: 3)
|
168
168
|
raise ArgumentError unless str.is_a?(String) && ! str.empty?
|
169
169
|
@views.find {|x| x.name == str }
|
170
170
|
end
|
171
171
|
|
172
172
|
def _set_publisher
|
173
|
-
log!(enter: __method__)
|
173
|
+
log!(enter: __method__, level: 3)
|
174
174
|
@view.publisher = RuneBlog::Publishing.new(@view.to_s) # FIXME refactor
|
175
175
|
end
|
176
176
|
|
177
177
|
def view=(arg)
|
178
|
-
log!(enter: __method__, args: [arg])
|
178
|
+
log!(enter: __method__, args: [arg], level: 2)
|
179
179
|
case arg
|
180
180
|
when RuneBlog::View
|
181
181
|
@view = arg
|
@@ -191,19 +191,19 @@ class RuneBlog
|
|
191
191
|
end
|
192
192
|
|
193
193
|
def get_sequence
|
194
|
-
log!(enter: __method__)
|
194
|
+
log!(enter: __method__, level: 3)
|
195
195
|
File.read(@root/:sequence).to_i
|
196
196
|
end
|
197
197
|
|
198
198
|
def next_sequence
|
199
|
-
log!(enter: __method__)
|
199
|
+
log!(enter: __method__, level: 3)
|
200
200
|
@sequence += 1
|
201
201
|
dump(@sequence, @root/:sequence)
|
202
202
|
@sequence
|
203
203
|
end
|
204
204
|
|
205
205
|
def viewdir(v = nil) # delete?
|
206
|
-
log!(enter: __method__, args: [v])
|
206
|
+
log!(enter: __method__, args: [v], level: 3)
|
207
207
|
v = str2view(v) if v.is_a?(String)
|
208
208
|
raise ArgumentError unless v.nil? || v.is_a?(RuneBlog::View)
|
209
209
|
v ||= @view
|
@@ -211,17 +211,17 @@ class RuneBlog
|
|
211
211
|
end
|
212
212
|
|
213
213
|
def self.exist?
|
214
|
-
log!(enter: __method__)
|
214
|
+
log!(enter: __method__, level: 3)
|
215
215
|
Dir.exist?(DotDir) && File.exist?(DotDir/ConfigFile)
|
216
216
|
end
|
217
217
|
|
218
218
|
def mark_last_published(str)
|
219
|
-
log!(enter: __method__, args: [str])
|
219
|
+
log!(enter: __method__, args: [str], level: 2)
|
220
220
|
dump(str, "#{self.view.dir}/last_published")
|
221
221
|
end
|
222
222
|
|
223
223
|
def add_view(view_name)
|
224
|
-
log!(enter: __method__, args: [view_name])
|
224
|
+
log!(enter: __method__, args: [view_name], level: 2)
|
225
225
|
view = RuneBlog::View.new(view_name)
|
226
226
|
@view = view # current view
|
227
227
|
@views << view # all views
|
@@ -229,7 +229,7 @@ class RuneBlog
|
|
229
229
|
end
|
230
230
|
|
231
231
|
def make_empty_view_tree(view_name)
|
232
|
-
log!(enter: __method__, args: [view_name])
|
232
|
+
log!(enter: __method__, args: [view_name], level: 2)
|
233
233
|
Dir.chdir(@root) do
|
234
234
|
cmd = "cp -r #{RuneBlog::Path}/../empty_view views/#{view_name}"
|
235
235
|
system!(cmd)
|
@@ -237,7 +237,7 @@ class RuneBlog
|
|
237
237
|
end
|
238
238
|
|
239
239
|
def check_valid_new_view(view_name)
|
240
|
-
log!(enter: __method__, args: [view_name])
|
240
|
+
log!(enter: __method__, args: [view_name], level: 3)
|
241
241
|
raise ArgumentError unless view_name.is_a?(String)
|
242
242
|
raise ArgumentError if view_name.empty?
|
243
243
|
names = self.views.map(&:to_s)
|
@@ -249,9 +249,11 @@ class RuneBlog
|
|
249
249
|
end
|
250
250
|
|
251
251
|
def create_view(view_name)
|
252
|
-
log!(enter: __method__, args: [view_name])
|
252
|
+
log!(enter: __method__, args: [view_name], level: 2)
|
253
253
|
check_valid_new_view(view_name)
|
254
254
|
make_empty_view_tree(view_name)
|
255
|
+
# STDERR.puts "Made empty tree!"
|
256
|
+
# system("bash")
|
255
257
|
add_view(view_name)
|
256
258
|
mark_last_published("Initial creation")
|
257
259
|
end
|
@@ -267,7 +269,7 @@ class RuneBlog
|
|
267
269
|
end
|
268
270
|
|
269
271
|
def view_files
|
270
|
-
log!(enter: __method__)
|
272
|
+
log!(enter: __method__, level: 2)
|
271
273
|
vdir = self.view.dir
|
272
274
|
files = [vdir/"index.html"]
|
273
275
|
files += posts.map {|x| vdir/x }
|
@@ -275,7 +277,7 @@ class RuneBlog
|
|
275
277
|
end
|
276
278
|
|
277
279
|
def post_lookup(postid) # side-effect?
|
278
|
-
log!(enter: __method__, args: [postid])
|
280
|
+
log!(enter: __method__, args: [postid], level: 2)
|
279
281
|
slug = title = date = teaser_text = nil
|
280
282
|
|
281
283
|
dir_posts = @vdir/:posts
|
@@ -290,7 +292,7 @@ class RuneBlog
|
|
290
292
|
end
|
291
293
|
|
292
294
|
def index_entry(slug)
|
293
|
-
log!(enter: __method__, args: [slug])
|
295
|
+
log!(enter: __method__, args: [slug], level: 2)
|
294
296
|
id = slug.to_i
|
295
297
|
text = nil
|
296
298
|
@theme = @view.dir/"themes/standard"
|
@@ -309,7 +311,7 @@ class RuneBlog
|
|
309
311
|
end
|
310
312
|
|
311
313
|
def collect_recent_posts(file)
|
312
|
-
log!(enter: __method__, args: [file])
|
314
|
+
log!(enter: __method__, args: [file], level: 3)
|
313
315
|
posts = nil
|
314
316
|
dir_posts = @vdir/:posts
|
315
317
|
entries = Dir.entries(dir_posts)
|
@@ -335,7 +337,7 @@ class RuneBlog
|
|
335
337
|
end
|
336
338
|
|
337
339
|
def create_new_post(title, testing = false, teaser: nil, body: nil, views: [])
|
338
|
-
log!(enter: __method__, args: [title, testing, teaser, body, views])
|
340
|
+
log!(enter: __method__, args: [title, testing, teaser, body, views], level: 1)
|
339
341
|
meta = nil
|
340
342
|
views = views + [self.view.to_s]
|
341
343
|
Dir.chdir(@root/:posts) do
|
@@ -351,7 +353,7 @@ class RuneBlog
|
|
351
353
|
end
|
352
354
|
|
353
355
|
def edit_initial_post(file, testing = false)
|
354
|
-
log!(enter: __method__, args: [file, testing])
|
356
|
+
log!(enter: __method__, args: [file, testing], level: 3)
|
355
357
|
debug "=== edit_initial_post #{file.inspect} => #{sourcefile}"
|
356
358
|
sourcefile = @root/:drafts/file
|
357
359
|
result = system!("#@editor #{sourcefile} +8") unless testing
|
@@ -363,20 +365,20 @@ class RuneBlog
|
|
363
365
|
end
|
364
366
|
|
365
367
|
def posts
|
366
|
-
log!(enter: __method__)
|
368
|
+
log!(enter: __method__, level: 3)
|
367
369
|
dir = self.view.dir/:posts
|
368
370
|
posts = Dir.entries(dir).grep(/^\d{4}/)
|
369
371
|
posts
|
370
372
|
end
|
371
373
|
|
372
374
|
def drafts
|
373
|
-
log!(enter: __method__)
|
375
|
+
log!(enter: __method__, level: 3)
|
374
376
|
dir = @root/:drafts
|
375
377
|
drafts = Dir.entries(dir).grep(/^\d{4}.*/)
|
376
378
|
end
|
377
379
|
|
378
380
|
def change_view(view)
|
379
|
-
log!(enter: __method__, args: [view])
|
381
|
+
log!(enter: __method__, args: [view], level: 3)
|
380
382
|
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
381
383
|
x = OpenStruct.new
|
382
384
|
x.root, x.current_view, x.editor = @root, view.to_s, @editor # dumb - FIXME later
|
@@ -400,7 +402,7 @@ class RuneBlog
|
|
400
402
|
src: "blog.css.lt3", copy: vdir/"remote/etc/blog.css" # , debug: true
|
401
403
|
xlate cwd: vdir/"themes/standard",
|
402
404
|
src: "blog/generate.lt3", dst: vdir/:remote/"index.html"
|
403
|
-
|
405
|
+
# generate_index(view) # recent posts (recent.html)
|
404
406
|
# ^ HERE
|
405
407
|
copy("#{vdir}/assets/*", "#{vdir}/remote/assets/")
|
406
408
|
rescue => err
|
@@ -411,7 +413,7 @@ class RuneBlog
|
|
411
413
|
end
|
412
414
|
|
413
415
|
def _get_views(draft)
|
414
|
-
log!(enter: __method__, args: [draft])
|
416
|
+
log!(enter: __method__, args: [draft], level: 2)
|
415
417
|
# FIXME dumb code
|
416
418
|
view_line = File.readlines(draft).grep(/^.views /)
|
417
419
|
raise "More than one .views call!" if view_line.size > 1
|
@@ -422,7 +424,7 @@ class RuneBlog
|
|
422
424
|
end
|
423
425
|
|
424
426
|
def _copy_get_dirs(draft, view)
|
425
|
-
log!(enter: __method__, args: [draft, view])
|
427
|
+
log!(enter: __method__, args: [draft, view], level: 2)
|
426
428
|
fname = File.basename(draft)
|
427
429
|
noext = fname.sub(/.lt3$/, "")
|
428
430
|
vdir = @root/:views/view
|
@@ -435,12 +437,12 @@ class RuneBlog
|
|
435
437
|
end
|
436
438
|
|
437
439
|
def _post_metadata(draft, pdraft)
|
438
|
-
log!(enter: __method__, args: [draft, pdraft])
|
440
|
+
log!(enter: __method__, args: [draft, pdraft], level: 2)
|
439
441
|
# FIXME store this somewhere
|
440
442
|
fname = File.basename(draft) # 0001-this-is-a-post.lt3
|
441
443
|
nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
|
442
444
|
aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
|
443
|
-
pnum = nslug[0..3]
|
445
|
+
pnum = nslug[0..3] # 0001
|
444
446
|
Dir.chdir(pdraft) do
|
445
447
|
excerpt = File.read("teaser.txt")
|
446
448
|
date = _retrieve_metadata(:date)
|
@@ -470,7 +472,7 @@ class RuneBlog
|
|
470
472
|
end
|
471
473
|
|
472
474
|
def copy_widget_html(view)
|
473
|
-
log!(enter: __method__)
|
475
|
+
log!(enter: __method__, level: 2)
|
474
476
|
vdir = @root/:views/view
|
475
477
|
remote = vdir/:remote
|
476
478
|
wdir = vdir/:themes/:standard/:widgets
|
@@ -481,12 +483,15 @@ class RuneBlog
|
|
481
483
|
create_dirs(rem)
|
482
484
|
files = Dir[w/"*"]
|
483
485
|
files = files.select {|x| x =~ /(html|css)$/ }
|
484
|
-
|
486
|
+
# files.each {|f| STDERR.puts " #{f.inspect}" }
|
487
|
+
tag = File.basename(w)
|
488
|
+
# STDERR.puts "--- tag: #{tag.inspect}"
|
489
|
+
files.each {|file| system!("cp #{file} #{rem}", show: (tag == "zzz")) }
|
485
490
|
end
|
486
491
|
end
|
487
492
|
|
488
493
|
def _handle_post(draft, view)
|
489
|
-
log!(enter: __method__, args: [draft, view])
|
494
|
+
log!(enter: __method__, args: [draft, view], level: 2)
|
490
495
|
# break into separate methods?
|
491
496
|
|
492
497
|
fname = File.basename(draft) # 0001-this-is-a-post.lt3
|
@@ -515,7 +520,7 @@ class RuneBlog
|
|
515
520
|
end
|
516
521
|
|
517
522
|
def generate_post(draft)
|
518
|
-
log!(enter: __method__, args: [draft])
|
523
|
+
log!(enter: __method__, args: [draft], level: 1)
|
519
524
|
views = _get_views(draft)
|
520
525
|
views.each do |view|
|
521
526
|
_handle_post(draft, view)
|
@@ -561,7 +566,7 @@ class RuneBlog
|
|
561
566
|
end
|
562
567
|
|
563
568
|
def remove_post(num)
|
564
|
-
log!(enter: __method__, args: [num])
|
569
|
+
log!(enter: __method__, args: [num], level: 1)
|
565
570
|
raise ArgumentError unless num.is_a?(Integer)
|
566
571
|
# FIXME update original draft .views
|
567
572
|
tag = prefix(num)
|
@@ -578,7 +583,7 @@ class RuneBlog
|
|
578
583
|
end
|
579
584
|
|
580
585
|
def undelete_post(num)
|
581
|
-
log!(enter: __method__, args: [num])
|
586
|
+
log!(enter: __method__, args: [num], level: 1)
|
582
587
|
raise ArgumentError unless num.is_a?(Integer)
|
583
588
|
files = Find.find(@root/:views).to_a
|
584
589
|
tag = prefix(num)
|
@@ -594,14 +599,14 @@ class RuneBlog
|
|
594
599
|
end
|
595
600
|
|
596
601
|
def delete_draft(num)
|
597
|
-
log!(enter: __method__, args: [num])
|
602
|
+
log!(enter: __method__, args: [num], level: 1)
|
598
603
|
raise ArgumentError unless num.is_a?(Integer)
|
599
604
|
tag = prefix(num)
|
600
605
|
system!("rm -rf #@root/drafts/#{tag}-*")
|
601
606
|
end
|
602
607
|
|
603
608
|
def make_slug(meta)
|
604
|
-
log!(enter: __method__, args: [meta])
|
609
|
+
log!(enter: __method__, args: [meta], level: 3)
|
605
610
|
raise ArgumentError unless meta.title.is_a?(String)
|
606
611
|
label = '%04d' % meta.num # FIXME can do better
|
607
612
|
slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
|
data/lib/runeblog_version.rb
CHANGED
data/lib/view.rb
CHANGED
@@ -8,7 +8,7 @@ class RuneBlog::View
|
|
8
8
|
include RuneBlog::Helpers
|
9
9
|
|
10
10
|
def initialize(name)
|
11
|
-
log!(enter: __method__, args: [name])
|
11
|
+
log!(enter: __method__, args: [name], level: 3)
|
12
12
|
raise NoBlogAccessor if RuneBlog.blog.nil?
|
13
13
|
@blog = RuneBlog.blog
|
14
14
|
@name = name
|
@@ -17,27 +17,23 @@ class RuneBlog::View
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def dir
|
20
|
-
log!(enter: __method__)
|
21
20
|
@blog.root + "/views/#@name/"
|
22
21
|
end
|
23
22
|
|
24
23
|
def local_index
|
25
|
-
log!(enter: __method__)
|
26
24
|
dir + "/remote/index.html"
|
27
25
|
end
|
28
26
|
|
29
27
|
def index
|
30
|
-
log!(enter: __method__)
|
31
28
|
dir + "index.html"
|
32
29
|
end
|
33
30
|
|
34
31
|
def to_s
|
35
|
-
log!(enter: __method__)
|
36
32
|
@name
|
37
33
|
end
|
38
34
|
|
39
35
|
def publishable_files
|
40
|
-
log!(enter: __method__)
|
36
|
+
log!(enter: __method__, level: 2)
|
41
37
|
vdir = dir()
|
42
38
|
remote = local_index()
|
43
39
|
files = [remote]
|
@@ -55,12 +51,10 @@ class RuneBlog::View
|
|
55
51
|
end
|
56
52
|
|
57
53
|
def can_publish?
|
58
|
-
log!(enter: __method__)
|
59
54
|
@can_publish
|
60
55
|
end
|
61
56
|
|
62
57
|
def recent?(file)
|
63
|
-
log!(enter: __method__, args: [file])
|
64
58
|
File.mtime(file) > File.mtime("#{self.dir()}/last_published")
|
65
59
|
rescue
|
66
60
|
true
|
data/lib/xlate.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
LEXT = ".lt3"
|
3
3
|
|
4
4
|
def stale?(src, dst, force = false)
|
5
|
-
log!(enter: __method__, args: [src, dst])
|
5
|
+
log!(enter: __method__, args: [src, dst], level: 3)
|
6
6
|
raise "Source #{src} not found in #{Dir.pwd}" unless File.exist?(src)
|
7
7
|
return true if force
|
8
8
|
return true unless File.exist?(dst)
|
@@ -29,7 +29,7 @@ LEXT = ".lt3"
|
|
29
29
|
STDERR.puts "#{indent} -- ^ Already up to date!" if debug
|
30
30
|
return
|
31
31
|
end
|
32
|
-
rc = system
|
32
|
+
rc = system("livetext #{src} >#{dst}")
|
33
33
|
STDERR.puts "...completed (shell returned #{rc})" if debug
|
34
34
|
system!("cp #{dst} #{copy}") if copy
|
35
35
|
end
|
data/test/austin.rb
CHANGED
@@ -30,11 +30,6 @@ end
|
|
30
30
|
def make_post(x, title, teaser, body, views=[])
|
31
31
|
debug " make_post #{bold(title)}"
|
32
32
|
x.create_new_post(title, true, teaser: teaser, body: body, views: views)
|
33
|
-
views.each do |view|
|
34
|
-
debug
|
35
|
-
debug "** generate_index #{bold(view)}"
|
36
|
-
x.generate_index(view)
|
37
|
-
end # recent.html
|
38
33
|
end
|
39
34
|
|
40
35
|
def show_lines(text)
|
@@ -70,6 +65,9 @@ File.open(".blogs/views/around_austin/themes/standard/global.lt3", "a") do |f|
|
|
70
65
|
end
|
71
66
|
####
|
72
67
|
|
68
|
+
debug("** generate_view: #{bold('around_austin')}")
|
69
|
+
x.generate_view("around_austin")
|
70
|
+
|
73
71
|
debug("-- change_view: #{bold('around_austin')}")
|
74
72
|
x.change_view("around_austin") # 1 2 7 8 9
|
75
73
|
|
@@ -136,8 +134,10 @@ in 2005.
|
|
136
134
|
BODY
|
137
135
|
|
138
136
|
debug
|
139
|
-
debug
|
140
|
-
x.
|
137
|
+
debug "** generate_index #{bold("around_austin")}"
|
138
|
+
x.generate_index("around_austin")
|
139
|
+
|
140
|
+
debug
|
141
141
|
x.change_view("around_austin")
|
142
142
|
debug
|
143
143
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runeblog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.44
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-10-
|
11
|
+
date: 2019-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: livetext
|
@@ -67,9 +67,6 @@ files:
|
|
67
67
|
- empty_view/remote/etc/GIT_IS_DUMB
|
68
68
|
- empty_view/remote/navbar/GIT_IS_DUMB
|
69
69
|
- empty_view/remote/permalink/GIT_IS_DUMB
|
70
|
-
- empty_view/remote/widgets/links/list.data
|
71
|
-
- empty_view/remote/widgets/news/list.data
|
72
|
-
- empty_view/remote/widgets/pages/list.data
|
73
70
|
- empty_view/themes/standard/README
|
74
71
|
- empty_view/themes/standard/blog/generate.lt3
|
75
72
|
- empty_view/themes/standard/blog/head.lt3
|
@@ -82,6 +79,7 @@ files:
|
|
82
79
|
- empty_view/themes/standard/global.lt3
|
83
80
|
- empty_view/themes/standard/navbar/about.lt3
|
84
81
|
- empty_view/themes/standard/navbar/contact.lt3
|
82
|
+
- empty_view/themes/standard/navbar/faq.lt3
|
85
83
|
- empty_view/themes/standard/navbar/navbar.lt3
|
86
84
|
- empty_view/themes/standard/post/generate.lt3
|
87
85
|
- empty_view/themes/standard/post/head.lt3
|
@@ -89,6 +87,10 @@ files:
|
|
89
87
|
- empty_view/themes/standard/post/permalink.lt3
|
90
88
|
- empty_view/themes/standard/widgets/README
|
91
89
|
- empty_view/themes/standard/widgets/ad/ad.lt3
|
90
|
+
- empty_view/themes/standard/widgets/ad/ad1.png
|
91
|
+
- empty_view/themes/standard/widgets/ad/ad2.png
|
92
|
+
- empty_view/themes/standard/widgets/ad/ad3.png
|
93
|
+
- empty_view/themes/standard/widgets/ad/ad4.png
|
92
94
|
- empty_view/themes/standard/widgets/bydates/README
|
93
95
|
- empty_view/themes/standard/widgets/bydates/bydates.lt3
|
94
96
|
- empty_view/themes/standard/widgets/bydates/bydates.rb
|
@@ -1,4 +0,0 @@
|
|
1
|
-
https://techcrunch.com/2019/09/16/fossa-scores-8-5-million-series-a-to-help-enterprise-manage-open-source-licenses/, yes, FOSSA scores \$8.5 million Series A to help enterprise manage open-source licenses
|
2
|
-
https://techcrunch.com/2019/09/17/spacexs-orbital-starship-prototype-construction-progress-detailed-in-new-photos/, yes, SpaceX’s orbital Starship prototype construction progress detailed in new photos
|
3
|
-
https://developers.googleblog.com/2019/05/Flutter-io19.html, yes, Flutter: a Portable UI Framework for Mobile, Web, Embedded, and Desktop
|
4
|
-
https://jaycarlson.net/microcontrollers/, no, The Amazing \$1 Microcontroller (2017)
|