I’m new to sublime-syntax
development so any feedback is very helpful.
I’m writing support for Vue Component. A copy of my work so far is in this pull request but I’m going to describe my questions in detail here:
Extending HTML attributes in syntax
Vue supports adding expressions as JavaScript, similar to Angular’s ng-model
if you’re familiar with it.
<div :expr="3 + 3">Hello</div>
^^^^^ formatted as scope:source.js
^^^^^ attribute
For this I would do something like (simplified):
- match: ':expr="'
push:
- match: '"'
pop: true
- include: scope:source.js
The downside is that it’s not treated as purely a HTML attribute. So the result is something like:
<div :expr="3 + 3">
^^^^^ formatted as scope:source.js. CORRECT
Hello :expr="4 + 4"
^^^^^ formatted as scope:source.js. INCORRECT
</div>
If I do something which parses the opening tags, then the other builtin HTML tag features stop working. I will have to re-implement or include things like the HTML tag-stuff
. What’s the best approach to solve this?
Implementing basic tag attribute functionality
In vue component files, the top level scope is text.vue
. Users can use custom languages in their styles and scripts. So a user can write
<- default scope text.vue
<style lang="sass">
^^^^^^^^^^^^^^^^^^^ <- parsed by my package, not by Sublime's HTML
<- new scope: source.sass
<- new scope: source.sass
<- new scope: source.sass
</style>
The exact rules I’m using to match this is:
# 'sass' language
- match: (<)(style)\b[^>]*(lang)\s*=\s*([\'\"]sass[\'\"])\s*.*(>)
captures:
1: punctuation.definition.tag.begin.html
2: entity.name.tag.script.html
3: entity.other.attribute-name.html
4: string.quoted.double.html
5: meta.tag.script.end.html
embed: scope:source.sass
escape: (</)(style).*(>)
escape_captures:
1: punctuation.definition.tag.begin.html
2: entity.name.tag.script.html
3: meta.tag.script.end.html
However, with this approach, I’m manually capturing and setting the scopes of the attributes. Realistically vue’s <style>
doesn’t support many different attributes except one but but I would like to highlight all attributes similar to the HTML package.
<style lang="sass" foo="bar">
^^^^^^^^^ no scope
Is there a way I can re-use HTML’s attribute matching rules here?