Como o github descobre a linguagem de um projeto?

84

Recentemente, eu estava trabalhando em um projeto github em JavaScript e C ++ e percebi que o github marcou o projeto como C ++. Se você tiver que escolher uma única linguagem, esta provavelmente é a designação correta, já que o código C ++ é compilado como uma biblioteca JavaScript, mas isso me fez pensar ... como o github descobre em qual linguagem marcar cada projeto?

Justin Ethier
fonte
14
Você pode se considerar com sorte. Estou escrevendo um projeto Ruby on Rails, mas como estou usando o Twitter Bootstrap, o Github pensa que meu projeto é Javascript, em vez do Ruby pretendido
2
@davblayn Acho que github.com/github/linguist/blob/master/lib/linguist/vendor.yml resolveria seu problema. Também usar um CDN para bootstrap funcionaria.
Eric Wilson
3
Esta questão parece estar fora do tópico porque não se trata de programação. Veja sobre quais tópicos posso perguntar aqui na Central de Ajuda. Talvez o Web Apps Stack Exchange seja um lugar melhor para perguntar.
jww
Consulte também a tag Misidentified Language no Github tracker for Linguist .
jww
1
Você pode dizer que o mecanismo de estatísticas mente sobre os tipos de arquivo para falsificar o resultado. Consulte stackoverflow.com/a/27099628/492
CAD bloke

Respostas:

81

Atualização de abril de 2013, por nuclearsandwich (equipe de suporte do GitHub ou "supportocat"):

Se o seu idioma desejado não estiver recebendo destaque de sintaxe, você pode contribuir com a biblioteca do Linguist para adicioná-lo.


(Resposta original, outubro de 2012)

Este tópico no suporte do GitHub explica isso:

Ele apenas resume o tamanho dos arquivos para cada extensão. O maior "ganha".

Gostaríamos de evitar abrir arquivos e analisar seu conteúdo, pois ambos retardariam o processo ... mas esse pode ser o único método de resolver conflitos como este.

Como isso não é 100% preciso, isso levou alguns a adicionar:

Eu também votaria em uma chave de controle manual simples para os casos em que a suposição está errada.


Nota: como Mark Rushakoff menciona em sua resposta (votação positiva), a suposição melhorou desde então com o projeto linguístico (código aberto em junho de 2011).
Você pode ver que ainda há problemas: Problemas de linguista do GitHub .
Veja aqui para mais detalhes :

Depois que o idioma é detectado, ele é passado para Albino , um wrapper de Pygments , que realça a sintaxe real.

E você pode adicionar diretivas linguísticas em um arquivo .gitattributes .

VonC
fonte
2
Obrigado pela informação. Acho que ainda não há como modificar o idioma manualmente.
noob
Isso não é mais o caso! As respostas abaixo sobre linguista estão mais perto do alvo. Confira Meu repositório está marcado como o idioma errado e Por que meu idioma favorito não é reconhecido em help.github.com . Aviso de isenção de responsabilidade: eu trabalho na equipe de suporte do GitHub.
nuclearsandwich de
@nuclearsandwich Excelente, atualizei a resposta, concluindo sua edição. Observação: estarei na sede do GitHub sexta-feira, 10 de maio, encontrando-me com John Greet e outros supportocats :)
VonC de
Só quero acrescentar que não marcar repositório ou deixar que o usuário escolha o idioma principal seria muito mais conveniente do que adivinhar automaticamente, porque meu repositório github.com/salda/file_scraper é principalmente em C ++ com um pouco de C, mas marcado como 70 % Objective-C.
Lukas Salich de
13

Atualmente, o projeto linguístico do Github é o que é usado para determinar as estatísticas do idioma, conforme descrito nesta postagem do blog do Github (que saiu alguns meses depois que essa pergunta foi feita originalmente).

Mark Rushakoff
fonte
Excelente, não vi na altura da minha resposta. +1
VonC,
4

Primeiro, saiba que você pode substituir o idioma detectado para arquivos em seu repositório usando substituições do Linguist .

Agora, em poucas palavras,

  1. Cada repositório é marcado com o primeiro idioma das estatísticas de idioma .
  2. As estatísticas da linguagem contam o tamanho total dos arquivos para cada linguagem de programação ou marcação detectada. Arquivos de fornecedores, documentação e gerados não são contados.
  3. O idioma de cada arquivo é detectado pelo Linguist do projeto de código aberto .

Como o Linguist detecta os idiomas?

Linguist conta com as seguintes estratégias , em ordem, e retorna o idioma assim que encontra uma correspondência perfeita (estratégia com um único idioma retornado).

  1. Procure modelines Emacs e Vim .
  2. Nome de arquivo conhecido. Alguns nomes de arquivo são associados a idiomas específicos (pense Makefile).
  3. Procure um shebang. Um arquivo com um #!/bin/bashshebang será classificado como Shell.
  4. Extensão de arquivo conhecida. Os idiomas possuem um conjunto de extensões associadas a eles. Existem, no entanto, muitos conflitos com essa estratégia. Os resultados conflitantes (pense em C ++, C e Objective-C para .h) são refinados pelas estratégias subsequentes.
  5. Um conjunto de regras heurísticas . Eles geralmente contam com expressões regulares sobre o conteúdo dos arquivos para tentar identificar o idioma (por exemplo, ^[^#]+:-para Prolog ).
  6. Um classificador bayesiano ingênuo treinado em arquivos de amostra . Última estratégia, menor precisão. O classificador bayesiano sempre leva um subconjunto de linguagens como entrada; não se destina a classificar entre todas as línguas. A melhor correspondência encontrada pelo classificador é retornada.

O que são arquivos não vendidos e arquivos de documentação?

O Linguist considera alguns arquivos como vendidos , o que significa que não são incluídos nas estatísticas do idioma. Isso inclui bibliotecas de terceiros, como jQuery, e são definidas no vendor.ymlarquivo de configuração. Você também pode fornecer ou cancelar o fornecimento de arquivos em seu repositório usando substituições do Linguist .

Da mesma forma, os arquivos de documentação são definidos documentation.ymle podem ser alterados usando as substituições do Linguist .

Como os arquivos gerados são detectados?

O Linguist depende de regras simples para detectar os arquivos gerados, usando os caminhos e o conteúdo dos arquivos. Os arquivos gerados não são contados nas estatísticas do idioma e não são exibidos nos diffs em github.com.

E quanto às linguagens de programação e marcação?

Em Linguist, cada idioma recebe um tipo. Esses tipos podem ser encontrados no arquivo de configuração principal languages.yml,. Apenas as linguagens de programação e marcação são contadas nas estatísticas.

Pchaigno
fonte
0

Depois de alguns ajustes com o linguista , percebi isso.

Para arquivos com um Shebang , o Shebang é considerado ao determinar o idioma, mas parece ter o mesmo peso em relação a outros tokens . Este parece ser um grande erro porque o Shebang deve definir definitivamente o idioma do arquivo.

Isso pode causar problemas com o realce.

Steven Penny
fonte
Esta resposta tem vários links quebrados. Isso também é verdadeiro para a resposta que aparece na troca de pilha: webapps.stackexchange.com/a/40110 . Uma pena, pois gostaria de ver esses links!
shmim
-1

Extensões de arquivo é a primeira coisa que me vem à mente.

Maarten Terpstra
fonte
Claro, mas ... meu projeto continha os dois arquivos .jse .cc, entre outras extensões.
Justin Ethier