Colabora
 

Escribiendo Plugins para LiveWriter (I)

 

Fecha: 22/Ene/2007 (22 Enero 2007)
Autor: Horacio Nuñez Hernández

 


 

Nota:
Este artículo fue publicado en mi blog hace un par de meses, en el momento de escribirlo tome como referencia dos articulos publicados en blogs (tambien) en idioma en ingles (ver referencia), y el contenido del SDK. Mi intención fue que en esos momentos en los que se lanzaba el LiveWriter hubiera una pequeña iniciación al tema de los plugins pero en español. Como veran en el titulo del articulo menciono esta es una primera entrega, lamentablemente hace un par de meses no pude seguir con el tema de los plugins por otras cuestiones, por lo que les pido a los lectores, que si encuentran este articulo util, y quisieran una segunda entrega del mismo, me escribieran al correo, para decidirme si me lanzo con el tema de los plugins complejos :), que lo disfruten.
 

 

Introducción

En 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:

  1. Tags de servicios como Del.icio.us, Technorati, etc.
  2. Imagenes online de sitios como Flickr.

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

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.

opciones

 y para indicar que esta clase propociona un procedimiento de inserción para un nuevo  contenido mediante un cuadro de dialogo:

  • Atributo InsertableContentSourceAttribute

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:

  • XCOPY /D /Y /R "$(TargetPath)" "C:\Archivos de programa\Windows Live Writer\Plugins\"
  • C:\Archivos de Programa\Windows Live Writer\WindowsLiveWriter.exe

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 rapido smile_speedy

si 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

(MD5 checksum: 4C149C575089ADCCD41FD9686249E908)

 


ir al índice principal del Guille