Giter Club home page Giter Club logo

bog001-md-links's Introduction

Markdown Links

Índice


1. Preámbulo

Markdown es un lenguaje de marcado ligero muy popular entre developers. Es usado en muchísimas plataformas que manejan texto plano (GitHub, foros, blogs, ...), y es muy común encontrar varios archivos en ese formato en cualquier tipo de repositorio (empezando por el tradicional README.md).

Estos archivos Markdown normalmente contienen links (vínculos/ligas) que muchas veces están rotos o ya no son válidos y eso perjudica mucho el valor de la información que se quiere compartir.

Dentro de una comunidad de código abierto, nos han propuesto crear una herramienta usando Node.js, que lea y analice archivos en formato Markdown, para verificar los links que contengan y reportar algunas estadísticas.


2. Plan de acción

Diagrama de flujo

Diagrama de flujo

Backlog

Sprint 1

  • Investigar sobre node.js (NodeSchool workshopper learnyounode).

Sprint 2

  • Definir diferentes comandos de entrada posibles para mi programa.
  • Hacer diagrama de flujo.
  • Realizar función para verificar si la ruta ingresada existe y comprobar si es archivo o directorio.
  • Utilizar file system (Fs) para leer un archivo o directorio, según sea el caso.
  • Verificar que el o los archivos tengan extensión .md
  • Investigar como poder extraer los links del archivo markdown.

Sprint 3

  • Probar módulo markdown-it.
  • Convertir archivo markdown a Html con propiedad render de markdown-it.
  • Simular un DOM con el html generado por markdown-it, utilizando la libreria JSDOM, y así poder usar la propiedad windows de ese DOM para acceder window.querySelectorAll para extraer todos los links del archivo.
  • Generar un array que contenga un objeto con las propiedades href, text y file por cada uno de los links encontrados.
  • Investigar sobre librerias para hacer solicitudes HTTP.
  • Investigar sobre el método get de Node.js
  • Hacer condicional para definir cuales links usan protocolo http y cuales https y emplear el método get para hacer las solcitudes correspondientes.
  • Agregar las propiedades status y ok a los objetos de los links.

Sprint 4

  • Refactorizar y pasar todo el código a promesas
  • Crear módulo (exportar función mdLinks).
  • Crear archivo cli.js y requerir el módulo mdLinks.
  • Consumir la promesa que devuelve el módulo mdLinks.
  • Crear función con cuatro condicionales de acuerdo a las posibles entradas que se pueden tener.

Sprint 5

  • Hacer conteo de total de links, links rotos y links unicos.
  • Realizar test unitarios y asíncronos de las funciones en mdLinks.js.
  • Manejo de errores que faltaban.
  • Documentación y README.

3. Objetivos de aprendizaje de este proyecto

JavaScript

  • Uso de condicionales (if-else | switch | operador ternario)
  • Uso de funciones (parámetros | argumentos | valor de retorno)
  • Manipular arrays (filter | map | sort | reduce)
  • Manipular objects (key | value)
  • Uso ES modules (import | export)
  • Diferenciar entre expression y statements.
  • Diferenciar entre tipos de datos atómicos y estructurados.
  • Uso de callbacks.
  • Consumo de Promesas.
  • Creación de Promesas.

Node

Testing

Estructura del código y guía de estilo

  • Organizar y dividir el código en módulos (Modularización)
  • Uso de identificadores descriptivos (Nomenclatura | Semántica)
  • Uso de linter (ESLINT)

Git y GitHub

  • Uso de comandos de git (add | commit | pull | status | push)
  • Manejo de repositorios de GitHub (clone | fork | gh-pages)
  • Colaboración en Github (branches | pull requests | |tags)
  • Organización en Github (projects | issues | labels | milestones)

HTTP

Fundamentos de programación


4. Checklist de entregables

General

  • Puede instalarse via npm install --global <github-user>/md-links

README.md

  • Un board con el backlog para la implementación de la librería.
  • Documentación técnica de la librería.
  • Guía de uso e instalación de la librería

API mdLinks(path, opts)

  • El módulo exporta una función con la interfaz (API) esperada.
  • Implementa soporte para archivo individual
  • Implementa soporte para directorios
  • Implementa options.validate

CLI

  • Expone ejecutable md-links en el path (configurado en package.json)
  • Se ejecuta sin errores / output esperado
  • Implementa --validate
  • Implementa --stats

Pruebas / tests

  • Pruebas unitarias cubren un mínimo del 70% de statements, functions, lines, y branches.
  • Pasa tests (y linters) (npm test).

5. Instrucciones de instalación de la librería:

Para instalar el módulo debes escribir en la terminal:

              npm install CamiYanez/bog001-md-links

Luego de instalarlo puedes ejecutar el programa de la siguiente manera a través de la terminal:

              md-links <path-to-file> [options]

O puedes usarlo con require desde tu archivo js de la siguiente manera:

              const { mdLinks } = require('@CamiYanez/mdLinks')

6. Instrucciones de uso desde la línea de comandos

Tienes cuatro posibles opciones de respuesta de acuerdo al comando que ejecutes a través de tu terminal, la estructura del comando debe ser md-links <path> [options] donde path es la ruta al archivo o directorio, y options puede ser --validate y/o --stats (este parámetro es opcional).

Opción 1: md-links

Por ejemplo: $ md-links ./some/example.md

En caso de no especificar options la salida será un array de objetos donde cada objeto correspondera a un link con las siguientes propiedades:

  • href: URL encontrada.
  • text: Texto que aparecía dentro del link (<a>).
  • file: Ruta del archivo donde se encontró el link.

Opción 2: md-links --validate

Por ejemplo: $ md-links ./some/example.md --validate

En caso de especificar unicamente la opción validate la salida será un array de objetos donde cada objeto correspondera a un link con las siguientes propiedades:

  • href: URL encontrada.
  • text: Texto que aparecía dentro del link (<a>).
  • file: Ruta del archivo donde se encontró el link.
  • status: Código de estado de respuesta de la petición HTTP a la URL encontrada.
  • ok: Depende del status, será ok si la petición fue exitosa y fail si hubo algún problema.

Opción 3: md-links --stats

Por ejemplo: $ md-links ./some/example.md --stats

En caso de especificar unicamente la opción stats la salida será la estadistica del total de links encontrados y la cantidad de links unicos encontrados.

Total Links: 3
Unique Links: 3

Opción 4: md-links --validate --stats

Por ejemplo: $ md-links ./some/example.md --validate --stats

En caso de especificar ambas opciones la salida será el total de links, links unicos, y links rotos encontrados.

Total Links: 3
Unique Links: 3
Broken Links: 1

Recuerda asegurarte de que la ruta ingresada sea valida.


7. Instrucciones de uso para importar con require

Para usar el módulo dentro de tu código puedes importarlo de la siguiente manera: const { mdLinks } = require('./mdLinks')

mdLinks es una función que recibe dos parametros mdLinks(path, option) donde path es la ruta al archivo o directorio y option es un objeto con una propiedad llamada validate que debe contener un Booleano que sea true si deseas validar los links encontrados o false si no.

Esta función retorna una promesa que resuelve un array de objetos, cada objeto representa un link, y las propiedades de estos objetos varian de acuerdo al parametro options, si es false tendrá las propiedades href, text y file, pero si es true tendrá las propiedades href, text, file, status y ok, donde:

  • href: URL encontrada.
  • text: Texto que aparecía dentro del link (<a>).
  • file: Ruta del archivo donde se encontró el link.
  • status: Código de estado de respuesta de la petición HTTP a la URL encontrada.
  • ok: Depende del status, será ok si la petición fue exitosa y fail si hubo algún problema.

Para consumir la promesa

mdLinks(path, option)
    .then(links => {
        console.log(links)
    });

Ejemplo:

mdLinks("./some/example.md", { validate: true })
  .then(links => {
    // => [{ href, text, file, status, ok }]
  })

links es el array de objetos que mencionabamos anteriormente, ya puedes usar esta data para lo que necesites.

bog001-md-links's People

Contributors

camiyanez avatar

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.