runeblog 0.2.47 → 0.2.48
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/bin/blog +4 -3
- data/empty_view/themes/standard/blog/post_entry.lt3 +4 -1
- data/lib/liveblog.rb +13 -7
- data/lib/post.rb +17 -10
- data/lib/repl.rb +50 -5
- data/lib/runeblog.rb +71 -23
- data/lib/runeblog_version.rb +1 -1
- data/lib/xlate.rb +6 -5
- data/test/austin.rb +2 -0
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d4bd7b67f736b85651eb0650c5af974cbcf74fce48be345920e9bac4c9dba9dd
         | 
| 4 | 
            +
              data.tar.gz: 5fda0c05a32e16103e7f7f31b7ffe104c307b63c2e14e96216644dfbc6fdefff
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 55b9141f9b2d0d7a06cb5134d1e1da871cd78c2dffa7502310d0ae0caedec7c27eabfa28dc7957754f611122283abc2bc833512e58f9414a541b87d8cf4e146f
         | 
| 7 | 
            +
              data.tar.gz: 60b1546750066d75a623a3ca7866b5f5307b31e14a806a85f726fe87507ab1c3d24c5ce7737742ffdb3e41fb7cbcb0eac244089c9f96efddc6534299e9ab9ef1
         | 
    
        data/bin/blog
    CHANGED
    
    | @@ -23,7 +23,8 @@ TEXT | |
| 23 23 | 
             
            end
         | 
| 24 24 |  | 
| 25 25 | 
             
            def mainloop
         | 
| 26 | 
            -
               | 
| 26 | 
            +
              info = @blog.view || "no view"
         | 
| 27 | 
            +
              print fx("[#{info}] ", Red, :bold)
         | 
| 27 28 | 
             
              cmd = STDSCR.gets(history: @cmdhist, tab: @tabcom)
         | 
| 28 29 | 
             
              cmd_quit(nil) if cmd.nil?   # ^D
         | 
| 29 30 | 
             
              cmd.chomp!
         | 
| @@ -72,7 +73,7 @@ puts fx("\n  RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red) | |
| 72 73 |  | 
| 73 74 | 
             
            loop { mainloop }
         | 
| 74 75 |  | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 76 | 
            +
            system("tput clear")
         | 
| 77 | 
            +
            sleep 0.2
         | 
| 77 78 | 
             
            puts
         | 
| 78 79 |  | 
| @@ -2,13 +2,14 @@ | |
| 2 2 | 
             
            . This HTML fragment gives the format of a post's   
         | 
| 3 3 | 
             
            . "index" entry (recent posts on blog front page).  
         | 
| 4 4 | 
             
            . --------------------------------------------------
         | 
| 5 | 
            +
            .nopara
         | 
| 5 6 |  | 
| 6 7 | 
             
            <div class="post">
         | 
| 7 8 | 
             
              <table width=100% cellpadding=7>
         | 
| 8 9 | 
             
                <tr>
         | 
| 9 10 | 
             
                  <td width=14% valign=top align=right style="margin-top: -1px;">
         | 
| 10 11 | 
             
            <!--        <span class="post-date mt-1 mb-1" style="margin-top: 3px; text-align: right"> -->
         | 
| 11 | 
            -
                      <font size=-1 | 
| 12 | 
            +
                      <font size=-1>#{date}</font>
         | 
| 12 13 | 
             
            <!--        </span> -->
         | 
| 13 14 | 
             
                  </td>
         | 
| 14 15 | 
             
                  <td> 
         | 
| @@ -21,3 +22,5 @@ | |
| 21 22 | 
             
                </tr>
         | 
| 22 23 | 
             
              </table>
         | 
| 23 24 | 
             
            </div>
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            <font size=-4><br></font>
         | 
    
        data/lib/liveblog.rb
    CHANGED
    
    | @@ -70,7 +70,7 @@ end | |
| 70 70 |  | 
| 71 71 | 
             
            def quote
         | 
| 72 72 | 
             
              _passthru "<blockquote>"
         | 
| 73 | 
            -
              _passthru _body
         | 
| 73 | 
            +
              _passthru _body.join(" ")
         | 
| 74 74 | 
             
              _passthru "</blockquote>"
         | 
| 75 75 | 
             
              _optional_blank_line
         | 
| 76 76 | 
             
            end
         | 
| @@ -364,8 +364,8 @@ def _load_local(widget) | |
| 364 364 | 
             
                code
         | 
| 365 365 | 
             
              end
         | 
| 366 366 | 
             
            rescue => err
         | 
| 367 | 
            -
               | 
| 368 | 
            -
               | 
| 367 | 
            +
              STDERR.puts err.to_s
         | 
| 368 | 
            +
              STDERR.puts err.backtrace.join("\n")
         | 
| 369 369 | 
             
              exit
         | 
| 370 370 | 
             
            end
         | 
| 371 371 |  | 
| @@ -480,10 +480,16 @@ class Livetext::Functions | |
| 480 480 | 
             
                ::Livetext::Vars[name] || "[:#{name} is undefined]"
         | 
| 481 481 | 
             
              end
         | 
| 482 482 |  | 
| 483 | 
            -
             | 
| 484 | 
            -
             | 
| 485 | 
            -
             | 
| 486 | 
            -
             | 
| 483 | 
            +
            #   def link(param = nil)
         | 
| 484 | 
            +
            # puts "--- WTF?? param = #{param.inspect}"; gets
         | 
| 485 | 
            +
            #     file, cdata = param.split("||", 2)
         | 
| 486 | 
            +
            #     %[<a href="assets/#{file}">#{cdata}</a>]
         | 
| 487 | 
            +
            #   end
         | 
| 488 | 
            +
            # 
         | 
| 489 | 
            +
            #   def link(param = nil)
         | 
| 490 | 
            +
            #     file, cdata = param.split("||", 2)
         | 
| 491 | 
            +
            #     %[<link type="application/atom+xml" rel="alternate" href="#{_var(:host)}#{file}" title="#{_var(:title)}">]
         | 
| 492 | 
            +
            #   end
         | 
| 487 493 | 
             
            end
         | 
| 488 494 |  | 
| 489 495 | 
             
            ###
         | 
    
        data/lib/post.rb
    CHANGED
    
    | @@ -62,8 +62,8 @@ class RuneBlog::Post | |
| 62 62 | 
             
              end
         | 
| 63 63 |  | 
| 64 64 | 
             
              def self.create(title:, teaser:, body:, pubdate: Time.now.strftime("%Y-%m-%d"),
         | 
| 65 | 
            -
                              views:[])
         | 
| 66 | 
            -
                log!(enter: __method__, args: [title, teaser, body, pubdate, views])
         | 
| 65 | 
            +
                              views:[], file: nil)
         | 
| 66 | 
            +
                log!(enter: __method__, args: [title, teaser, body, pubdate, views], stderr: true)
         | 
| 67 67 | 
             
                post = self.new
         | 
| 68 68 | 
             
                # NOTE: This is the ONLY place next_sequence is called!
         | 
| 69 69 | 
             
                num = post.meta.num   = post.blog.next_sequence
         | 
| @@ -78,14 +78,18 @@ class RuneBlog::Post | |
| 78 78 | 
             
                # create_draft
         | 
| 79 79 | 
             
                viewhome = post.blog.view.publisher.url
         | 
| 80 80 | 
             
                meta = post.meta
         | 
| 81 | 
            -
                 | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 81 | 
            +
                if file.nil?
         | 
| 82 | 
            +
                  text = RuneBlog.post_template(num: meta.num, title: meta.title, date: meta.pubdate, 
         | 
| 83 | 
            +
                             view: meta.view, teaser: meta.teaser, body: meta.body,
         | 
| 84 | 
            +
                             views: meta.views, tags: meta.tags, home: viewhome)
         | 
| 85 | 
            +
                  srcdir = post.blog.root/:drafts + "/"
         | 
| 86 | 
            +
                  vpdir = post.blog.root/:drafts + "/"
         | 
| 87 | 
            +
                  fname  = meta.slug + ".lt3"
         | 
| 88 | 
            +
                  post.draft = srcdir + fname
         | 
| 89 | 
            +
                  dump(text, post.draft)
         | 
| 90 | 
            +
                else
         | 
| 91 | 
            +
                  dump(File.read(file), post.draft)
         | 
| 92 | 
            +
                end
         | 
| 89 93 | 
             
                return post
         | 
| 90 94 | 
             
              end
         | 
| 91 95 |  | 
| @@ -125,6 +129,9 @@ class RuneBlog::ViewPost | |
| 125 129 | 
             
                lines = File.readlines(mdfile)
         | 
| 126 130 | 
             
                @title = lines.grep(/title:/).first[7..-1].chomp
         | 
| 127 131 | 
             
                @date  = lines.grep(/pubdate:/).first[9..-1].chomp
         | 
| 132 | 
            +
            # print "-- date = #{@date.inspect} "; gets
         | 
| 133 | 
            +
              rescue => err
         | 
| 134 | 
            +
                STDERR.puts "--- #{err}\n #{err.backtrace.join("\n  ")}"
         | 
| 128 135 | 
             
              end
         | 
| 129 136 |  | 
| 130 137 | 
             
              def get_dirs
         | 
    
        data/lib/repl.rb
    CHANGED
    
    | @@ -11,13 +11,15 @@ module RuneBlog::REPL | |
| 11 11 | 
             
                result = system!("#{@blog.editor} #{file}")
         | 
| 12 12 | 
             
                raise EditorProblem(file) unless result
         | 
| 13 13 | 
             
                sleep 0.1
         | 
| 14 | 
            -
                 | 
| 14 | 
            +
                cmd_clear(nil)
         | 
| 15 15 | 
             
              end
         | 
| 16 16 |  | 
| 17 17 | 
             
              def cmd_quit(arg, testing = false)
         | 
| 18 18 | 
             
                check_empty(arg)
         | 
| 19 19 | 
             
                RubyText.stop
         | 
| 20 | 
            -
                 | 
| 20 | 
            +
                sleep 0.1
         | 
| 21 | 
            +
                cmd_clear(nil)
         | 
| 22 | 
            +
                sleep 0.1
         | 
| 21 23 | 
             
                exit
         | 
| 22 24 | 
             
              end
         | 
| 23 25 |  | 
| @@ -98,6 +100,13 @@ module RuneBlog::REPL | |
| 98 100 | 
             
                result = system!("open #{local}")
         | 
| 99 101 | 
             
                raise CantOpen(local) unless result
         | 
| 100 102 | 
             
                @out
         | 
| 103 | 
            +
              rescue => err
         | 
| 104 | 
            +
                out = "/tmp/blog#{rand(100)}.txt"
         | 
| 105 | 
            +
                File.open(out, "w") do |f|
         | 
| 106 | 
            +
                  f.puts err
         | 
| 107 | 
            +
                  f.puts err.backtrace.join("\n")
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
                puts "Error: See #{out}"
         | 
| 101 110 | 
             
              end
         | 
| 102 111 |  | 
| 103 112 | 
             
              def cmd_publish(arg, testing = false)
         | 
| @@ -135,6 +144,13 @@ module RuneBlog::REPL | |
| 135 144 | 
             
                  output! "...finished.\n"
         | 
| 136 145 | 
             
                end
         | 
| 137 146 | 
             
                return @out
         | 
| 147 | 
            +
              rescue => err
         | 
| 148 | 
            +
                out = "/tmp/blog#{rand(100)}.txt"
         | 
| 149 | 
            +
                File.open(out, "w") do |f|
         | 
| 150 | 
            +
                  f.puts err
         | 
| 151 | 
            +
                  f.puts err.backtrace.join("\n")
         | 
| 152 | 
            +
                end
         | 
| 153 | 
            +
                puts "Error: See #{out}"
         | 
| 138 154 | 
             
              end
         | 
| 139 155 |  | 
| 140 156 | 
             
              def cmd_rebuild(arg, testing = false)
         | 
| @@ -145,6 +161,13 @@ module RuneBlog::REPL | |
| 145 161 | 
             
                @blog.generate_view(@blog.view)
         | 
| 146 162 | 
             
                @blog.generate_index(@blog.view)
         | 
| 147 163 | 
             
                @out
         | 
| 164 | 
            +
              rescue => err
         | 
| 165 | 
            +
                out = "/tmp/blog#{rand(100)}.txt"
         | 
| 166 | 
            +
                File.open(out, "w") do |f|
         | 
| 167 | 
            +
                  f.puts err
         | 
| 168 | 
            +
                  f.puts err.backtrace.join("\n")
         | 
| 169 | 
            +
                end
         | 
| 170 | 
            +
                puts "Error: See #{out}"
         | 
| 148 171 | 
             
              end
         | 
| 149 172 |  | 
| 150 173 | 
             
              def cmd_change_view(arg, testing = false)
         | 
| @@ -178,18 +201,30 @@ module RuneBlog::REPL | |
| 178 201 | 
             
                @out
         | 
| 179 202 | 
             
              rescue ViewAlreadyExists
         | 
| 180 203 | 
             
                puts 'Blog already exists'
         | 
| 204 | 
            +
              rescue => err
         | 
| 205 | 
            +
                out = "/tmp/blog#{rand(100)}.txt"
         | 
| 206 | 
            +
                File.open(out, "w") do |f|
         | 
| 207 | 
            +
                  f.puts err
         | 
| 208 | 
            +
                  f.puts err.backtrace.join("\n")
         | 
| 209 | 
            +
                end
         | 
| 210 | 
            +
                puts "Error: See #{out}"
         | 
| 181 211 | 
             
              end
         | 
| 182 212 |  | 
| 183 213 | 
             
              def cmd_new_post(arg, testing = false)
         | 
| 184 214 | 
             
                reset_output
         | 
| 185 215 | 
             
                check_empty(arg)
         | 
| 186 216 | 
             
                title = ask("\nTitle: ")
         | 
| 217 | 
            +
                puts
         | 
| 187 218 | 
             
                @blog.create_new_post(title)
         | 
| 188 219 | 
             
            #   STDSCR.clear
         | 
| 189 220 | 
             
                @out
         | 
| 190 221 | 
             
              rescue => err
         | 
| 191 | 
            -
                 | 
| 192 | 
            -
                 | 
| 222 | 
            +
                out = "/tmp/blog#{rand(100)}.txt"
         | 
| 223 | 
            +
                File.open(out, "w") do |f|
         | 
| 224 | 
            +
                  f.puts err
         | 
| 225 | 
            +
                  f.puts err.backtrace.join("\n")
         | 
| 226 | 
            +
                end
         | 
| 227 | 
            +
                puts "Error: See #{out}"
         | 
| 193 228 | 
             
              end
         | 
| 194 229 |  | 
| 195 230 | 
             
              def _remove_post(arg, testing=false)
         | 
| @@ -235,6 +270,13 @@ module RuneBlog::REPL | |
| 235 270 | 
             
                draft = "#{@blog.root}/drafts/#{file}"
         | 
| 236 271 | 
             
                result = edit_file(draft)
         | 
| 237 272 | 
             
                @blog.generate_post(draft)
         | 
| 273 | 
            +
              rescue => err
         | 
| 274 | 
            +
                out = "/tmp/blog#{rand(100)}.txt"
         | 
| 275 | 
            +
                File.open(out, "w") do |f|
         | 
| 276 | 
            +
                  f.puts err
         | 
| 277 | 
            +
                  f.puts err.backtrace.join("\n")
         | 
| 278 | 
            +
                end
         | 
| 279 | 
            +
                puts "Error: See #{out}"
         | 
| 238 280 | 
             
              end
         | 
| 239 281 |  | 
| 240 282 | 
             
              def cmd_list_views(arg, testing = false)
         | 
| @@ -318,7 +360,10 @@ module RuneBlog::REPL | |
| 318 360 |  | 
| 319 361 | 
             
              def cmd_ssh(arg, testing = false)
         | 
| 320 362 | 
             
                pub = @blog.view.publisher
         | 
| 321 | 
            -
                 | 
| 363 | 
            +
                puts
         | 
| 364 | 
            +
                system!("tputs clear; ssh #{pub.user}@#{pub.server}")
         | 
| 365 | 
            +
                sleep 0.1
         | 
| 366 | 
            +
                cmd_clear(nil)
         | 
| 322 367 | 
             
              end
         | 
| 323 368 |  | 
| 324 369 | 
             
              def cmd_INVALID(arg, testing = false)
         | 
    
        data/lib/runeblog.rb
    CHANGED
    
    | @@ -43,6 +43,15 @@ class RuneBlog | |
| 43 43 |  | 
| 44 44 | 
             
              include Helpers
         | 
| 45 45 |  | 
| 46 | 
            +
              def _tmp_error(err)   # FIXME move to helpers
         | 
| 47 | 
            +
                out = "/tmp/blog#{rand(100)}.txt"
         | 
| 48 | 
            +
                File.open(out, "w") do |f|
         | 
| 49 | 
            +
                  f.puts err
         | 
| 50 | 
            +
                  f.puts err.backtrace.join("\n")
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
                puts "Error: See #{out}"
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
             | 
| 46 55 | 
             
              def self.create_new_blog_repo(dir = ".blogs")
         | 
| 47 56 | 
             
                log!(enter: __method__, args: [dir])
         | 
| 48 57 | 
             
                raise ArgumentError unless dir.is_a?(String) && ! dir.empty?
         | 
| @@ -68,8 +77,9 @@ class RuneBlog | |
| 68 77 | 
             
                x.root, x.current_view, x.editor = root, "test_view", "/usr/bin/vim "   # dumb - FIXME later
         | 
| 69 78 | 
             
                write_config(x, root/ConfigFile)
         | 
| 70 79 | 
             
                @blog = self.new(root)
         | 
| 71 | 
            -
                @blog.create_view("test_view")
         | 
| 72 80 | 
             
                @blog
         | 
| 81 | 
            +
              rescue => err
         | 
| 82 | 
            +
                _tmp_error(err)
         | 
| 73 83 | 
             
              end
         | 
| 74 84 |  | 
| 75 85 | 
             
              def self.open(root = ".blogs")
         | 
| @@ -78,6 +88,8 @@ class RuneBlog | |
| 78 88 | 
             
                self.blog = self   # Weird. Like a singleton - dumbass circular dependency?
         | 
| 79 89 | 
             
                root = Dir.pwd/root
         | 
| 80 90 | 
             
                blog = self.new(root)
         | 
| 91 | 
            +
              rescue => err
         | 
| 92 | 
            +
                _tmp_error(err)
         | 
| 81 93 | 
             
              end
         | 
| 82 94 |  | 
| 83 95 | 
             
              def initialize(root_dir = ".blogs")   # always assumes existing blog
         | 
| @@ -106,6 +118,8 @@ class RuneBlog | |
| 106 118 | 
             
                  views = _retrieve_metadata(:views)
         | 
| 107 119 | 
             
                  views.each {|v| system!("cp *html #@root/views/#{v}/remote") }
         | 
| 108 120 | 
             
                end
         | 
| 121 | 
            +
              rescue => err
         | 
| 122 | 
            +
                _tmp_error(err)
         | 
| 109 123 | 
             
              end
         | 
| 110 124 |  | 
| 111 125 | 
             
              def _retrieve_metadata(key)
         | 
| @@ -129,6 +143,8 @@ class RuneBlog | |
| 129 143 | 
             
                  raise "Too many #{key} instances in metadata.txt!"
         | 
| 130 144 | 
             
                end
         | 
| 131 145 | 
             
                return result
         | 
| 146 | 
            +
              rescue => err
         | 
| 147 | 
            +
                _tmp_error(err)
         | 
| 132 148 | 
             
              end
         | 
| 133 149 |  | 
| 134 150 | 
             
              def process_post(sourcefile)
         | 
| @@ -138,6 +154,8 @@ class RuneBlog | |
| 138 154 | 
             
                create_dir(dir)
         | 
| 139 155 | 
             
                xlate cwd: dir, src: sourcefile  # , debug: true
         | 
| 140 156 | 
             
                _deploy_local(dir)
         | 
| 157 | 
            +
              rescue => err
         | 
| 158 | 
            +
                _tmp_error(err)
         | 
| 141 159 | 
             
              end
         | 
| 142 160 |  | 
| 143 161 | 
             
              def inspect
         | 
| @@ -172,6 +190,8 @@ class RuneBlog | |
| 172 190 | 
             
              def _set_publisher
         | 
| 173 191 | 
             
                log!(enter: __method__, level: 3)
         | 
| 174 192 | 
             
                @view.publisher = RuneBlog::Publishing.new(@view.to_s)  # FIXME refactor
         | 
| 193 | 
            +
              rescue => err
         | 
| 194 | 
            +
                _tmp_error(err)
         | 
| 175 195 | 
             
              end
         | 
| 176 196 |  | 
| 177 197 | 
             
              def view=(arg)
         | 
| @@ -188,6 +208,8 @@ class RuneBlog | |
| 188 208 | 
             
                  else 
         | 
| 189 209 | 
             
                    raise CantAssignView(arg.class.to_s)
         | 
| 190 210 | 
             
                end
         | 
| 211 | 
            +
              rescue => err
         | 
| 212 | 
            +
                _tmp_error(err)
         | 
| 191 213 | 
             
              end
         | 
| 192 214 |  | 
| 193 215 | 
             
              def get_sequence
         | 
| @@ -234,6 +256,8 @@ class RuneBlog | |
| 234 256 | 
             
                  cmd = "cp -r #{RuneBlog::Path}/../empty_view views/#{view_name}"
         | 
| 235 257 | 
             
                  system!(cmd)
         | 
| 236 258 | 
             
                end
         | 
| 259 | 
            +
              rescue => err
         | 
| 260 | 
            +
                _tmp_error(err)
         | 
| 237 261 | 
             
              end
         | 
| 238 262 |  | 
| 239 263 | 
             
              def check_valid_new_view(view_name)
         | 
| @@ -254,6 +278,8 @@ class RuneBlog | |
| 254 278 | 
             
                make_empty_view_tree(view_name)
         | 
| 255 279 | 
             
                add_view(view_name)
         | 
| 256 280 | 
             
                mark_last_published("Initial creation")
         | 
| 281 | 
            +
              rescue => err
         | 
| 282 | 
            +
                _tmp_error(err)
         | 
| 257 283 | 
             
              end
         | 
| 258 284 |  | 
| 259 285 | 
             
              def delete_view(name, force = false)
         | 
| @@ -287,6 +313,8 @@ class RuneBlog | |
| 287 313 | 
             
                postdir = post.first
         | 
| 288 314 | 
             
                vp = RuneBlog::ViewPost.new(self.view, postdir)
         | 
| 289 315 | 
             
                vp
         | 
| 316 | 
            +
              rescue => err
         | 
| 317 | 
            +
                _tmp_error(err)
         | 
| 290 318 | 
             
              end
         | 
| 291 319 |  | 
| 292 320 | 
             
              def index_entry(slug)
         | 
| @@ -302,10 +330,13 @@ class RuneBlog | |
| 302 330 | 
             
                  vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
         | 
| 303 331 | 
             
                path = vp.path
         | 
| 304 332 | 
             
                url = aslug + ".html"
         | 
| 333 | 
            +
            # puts "--- vp = #{[vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text].inspect}"; gets
         | 
| 305 334 | 
             
                date = ::Date.parse(date)
         | 
| 306 335 | 
             
                date = date.strftime("%B %e<br><div style='float: right'>%Y</div>")
         | 
| 307 336 | 
             
                text = interpolate(@_post_entry, binding)
         | 
| 308 337 | 
             
                text
         | 
| 338 | 
            +
              rescue => err
         | 
| 339 | 
            +
                _tmp_error(err)
         | 
| 309 340 | 
             
              end
         | 
| 310 341 |  | 
| 311 342 | 
             
              def collect_recent_posts(file)
         | 
| @@ -316,14 +347,20 @@ class RuneBlog | |
| 316 347 | 
             
                posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts/x }
         | 
| 317 348 | 
             
                posts.select! {|x| File.directory?(x) }
         | 
| 318 349 | 
             
                # directories that start with four digits
         | 
| 319 | 
            -
                posts = posts.sort  | 
| 350 | 
            +
                posts = posts.sort do |a, b| 
         | 
| 351 | 
            +
                  ai = a.index(/\d\d\d\d-/)
         | 
| 352 | 
            +
                  bi = b.index(/\d\d\d\d-/)
         | 
| 353 | 
            +
                  na = a[ai..(ai+3)].to_i
         | 
| 354 | 
            +
                  nb = b[bi..(bi+3)].to_i
         | 
| 355 | 
            +
                  nb <=> na
         | 
| 356 | 
            +
                end  # sort descending
         | 
| 320 357 | 
             
                posts = posts[0..19]  # return 20 at most
         | 
| 321 358 | 
             
                text = <<-HTML
         | 
| 322 359 | 
             
                  <html>
         | 
| 323 360 | 
             
                  <head><link rel="stylesheet" href="etc/blog.css"></head>
         | 
| 324 361 | 
             
                  <body>
         | 
| 325 362 | 
             
                HTML
         | 
| 326 | 
            -
                wanted = [ | 
| 363 | 
            +
                wanted = [8, posts.size].min  # estimate how many we want?
         | 
| 327 364 | 
             
                enum = posts.each
         | 
| 328 365 | 
             
                wanted.times do
         | 
| 329 366 | 
             
                  postid = File.basename(enum.next)
         | 
| @@ -332,13 +369,16 @@ class RuneBlog | |
| 332 369 | 
             
                end
         | 
| 333 370 | 
             
                text << "</body></html>"
         | 
| 334 371 | 
             
                File.write(@vdir/:remote/file, text)
         | 
| 372 | 
            +
              rescue => err
         | 
| 373 | 
            +
                _tmp_error(err)
         | 
| 335 374 | 
             
              end
         | 
| 336 375 |  | 
| 337 376 | 
             
              def create_new_post(title, testing = false, teaser: nil, body: nil, 
         | 
| 338 377 | 
             
                                  pubdate: Time.now.strftime("%Y-%m-%d"), views: [])
         | 
| 339 | 
            -
                log!(enter: __method__, args: [title, testing, teaser, body, views], level: 1)
         | 
| 378 | 
            +
                log!(enter: __method__, args: [title, testing, teaser, body, views], level: 1, stderr: true)
         | 
| 340 379 | 
             
                meta = nil
         | 
| 341 380 | 
             
                views = views + [self.view.to_s]
         | 
| 381 | 
            +
                views.uniq!
         | 
| 342 382 | 
             
                Dir.chdir(@root/:posts) do
         | 
| 343 383 | 
             
                  post = Post.create(title: title, teaser: teaser, body: body, pubdate: pubdate, views: views)
         | 
| 344 384 | 
             
                  post.edit unless testing
         | 
| @@ -347,14 +387,12 @@ class RuneBlog | |
| 347 387 | 
             
                end
         | 
| 348 388 | 
             
                return meta.num
         | 
| 349 389 | 
             
              rescue => err
         | 
| 350 | 
            -
                 | 
| 351 | 
            -
                puts err.backtrace.join("\n")
         | 
| 390 | 
            +
                _tmp_error(err)
         | 
| 352 391 | 
             
              end
         | 
| 353 392 |  | 
| 354 393 | 
             
              def edit_initial_post(file, testing = false)
         | 
| 355 394 | 
             
                log!(enter: __method__, args: [file, testing], level: 3)
         | 
| 356 395 | 
             
                debug "=== edit_initial_post #{file.inspect}  => #{sourcefile}"
         | 
| 357 | 
            -
                sourcefile = @root/:drafts/file
         | 
| 358 396 | 
             
                result = system!("#@editor #{sourcefile} +8") unless testing
         | 
| 359 397 | 
             
                raise EditorProblem(sourcefile) unless result
         | 
| 360 398 | 
             
                process_post(sourcefile)
         | 
| @@ -390,6 +428,8 @@ class RuneBlog | |
| 390 428 | 
             
                raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
         | 
| 391 429 | 
             
                @vdir = @root/:views/view
         | 
| 392 430 | 
             
                collect_recent_posts("recent.html")
         | 
| 431 | 
            +
              rescue => err
         | 
| 432 | 
            +
                _tmp_error(err)
         | 
| 393 433 | 
             
              end
         | 
| 394 434 |  | 
| 395 435 | 
             
              def generate_view(view)  # huh?
         | 
| @@ -402,10 +442,7 @@ class RuneBlog | |
| 402 442 | 
             
                      src: "blog/generate.lt3", dst: vdir/:remote/"index.html"
         | 
| 403 443 | 
             
                copy("#{vdir}/assets/*", "#{vdir}/remote/assets/")
         | 
| 404 444 | 
             
              rescue => err
         | 
| 405 | 
            -
                 | 
| 406 | 
            -
                puts err.backtrace.join("\n")
         | 
| 407 | 
            -
                print "Pause... "
         | 
| 408 | 
            -
                gets
         | 
| 445 | 
            +
                _tmp_error(err)
         | 
| 409 446 | 
             
              end
         | 
| 410 447 |  | 
| 411 448 | 
             
              def _get_views(draft)
         | 
| @@ -416,7 +453,9 @@ class RuneBlog | |
| 416 453 | 
             
                raise "No .views call!" if view_line.size < 1
         | 
| 417 454 | 
             
                view_line = view_line.first
         | 
| 418 455 | 
             
                views = view_line[7..-1].split
         | 
| 419 | 
            -
                views 
         | 
| 456 | 
            +
                views.uniq 
         | 
| 457 | 
            +
              rescue => err
         | 
| 458 | 
            +
                _tmp_error(err)
         | 
| 420 459 | 
             
              end
         | 
| 421 460 |  | 
| 422 461 | 
             
              def _copy_get_dirs(draft, view)
         | 
| @@ -430,6 +469,8 @@ class RuneBlog | |
| 430 469 | 
             
                viewdir, slugdir, aslug = vdir, dir, noext[5..-1]
         | 
| 431 470 | 
             
                theme = viewdir/:themes/:standard
         | 
| 432 471 | 
             
                [noext, viewdir, slugdir, aslug, theme]
         | 
| 472 | 
            +
              rescue => err
         | 
| 473 | 
            +
                _tmp_error(err)
         | 
| 433 474 | 
             
              end
         | 
| 434 475 |  | 
| 435 476 | 
             
              def _post_metadata(draft, pdraft)
         | 
| @@ -466,6 +507,8 @@ class RuneBlog | |
| 466 507 | 
             
                  LIVE
         | 
| 467 508 | 
             
                  File.open(pdraft/"vars.lt3", "w") {|f| f.puts vars }
         | 
| 468 509 | 
             
                end
         | 
| 510 | 
            +
              rescue => err
         | 
| 511 | 
            +
                _tmp_error(err)
         | 
| 469 512 | 
             
              end
         | 
| 470 513 |  | 
| 471 514 | 
             
              def copy_widget_html(view)
         | 
| @@ -483,10 +526,12 @@ class RuneBlog | |
| 483 526 | 
             
                  tag = File.basename(w)
         | 
| 484 527 | 
             
                  files.each {|file| system!("cp #{file} #{rem}", show: (tag == "zzz")) }
         | 
| 485 528 | 
             
                end
         | 
| 529 | 
            +
              rescue => err
         | 
| 530 | 
            +
                _tmp_error(err)
         | 
| 486 531 | 
             
              end
         | 
| 487 532 |  | 
| 488 | 
            -
              def _handle_post(draft, view)
         | 
| 489 | 
            -
                log!(enter: __method__, args: [draft,  | 
| 533 | 
            +
              def _handle_post(draft, view_name = self.view.to_s)
         | 
| 534 | 
            +
                log!(enter: __method__, args: [draft, view_name], level: 2)
         | 
| 490 535 | 
             
                # break into separate methods?
         | 
| 491 536 |  | 
| 492 537 | 
             
                fname = File.basename(draft)       # 0001-this-is-a-post.lt3
         | 
| @@ -494,30 +539,34 @@ class RuneBlog | |
| 494 539 | 
             
                aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
         | 
| 495 540 | 
             
                ahtml = aslug + ".html"            # this-is-a-post.html
         | 
| 496 541 | 
             
                pdraft = @root/:posts/nslug
         | 
| 497 | 
            -
                remote = @root/:views/ | 
| 498 | 
            -
                @theme = @root/:views/ | 
| 542 | 
            +
                remote = @root/:views/view_name/:remote
         | 
| 543 | 
            +
                @theme = @root/:views/view_name/:themes/:standard
         | 
| 499 544 | 
             
                # Step 1...
         | 
| 500 545 | 
             
                create_dirs(pdraft)
         | 
| 501 | 
            -
                xlate cwd: pdraft, src: draft, dst: "guts.html"
         | 
| 546 | 
            +
                xlate cwd: pdraft, src: draft, dst: "guts.html", debug: true
         | 
| 502 547 | 
             
                _post_metadata(draft, pdraft)
         | 
| 503 548 | 
             
                # Step 2...
         | 
| 504 | 
            -
                vposts = @root/:views/ | 
| 549 | 
            +
                vposts = @root/:views/view_name/:posts
         | 
| 505 550 | 
             
                copy!(pdraft, vposts)    # ??
         | 
| 506 551 | 
             
                # Step 3..
         | 
| 507 552 | 
             
                copy(pdraft/"guts.html", @theme/:post) 
         | 
| 508 553 | 
             
                copy(pdraft/"vars.lt3",  @theme/:post) 
         | 
| 509 554 | 
             
                # Step 4...
         | 
| 510 | 
            -
                xlate cwd: @theme/:post, src: "generate.lt3", 
         | 
| 511 | 
            -
                      dst: remote/ahtml, copy: @theme/:post | 
| 555 | 
            +
                xlate cwd: @theme/:post, src: "generate.lt3", force: true, 
         | 
| 556 | 
            +
                      dst: remote/ahtml, copy: @theme/:post, debug: true
         | 
| 512 557 | 
             
                xlate cwd: @theme/:post, src: "permalink.lt3", 
         | 
| 513 558 | 
             
                      dst: remote/:permalink/ahtml  # , debug: true
         | 
| 514 | 
            -
                copy_widget_html( | 
| 559 | 
            +
                copy_widget_html(view_name)
         | 
| 560 | 
            +
              rescue => err
         | 
| 561 | 
            +
                _tmp_error(err)
         | 
| 515 562 | 
             
              end
         | 
| 516 563 |  | 
| 517 564 | 
             
              def generate_post(draft)
         | 
| 518 565 | 
             
                log!(enter: __method__, args: [draft], level: 1)
         | 
| 519 566 | 
             
                views = _get_views(draft)
         | 
| 520 567 | 
             
                views.each {|view| _handle_post(draft, view) }
         | 
| 568 | 
            +
              rescue => err
         | 
| 569 | 
            +
                _tmp_error(err)
         | 
| 521 570 | 
             
              end
         | 
| 522 571 |  | 
| 523 572 | 
             
              def rebuild_post(file)
         | 
| @@ -531,8 +580,7 @@ class RuneBlog | |
| 531 580 | 
             
                @views_dirty.flatten!
         | 
| 532 581 | 
             
                @views_dirty.uniq!
         | 
| 533 582 | 
             
              rescue => err
         | 
| 534 | 
            -
                 | 
| 535 | 
            -
                getch
         | 
| 583 | 
            +
                _tmp_error(err)
         | 
| 536 584 | 
             
              end
         | 
| 537 585 |  | 
| 538 586 | 
             
              def remove_post(num)
         | 
    
        data/lib/runeblog_version.rb
    CHANGED
    
    
    
        data/lib/xlate.rb
    CHANGED
    
    | @@ -2,6 +2,7 @@ | |
| 2 2 | 
             
            LEXT = ".lt3"
         | 
| 3 3 |  | 
| 4 4 | 
             
            def stale?(src, dst, force = false)
         | 
| 5 | 
            +
              meh = File.new("/tmp/dammit-#{src.gsub(/\//, "-")}", "w")
         | 
| 5 6 | 
             
              log!(enter: __method__, args: [src, dst], level: 3)
         | 
| 6 7 | 
             
              raise "Source #{src} not found in #{Dir.pwd}" unless File.exist?(src)
         | 
| 7 8 | 
             
              return true if force
         | 
| @@ -23,15 +24,15 @@ def xlate(cwd: Dir.pwd, src:, | |
| 23 24 | 
             
                  STDERR.puts "#{indent}      from: #{caller[0]}"
         | 
| 24 25 | 
             
                  STDERR.puts "#{indent}      copy: #{copy}" if copy
         | 
| 25 26 | 
             
                end
         | 
| 26 | 
            -
                 | 
| 27 | 
            -
             | 
| 27 | 
            +
                stale = stale?(src, dst, force)
         | 
| 28 | 
            +
                if stale
         | 
| 29 | 
            +
                  rc = system("livetext #{src} >#{dst}")
         | 
| 30 | 
            +
                  STDERR.puts "...completed (shell returned #{rc})" if debug
         | 
| 31 | 
            +
                  system!("cp #{dst} #{copy}") if copy
         | 
| 28 32 | 
             
                else
         | 
| 29 33 | 
             
                  STDERR.puts "#{indent} -- ^ Already up to date!" if debug
         | 
| 30 34 | 
             
                  return
         | 
| 31 35 | 
             
                end
         | 
| 32 | 
            -
                rc = system("livetext #{src} >#{dst}")
         | 
| 33 | 
            -
                STDERR.puts "...completed (shell returned #{rc})" if debug
         | 
| 34 | 
            -
                system!("cp #{dst} #{copy}") if copy
         | 
| 35 36 | 
             
              end
         | 
| 36 37 | 
             
            end
         | 
| 37 38 |  | 
    
        data/test/austin.rb
    CHANGED
    
    | @@ -119,6 +119,8 @@ Contact light. Houston, this is Tranquility Base. The Eagle has | |
| 119 119 | 
             
            landed. That's one small step for (a) man, one giant leap for 
         | 
| 120 120 | 
             
            mankind.
         | 
| 121 121 |  | 
| 122 | 
            +
            Here's the PDF of $$link["Ruby for the Old-Time C Programmer"|http://rubyhacker.com/blog2/rubydino.pdf]
         | 
| 123 | 
            +
             | 
| 122 124 | 
             
            Pity this busy monster, manunkind, not. Pity rather... Listen:
         | 
| 123 125 | 
             
            There's a hell of a universe next door; let's go.
         | 
| 124 126 | 
             
            BODY
         | 
    
        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.48
         | 
| 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-20 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: livetext
         |