トップ 最新 追記   RSS 1.0 FEED  

Journal InTime


2019-12-03 (Tue) [長年日記]

_ Textbringerの名前の由来

Textbringer Advent Calendar 2019の参加記事です。

Textbringerという名前はStormbringerに由来している。 StormbringerといえばDeep Purple第3期の佳作(邦題『嵐の使者』)を思い出す人も多いと思うが、エルリックサーガ( メルニボネの皇子をはじめとするマイクルムアコックの小説群)に登場する魔剣Stormbringerの方である。 殺した相手の魂を吸い取って、持ち主である病弱なエルリックに活力を与えてくれる強力な剣であり、我々定命の者の能力を拡張するテキストエディタの名前としてふさわしい。

なお、ムアコックの読者からはしばしば不吉な名前だと言われるが、Stormbringerが危険なのはstormをbringするからであって、Textbringerがbringするのはtextなので安心してほしい。

_ tDiary 5.1.0へのアップデート

tDiary 5.1.0へアップデートした。

リリースノートに従ってAmazonプラグインの設定をしたが、429 Too Many Requestsでどうにもならない感じだったので、以下のスクリプトでキャッシュを元にリンクするようにして、Amazonプラグインは使わないことにした。

#!/usr/bin/ruby

require 'rexml/document'

class AmazonItem
  def initialize(xml, parser = :rexml, label = nil)
    @parser = parser
    @label = label
    if parser == :oga
      @doc = Oga.parse_xml(xml)
      @item = @doc.xpath('*/*/Item')[0]
    else
      @doc = REXML::Document::new( REXML::Source::new( xml ) ).root
      @item = @doc.elements.to_a( '*/Item' )[0]
    end
  end
  
  def nodes(path)
    if @parser == :oga
      if @item
        @item.xpath(path)
      else
        @doc.xpath(path)
      end
    else
      if @item
        @item.elements.to_a(path)
      else
        @doc.elements.to_a(path)
      end
    end
  end
  
  def has_item?
    !@item.nil?
  end
  
  def title
    @label || nodes('*/Title')[0].text
  end

  def url
    nodes('DetailPageURL')[0].text
  end

  def to_rd
    %Q[((<"#{title}"|URL:#{url}>))]
  end

  def to_md
    "[#{title}](#{url})"
  end
end

CACHE_PATH = "/home/shugo/diary/cache"

def amazon_get(asin, label)
  country = "jp"
  cache = "#{CACHE_PATH}/amazon"
  s = asin.gsub(/-/, "")
  xml = File.read("#{cache}/#{country}#{s}.xml")
  AmazonItem.new(xml, :rexml, label)
end

ARGF.inplace_mode = ".bak"
ARGF.each_line do |line|
  line.gsub!(/\(\(% *(isbn|amazon)\w* *["'](?<asin>.*?)["'](, *["'](?<label>.*?)["'])?.*?%\)\)/) {
    item = amazon_get($~[:asin], $~[:label])
    item.to_rd
  }
  line.gsub!(/\{\{ *(isbn|amazon)\w* *["'](?<asin>.*?)["'](, *["'](?<label>.*?)["'])?.*?\}\}/) {
    item = amazon_get($~[:asin], $~[:label])
    item.to_md
  }
  print line
end
Tags: tDiary

2019-12-04 (Wed) [長年日記]

_ Textbringerのインストール

Textbringer Advent Calendar 2019の参加記事です。

READMEに書いてある通りだが、

$ gem install textbringer

でインストールできる。日本語を扱うためにncurseswが必要な環境があるので、その場合は例えば以下のように事前にインストールしておく。

$ sudo apt install libncursesw5-dev

インストールしたら

$ textbringer

で起動できるが、コマンド名が長いので自分は以下のようなスクリプトを~/bin/tbに置いている。

#!/bin/sh

/home/shugo/local/bin/ruby -I /home/shugo/src/textbringer/lib /home/shugo/src/textbringer/exe/textbringer "$@"

上の例は手元のソースコードを直接実行しているが、gemで入れたコマンドを使う場合は alias tb=textbringer とでもしておけばよい。 ただし、rbenvを使っていたりするとRubyのバージョンによってgemが入ってないことがありがちなので注意。