Skip to content

Commit

Permalink
条件分岐表の出力
Browse files Browse the repository at this point in the history
refs #2
  • Loading branch information
love2hina-net committed Aug 11, 2021
1 parent 5db3e9d commit 69889df
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 15 deletions.
42 changes: 30 additions & 12 deletions doc/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
これはコードからコードドキュメント(詳細設計書)を生成するツールです。
次のプログラムで構成されています。

1. Sharon.jar (Kotlin)
1. sharon.jar (Kotlin)
- Javaソースコードを解析し、コメント(Javadoc)を抽出します。
抽出した情報は独自形式のXMLとして出力し、Gananの入力情報となります
抽出した情報は独自形式のXMLとして出力し、gananの入力情報となります
2. ganan.ps1 (PowerShell)
- ExcelのテンプレートファイルとSharonの出力したXMLを読み込み
- Excelのテンプレートファイルとsharonの出力したXMLを読み込み
情報を埋め込んでExcelコードドキュメントを生成します。

特に整形を担うgananはスクリプトファイルとなっています。
Expand All @@ -19,13 +19,13 @@ This project was released under the MIT Lincense.
## 記載ルール

### Javaソースコード
パラメーターや外部インターフェース仕様については、Javadoc(`/***/`)を認識します。
処理部については、行コメントについては3重スラッシュ(`///`)を用います。
パラメーターや外部インターフェース仕様については、Javadoc(`/**`)を認識します。
処理部については、行コメントについては3重スラッシュ(`///`)を用い、
ブロックコメントは(`/*/`)で開始します。

処理部の記述で特別な意味を持つものは、以下の通りです。
- \#(シャープ)
- ロジック記述に項目番号を振ることを示します
- 先頭に付与することで、ロジック記述に段落番号を振ることを示します。番号は自動的に採番されます。`\#`の後ろにはスペースが必要です
- \=(等号)
- 左辺に右辺の値を設定することを示します。

Expand All @@ -49,7 +49,7 @@ public int method(String name) throws IOException {
// この行の通常コメントはコードドキュメントには出力されません。
/*
* このブロックコメントもコードドキュメントには出力されません。
* なお、詳細設計工程では実処理は記述しません
* 詳細設計工程ではこのように実処理は記述しません
*/
/// [内部変数]カウンター = 0
/// [内部変数]リターンコード = 正常
Expand All @@ -59,20 +59,38 @@ public int method(String name) throws IOException {

/// [引数]パラメーター名が null の場合
if (true) {
/// ここのコメントは、if文の条件コメントとしては扱われません
// 条件は仮置きすればよいです
}
/// [引数]パラメーター名が 空文字 の場合
else if (false) {
/// ここのコメントも、else if文の条件コメントとしては扱われません。
}
/// その他の場合
else {
/// この場所のコメントは、The Java Language Specification上、
/// ブロックステートメント内のコメントであり、if elseステートメントに対するコメントとは解釈されません。
}
}
```

次によく見かけるコメント記述ですが、悪い例を示します。
```java
public int badExsample(String name) {

/// # パラメーターチェック
if (name == null) {
/// [引数]パラメーター名が null の場合
// 上記指定は正しくなく、if文の条件コメントとしては扱われません。
} else if (name.isEmpty()) {
/// [引数]パラメーター名が 空文字 の場合
// ここのコメントも、else if文の条件コメントとしては扱われません。

/// その他の場合
} else {
// 上のその他の場合もコメント位置が正しくありません。
}
}
```
Sharonコードパーサーは比較的厳密にJava言語仕様(The Java Language Specification)に従ってパースします。
上記の例はJava言語仕様上、条件分岐に対するコメントとしてみなされないため、正しく解釈されません。

### Excel

#### 制御文
Expand All @@ -92,7 +110,7 @@ A列に鍵括弧で括り、\#で始まる文字列(例:`{#sheet class}`)を制
|begin |-|指定された要素の繰り返し処理を開始します。||
| |fields|フィールド定義を繰り返します。|`{#begin fields}`|
| |codes|ロジック記述を開始します。|`{#begin codes}`|
|end |-|指定された要素の繰り返し処理を終了します。||
|end |-|指定された要素の繰り返し処理を終了します。|`{#end fields}`|

#### 変数
任意のセルに$で始まる文字列(例:`{$name}`)は変数展開されます。
Expand Down
35 changes: 34 additions & 1 deletion src/main/powershell/ControlStatement.psm1
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using module '.\TargetInfo.psm1'
using module '.\TargetEnumerator.psm1'
using module '.\DocumentWriter.psm1'

# 制御文構造保持
Expand Down Expand Up @@ -129,6 +130,8 @@ class CodesControl : ControlStatement {

# ロジック説明制御文
[DescriptionControl] $descCtrl
# 条件制御文
[ConditionControl] $condCtrl

CodesControl($match, $cell) : base($match, $cell) {
$this.Open('codes')
Expand All @@ -144,6 +147,9 @@ class CodesControl : ControlStatement {
{ $_ -is [DescriptionControl] } {
$this.descCtrl = $control
}
{ $_ -is [ConditionControl] } {
$this.condCtrl = $control
}
}
}

Expand All @@ -152,6 +158,10 @@ class CodesControl : ControlStatement {
throw (New-Object -TypeName 'System.InvalidOperationException' `
-ArgumentList ('コード制御文(codes)中に記述制御文(description)が未定義です。'))
}
if ($null -eq $this.condCtrl) {
throw (New-Object -TypeName 'System.InvalidOperationException' `
-ArgumentList ('コード制御文(codes)中に条件制御文(condition)が未定義です。'))
}
}

[void] Output([DocumentWriter] $docWriter, $target) {
Expand All @@ -165,7 +175,12 @@ class CodesControl : ControlStatement {
'comment' {
$this.descCtrl.Output($docWriter, ([DescriptionTargetInfo]::new($node, $docWriter)))
}
'condition' {}
'condition' {
$cases = [ConditionTargetEnumerator]::new($node, ($docWriter.getCurrentParagraphNumber()))
foreach ($case in $cases) {
$this.condCtrl.Output($docWriter, $case)
}
}
}
}

Expand All @@ -192,6 +207,24 @@ class DescriptionControl : ControlStatement {

}

# 条件制御文
class ConditionControl : ControlStatement {

ConditionControl($match, $cell) : base($match, $cell) {
$this.Open('condition')
}

[void] Output([DocumentWriter] $docWriter, $target) {
$this.beginTransaction($docWriter)

# 単純出力
$this.append($docWriter, $target)

$this.commitTransaction($docWriter)
}

}

# 繰り返し制御文
class IterationControl : ControlStatement {

Expand Down
12 changes: 10 additions & 2 deletions src/main/powershell/DocumentWriter.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,16 @@ class DocumentWriter {
$cell.Value = $replaced
}

# Ctrl + → と同等の処理で列挙高速化
$cell = $cell.End($global:const.xlToRight)
# 次のセル
$next = $cell.Item(1, 2)
if ($next.Text -ne '') {
# 次のセルに値がある(連続)
$cell = $next
}
else {
# Ctrl + → と同等の処理で列挙高速化
$cell = $cell.End($global:const.xlToRight)
}
} while ($cell.Column -le $global:config.searchColumns)
}

Expand Down
22 changes: 22 additions & 0 deletions src/main/powershell/TargetEnumerator.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ class TargetEnumerator : System.Collections.IEnumerable, System.Collections.IEnu
$this._query = $null
}

TargetEnumerator([XPathNodeIterator]$query) {
$this._query = $query
}

# ルートから検索するか自動判定
TargetEnumerator([object]$parent, [string]$tag) {
$info = $parent -as [TargetInfo]
$xpath = $parent -as [XPathNavigator]
Expand Down Expand Up @@ -75,3 +80,20 @@ class MethodTargetEnumerator : TargetEnumerator {
}

}

class ConditionTargetEnumerator : TargetEnumerator {

# 項目番号
[int] $index = 0
# 段落番号
[string] $number

ConditionTargetEnumerator([XPathNavigator]$node, [string]$number) : base($node.Evaluate('case')) {
$this.number = $number
}

[TargetInfo] CreateInfo([XPathNavigator]$node) {
return [ConditionTargetInfo]::new($node, $this.number, ++$this.index)
}

}
18 changes: 18 additions & 0 deletions src/main/powershell/TargetInfo.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -115,3 +115,21 @@ class DescriptionTargetInfo : TargetInfo {
}

}

class ConditionTargetInfo : TargetInfo {

# 項目番号
[string] $index
# 段落番号
[string] $number
# 記述
[string] $description

ConditionTargetInfo([XPathNavigator]$node, [string]$number, [int]$index) : base($node) {

$this.index = $index
$this.number = [string]::Format('{0}.{1}', $number, $index)
$this.description = $node.Evaluate('comment/text()')
}

}
3 changes: 3 additions & 0 deletions src/main/powershell/ganan.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ class GananApplication {
'description' {
$control = [DescriptionControl]::new($Matches, $cell)
}
'condition' {
$control = [ConditionControl]::new($Matches, $cell)
}
default {
$control = [IterationControl]::new($Matches, $cell)
}
Expand Down
Binary file modified template/test.xlsm
Binary file not shown.

0 comments on commit 69889df

Please sign in to comment.