Whitespace

Whitespaceとは?

すべてが空白とタブと改行の世界です。
http://ja.wikipedia.org/wiki/Whitespace

サンプルコード

例えばHelloと出力させる場合はこんな感じのコードになります。

   		 	   
	
     		  	 	
	
     		 		  
	
     		 		  
	
     		 				
	
     	 	 
	
  


はい、わけがわかりません。

textからWhitespaceコードへ

文字を出力する程度なら簡単にできるので、
今回はプレーンテキストファイルをWhitespaceのprint文に変換するという
大変無駄なコードを書いてみました。
言語はRubyです。

#-----------------------------
# 出力方法設定
#-----------------------------
# コメントの出力
COMMENT_MODE = false
# HTTPヘッダーの出力(trueで"Content-type..."をアタマにつける。)
HTTP_MODE = true

#-----------------------------
# 定義部
#-----------------------------
WSC_SPACE = ' ' # 0
WSC_TAB = '	' # 1
WSC_NEWLINE = "\n" # \n
ERR_ARGNIL = "arg error."
ERR_FILENOTFIND = "file not found."
HTTP_HEADER = "Content-type:text/html\n\n";
WS_STACKPUSH = WSC_SPACE + WSC_SPACE
WS_STACKPRINT = WSC_TAB + WSC_NEWLINE + WSC_SPACE + WSC_SPACE

#-----------------------------
# 関数定義
#-----------------------------
# メッセージを出力。exitflg=1で終了
def printmsg(str, exitflg)
  p str
  exit if(exitflg==1)
end
# 文字をWhitespace表示にして戻す
def conv_wsc(char)
  Regexp.quote(char) + char[0].to_s(2).split('').inject(WSC_SPACE) do |ret, bit|
    ret += (bit == "1" ? WSC_TAB : WSC_SPACE)
  end + WSC_NEWLINE
end
# 文字列をWhitespace表示にして戻す
def conv_wsc_line(line)
  line.split('').inject("") do |ret, c|
    ret += "[S" + WS_STACKPUSH + "]" + conv_wsc(c) + "[P" + WS_STACKPRINT + "]"
  end
end

#-----------------------------
# 引数チェック
#-----------------------------
readfile = $*[0]
whitefile = $*[1]
# 入力チェック
printmsg(ERR_ARGNIL, 1) if(readfile.nil? || whitefile.nil?)
#存在チェック
printmsg(ERR_FILENOTFIND, 1) unless(FileTest.file?(readfile))

#-----------------------------
# メイン処理
#-----------------------------
# 出力結果初期化
outtext = ""
# HTTPヘッダー追加
outtext += "HEADER--" + conv_wsc_line(HTTP_HEADER) + "--HEADER" if(HTTP_MODE)
# ファイル読み込み
f = open(readfile)
f.each do |line|
  outtext += conv_wsc_line(line)
end
f.close
# 終端文字追加
outtext += WSC_NEWLINE + WSC_NEWLINE + WSC_NEWLINE + "EOF"
outtext.gsub!(/\S/, "") unless(COMMENT_MODE)
# 結果出力
foo = File.open(whitefile,'w')
foo.puts outtext
foo.close

第1引数で元ファイル、第2引数で出力先を指定すると変換できます。

Web対応?

今回Rubyでこのようなプログラムを書いたのは、
CGIとして出力できないかなぁと思ったのが理由です。
ソースを見てわかるとおり、"Content-type"といったなぞの記述があります。
wspaceから直接出力できるかと思いましたが、
改行が関わってくるので難しい感じです。
苦肉の策で以下のようになりました。

#!/bin/sh

wspace html.ws

一応できました。

誰得?

誰も得しません。
レンタルサーバに載せようと試みましたが、
wspaceがLinux版なのでFreeBSDの某サーバでは無理でした・・・残念。

問題点

Done.
Stack size 0
Heap size 0

と出力されます。どうしよ。。。