Plugins de ejemplo
Dos plugins se distribuyen con el propio SwiftList y son referencias útiles del mundo real — ambos residen en la carpeta Plugins/ del repositorio de SwiftList.
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 SwiftList. Este es el patrón que hay que copiar si quieres mostrar cualquier menú externo generado dinámicamente dentro de SwiftList 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.FavoritesTabProvideryHistoryTabProviderimplementan cada unoIStartupPanelTabProviderpara mostrar sus listas existentes como pestañas en el Panel de Inicio — una referencia mínima para esa interfaz, ya que ambos simplemente envuelven una lista de elementos ya consultada, sin estado adicional propio.
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.