mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	* grammars: Update several grammars with compat issues * [WIP] Add new grammar conversion tools * Wrap in a Docker script * Proper Dockerfile support * Add Javadoc grammar * Remove NPM package.json * Remove superfluous test This is now always checked by the grammars compiler * Update JSyntax grammar to new submodule * Approve Javadoc license * grammars: Remove checked-in dependencies * grammars: Add regex checks to the compiler * grammars: Point Oz to its actual submodule * grammars: Refactor compiler to group errors by repo * grammars: Cleanups to error reporting
		
			
				
	
	
		
			94 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package compiler
 | |
| 
 | |
| import (
 | |
| 	"archive/tar"
 | |
| 	"compress/gzip"
 | |
| 	"io"
 | |
| 	"io/ioutil"
 | |
| 	"net/http"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| type urlLoader struct {
 | |
| 	*Repository
 | |
| }
 | |
| 
 | |
| func (l *urlLoader) loadTarball(r io.Reader) {
 | |
| 	gzf, err := gzip.NewReader(r)
 | |
| 	if err != nil {
 | |
| 		l.Fail(err)
 | |
| 		return
 | |
| 	}
 | |
| 	defer gzf.Close()
 | |
| 
 | |
| 	tarReader := tar.NewReader(gzf)
 | |
| 	for true {
 | |
| 		header, err := tarReader.Next()
 | |
| 
 | |
| 		if err != nil {
 | |
| 			if err != io.EOF {
 | |
| 				l.Fail(err)
 | |
| 			}
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		if isValidGrammar(header.Name, header.FileInfo()) {
 | |
| 			data, err := ioutil.ReadAll(tarReader)
 | |
| 			if err != nil {
 | |
| 				l.Fail(err)
 | |
| 				return
 | |
| 			}
 | |
| 
 | |
| 			ext := filepath.Ext(header.Name)
 | |
| 			rule, unknown, err := ConvertProto(ext, data)
 | |
| 			if err != nil {
 | |
| 				l.Fail(&ConversionError{header.Name, err})
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			if _, ok := l.Files[rule.ScopeName]; ok {
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			l.AddFile(header.Name, rule, unknown)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (l *urlLoader) load() {
 | |
| 	res, err := http.Get(l.Source)
 | |
| 	if err != nil {
 | |
| 		l.Fail(err)
 | |
| 		return
 | |
| 	}
 | |
| 	defer res.Body.Close()
 | |
| 
 | |
| 	if strings.HasSuffix(l.Source, ".tar.gz") {
 | |
| 		l.loadTarball(res.Body)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	data, err := ioutil.ReadAll(res.Body)
 | |
| 	if err != nil {
 | |
| 		l.Fail(err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	ext := filepath.Ext(l.Source)
 | |
| 	filename := filepath.Base(l.Source)
 | |
| 	rule, unknown, err := ConvertProto(ext, data)
 | |
| 	if err != nil {
 | |
| 		l.Fail(&ConversionError{filename, err})
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	l.AddFile(filename, rule, unknown)
 | |
| }
 | |
| 
 | |
| func LoadFromURL(src string) *Repository {
 | |
| 	loader := urlLoader{newRepository(src)}
 | |
| 	loader.load()
 | |
| 	return loader.Repository
 | |
| }
 |