Colabora |
Escribiendo Plugins para LiveWriter (I)
Fecha: 22/Ene/2007 (22 Enero 2007)
|
Nota:
IntroducciónEn esta serie de articulos, comentare lo que estoy aprendiendo acerca de los plugins en Windows Live Writer (de ahora en adelante WLW). Si no tienes instalado este programa descargatelo junto con el SDK. Comenzando...El objetivo de los plugin, es extender las funcionalidades de un programa, en el caso de WLW concretamente escribiremos plugins para añadir contenidos de manera más interactiva (sin tocar el html), y enriquecer el sistema de blogging, ejemplos de contenidos que podemos añadir como plugins:
Los plugin para WLW reciben el nombre Content Source Plugin, estos se clasifican en dos tipos: Simple: Permite la inserción de codigo html dentro de un post, Para implementar un plugin de este tipo debemos heredar de la clase base ContentSource. Smart: Al igual que el anterior permite la inserción de codigo html, pero provee un comportamiento más intuitivo: podemos definir un editor para el SideBar y la habilidad de tener dos representaciones del html (una para la edición y otra para la publicación), entre otras. Para implementar un plugin de este tipo debemos heredar de la clase base SmartContentSource. Los dos tipos de plugin, pueden originar html desde un cuadro de dialogo, una URL, y datos de Live Clipboard . Para cada una de estas "especificaciones" se debe sobreescribir un metodo en la clase base. En esta entrega solo nos preocuparemos del tipo Simple y de proveer un cuadro de dialogo. Supongo que ya te has bajado el WLW, así que creemos un nuevo proyecto del tipo Libreria de clases, y agregamos la referencia a la Api de WLW situada en el directorio de instalación, si no cambiaste la ruta de instalación por defecto de la instalación el path debe ser: C:\Archivos de programa\Windows Live Writer\WindowsLive.Writer.Api.dll Una vez establecida la referencia podemos crear nuestra clase que herede de ContentSource. Para marcar nuestra clase como plugin, debemos adornarla un atributo:
Atributo WriterPlugin, en el constructor de este atributo estamos obligados a indicarle la ID (en forma de GUID, si necesitas una entra aquí) y el Name que sera la cadena por la cual identificaremos al nuestro en la lista.Es posible proporcionar otros parametros al atributo: ImagePath, que indicara la ruta de una imagen incrustada en el assembly, esta imagen sera él icono que lucira nuestro plugin, para que la imagen pueda ser mostrada por el WLW debe ser 20x18 en formato png, tambien es importante que hallamos definido el plugin en el namespace por defecto del proyecto y en caso de haber puesto la imagen dentro de alguna carpeta como Resources, debemos especificar Resources.imagen.png con el . para indicar la jerarquia; Description sera una pequeña descripción (2 lineas) del plugin que podremos ver las preferencias del programa; Publish Url, la pagina del autor; HasEditableOptions, añade un botón para editar las opciones en el panel de plugins, ejecutando un metodo que debemos sobreescribir EditOptions.
y para indicar que esta clase propociona un procedimiento de inserción para un nuevo contenido mediante un cuadro de dialogo:
Especificaremos en el contructor, el texto que tendra en el menu, y si queremos el texto que tendra en la barra (sidebar), en caso de no especificar esta ultimo, se mostrara el texto que tiene del menu en su lugar. El metodo que se ejecutara al hacer click en el menu o en la barra, sera el que CreateContent que debemos sobreescribir (en el caso de los cuadros de dialogo, como se dijo un poco antes). Es importante tener claro que este metodo lo ejecuta el WLW, pasando a esta función parametros. Ahora bien, esta función recibe un primer parametro dialogOwner del tipo IWin32Windows, y un segundo del tipo string pasado por referencia newContent, sera este ultimo el que usaremos para devolver el html . Como resultado a esta función pasaremos un valor de la enumeración DialogResult. El código:C#//el plugin using System.Windows.Forms; using WindowsLive.Writer.Api; [WriterPlugin("5C572939-449F-499C-8AD8-F17639458440", "MarqueeTag", HasEditableOptions = true, ImagePath = "Resources.marquee.png", PublisherUrl = "http://elblogdehoracio.blogspot.com", Description = "Gives ... can be added")] [InsertableContentSource("Insert A Marquee Tag", SidebarText = "Marquee Tag")] public class MarqueeTag : ContentSource { public override DialogResult CreateContent(IWin32Window dialogOwner, ref string newContent) { DialogResult result; using (frmMarquee frmInsert = new frmMarquee()) { result = frmInsert.ShowDialog(); if (result == DialogResult.OK) { MessageBox.Show(frmInsert.Handle.ToString() + dialogOwner.Handle.ToString()); newContent = frmInsert.Content; } } return result; } } //el formulario using System.Windows.Forms; namespace Typhoon { public partial class frmMarquee : Form { public string Content; public frmMarquee() { InitializeComponent(); } private void btnOK_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.OK; char temp = (char)34; this.Content = string.Format( "<marquee direction={4}{1}{4} scrolldelay={4}{2}{4} loop={4}{3}{4}>{0}</marquee>", this.textBox1.Text, this.cmbDirection.Text, this.nudScrolldelay.Value, this.nudLoop.Value, temp); Close(); } private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; Close(); } } }VB.NET 2005 '//el plugin Imports WindowsLive.Writer.Api Imports System.Windows.Forms <WriterPlugin("5C572939-449F-499C-8AD8-F17639458440", "MarqueeTag", _ Description:="Gives ... can be added", _ ImagePath:="Resources.marquee.png", _ PublisherUrl:="http://elblogdehoracio.blogspot.com")> _ <InsertableContentSource("Insert A Marquee Tag", SidebarText:="Marquee Tag")> _ Public Class MarqueeTag Inherits ContentSource Public Overrides Function CreateContent( _ ByVal dialogOwner As System.Windows.Forms.IWin32Window, _ ByRef newContent As String) As DialogResult Dim result As DialogResult Using frmInsert As New frmMarquee() result = frmInsert.ShowDialog If result = DialogResult.OK Then newContent = frmInsert.Content End If End Using Return result End Function End Class '//el formulario Imports System.Windows.Forms Public Class frmMarquee Public Content As String Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles btnOK.Click Me.DialogResult = Windows.Forms.DialogResult.OK '//cuando ponemos "" insertamos un ", '//en c# desconozco la forma de hacer algo parecido por lo que '//tuve que recurrir a (char)34 Me.Content = String.Format( _ "<marquee direction=""{1}"" scrolldelay=""{2}"" loop=""{3}"">{0}</marquee>", _ Me.textBox1.Text, Me.cmbDirection.Text, _ Me.nudScrolldelay.Value, Me.nudLoop.Value) End Sub Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles btnCancel.Click Me.DialogResult = Windows.Forms.DialogResult.Cancel Close() End Sub End Class El codigo anterior habla por si solo, utilizamos using para crear una instancia, almacenamos el resultado, de ser OK el resultado, pasamos el texto, liberamos el recurso (la instancia) y devolvemos el resultado. El aspecto del form seria el siguiente:
Para que la depuración sea más comoda, añadan estos comandos en los eventos post compilación en las propiedades del proyecto:
Conclusiones: Como vemos, hacer un plugin para WLW no es dificil. Con pocas lineas de codigo podemos hacer un sencillo plugin como el anterior que nos permite insertar un texto en movimiento, y solo tenemos que añadir la etiqueta marquee, que tendra en efecto en cualquier etiqueta dentro de su definición, permitiendo insertar el resultado de cualquier plugin (haz doble click en la marquesina y comenzaras a editarla), ejemplo: Me estoy moviendo muy rapidosi creas un plugin puedes enviarlo a las paginas: http://windowswriterplugins.wordpress.com/ http://wlwplugins.com/ en esta hay un foro, postealo alli Bibliografia: http://tech.pederborgpoulsen.dk/2006/09/05/creating-a-plugin-for-windows-live-writer-using-vbnet/ http://nayyeri.net/archive/2006/08/15/Write-a-Windows-Live-Writer-plugin-using-C_2300_.asp Espacios de nombres usados en el código de este artículo:System.Windows.Forms WindowsLive.Writer.Api
|
Código de ejemplo (comprimido): |
Fichero con el código de ejemplo: horacio_pluginslw_sln.zip - 26.7 KB
|