Git Product home page Git Product logo

multilang's Introduction

multilang

Tools for multilanguage & Markdown multilang

npm-version downloads build coverage

language: English also available in: Spanish - German

In a Markdown or HTML-like file is written the documentation in multiple languages.

One of these languages ​​is the main, the others are commented with open and close

Then with multilang the other languages ​​are extracted to generate one file for each of the other languages ​​defined

Install

$ npm install multilang -g

How to use

$ multilang doc-en.md

A .md file is generated for the other languages written in doc-en.md file

Multilanguage document format

Any HTML or Markdown document is a multilenguage document if it has a main multilanguage directive.

Example

<!--multilang v0 en:README.md es:LEEME.md fr:LISEZMOI.md de:LIESMICH.md -->
<!--multilang buttons-->

language: ![English](https://raw.githubusercontent.com/codenautas/multilang/master/img/lang-en.png)
also available in:
[Spanish](LEEME.md)  [French](LISEZMOI.md)  [German](LIESMICH.md)

<!--lang:en-->
This is a little example
<!--lang:es--]
Este es un pequeño ejemplo
[!--lang:fr--]
Ce est un petit exemple
[!--lang:de--]
Das ist ein Beispiel
[!--lang:*-->

<!--lang:en-->
"*" means all languages
<!--lang:es--]
"*" es para indicar todos los idiomas
[!--lang:fr--]
"*" est d'indiquer toutes les langues
[!--lang:de--]
"*" steht für alle Sprachen
[!--lang:*-->
All you need is multilang!

In this example:

<!--multilanguage v0 en:README.md es:LEEME.md fr:LISEZMOI.md-->

is the directive for declare the languages

<!--multilanguage buttons-->

is the directive for declaring the place for the button section

[!--lang:fr--]

is the directive for declaring the language of the next section (use * for all languages)

API

var fs = require('fs');
var multilang = require('multilang');

var englishText = fs.readFileSync('README.md', {encoding:'utf8'});

var warnings = multilang.getWarnings(englishText);
if(warnings.lengt){
    console.log('WARN', warnings);
}

var spanishText = multilang.changeDoc(englishText,'es');

console.log('spanish.md',spanishText);

(note about the example: do not use Sync functions in production, use async or promise version as you can see in codenautas

function use
changeDoc(text,lang) receives a multilang text and a language code and returns de text of specified lang
warnings(text) receives a list of warnings and returns a multilang text

License

MIT

...................................

multilang's People

Contributors

biancode avatar diegoefe avatar emilioplatzer avatar estefi-capece avatar julilvicente avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

multilang's Issues

Falla al usar el multilang-run sin --lang para js-to-html

Para reproducirlo:

  1. Hacer git-clone de multilang y de js-to-html colgando de la misma carpeta (en mi caso fue c:\hecho\npm)
  2. Ejecutar lo que acá se indica:
c:\hecho\npm\multilang>node bin/multilang-run.js c:\hecho\npm\js-to-html\README.md
Using directory:  c:\hecho\npm\js-to-html
Processing 'c:\hecho\npm\js-to-html\README.md'...
Generating all languages...

c:\hecho\npm\multilang>
  1. Ver que no se generó nada.

Agregar la opción --verbose para info no necesaria y arreglar --silent

Si no se especifica --verbose solo deben aparecer los warnings

Si se especifica --silent y todo anda bien no debe aparecer nada (ni Done!), solo deben aparecer los runtime errors si hubieran.

Actualmente al poner multilang aparece algo así como

c:\Hecho\npm\js-to-html>multilang README.md
Processing 'README.md'...
Generating all languages...
line 113: unbalanced start "["
line 113: unbalanced "<"
Generating 'es', writing to 'c:\Hecho\npm\js-to-html\LEEME.md'...
Generated 'es', file 'c:\Hecho\npm\js-to-html\LEEME.md'.
Done!

Esa tendría que ser la salida de --verbose. Sin --verbose tiene que sacar solo los warnings

c:\Hecho\npm\js-to-html>multilang README.md
line 113: unbalanced start "["
line 113: unbalanced "<"

Actualmente con --silent aparece Done!, no debería. Si hay runtime errors sí deberían aparecer.

Agregar la opcion --strip-comment --no-strip-comment

Con --strip-comment (o cuando el nombre del archivo es README.md) quitar todos los comentarios de dentro del generado. (salvo que esté en un bloque de código que empiece con tres apóstrofes invertidos).

Si el archivo es README.md y se especifica --no-strip-comment no se hace el strip

El strip debería quitar el renglón entero, o sea si el comentario termina en un fin de línea (\r\n o en un \n) hay que quitar también el fin de línea .

No detecta el mismo idioma dos veces seguido

Para reproducir el bug hay que clonar pg-promise-strict y ejecutar:

c:\hecho\npm\pg-promise-strict>multilang docs\additions.md
Processing 'docs\additions.md'...
Generating all languages...
line 13: button section must be in main language or in all languages
Generating 'es', writing to 'c:\hecho\npm\pg-promise-strict\docs\agregados.md'...
Generated 'es', file 'c:\hecho\npm\pg-promise-strict\docs\agregados.md'.
Done!
c:\hecho\npm\pg-promise-strict>
  • Falta un warning diciendo que falta una sección en inglés
  • Sobra el warning que dice que la sección buttons debe estar en all languages porque ahí está.

Informa doble desbalance (con < y con [) en ejemplo eiffel

Bajando el commit que estaba vigente en: emilioplatzer/eiffel@8260864 da un error en la misma línea (77) diciendo que está desbalanceado "<" y "[". Algo está mal ahí. Quizás esté mal mi definición inicial. Hay que revisar las especificaciones para ver qué es lo más coherente.

c:\Hecho\npm\eiffel>multilang --version
1.0.4

c:\Hecho\npm\eiffel>multilang README.md
Processing 'README.md'...
Generating all languages...
line 77: unbalanced start "["
line 77: unbalanced "<"
line 81: last lang directive could'n finish in "]"
Generating 'es', writing to 'c:\Hecho\npm\eiffel\LEEME.md'...
Generated 'es', file 'c:\Hecho\npm\eiffel\LEEME.md'.
Done!
c:\Hecho\npm\eiffel>

Poder instalarlo globalmente con -g

El objetivo final es que funcione como npm-check-updates, en el sentido de que al instalarlo con -g queda instalado de manera que pueda invocarse sin buscarlo en la carpeta y sin ponerle delante node o npm.

bug de mala identificación de lenguajes para el README de fast-devel-server

En codenautas/fast-devel-server@8d34ad0 el README.md parece estar bien (tener bien las señales de multilang), sin embargo da error:

c:\Hecho\npm\fast-devel-server>multilang --version
1.0.4

c:\Hecho\npm\fast-devel-server>multilang README.md
Processing 'README.md'...
Generating all languages...
line 61: lang: en not included in the header
line 65: lang: es not included in the header
Generating 'es', writing to 'c:\Hecho\npm\fast-devel-server\LEEME.md'...
Generated 'es', file 'c:\Hecho\npm\fast-devel-server\LEEME.md'.
Done!

Implementar la función principal

La función principal es la que se llamará desde la línea de comandos

multilang.main = function main(parameters)

uso típico:

multilang README.md

otro uso posible

(en el #4 decidiremos dónde van las opciones)

multilang README.md --lang es --out README.es --verify
parameters tipo default uso
input posicional obligatorio Nombre del archivo de entrada que contiene el MD multiline
lang optativo todos los lenguajes definidos lenguaje que va a exportarse
out optativo lo deduce del input el nombre del archivo de salida, no puede especificarse si no se especificó lang
verify optativo false No graba la respuesta, lo que hace es leer y comparar que sea igual
silent optativo false No muestra información de progreso por chanout
chanout interna stdout Stream por donde mostrar la salida (salvo que sea silent)
chanerr interna stderr Stream por donde mostrar los errores de verify

ejemplo

Dentro de un test a la función se la podría llamar así:

var dummyErrStream=new StreamStringWriter(); // si es que existe
multilang.main({
    input: 'README.md',
    lang: 'es',
    out: 'LEEME-errado.md',
    verify: true,
    chanerr: dummyErrStream
});

expect(dummyErrStream).to.eql(
  "Error in line 14..."
);

La función devuelve un número que si es distinto de 0 debe llamarse a process.exit(n)

Avisar si se especifica una versión de qa-control que no existe

Esa es la primera regla y es válida para todas las reglas. Si esta falla se deja de controlar el resto.

Tiene que haber un conjunto de reglas que no dependa de la versión.

En LoadProject hay que agregar el campo info.version que será el que después se use para acceder al conjunto de reglas específico (si es que la versión es válida y existe)

nunca pisar el archivo principal

Si alguno de los archivos "a generar" coincide con el archivo que se usa como parámetro multilang debe devolver un error y no hacer nada.

Agregar el parámetro output-path

Los output los genera en la carpeta especificada en output-path

Si no está especificado debe tomar la carpeta del parámetro input

Si alguien quiere la carpeta actual pondrá --output-path .

Verificar la lógica de los warnings

El algoritmo que revise los warnings de los lenguajes debe considerar la directiva lang:xx actual y la directiva lang:xx anterior. Se debe parsear en orden cada directiva lang:xx

  1. la primera vez:
    1. que se encuentra un lang:xx, xx debe ser el lenguaje principal o el siguiente (si son dos puede ser cualquiera de ellos).
    2. la primera vez debe comenzar con "<".
  2. las veces subsiguientes:
    1. el lenguaje principal y el "*" cierran con ">" (significa seguir visible) los demás con "]" (significa seguir invisible)
    2. el signo de apertura de la directiva depende del cierre de la directiva anterior (si cerró con "]" el actual abre con "[")
    3. el lenguaje actual debe ser el siguiente del anterior (en la lista de definición de lenguajes) y si es "" el anterior debe ser el último lenguaje y si es main el anterior es el último lenguaje o "".
  3. al final de todo (cuando no hay más lenguajes) hay que revisar el último que se había visto y:
    1. el lenguaje debe ser el último o *

Bug de efectos colaterales de getWarnings

getWarnings tiene efectos colaterales. Para reproducir este bug hay que bajarse los módulos

  • tabulator y
  • multilang

e instalar multilang y correr esto desde multilang.

c:\hecho\npm\multilang> node bin\multilang-run.js c:\hecho\npm\tabulator\README.md

Funciona bien

Luego hay que modificar multilang.js y descomentar las siguientes 3 líneas (de la 302 a la 304):

        // comentar estas 3:
        if(!parameters.silent){
            (parameters.chanerr || process.stderr).write(multilang.getWarnings(readContent));
        }

Luego volver a ejecutar

c:\hecho\npm\multilang>node bin\multilang-run.js c:\hecho\npm\tabulator\README.md
Using directory:  c:\hecho\npm\tabulator
Processing 'c:\hecho\npm\tabulator\README.md'...
Generating all languages...
ERROR
Error: ENOENT, no such file or directory 'c:\hecho\npm\multilang\langs\lang-[object Object].yaml'
c:\hecho\npm\multilang>

al correr lo mismo ahora da un error. Evidentemente el problema es la invocación del getWarnings.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.