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