markdown-checklinks-multiarquive
Version:
Verifica os links de vários arquivos markdown em uma pasta
87 lines (56 loc) • 4.29 kB
JavaScript
/*
expressores regulares são um pacote do java script, que reconhece padroes no texto, e pode ser configurado para reconhecer links por exemplo
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Regular_Expressions
Site que nos ajuda com as expressoes regulares, copiamos o texto e colamos la
https://regex101.com/
Expressao regular
parte 1: vamos pegar palavras dentro de cochetes exemplo [oi]
ab = vai pegar no texto onde ha ab em minusculo
[ab] = vai pegar a e b mesmo nao estando juntos
[] = é uma classe - se usar o /[ ou /] ai ele pega o caractere
() = separador de grupos - se usar /( ou /) ai ele pega o caractere
[^ab] = vai pegar todo texto que nao for nem a nem b
[a-e] = vai pegar todas letras entre a e e minusculas
[A-e] = vai pegar todas letras de a e e maiusculas e minusculas
não pega letras com caracteres especiais ê ó à ã : / , .
\w = pega estruturas que ele reconhece como palavra (word)
\[ = usando a barra antes ele vai pegar o cochete [ mesmo a chave sendo uma caractere especial do codigo
\[[\w]\] = pega [palavra] temos uma classe dentro dos cochetes chamando palavras /w. Porem nao vai funcionar pois precisamos definir qual palavra
\[[\w]*\] = o asterisco pega toda quantidade de caracteres, agora sim indicamos uma palavra qualqer dentro de chaves
porem ele nao pega caracteres especiais tipo [<imput>] ou [oi ok] porque ha espeço entre as palavras
\[[\w\s]*\] = \s significa espaço agora [oi ok funcionaria]
poderiamos ir adicionando cada caractare porem ia ficar uma expressao muito grande, ha uma forma melhor de resolver
\[[^\]]*\] = usei o [^\]] significa pegar tudo que nao for um cochete fechando, *\ nao importa quantos caracteres
\[[^\]]*\]
parte 2: vamos pegar um endereço dentro de aspas exemplo
(https://developer.mozilla.org/pt-BR/docs/Web/API/FileList)
\(http = pega a sequencia (http
\(https? = s? significa que o s pode ocorrer ou nao, pois existem apenas http sem o s
\(https?:\/\/ = pega tambem os : e os //
agora complica um pouco pois temos enderecos de dominio. tem deminio.outracoisa., entao varia
\(https?:\/\/[^$#\s] = abrimos agora uma classe com ^ tudo que nao for $# espaço
\(https?:\/\/[^$#\s]*\) = *\) significa quantos caracteres forem necessarios ate chegar a aspa fechada )
ja funciona mais a processora usou o codigo abaixo
\(https?:\/\/[^$#\s].[^\s]*\) = .[^\s]*\) até o ponto que nao for espaço quantos caracteres forem necessarios ate a )
juntando as duas partes
\[[^\]]*\]\(https?:\/\/[^$#\s].[^\s]*\)
porem podemos separalas por grupo, com (),
primeiro grupo o que esta dentro de [] exemplo: ([^\]]*)
segundo grupo o endereco exemplo: (https?:\/\/[^$#\s].[^\s]*)
\[([^\]]*)\]\((https?:\/\/[^$#\s].[^\s]*)\)
podemos visualizar agora no menu lateral do regex101 o
match1: [FileList](https://developer.mozilla.org/pt-BR/docs/Web/API/FileList)
grupo1: FileList
grupo2: https://developer.mozilla.org/pt-BR/docs/Web/API/FileList
e assim por diante
agora temis tudo separado e podemos usar a informação de cada grupo ou do match inteiro
/gm = no regex101 apos o codigo temos o /gm significa global ou seja todas as ocorrencias, e multilinha pois vai pegar todas as linhas onde acontecem a ocorrencia da expressao regular
codigo final para ser incerido no script:
const regex = /\[([^\]]*)\]\((https?:\/\/[^$#\s].[^\s]*)\)/gm;
precisa ser envolvido entre /..../gm
Cada linguagem de programação desenvolve seu próprio interpretador de expressões regulares; no caso do JavaScript podemos usar // e salvar o padrão em uma variável, como foi feito nos vídeos, ou utilizar o construtor new RegExp():
const regex = /[a-zA-z\s]/;
chamada de meta-chars por exemplo *.jpg para procurar todos os jpg, e uma expressao em meta-chars
Para trabalhar com as regex em nosso código, podemos utilizar alguns métodos próprios de string, como match() (que usamos no vídeo), search(), replace(), matchAll() e split(). Você pode consultar mais sobre estes métodos no MDN. Além disso, o JavaScript também tem alguns métodos próprios do objeto RegExp: test() e exec(). Vamos enter mais sobre o exec()
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/RegExp
*/