アットウィキロゴ
Imports System.Windows.Forms
Imports System.IO
Imports MyLibrary


Module Module1

    Sub Main()

        '失敗したらクリップボードを消去
        If Not TryClip() Then
            Clipboard.Clear()
        End If

    End Sub

    ''' <summary>
    ''' クリップしてみる
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function TryClip() As Boolean

        'コマンドを取得
        Dim args() As String
        args = System.Environment.GetCommandLineArgs()
        Dim parser As New CommandParser()
        Dim commandDic As Dictionary(Of String, List(Of String)) = parser.Parse(args)

        Dim ca As KeyValuePair(Of String, List(Of String))? = Nothing    '-ca    ClipArgs : 引数をクリップ
        Dim cf As KeyValuePair(Of String, List(Of String))? = Nothing    '-cf    ClipFile : 引数にあるテキストファイルをクリップ
        Dim s As KeyValuePair(Of String, List(Of String))? = Nothing     '-s     SaveClip : クリップボードにあるやつをシリアライズ化して保存
        Dim co As KeyValuePair(Of String, List(Of String))? = Nothing    '-co    ClipObject : 引数にあるシリアライズ化されたファイルをクリップ
        Dim rm As KeyValuePair(Of String, List(Of String))? = Nothing    '-rm    ReplaceMacro : マクロを置換

        'コマンドを解析
        For Each commandPair As KeyValuePair(Of String, List(Of String)) In commandDic
            Select Case commandPair.Key
                Case "ca"
                    ca = commandPair
                Case "cf"
                    cf = commandPair
                Case "s"
                    s = commandPair
                Case "co"
                    co = commandPair
                Case "rm"
                    rm = commandPair
            End Select
        Next

        '優先度の高いコマンドから順番に処理
        If ca.HasValue Then

            If rm.HasValue Then
                Return ClipArgs(ca.Value.Value, rm.Value.Value)
            Else
                Return ClipArgs(ca.Value.Value, Nothing)
            End If

        End If

        If cf.HasValue Then

            If rm.HasValue Then
                Return ClipFile(cf.Value.Value, rm.Value.Value)
            Else
                Return ClipFile(cf.Value.Value, Nothing)
            End If

        End If

        'If s.HasValue Then
        '    Return SaveClip(cs.Value)
        'End If

        'If co.HasValue Then

        'End If


        MsgBox("該当するコマンドがありません")
        Return False
    End Function


    ''' <summary>
    ''' 引数の文字をクリップボードにコピーする
    ''' </summary>
    ''' <param name="copyStringArgs">引用する文字を格納したリスト</param>
    ''' <param name="replaceMacroArgs">マクロに置換するかどうか</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function ClipArgs(ByVal copyStringArgs As List(Of String), ByVal replaceMacroArgs As List(Of String)) As Boolean
        If copyStringArgs.Count > 2 Then
            MsgBox("引数が多すぎます")
            Return False
        End If

        Dim txt = TrimQuatation(copyStringArgs(0))

        '引数がある場合、マクロに置換する
        If Not replaceMacroArgs Is Nothing Then

            Dim macro As New BasicMacro()
            txt = macro.Replace(txt)
        End If


        Clipboard.SetText(txt)

        Return True
    End Function

    ''' </summary>
    ''' 引数のファイルをクリップボードにコピーする
    ''' <param name="args"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function ClipFile(ByVal args As List(Of String), ByVal replaceMacroArgs As List(Of String)) As Boolean
        If args.Count > 2 Then
            MsgBox("引数が多すぎます")
            Return False
        End If

        Dim file = TrimQuatation(args(0))
        Dim encode As Text.Encoding = EncodingParser.GetCode(file)
        If encode Is Nothing Then
            Throw New InvalidOperationException("エンコードが特定できませんでした")
            Return False
        End If

        Using reader As New StreamReader(file, encode)
            Dim txt As String = reader.ReadToEnd()

            '引数がある場合、マクロに置換する
            If Not replaceMacroArgs Is Nothing Then

                Dim macro As New BasicMacro()
                txt = macro.Replace(txt)
            End If

            Clipboard.SetText(txt)
        End Using
        Return True
    End Function

    '最初と最後にあるクォーテーションを取り除く
    Private Function TrimQuatation(ByVal str As String) As String
        If str.StartsWith("""") Then
            str = str.Substring(1)
        End If
        If str.EndsWith("""") Then
            str = str.Substring(0, str.Length - 1)
        End If
        Return str
    End Function

    ''' <summary>
    '''
    ''' </summary>
    ''' <param name="args"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function SaveClip(ByVal args() As String) As Boolean
        Return False
        'If args.Length > 3 Then
        '    MsgBox("引数が多すぎます")
        '    Return False
        'End If
        'Dim file = TrimQuatation(args(2))

        'Dim clipObj As IDataObject = Clipboard.GetDataObject()


        'Dim serializer As New BinaryFormatter
        'Using stream As New System.IO.FileStream(file, System.IO.FileMode.Create)
        '    serializer.Serialize(stream, clipObj)
        '    stream.Close()
        'End Using

        'Return True
    End Function


End Module






''' <summary>
''' マクロのインタフェイス
''' </summary>
''' <remarks></remarks>
Public Interface IMacro

    Function Replace(ByVal txt As String) As String

End Interface

''' <summary>
''' マクロの実装
''' </summary>
''' <remarks></remarks>
Public Class BasicMacro
    Implements IMacro

    Private Shared macroDic As Dictionary(Of String, String) = Nothing

    Public Sub New()

        macroDic = New Dictionary(Of String, String)
        macroDic.Add("@@ymd", DateTime.Now.ToString("yyyyMMdd"))
        macroDic.Add("@@ymd2", DateTime.Now.ToString("yyyy/MM/dd"))
        macroDic.Add("@@yyyy", DateTime.Now.ToString("yyyy"))
        macroDic.Add("@@MM", DateTime.Now.ToString("MM"))
        macroDic.Add("@@M", DateTime.Now.ToString("M"))
        macroDic.Add("@@dd", DateTime.Now.ToString("dd"))
        macroDic.Add("@@d", DateTime.Now.ToString("d"))
        macroDic.Add("@@hhmm", DateTime.Now.ToString("hh:mm"))
        macroDic.Add("@@hh", DateTime.Now.ToString("hh"))
        macroDic.Add("@@mm", DateTime.Now.ToString("mm"))

    End Sub


    Public Function Replace(ByVal txt As String) As String Implements IMacro.Replace

        '置換
        For Each pair As KeyValuePair(Of String, String) In macroDic
            txt = txt.Replace(pair.Key, pair.Value)
        Next

        Return txt
    End Function

End Class
最終更新:2014年11月27日 01:18