switem

概要

 テキストの書式を切り替えます。
 テキストから特定の範囲を抽出し、加工するスクリプトを実行します。

 個人が学習のために開発したものです。
 故障対応や問合せ回答などのサポートはしていません。

特徴

 このライブラリの名称は書式の切り替え(Switch Template)に由来しています。

サンプルコード

 以下に switem文書のサンプルを示します(src/test/resources/sample.tpac)。
 Markdown形式で記述されたテキストをHTML形式に変換します。
 テキストを解析してtpac文書に変換し、それをHTML形式に整形します。

#! switem
#> parse
#>> enclose:pre
#-bgn ```
#>> indent:ul
#-bullet - 
#-more   
#> format
#>> replace:pre
#-include pre
World	Groovy
#>> call:pre
#-include pre
#-cover
{ def hndl ->
	hndl.top = '<pre>'
	hndl.btm = '</pre>'
}
#>> call:ul
#-include ul
#-cover
{ def hndl ->
	if (hndl.tagnum == 1) hndl.top = '<ul>'
	if (hndl.tagnum == hndl.tagtotal) hndl.btm = '</ul>'
	hndl.bgn = '<li>'
	hndl.end = '</li>'
	hndl.bullet = (hndl.level == 1)? '' : '  '
	hndl.more = (hndl.level == 1)? '' : '  '
	hndl.nogap = true
}
#>> call:p
#-include doc
#-chunk
{ def hndl ->
	def lines = hndl.dflt.collect()
	lines[0] = "<p>${lines[0]}"
	lines[lines.size() - 1] = "${lines[lines.size() - 1]}</p>"
	return lines
}
#>> call:br
#-chunk
{ def hndl ->
	return hndl.dflt.join("<br/>${System.lineSeparator()}").split(System.lineSeparator())
}

 上記の switem文書を読みこんでクロージャを実行し、期待する戻り値を得られるか assertで確認するスクリプトです(src/test/groovy/Sample.groovy)。

import io.github.longfish801.switem.SwitemServer

File dir = new File('src/test/resources')
String text = new File(dir, 'target.md').text
String tpac = new File(dir, 'parsed.tpac').text
String html = new File(dir, 'formatted.html').text

try {
	def switem = new SwitemServer().soak(new File('src/test/resources/sample.tpac')).switem
	switem.parsedWriter = new StringWriter()
	assert html == switem.run(text).normalize()
	assert tpac == switem.parsedWriter.toString().normalize()
} catch (exc){
	println "Failed to run: ${exc.message}"
	throw exc
}

 switem文書による変換の対象となるテキストです(src/test/resources/target.md)。

This is sample text.
Please read this carefully.

```
println 'Hello, World!'
println 'Hello, Groovy!'
```

- List
  - Elem1
    Elem2
- Map
  - Key
  - Value

 switem文書で上記のテキストを解析した結果であるtpac文書です(src/test/resources/parsed.tpac)。

#! doc
#-gap _
#>

#> chunk:1
This is sample text.
Please read this carefully.
#>

#> pre:1
#-top ```
#-btm ```
#>

#>> chunk:1
println 'Hello, World!'
println 'Hello, Groovy!'
#>

#> ul:1
#-bullet - 
#-more   
#>

#>> chunk:1
List
#>

#>> ul:2
#-bullet - 
#-more   
#>

#>>> chunk:1
Elem1
Elem2
#>

#> ul:3
#-bullet - 
#-more   
#>

#>> chunk:1
Map
#>

#>> ul:4
#-bullet - 
#>

#>>> chunk:1
Key
#>

#>> ul:5
#-bullet - 
#>

#>>> chunk:1
Value
#>

#!

 switem文書で上記のtpac文書を整形した結果です(src/test/resources/formatted.html)。

<p>This is sample text.<br/>
Please read this carefully.</p>

<pre>
println 'Hello, Groovy!'<br/>
println 'Hello, Groovy!'
</pre>

<ul>
<li>List
<ul>
  <li>Elem1<br/>
  Elem2</li>
</ul></li>
<li>Map
<ul>
  <li>Key</li>
  <li>Value</li>
</ul></li>
</ul>

 このサンプルコードは build.gradle内の execSamplesタスクで実行しています。

ドキュメント

GitHubリポジトリ

Mavenリポジトリ

 本ライブラリの JARファイルを GitHub上の Mavenリポジトリで公開しています。
 build.gradleの記述例を以下に示します。

repositories {
	mavenCentral()
	maven { url 'https://longfish801.github.io/maven/' }
}

dependencies {
	implementation group: 'io.github.longfish801', name: 'switem', version: '0.3.00'
}

改版履歴

0.0.01
ドキュメントはmavenリポジトリに出力するよう修正しました。
0.0.02
出力処理にnogapキーを追加し、top, btmキーのList指定に対応しました。
0.0.03
tpac 0.3.12とclmap 0.3.06に対応しました。
0.0.04
tpac 0.3.13に対応しました。
1.1.00
gradle 7.4の記法に対応しました。
1.1.01
tpac 1.1.02, clmap 1.1.02に対応しました。
1.1.02
runメソッドを非同期実行にしました。
1.2.01
clmap 2.0.00に対応しました。