0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PowerShell】Notes DB ファイルから、設計書 (Markdown形式) を自動作成する

Last updated at Posted at 2022-03-29

概要

Notes DB ファイル(.nsf) からビュー、フォーム、エージェント等の情報記載した設計書を自動作成するサンプルコードです。

前提

LotusScript は 32bit版 PowerShell でしか動作しません。

ソース

XML ファイルに変換する

※こちらは 32bit版 でしか使えません。

Convert-NotesToXml.ps1
using namespace System.IO;

Param (
    # Notes DB ファイルパス
    [Parameter(Mandatory, ValueFromPipeline, Position=0)]
    [FileInfo] $Path,

    # データを含むどうか
    [switch] $ContainsData
) Begin {
    # Notes を設定するセッション接続
    $Notes = New-Object -ComObject Lotus.NotesSession
    $Notes.Initialize('')
} Process {
    $db = $Notes.GetDatabase('', $Path, $false) 

    $nc = $db.CreateNoteCollection($true)
    $nc.SelectAllDataNotes($ContainsData)
    # ログを対象外に
    $nc.SelectMiscCodeElements = $false
    # ビルド
    $nc.BuildCollection()

    # 出力XML
    [FileInfo] $xmlPath = Join-Path $Path.DirectoryName ("{0}.xml" -f $db.Title)

    $exporter = $Notes.CreateDXLExporter()
    $exporter.Export($nc) | Out-File $xmlPath -Encoding utf8

    $xmlPath
} End {
}

XML ファイルから設計書 (Markdown形式) を作成する

※こちらは 64bit 版でもつかえます。

Markdown 形式の表変換

ConvertTo-Markdown.ps1
<#
.Synopsis
   Markdown 形式変換
.DESCRIPTION
   Markdown 形式の表に変換します。
#>
function ConvertTo-Markdown {
    [Alias('cnvmd')]
    Param (
        # 項目
        [Parameter(Mandatory, Position=0)]
        $Item,

        # 番号列を使用するかどうか
        [switch] $Numbering
    ) Begin {
        # 列情報取得
        $Header = $Item | select -First 1 | Get-member -MemberType NoteProperty | select -ExpandProperty Name
        $Cols = $Header -join ' | '
        $ColCount = ($Header | measure).Count

        if ($Numbering) {
            echo ('| No. | {0} |' -f $Cols)
            echo ('| :-: |' + (' ---- |' * $ColCount))
        } else {
            echo ('| {0} |' -f $Cols)
            echo ('|' + (' ---- |' * $ColCount))
        }

        $num = 1
    } Process {
        $Item | % {
            $row = $_
            $cells = ($Header | % {
                $cell = $row."$_" -replace "`r?`n", '<br />'
                $cell.Replace('|', '│')
            }) -join ' | '
            if ($Numbering) {
                echo "| $num | $cells |"
            } else {
                echo "| $cells |"
            }

            $num++
        }
    } End {
    }
}

Markdown 形式文書変換処理

Make-Document.ps1
using namespace System.IO;

Param (
    # XML ファイルパス
    [Parameter(Mandatory, ValueFromPipeline, Position=0)]
    [FileInfo] $Path
) Begin {
    pushd $PSScriptRoot
    . .\ConvertTo-Markdown.ps1
} Process {
    [FileInfo] $md = [Path]::ChangeExtension($Path, '.md')

    [XML] $xml = Get-Content $Path
    $db = $xml.database

    echo ("# {0}" -f $Path.BaseName) > $md

    echo '' >> $md
    echo '## 情報' >> $md

    $info = [PSCustomObject]@{
        Version = $db.version
        MaintenanceVersion = $db.maintenanceversion
        ReplicaID = $db.replicaid
        Path = [FileInfo] $db.path
        Title = $db.title
        IncreaseMaxFields = $db.increasemaxfields -eq $true
        ShowInOpenDialog = $db.showinopendialog -eq $true
        MarkModifiedUnread = $db.markmodifiedunread -eq $true
        Uselz1 = $db.uselz1 -eq $true
        FileName = $Path.Name
    }
    $infos = @(
        [PSCustomObject]@{ Name = 'Version'; Value = $info.Version }
        [PSCustomObject]@{ Name = 'MaintenanceVersion'; Value = $info.MaintenanceVersion }
        [PSCustomObject]@{ Name = 'ReplicaID'; Value = $info.ReplicaID }
        [PSCustomObject]@{ Name = 'Path'; Value = $info.Path }
        [PSCustomObject]@{ Name = 'Title'; Value = $info.Title }
        [PSCustomObject]@{ Name = 'IncreaseMaxFields'; Value = $info.IncreaseMaxFields }
        [PSCustomObject]@{ Name = 'ShowInOpenDialog'; Value = $info.ShowInOpenDialog }
        [PSCustomObject]@{ Name = 'MarkModifiedUnread'; Value = $info.MarkModifiedUnread }
        [PSCustomObject]@{ Name = 'Uselz1'; Value = $info.Uselz1 }
        [PSCustomObject]@{ Name = 'FileName'; Value = $info.FileName }
    )

    echo '' >> $md
    cnvmd $infos -Numbering >> $md

    echo '' >> $md
    echo '## 項目数一覧' >> $md

    $objs = @(
        [PSCustomObject]@{ 名前 = '[ビュー](#1.-ビュー)';  = ($db.view | measure).Count }
        [PSCustomObject]@{ 名前 = '[フォーム](#2.-フォーム)';  = ($db.form | measure).Count }
        [PSCustomObject]@{ 名前 = '[エージェント](#3.-エージェント)';  = ($db.agent | measure).Count }
        [PSCustomObject]@{ 名前 = '[スクリプト](#4.-スクリプト)';  = ($db.scriptlibrary | measure).Count }
    )

    echo '' >> $md
    cnvmd $objs -Numbering >> $md

    echo '' >> $md
    echo '# 詳細' >> $md

    echo '' >> $md
    echo '## 1. ビュー' >> $md

    $sub = 1
    $Views = $db.view | % {
        [PSCustomObject]@{
            Num = $sub
            Name = $_.name
            Alias = $_.alias
            Columns = $_.column
        }

        $sub++
    }

    echo '' >> $md
    cnvmd ($Views | select @{name='Name'; expression={('[{0}](#1-{1}. {0})' -f $_.Name, $_.Num)}}, Alias) -Numbering >> $md

    $Views | % {
        $view = $_

        echo '' >> $md
        echo ("### 1-{0}. {1}" -f $view.Num, $_.Name) >> $md

        $columns = $view.Columns | % {
            [PSCustomObject]@{
                Disp = $_.columnheader.title
                Name = $_.itemname
                Summary = $_.code.formula
            }
        }

        echo '' >> $md
        cnvmd $columns -Numbering >> $md
    }

    echo '' >> $md
    echo '## 2. フォーム' >> $md

    $sub = 1
    $Forms = $db.form | % {
        [PSCustomObject]@{
            Num = $sub
            Name = $_.name
            Alias = $_.alias
            Codes = $_.code
        }

        $sub++
    }

    echo '' >> $md
    cnvmd ($Forms | select @{name='Name'; expression={('[{0}](#2-{1}. {0})' -f $_.Name, $_.Num)}}, Alias) -Numbering >> $md

    $Forms | % {
        $form = $_

        echo '' >> $md
        echo ("### 2-{0}. {1}" -f $form.Num, $_.Name) >> $md

        echo '' >> $md
        echo ("#### 2-{0}-1. コード" -f $form.Num) >> $md

        $codes = $form.Codes | % {
            [PSCustomObject]@{
                Name = $_.event
                Summary = $_.formula
                Script = $_.lotusscript
            }
        }

        $codes | % {
            $code = $_

            echo '' >> $md
            echo ('##### {0}' -f $code.Name) >> $md

            if (![string]::IsNullOrEmpty($code.Summary)) {
                echo '' >> $md
                echo ('> {0}' -f $code.Summary) >> $md
            }

            if (![string]::IsNullOrEmpty($code.Script)) {
                echo '' >> $md
                echo '```vb' >> $md
                echo $code.Script >> $md
                echo '```' >> $md
            }
        }
    }

    echo '' >> $md
    echo '## 3. エージェント' >> $md

    $sub = 1
    $Agents = $db.agent | % {
        [PSCustomObject]@{
            Num = $sub
            Name = $_.name
            Alias = $_.alias
            Codes = $_.code
        }

        $sub++
    }

    echo '' >> $md
    cnvmd ($Agents | select @{name='Name'; expression={('[{0}](#3-{1}. {0})' -f $_.Name, $_.Num)}}, Alias) -Numbering >> $md

    $Agents | % {
        $agent = $_

        echo '' >> $md
        echo ("### 3-{0}. {1}" -f $agent.Num, $_.Name) >> $md

        echo '' >> $md
        echo ("#### 3-{0}-1. コード" -f $agent.Num) >> $md

        $codes = $agent.Codes | % {
            [PSCustomObject]@{
                Name = $_.event
                Summary = $_.formula
                Script = $_.lotusscript
            }
        }

        $codes | % {
            $code = $_

            echo '' >> $md
            echo ('##### {0}' -f $code.Name) >> $md

            if (![string]::IsNullOrEmpty($code.Summary)) {
                echo '' >> $md
                echo ('> {0}' -f $code.Summary) >> $md
            }

            if (![string]::IsNullOrEmpty($code.Script)) {
                echo '' >> $md
                echo '```vb' >> $md
                echo $code.Script >> $md
                echo '```' >> $md
            }
        }
    }

    echo '' >> $md
    echo '## 4. スクリプト' >> $md

    $sub = 1
    $Scripts = $db.scriptlibrary | % {
        [PSCustomObject]@{
            Num = $sub
            Name = $_.name
            Alias = $_.alias
            Codes = $_.code
        }

        $sub++
    }

    echo '' >> $md
    cnvmd ($Scripts | select @{name='Name'; expression={('[{0}](#4-{1}. {0})' -f $_.Name, $_.Num)}}, Alias) -Numbering >> $md

    $Scripts | % {
        $script = $_

        echo '' >> $md
        echo ("### 4-{0}. {1}" -f $script.Num, $_.Name) >> $md

        echo '' >> $md
        echo ("#### 4-{0}-1. コード" -f $script.Num) >> $md

        $codes = $script.Codes | % {
            [PSCustomObject]@{
                Name = $_.event
                Summary = $_.formula
                Script = $_.lotusscript
            }
        }

        $codes | % {
            $code = $_

            echo '' >> $md
            echo ('##### {0}' -f $code.Name) >> $md

            if (![string]::IsNullOrEmpty($code.Summary)) {
                echo '' >> $md
                echo ('> {0}' -f $code.Summary) >> $md
            }

            if (![string]::IsNullOrEmpty($code.Script)) {
                echo '' >> $md
                echo '```vb' >> $md
                echo $code.Script >> $md
                echo '```' >> $md
            }
        }
    }
} End {
    popd
}

使用方法

dir C:\NotesDb -File -Recurse -Include *.nsf | .\Convert-NotesToXml.ps1 | .\Make-Document.ps1


参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?