Plugins de ejemplo
Dos plugins se distribuyen con el propio Lertaro y son referencias útiles del mundo real — ambos residen en la carpeta Plugins/ del repositorio de Lertaro.
CoreExtensions — acciones y el menú contextual del shell
CoreExtensionsPlugin implementa tres interfaces a la vez: IPlugin, IActionProvider e IConfigurable.
IActionProvider.GetActions()devuelve diezISearchResultActionintegradas — abrir, localizar en el Explorador, copiar ruta, copiar/cortar el propio archivo, abrir un símbolo del sistema en su ubicación, crear archivo/carpeta, y variantes elevadas (ejecutar como administrador) de abrir y símbolo del sistema.IActionProvider.GetDynamicActionProviders()devuelve un únicoIDynamicActionProvider—ShellMenuActionProvider— que es lo que hace que el menú contextual real de Windows (incluidos submenús en cascada anidados como "Enviar a") aparezca dentro del propio menú de Acciones de Lertaro. Este es el patrón que hay que copiar si quieres mostrar cualquier menú externo generado dinámicamente dentro de Lertaro en lugar de una lista fija de acciones.IConfigurable.GetConfigSchema()muestra un esquema de configuración con grupos de campos anidados y un tipo de campoStringList— merece la pena leerlo si tu propio plugin necesita algo más que una lista plana de booleanos en su cuadro de configuración de Configuración → Plugins.- Cinco proveedores implementan
IQuickPanelTabProvider, y entre ellos cubren ambos extremos de esa interfaz.FavoritesTabProvideryHistoryTabProviderdevuelven tal cual una lista que ya está en memoria — la referencia mínima, ya que ninguno lleva estado propio.WindowsRecentTabProvideres el otro extremo: lee un directorio y resuelve accesos directos del shell por COM en una tarea en segundo plano, recorta el conjunto antes de hacer la parte cara, y rellena elMetadata.Modifiedde cada entrada para que el orden por lo más nuevo de la pestaña signifique algo. LastDirectoryTabProvideryRecentFilesTabProvidermerecen leerse por otro motivo: ninguno tiene datos propios. Se los piden al anfitrión a través deExplorerPathServiceyRecentFilesService, que es el patrón a copiar siempre que lo que tu plugin quiere mostrar sea algo que Lertaro ya sabe.
PinyinAlias — alias en pinyin para nombres de archivo en chino
PinyinAliasProvider implementa tanto IAliasProvider como ITranslationProvider — un plugin puede combinar libremente roles del SDK cuando están relacionados, y este es un buen modelo para ello:
IAliasProvider.InputRanges/OutputRangesdeclaran sus dos alfabetos directamente a partir de los límites de la propia tabla dePinyinEngine(InputRanges: el bloque CJK;OutputRanges:a-z) en lugar de duplicar números mágicos — el host usa ambos juntos para admitir consultas mixtas de literal+pinyin como大cjcontra大长今.IAliasProvider.CanHandle(text)busca cualquier carácter chino antes de hacer trabajo real, de modo que los nombres de archivo que no son chinos se saltan por completo la generación de alias.IAliasProvider.GetAliases(text)construye una tabla de sílabas por carácter (cada carácter chino se asocia a sus posibles lecturas en pinyin) y luego genera tanto un alias en pinyin completo como un alias solo de iniciales. Para nombres de archivo con caracteres polifónicos (más de una lectura válida), genera alias para cada combinación habitual — limitado a 32 combinaciones para evitar una explosión combinatoria con entradas patológicas — uniendo las alternativas con|para que el motor de búsqueda trate cada una como candidata en lugar de exigir que todas coincidan simultáneamente.ITranslationProviderse implementa en la misma clase, únicamente para proporcionar las cadenas de interfaz propias de este plugin (por ejemplo, su nombre visible) medianteTranslationService.LoadEmbeddedTranslations— las dos interfaces no están relacionadas en propósito, pero coinciden aquí en un mismo tipo por tratarse de un plugin pequeño, de un solo archivo.- Una caché
Dictionary<string, Dictionary<string, string>>protegida por unlockevita volver a analizar el JSON de traducción incrustado en cada llamada — el patrón habitual para cualquier plugin que realice trabajo no trivial enGetTranslations.
Leer ambos plugins uno junto al otro es la forma más rápida de ver cómo encajan en la práctica las piezas de la Referencia del SDK de Plugins.