mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			121 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"os"
 | |
| 
 | |
| 	"github.com/github/linguist/tools/grammars/compiler"
 | |
| 	"github.com/urfave/cli"
 | |
| )
 | |
| 
 | |
| func cwd() string {
 | |
| 	cwd, _ := os.Getwd()
 | |
| 	return cwd
 | |
| }
 | |
| 
 | |
| func wrap(err error) error {
 | |
| 	return cli.NewExitError(err, 255)
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	app := cli.NewApp()
 | |
| 	app.Name = "Linguist Grammars Compiler"
 | |
| 	app.Usage = "Compile user-submitted grammars and check them for errors"
 | |
| 
 | |
| 	app.Flags = []cli.Flag{
 | |
| 		cli.StringFlag{
 | |
| 			Name:  "linguist-path",
 | |
| 			Value: cwd(),
 | |
| 			Usage: "path to Linguist root",
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	app.Commands = []cli.Command{
 | |
| 		{
 | |
| 			Name:  "add",
 | |
| 			Usage: "add a new grammar source",
 | |
| 			Flags: []cli.Flag{
 | |
| 				cli.BoolFlag{
 | |
| 					Name:  "force, f",
 | |
| 					Usage: "ignore compilation errors",
 | |
| 				},
 | |
| 			},
 | |
| 			Action: func(c *cli.Context) error {
 | |
| 				conv, err := compiler.NewConverter(c.String("linguist-path"))
 | |
| 				if err != nil {
 | |
| 					return wrap(err)
 | |
| 				}
 | |
| 				if err := conv.AddGrammar(c.Args().First()); err != nil {
 | |
| 					if !c.Bool("force") {
 | |
| 						return wrap(err)
 | |
| 					}
 | |
| 				}
 | |
| 				if err := conv.WriteGrammarList(); err != nil {
 | |
| 					return wrap(err)
 | |
| 				}
 | |
| 				return nil
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			Name:  "update",
 | |
| 			Usage: "update grammars.yml with the contents of the grammars library",
 | |
| 			Flags: []cli.Flag{
 | |
| 				cli.BoolFlag{
 | |
| 					Name:  "force, f",
 | |
| 					Usage: "write grammars.yml even if grammars fail to compile",
 | |
| 				},
 | |
| 			},
 | |
| 			Action: func(c *cli.Context) error {
 | |
| 				conv, err := compiler.NewConverter(c.String("linguist-path"))
 | |
| 				if err != nil {
 | |
| 					return wrap(err)
 | |
| 				}
 | |
| 				if err := conv.ConvertGrammars(true); err != nil {
 | |
| 					return wrap(err)
 | |
| 				}
 | |
| 				if err := conv.Report(); err != nil {
 | |
| 					if !c.Bool("force") {
 | |
| 						return wrap(err)
 | |
| 					}
 | |
| 				}
 | |
| 				if err := conv.WriteGrammarList(); err != nil {
 | |
| 					return wrap(err)
 | |
| 				}
 | |
| 				return nil
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			Name:  "compile",
 | |
| 			Usage: "convert the grammars from the library",
 | |
| 			Flags: []cli.Flag{
 | |
| 				cli.StringFlag{Name: "proto-out, P"},
 | |
| 				cli.StringFlag{Name: "out, o"},
 | |
| 			},
 | |
| 			Action: func(c *cli.Context) error {
 | |
| 				conv, err := compiler.NewConverter(c.String("linguist-path"))
 | |
| 				if err != nil {
 | |
| 					return cli.NewExitError(err, 1)
 | |
| 				}
 | |
| 				if err := conv.ConvertGrammars(false); err != nil {
 | |
| 					return cli.NewExitError(err, 1)
 | |
| 				}
 | |
| 				if out := c.String("proto-out"); out != "" {
 | |
| 					if err := conv.WriteProto(out); err != nil {
 | |
| 						return cli.NewExitError(err, 1)
 | |
| 					}
 | |
| 				}
 | |
| 				if out := c.String("out"); out != "" {
 | |
| 					if err := conv.WriteJSON(out); err != nil {
 | |
| 						return cli.NewExitError(err, 1)
 | |
| 					}
 | |
| 				}
 | |
| 				if err := conv.Report(); err != nil {
 | |
| 					return wrap(err)
 | |
| 				}
 | |
| 				return nil
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	app.Run(os.Args)
 | |
| }
 |