「hmPy・IronPython」HTMLのエンコード・デコード

  • 概要

    HTMLのエンコードやデコードなどは、.NETに正規のライブラリが存在します。
    これらは自作のものとは比べ物にもならない高い精度を誇ると言えるでしょう。

    以下のものを「encdecform.mac」として保存してみましょう。

    #PY = loaddll( hidemarudir + "\\" + "hmPy.dll" );
     
    #_ = dllfuncw(#PY, "DoString", R"IPY(
    
    filename = hm.Macro.Var["filename"]
    encoding = hm.Macro.Var["codepage"]
    
    )IPY"
    );
    
    #_ = dllfuncw(#PY, "DoString", R"IPY(
    
    import clr
    
    clr.AddReference("System.Windows.Forms")
    clr.AddReference("System.Web")
    clr.AddReference("System.Drawing")
    
    import System
    import System.IO
    import System.Windows.Forms
    
    from System.Windows.Forms import *
    from System.Web import HttpUtility
    from System.Drawing import *
    
    from System import *
    from System.IO import *
    
    
    def FileReadToEnd():
        text = ""
        sr = None
        try:
            sr  = StreamReader(filename, System.Text.Encoding.GetEncoding(encoding));
            text = sr.ReadToEnd();
            sr.Close();
        except Exception as e:
            hm.debuginfo(e)
        finally:
            if sr:
                sr.Close()
    
        return text
    
    strOrgText = FileReadToEnd()
    strDstText = ""
    
    class EncodeDecodeFrom(Form):
    
        def __init__(self):
    
            self.InitializeComponent()
    
    
        def InitializeComponent(self):
    
            global strOrgText
    
            self._textBoxInput = TextBox()
            self._textBoxOutput = TextBox()
            self._groupBoxType = GroupBox()
            self._radioButtonDecode = RadioButton()
            self._radioButtonEncode = RadioButton()
            self._checkBoxCopy = CheckBox()
            self._buttonAction = Button()
            self._groupBoxType.SuspendLayout()
            self.SuspendLayout()
            #
            # _textBoxInput
            #
            self._textBoxInput.Font = Font("Consolas", 10.5, FontStyle.Regular, GraphicsUnit.Point, 0)
            self._textBoxInput.Location = Point(12, 12)
            self._textBoxInput.Multiline = True
            self._textBoxInput.Name = "textBoxInput"
            self._textBoxInput.ScrollBars = ScrollBars.Both
            self._textBoxInput.Size = Size(380, 103)
            self._textBoxInput.TabIndex = 0
            self._textBoxInput.Text = strOrgText
            #
            # _textBoxOutput
            #
            self._textBoxOutput.Font = Font("Consolas", 10.5, FontStyle.Regular, GraphicsUnit.Point, 0)
            self._textBoxOutput.Location = Point(12, 125)
            self._textBoxOutput.Multiline = True
            self._textBoxOutput.Name = "textBoxOutput"
            self._textBoxOutput.ReadOnly = True
            self._textBoxOutput.ScrollBars = ScrollBars.Both
            self._textBoxOutput.Size = Size(380, 103)
            self._textBoxOutput.TabIndex = 1
            #
            # _groupBoxType
            #
            self._groupBoxType.Controls.Add(self._radioButtonEncode)
            self._groupBoxType.Controls.Add(self._radioButtonDecode)
            self._groupBoxType.FlatStyle = FlatStyle.System
            self._groupBoxType.Location = Point(12, 234)
            self._groupBoxType.Name = "groupBoxType"
            self._groupBoxType.Size = Size(168, 51)
            self._groupBoxType.TabIndex = 2
            self._groupBoxType.TabStop = False
            self._groupBoxType.Text = "Type"
            #
            # _radioButtonDecode
            #
            self._radioButtonDecode.AutoSize = True
            self._radioButtonDecode.FlatStyle = FlatStyle.System
            self._radioButtonDecode.Location = Point(18, 19)
            self._radioButtonDecode.Name = "radioButtonDecode"
            self._radioButtonDecode.Size = Size(69, 18)
            self._radioButtonDecode.TabIndex = 0
            self._radioButtonDecode.Text = "デコード"
            self._radioButtonDecode.UseVisualStyleBackColor = True
            self._radioButtonDecode.CheckedChanged += self.radioButtonType_CheckedChanged
            #
            # _radioButtonEncode
            #
            self._radioButtonEncode.AutoSize = True
            self._radioButtonEncode.Checked = True
            self._radioButtonEncode.FlatStyle = FlatStyle.System
            self._radioButtonEncode.Location = Point(93, 19)
            self._radioButtonEncode.Name = "radioButtonEncode"
            self._radioButtonEncode.Size = Size(68, 18)
            self._radioButtonEncode.TabIndex = 1
            self._radioButtonEncode.TabStop = True
            self._radioButtonEncode.Text = "エンコード"
            self._radioButtonEncode.UseVisualStyleBackColor = True
            self._radioButtonEncode.CheckedChanged += self.radioButtonType_CheckedChanged
            #
            # _checkBoxCopy
            #
            self._checkBoxCopy.AutoSize = True
            self._checkBoxCopy.Checked = True
            self._checkBoxCopy.CheckState = CheckState.Checked
            self._checkBoxCopy.FlatStyle = FlatStyle.System
            self._checkBoxCopy.Location = Point(186, 254)
            self._checkBoxCopy.Name = "checkBoxCopy"
            self._checkBoxCopy.Size = Size(115, 18)
            self._checkBoxCopy.TabIndex = 3
            self._checkBoxCopy.Text = "クリップボードにコピー"
            self._checkBoxCopy.UseVisualStyleBackColor = True
            #
            # _buttonAction
            #
            self._buttonAction.FlatStyle = FlatStyle.System
            self._buttonAction.Location = Point(317, 250)
            self._buttonAction.Name = "buttonAction"
            self._buttonAction.Size = Size(75, 23)
            self._buttonAction.TabIndex = 4
            self._buttonAction.Text = "エンコード"
            self._buttonAction.UseVisualStyleBackColor = True
            self._buttonAction.Click += self.buttonAction_Click
            #
            # FormMain
            #
            self.AcceptButton = self._buttonAction;
            self.AutoScaleDimensions = SizeF(6.0, 13.0)
            self.AutoScaleMode = AutoScaleMode.Font
            self.ClientSize = Size(406, 299)
            self.Controls.Add(self._buttonAction)
            self.Controls.Add(self._checkBoxCopy)
            self.Controls.Add(self._groupBoxType)
            self.Controls.Add(self._textBoxOutput)
            self.Controls.Add(self._textBoxInput)
            self.FormBorderStyle = FormBorderStyle.FixedDialog;
            self.MaximizeBox = False;
            self.Name = "エンコード・デコード・フォーム"
            self.StartPosition = FormStartPosition.CenterScreen;
            self.Text = "Html エンコード・デコード・フォーム"
            self._groupBoxType.ResumeLayout(False)
            self._groupBoxType.PerformLayout()
            self.ResumeLayout(False)
            self.PerformLayout()
    
    
        def radioButtonType_CheckedChanged(self, sender, e):
    
            self._buttonAction.Text = sender.Text
    
    
        def buttonAction_Click(self, sender, e):
            global strDstText
    
            actions = { True: HttpUtility.HtmlEncode, False: HttpUtility.HtmlDecode }
            self._textBoxOutput.Text = actions[self._radioButtonEncode.Checked](self._textBoxInput.Text)
    
            strDstText = self._textBoxOutput.Text
            if self._checkBoxCopy.Checked:
                Clipboard.SetText(self._textBoxOutput.Text)
    
    
    EncodeDecodeFrom().ShowDialog()
    )IPY"
    );
    
    
    freedll( #PY );