水杉输入法 MSIME|开源中文输入法
水杉输入法(MSIME)是开源中文输入法,面向 Windows、macOS、Linux、Android、iOS 与 HarmonyOS 开发,支持全拼、双拼、五笔,候选词旁直接显示译文。查看下载、使用指南与常见问题。
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Web personal de Shande Villa, fotógrafo de calle que vive en Guangzhou. Sirve también como enlace de la bio de Instagram.
HTML y CSS estáticos, sin frameworks, sin dependencias en el navegador y sin cookies. El único script de terceros es el captcha de Cloudflare (Turnstile), y solo se carga cuando alguien abre el formulario de contacto. Pensada para Cloudflare Pages; el formulario usa una Pages Function (functions/).
site/ ← lo único que se despliega (directorio de salida)
index.html texto en español (funciona sin JavaScript y es lo que ve Google)
css/estilo.css todo el diseño
js/ idioma, menú, formulario, filtros del portfolio, visor de fotos (sin dependencias)
i18n/zh.json, en.json textos en chino e inglés
img/ fotos optimizadas (WebP, varios tamaños)
fonts/ fuentes autoalojadas (+ sus licencias)
og.jpg, favicon.ico, icon-192.png, icon-512.png, apple-touch-icon.png (el logo 山德)
sitemap.xml, robots.txt, _redirects, _headers
originales/ fotos originales, FUERA del despliegue
tools/ herramientas para quien edita (no se despliegan)
functions/api/contacto.js backend del formulario de contacto (Pages Function)
build.mjs único script de build: RSS de Substack + fuente china
REVISAR.md traducciones al chino y al inglés pendientes de revisar
node build.mjs # (opcional) trae tu último post de Substack
python3 -m http.server -d site 8000
# abre http://localhost:8000
Hace falta Node 18 o superior. Para la fuente china, build.mjs usa Python 3 y la librería fonttools (se instala sola en el build; si no se puede, se queda la fuente que ya está en el repositorio).
main (o rediseno mientras la pruebas).node build.mjssiteNODE_VERSION = 22.*.pages.dev para probar.shandevilla.com (y www.shandevilla.com si lo quieres).kungfundidos.com o www.kungfundidos.comconcat("https://shandevilla.com", http.request.uri.path), estado 301, conservando la cadena de consulta.A a 192.0.2.1).Las URLs antiguas del blog (/blog, /es/blog/…, /en/blog/…, /zh-cn/blog/…) y las páginas sueltas (/obra, /sobre-mi, /contacto) llevan a la portada con un 301 gracias a site/_redirects.
El título y el enlace de tu último post (la fila «Substack» del bloque «Fuera de China») se leen del RSS al construir la web, no desde el navegador. Para que se actualicen sin tocar nada:
main).POST cada día, por ejemplo con un trabajo programado gratuito en cron-job.org o con un Worker con Cron Trigger de Cloudflare.Si Substack no responde el día del build, la web se publica igual: la fila de Substack sale sin título y enlaza a tu perfil.
El botón «Abrir el formulario» de la sección Contacto abre un popup con email, asunto y descripción. Tu correo no aparece en ningún sitio: solo vive en una variable secreta de Cloudflare. Defensas contra spam: captcha Turnstile verificado en el servidor, campo trampa oculto para robots, comprobación de origen, límites de tamaño y limpieza de caracteres de control.
Hasta que lo actives, el popup avisa de que «todavía no está activado» y ofrece Instagram como alternativa. Para activarlo:
shandevilla.com, kungfundidos.com y *.pages.dev (o el de tu proyecto). Modo Managed. Te da una Site key (pública) y una Secret key.shandevilla.com → Email → Email Routing → activar (Cloudflare añade los registros DNS). En Destination addresses añade tu Gmail y pulsa el enlace del correo de verificación; hasta entonces no envía nada.wrangler.jsonc + worker.js, ya incluidos). Crea el Worker: Workers & Pages → Create → Import a repository (este repo, rama main) con Build command node build.mjs, Deploy command npx wrangler deploy y Variable de build TURNSTILE_SITE_KEY = la Site key. Luego en el Worker, Settings → Variables and Secrets:| Nombre | Tipo | Valor |
|---|---|---|
TURNSTILE_SECRET | Secret | la Secret key |
CONTACT_TO | Secret | tu correo (ya verificado en Email Routing) |
CONTACT_FROM (el remitente, una dirección de tu dominio) y el binding EMAIL ya vienen en wrangler.jsonc; no los pongas en el panel. Después, mueve los dominios shandevilla.com y kungfundidos.com al Worker (Settings → Domains & Routes) y quita el proyecto de Pages.
Alternativa sin Email Routing: RESEND_API_KEY (Secret); la función usa Resend solo cuando no hay binding EMAIL.
CONTACT_TO nunca debe ir al repositorio. Para probarlo en local hace falta wrangler pages dev site.
This is the beginning of the README. Read the rest at the original. Read the full README ↗