トップ «前の日記(2019-11-30 (Sat)) 最新 次の日記(2019-12-04 (Wed))» 編集   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