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