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)
         |