Giter Club home page Giter Club logo

puppet-editor-syntax's Introduction

Puppet Editor Syntax

Build StatusBuild status

Syntax highlighting files for editors (VSCode, Atom, SublimeText, TextMate, etc.) for the Puppet Language

Information

What is this for

There were many locations with different formats of the Textmate style syntax highlighting; Each editor has it's own format, or there were many plugins/packages/extensions which added the syntax highlighting.

This repository is hoping to house syntax highlighting files for most editors. It uses the Textmate XML Property List file as the master template and then generates other formats based on that.

How to use the syntax files

Copy the right file type for your editor. Currently the XML Plist file is in the /syntaxes directory and JSON, YAML, CSON and atom flavoured CSON files are in the /generated-syntaxes directory.

How does the syntax parser work

Unfortunately it's too complex to describe in a README, but in essence, the parser is a great big regex engine. It goes through a list of patterns looking for match. When it finds a match, it assigns a scope to the text, and then starts again with the next bit of text.

At the end of parsing, the entire document is split out into tokens which contains the text, and the scope assigned to that text.

Theme editors can then assign colours or formatting to scopes, for example;

After parsing a document, a token with text $myvar has a scope variable.other.puppet assigned. The theme in the text editor says that the scope variable.other.puppet should have red text. So now in your editor $myvar will appear in red!

Helpful links

Textmate Manual - Language Grammars

Writing a TextMate Grammar: Some Lessons Learned

What scopes should I use

While it is up to the theme to determine what scopes each syntax should use, I found Sublime Text had good documentation on when and what scopes to use.

https://www.sublimetext.com/docs/3/scope_naming.html

Developing and Contributing

Setup

This project is cross platform, and can be developed using Mac, Linux or Windows.

  • Install NodeJS (This project tests on NodeJS v9)

  • Install node modules using npm install

    Note on Windows you may need to install the Windows build tools using;

    npm install --global --production windows-build-tools

Using Gitpod

If you're using gitpod, you can create a workspace using:

https://gitpod.io/#https://github.com/<Github Username>/puppet-editor-syntax/tree/<Git Branch>

To just browse master:

https://gitpod.io/#https://github.com/puppetlabs/puppet-editor-syntax

Running tests

This project makes use of mocha and expect.js. The tests are located in the /tests directory.

To run tests use;

npm run test

Converting to other formats

This project can automatically convert an XML Plist file into other formats.

To run the converter use;

npm run convert

Debugging tools

This project makes use of Visual Studio Code's textmate parser. In order to make development easier, the parser can be put into a debug mode where it shows each and every regex match applied and how an entire file is processed.

To run the inspector use;

npm run inspect <mainGrammarPath> [<additionalGrammarPath1> ...] <filePath>

For example,

To see how a file called C:\Temp\testfile.pp is parsed;

> npm run inspect syntaxes/puppet.tmLanguage C:\Temp\testfile.pp


LOADING GRAMMAR: .\syntaxes\puppet.tmLanguage


===========================================
TOKENIZING LINE 1: |Array[String] $testvar|

@@scanNext: |Array[String] $testvar\n|
  scanning for
   - 3: ^((#).*$\n?)
   - 6: (#).*$\n?
   - 9: \b(absent|directory|false|file|present|running|stopped|true)\b(?!.*{)
   - 10: ^\s*/\*
   - 11: ^\s*(node|class)\s+((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\s*
   - 60: ^\s*(plan)\s+((?:[a-z][a-z0-9_]+::)*[a-z][a-z0-9_]+)\s*
   - 75: ^\s*(define|function)\s+([a-zA-Z0-9_:]+)\s*(\()
   - 90: ^\s*(\w+)\s*{\s*([\'"].+[\'"]):
   - 93: ^\s*(\w+)\s*{\s*(\$[a-zA-Z_]+)\s*:
   - 96: \b(case|if|else|elsif|unless)(?!::)\b
   - 59: (?<![a-zA-Z\$])([A-Z][a-zA-Z]*)(?![a-zA-Z])
   - 32: "
   - 42: '
   - 53: (\[)
   - 97: ((\$?)"?[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*"?):(?=\s+|$)
   - 46: (?<!\w|\d)([-+]?)(?i:0x)(?i:[0-9a-f])+(?!\w|\d)
   - 47: (?<!\w|\.)([-+]?)(?<!\d)\d+(?i:e(\+|-){0,1}\d+){0,1}(?!\w|\d|\.)
...

Creating Pull Requests

  • Please add tests for any changes

  • Remember to commit the generated syntaxes too. Pull Request CI will fail if it finds that this has not been done.

puppet-editor-syntax's People

Contributors

dependabot[bot] avatar glennsarti avatar jpogran avatar mcdonaldseanp avatar michaeltlombardi 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.