NHRV5JP3IOPM3JRAT2FPM4D66UUUGQLHOJ6R7XGAVM2Z3FHTPLNQC
{
"folders": [
{
"path": "."
}
],
"settings": {}
}
# Welcome to your VS Code Extension
## What's in the folder
* This folder contains all of the files necessary for your extension.
* `package.json` - this is the manifest file in which you declare your language support and define the location of the grammar file that has been copied into your extension.
* `syntaxes/sprak.tmLanguage.json` - this is the Text mate grammar file that is used for tokenization.
* `language-configuration.json` - this is the language configuration, defining the tokens that are used for comments and brackets.
## Get up and running straight away
* Make sure the language configuration settings in `language-configuration.json` are accurate.
* Press `F5` to open a new window with your extension loaded.
* Create a new file with a file name suffix matching your language.
* Verify that syntax highlighting works and that the language configuration settings are working.
## Make changes
* You can relaunch the extension from the debug toolbar after making changes to the files listed above.
* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes.
## Add more language features
* To add features such as intellisense, hovers and validators check out the VS Code extenders documentation at https://code.visualstudio.com/docs
## Install your extension
* To start using your extension with Visual Studio Code copy it into the `<user home>/.vscode/extensions` folder and restart Code.
* To share your extension with the world, read on https://code.visualstudio.com/docs about publishing an extension.
{
"name": "Sprak Language Extension",
"scopeName": "source.sprak",
"fileTypes": [
"sprak",
"Sprak",
"SPRAK"
],
"uuid": "92b7c74c-cde8-4611-979e-a162a03c37fb",
"patterns": [
{
"comment": "Comment",
"name": "comment.line.sprak",
"match": "(#).*",
"captures": {
"1": {
"name": "punctuation.definition.comment.sprak"
}
}
},
{
"comment": "Keywords",
"name": "keyword.control.sprak",
"match": "\\b(else if|(end )?if|(end )?void|end|else|loop|in|from|to|break|return)\\b"
},
{
"comment": "Operators",
"name": "keyword.operator.sprak",
"match": "^(?:(?i)and|(?i)or|[!<->]=|&&|\\|\\||[!<->]|[*+\\-/])$"
},
{
"comment": "Types",
"name": "storage.type.sprak",
"match": "\\b(void|bool|number|string|array|var)\\b"
},
{
"comment": "Functions",
"name": "support.function.sprak",
"match": "\\b(Allow|Append|Blip|BootFromFloppy|Broadcast|ChangeBalance|CharToInt|Charisma|ClearData|ClearMemories|ClearText|Color|Connect|CopyToClipBoard|Corruption|Cos|Count|DisconnectAll|DisplayGraphics|Drink|Drunkenness|EnableAPI|EraseMemory|FastForward|FindPath|GetAction|GetAllRooms|GetBalanceForPerson|GetChannel|GetConnections|GetHour|GetIndexes|GetMemories|GetMinute|GetNumericData|GetPosition|GetPeople|GetRain|GetRoom|GetThingsInRoom|GetThingsOfType|GetTypeOfThing|GetUser|HD|HSVtoRGB|HasFloppy|HasFunction|HasIndex|HasMemory|Height|Info|Input|Int|InteractWith|IntToChar|IsKeyPressed|IsUser|Line|Lines|LoadData|LoadMemory|Lock|Log|Mod|Move|MovePerson|Name|OnHack|OnIntruder|Pitch|PlaySound|Position|Print|PrintS|QuickBoost|Quit|RGBToHSV|Random|Range|Rect|RegisterSeller|RemoteFunctionCall|Remove|RemoveAll|Repeat|RestoreCode|Round|SaveData|SaveMemory|Say|SetChannel|SetMaxTime|SetMhz|SetNumericData|SetPosition|SetRain|Sin|Sleep|Sleepiness|Slurp|Smelliness|Speed|StringContains|Switch|TeleportSetWorldPosition|Text|Time|Toggle|Trippy|TurnLeft|TurnOff|TurnOffSound|TurnOn|TurnOnSound|TurnRight|Type|Unlock|Width|ZapPerson|ZapPersonGently)\\b"
},
{
"comment": "Numeric",
"name": "constant.numeric.sprak",
"match": "\\b(\\d(\\.\\d)?)+"
},
{
"comment": "Global",
"name": "constant.global.sprak",
"match": "\\b\\w+\\$"
},
{
"comment": "SUB",
"name": "meta.function.sprak",
"match": "^(\\w+):",
"captures": {
"1": {
"name": "entity.name.function.sprak"
}
}
},
{
"comment": "Brace, round",
"name": "meta.brace.round.sprak",
"match": "[\\(\\)]"
},
{
"comment": "Brace, curly",
"name": "meta.brace.curly.sprak",
"match": "[\\{\\}]"
},
{
"comment": "Array",
"name": "other.array.sprak",
"begin": "(\\w+\\()",
"beginCaptures": {
"1": {
"name": "constant.array.sprak"
}
},
"end": "(\\))",
"endCaptures": {
"1": {
"name": "constant.array.sprak"
}
},
"patterns": [
{
"include": "$self"
}
]
},
{
"comment": "String, double-quoted",
"name": "string.quoted.double.sprak",
"match": "\\\"[^\"]*\\\""
},
{
"comment": "String, single-quoted",
"name": "string.quoted.single.sprak",
"match": "\\'[^']*\\'"
}
]
}
# [PackageDev] target_format: plist, ext: tmLanguage
---
name: Sprak Language Extension
scopeName: source.sprak
fileTypes: [sprak,Sprak,SPRAK]
uuid: 92b7c74c-cde8-4611-979e-a162a03c37fb
patterns:
- comment: Comment
name: comment.line.sprak
match: (#).*
captures:
'1': { name: punctuation.definition.comment.sprak }
- comment: Keywords
name: keyword.control.sprak
match: \b(else if|(end )?if|(end )?void|end|else|loop|in|from|to|break|return)\b
- comment: Operators
name: keyword.operator.sprak
match: '^(?:(?i)and|(?i)or|[!<->]=|&&|\|\||[!<->]|[*+\-/])$'
- comment: Types
name: storage.type.sprak
match: \b(void|bool|number|string|array|var)\b
- comment: Functions
name: support.function.sprak
match: \b(Allow|Append|Blip|BootFromFloppy|Broadcast|ChangeBalance|CharToInt|Charisma|ClearData|ClearMemories|ClearText|Color|Connect|CopyToClipBoard|Corruption|Cos|Count|DisconnectAll|DisplayGraphics|Drink|Drunkenness|EnableAPI|EraseMemory|FastForward|FindPath|GetAction|GetAllRooms|GetBalanceForPerson|GetChannel|GetConnections|GetHour|GetIndexes|GetMemories|GetMinute|GetNumericData|GetPosition|GetPeople|GetRain|GetRoom|GetThingsInRoom|GetThingsOfType|GetTypeOfThing|GetUser|HD|HSVtoRGB|HasFloppy|HasFunction|HasIndex|HasMemory|Height|Info|Input|Int|InteractWith|IntToChar|IsKeyPressed|IsUser|Line|Lines|LoadData|LoadMemory|Lock|Log|Mod|Move|MovePerson|Name|OnHack|OnIntruder|Pitch|PlaySound|Position|Print|PrintS|QuickBoost|Quit|RGBToHSV|Random|Range|Rect|RegisterSeller|RemoteFunctionCall|Remove|RemoveAll|Repeat|RestoreCode|Round|SaveData|SaveMemory|Say|SetChannel|SetMaxTime|SetMhz|SetNumericData|SetPosition|SetRain|Sin|Sleep|Sleepiness|Slurp|Smelliness|Speed|StringContains|Switch|TeleportSetWorldPosition|Text|Time|Toggle|Trippy|TurnLeft|TurnOff|TurnOffSound|TurnOn|TurnOnSound|TurnRight|Type|Unlock|Width|ZapPerson|ZapPersonGently)\b
- comment: Numeric
name: constant.numeric.sprak
match: \b(\d(\.\d)?)+
- comment: Global
name: constant.global.sprak
match: \b\w+\$
- comment: SUB
name: meta.function.sprak
match: '^(\w+):'
captures:
'1': { name: entity.name.function.sprak }
- comment: Brace, round
name: meta.brace.round.sprak
match: '[\(\)]'
- comment: Brace, curly
name: meta.brace.curly.sprak
match: '[\{\}]'
- comment: Array
name: other.array.sprak
begin: (\w+\()
beginCaptures:
'1': { name: constant.array.sprak }
end: (\))
endCaptures:
'1': { name: constant.array.sprak }
patterns:
- include: $self
- comment: String, double-quoted
name: string.quoted.double.sprak
match: \"[^"]*\"
- comment: String, single-quoted
name: string.quoted.single.sprak
match: \'[^']*\'
...
{
"Variable Array": {
"prefix": ["array"],
"body": ["array ${1:name} = [$0]"],
"description": "Array variable declaration."
},
"Variable Boolean": {
"prefix": ["bool"],
"body": ["bool ${1:name} = $0"],
"description": "Boolean variable declaration."
},
"Variable Number": {
"prefix": ["number"],
"body": ["number ${1:name} = $0"],
"description": "Number variable declaration."
},
"Variable String": {
"prefix": ["string"],
"body": ["string ${1:name} = \"$0\""],
"description": "String variable declaration."
},
"Variable Generic": {
"prefix": ["var"],
"body": ["var ${1:name} = $0"],
"description": "Generic variable declaration."
},
"Array Function": {
"prefix": ["array"],
"body": [
"array ${1:name}(${2:inputs})",
"\treturn [$0]",
"end"
],
"description": "Array function definition."
},
"Function Boolean": {
"prefix": ["bool"],
"body": [
"bool ${1:name}(${2:inputs})",
"\treturn $0",
"end"
],
"description": "Boolean function definition."
},
"Function Generic": {
"prefix": ["var"],
"body": [
"var ${1:name}(${2:inputs})",
"\treturn $0",
"end"
],
"description": "Generic function definition."
},
"Function Number": {
"prefix": ["number"],
"body": [
"number ${1:name}(${2:inputs})",
"\treturn $0",
"end"
],
"description": "Number function definition."
},
"Function String": {
"prefix": ["string"],
"body": [
"string ${1:name}(${2:inputs})",
"\treturn \"$0\"",
"end"
],
"description": "String function definition."
},
"Function Void": {
"prefix": ["void"],
"body": [
"void ${1:name}(${2:inputs})",
"\t$0",
"end"
],
"description": "Generic function definition."
},
"Conditional": {
"prefix": ["if"],
"body": [
"if $1",
"\t$3",
"else if $2",
"\t$4",
"else",
"\t$0",
"end"],
"description": "Conditional."
},
"Loop": {
"prefix": ["loop"],
"body": [
"loop",
"\t$0",
"end"
],
"description": "Loop forever."
},
"Loop over array": {
"prefix": ["loop"],
"body": [
"loop ${1:array}",
"\tvar element = @",
"\t$0",
"end"],
"description": "Loop over an array."
},
"Loop elements in array": {
"prefix": ["loop"],
"body": [
"loop ${1:element} in ${2:array}",
"\t$0",
"end"
],
"description": "Loop over elements in an array."
},
"Loop over range": {
"prefix": ["loop"],
"body": [
"loop from ${1:start} to ${2:finish}",
"\tnumber element = @",
"\t$0",
"end"
],
"description": "Loop over a range."
},
"Loop element in range": {
"prefix": ["loop"],
"body": [
"loop ${1:element} from ${2:start} to ${3:finish}",
"\t$0",
"end"
],
"description": "Loop over numbers in a range."
},
"Sebastian": {
"prefix": ["Sebastian", "sebastian"],
"body": ["Sebastian$0"],
"description": "Player character's name."
}
}
{ pkgs ? import <nixpkgs> {} }:
let
inherit (builtins)
attrValues
fetchGit;
in pkgs.mkShell {
nativeBuildInputs = (attrValues {
inherit (pkgs)
git
nodejs
vscodium
;
}) ++ [
pkgs.nodePackages.js-yaml
pkgs.nodePackages.yo
pkgs.nodePackages.generator-code
];
}
{
"name": "sprak-language-extension",
"displayName": "Sprak Language Extension",
"description": "Support for the Sprak programming language used in the game \"else Heart.Break()\".",
"version": "0.0.1",
"engines": {
"vscode": "^1.62.0"
},
"categories": [
"Programming Languages",
"Snippets"
],
"contributes": {
"languages": [
{
"id": "sprak",
"aliases": [
"Sprak",
"sprak"
],
"extensions": [
".sprak",
".Sprak",
".SPRAK"
],
"configuration": "./language-configuration.json"
}
],
"grammars": [
{
"language": "sprak",
"scopeName": "source.sprak",
"path": "./syntaxes/sprak.tmLanguage.json"
}
],
"snippets": [
{
"language": "sprak",
"path": "./snippets/snippets.code-snippets"
}
]
}
}
+
-
*
/
=
<
>
==
!=
>=
<=
and
anD
aNd
aND
And
AnD
AND
or
oR
Or
OR
&&
||
!
{
"comments": {
"lineComment": "#"
},
"brackets": [
["[", "]"],
["(", ")"]
],
"autoClosingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["\"", "\""],
["'", "'"],
{ "open": "'", "close": "'", "notIn": ["string", "comment"] },
{ "open": "\"", "close": "\"", "notIn": ["string"] },
{ "open": "`", "close": "`", "notIn": ["string", "comment"] }
],
"autoCloseBefore": ";:.,=}])>` \n\t",
"surroundingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
{ "open": "'", "close": "'", "notIn": ["string", "comment"] },
{ "open": "\"", "close": "\"", "notIn": ["string"] },
{ "open": "`", "close": "`", "notIn": ["string", "comment"] }
]
// "folding": {
// "markers": {
// "start": "^\\s*//\\s*#?region\\b",
// "end": "^\\s*//\\s*#?endregion\\b"
// }
// },
// "wordPattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)",
// "indentationRules": {
// "increaseIndentPattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$",
// "decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\}\\]].*$"
// }
}
Allow
Append
Blip
BootFromFloppy
Broadcast
ChangeBalance
CharToInt
Charisma
ClearData
ClearMemories
ClearText
Color
Connect
CopyToClipBoard
Corruption
Cos
Count
DisconnectAll
DisplayGraphics
Drink
Drunkenness
EnableAPI
EraseMemory
FastForward
FindPath
GetAction
GetAllRooms
GetBalanceForPerson
GetChannel
GetConnections
GetHour
GetIndexes
GetMemories
GetMinute
GetNumericData
GetPosition
GetPeople
GetRain
GetRoom
GetThingsInRoom
GetThingsOfType
GetTypeOfThing
GetUser
HD
HSVtoRGB
HasFloppy
HasFunction
HasIndex
HasMemory
Height
Info
Input
Int
InteractWith
IntToChar
IsKeyPressed
IsUser
Line
Lines
LoadData
LoadMemory
Lock
Log
Mod
Move
MovePerson
Name
OnHack
OnIntruder
Pitch
PlaySound
Position
PrintS
QuickBoost
Quit
RGBToHSV
Random
Range
Rect
RegisterSeller
RemoteFunctionCall
Remove
RemoveAll
Repeat
RestoreCode
Round
SaveData
SaveMemory
Say
SetChannel
SetMaxTime
SetMhz
SetNumericData
SetPosition
SetRain
Sin
Sleep
Sleepiness
Slurp
Smelliness
Speed
StringContains
Switch
TeleportSetWorldPosition
Text
Time
Toggle
Trippy
TurnLeft
TurnOff
TurnOffSound
TurnOn
TurnOnSound
TurnRight
Type
Unlock
Width
ZapPerson
ZapPersonGently
#!/usr/bin/env nix-shell
#!nix-shell -i bash
npx js-yaml syntaxes/sprak.YAML-tmLanguage > syntaxes/sprak.tmLanguage.json
npx vsce package
# Sprak Language Extension for Codium
Adds support for the Sprak programming language used in the game "else Heart.Break()".
## Features
* Syntax highlighting.
* Code snippets.
## Building
* Dependencies:
* `nix`
* To build:
```shell
sh build.sh
```
### License
This software is distributed and licensed under the terms of the [Blue Oak Model License 1.0.0](https://web.archive.org/web/20190309191626/https://blueoakcouncil.org/license/1.0.0).
# Blue Oak Model License
Version 1.0.0
## Purpose
This license gives everyone as much permission to work with
this software as possible, while protecting contributors
from liability.
## Acceptance
In order to receive this license, you must agree to its
rules. The rules of this license are both obligations
under that agreement and conditions to your license.
You must not do anything with this software that triggers
a rule that you cannot or will not follow.
## Copyright
Each contributor licenses you to do everything with this
software that would otherwise infringe that contributor's
copyright in it.
## Notices
You must ensure that everyone who gets a copy of
any part of this software from you, with or without
changes, also gets the text of this license or a link to
<https://blueoakcouncil.org/license/1.0.0>.
## Excuse
If anyone notifies you in writing that you have not
complied with [Notices](#notices), you can keep your
license by taking all practical steps to comply within 30
days after the notice. If you do not do so, your license
ends immediately.
## Patent
Each contributor licenses you to do everything with this
software that would otherwise infringe any patent claims
they can license or become able to license.
## Reliability
No contributor can revoke this license.
## No Liability
***As far as the law allows, this software comes as is,
without any warranty or condition, and no contributor
will be liable to anyone for any damages related to this
software or this license, under any kind of legal claim.***
# Change Log
All notable changes to the "sprak-language-extension" extension will be documented in this file.
Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
## [Unreleased]
- Initial release
.vscode/**
.vscode-test/**
.gitignore
vsc-extension-quickstart.md
// A launch configuration that launches the extension inside a new window
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{
"version": "0.2.0",
"configurations": [
{
"name": "Extension",
"type": "extensionHost",
"request": "launch",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}"
]
}
]
}
.git
.DS_Store