mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-28 17:20:22 +00:00
Added Ring Language Support (#3662)
* update .gitmodules * Update grammars.yml * Create hello.ring * Create Natural.ring * Create weblib.ring * vendor/grammars/language-ring * fix order in grammars.yml * remove two files from samples * delete hello.ring * Update languages.yml - add the R * Create hello.ring * Create natural.ring * Create weblib.ring * Create grammars.yml * Create .gitmodules * Create languages.yml * Create languages.yml * Create language-ring.txt * Update .gitmodules Prefer HTTPS links. * Update hello.ring Sample file from "real" applications (under permissive license) to train the Bayesian classifier. * Update languages.yml * Update weblib.ring Reduce the file size * Update .gitmodules * Update .gitmodules * Update .gitmodules * Update .gitmodules * Update submodule : language-ring * Update weblib.ring Sample : Using the web library. * Create weighthistory Add Sample * Rename weighthistory to weighthistory.ring * Update weblib.ring
This commit is contained in:
committed by
Colin Seymour
parent
6b221172c0
commit
632bcdc1ad
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -854,6 +854,9 @@
|
||||
[submodule "vendor/grammars/language-webassembly"]
|
||||
path = vendor/grammars/language-webassembly
|
||||
url = https://github.com/Alhadis/language-webassembly
|
||||
[submodule "vendor/grammars/language-ring"]
|
||||
path = vendor/grammars/language-ring
|
||||
url = https://github.com/MahmoudFayed/atom-language-ring
|
||||
[submodule "vendor/grammars/sublime-fantom"]
|
||||
path = vendor/grammars/sublime-fantom
|
||||
url = https://github.com/rkoeninger/sublime-fantom
|
||||
|
||||
@@ -436,6 +436,8 @@ vendor/grammars/language-renpy:
|
||||
- source.renpy
|
||||
vendor/grammars/language-restructuredtext:
|
||||
- text.restructuredtext
|
||||
vendor/grammars/language-ring:
|
||||
- source.ring
|
||||
vendor/grammars/language-roff:
|
||||
- source.ditroff
|
||||
- source.ditroff.desc
|
||||
|
||||
@@ -3736,6 +3736,14 @@ RenderScript:
|
||||
tm_scope: none
|
||||
ace_mode: text
|
||||
language_id: 323
|
||||
Ring:
|
||||
type: programming
|
||||
color: "#0e60e3"
|
||||
extensions:
|
||||
- .ring
|
||||
tm_scope: source.ring
|
||||
ace_mode: text
|
||||
language_id: 431
|
||||
RobotFramework:
|
||||
type: programming
|
||||
extensions:
|
||||
|
||||
335
samples/Ring/hello.ring
Normal file
335
samples/Ring/hello.ring
Normal file
@@ -0,0 +1,335 @@
|
||||
# The Ring Standard Library
|
||||
# Game Engine for 2D Games
|
||||
# Flappy Bird 3000 Game
|
||||
# 2016, Mahmoud Fayed <msfclipper@yahoo.com>
|
||||
|
||||
oGameState = NULL
|
||||
|
||||
Load "gameengine.ring"
|
||||
|
||||
func main
|
||||
|
||||
oGame = New Game
|
||||
|
||||
while true
|
||||
|
||||
oGameState = New GameState
|
||||
|
||||
oGame {
|
||||
title = "Flappy Bird 3000"
|
||||
sprite
|
||||
{
|
||||
file = "images/fbback.png"
|
||||
x = 0 y=0 width=800 height = 600 scaled = true animate = false
|
||||
keypress = func ogame,oself,nKey {
|
||||
if nkey = key_esc or nKey = GE_AC_BACK
|
||||
ogame.shutdown()
|
||||
but nKey = key_space
|
||||
oGameState.startplay=true
|
||||
ogame.shutdown=true
|
||||
ok
|
||||
}
|
||||
mouse = func ogame,oself,nType,aMouseList {
|
||||
if nType = GE_MOUSE_UP
|
||||
call oself.keypress(oGame,oSelf,Key_Space)
|
||||
ok
|
||||
}
|
||||
}
|
||||
text {
|
||||
animate = false
|
||||
size = 35
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "Flappy Bird 3000"
|
||||
x = 150 y=50
|
||||
}
|
||||
text {
|
||||
animate = false
|
||||
size = 25
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "Version 1.0"
|
||||
x = 280 y=100
|
||||
}
|
||||
text {
|
||||
animate = false
|
||||
size = 16
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "(C) 2016, Mahmoud Fayed"
|
||||
x = 245 y=140
|
||||
}
|
||||
|
||||
text {
|
||||
animate = false
|
||||
size = 25
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "To Win Get Score = 3000"
|
||||
x = 150 y=270
|
||||
}
|
||||
|
||||
text {
|
||||
animate = false
|
||||
size = 25
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "Press Space to start"
|
||||
x = 190 y=470
|
||||
}
|
||||
text {
|
||||
animate = false
|
||||
size = 20
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "Press Esc to Exit"
|
||||
x = 260 y=510
|
||||
}
|
||||
|
||||
animate {
|
||||
file = "images/fbbird.png"
|
||||
x = 200
|
||||
y = 200
|
||||
framewidth = 20
|
||||
scaled = true
|
||||
height = 50
|
||||
width = 50
|
||||
nStep = 3
|
||||
transparent = true
|
||||
animate = true
|
||||
direction = ge_direction_random
|
||||
state = func oGame,oSelf {
|
||||
oSelf {
|
||||
nStep--
|
||||
if nStep = 0
|
||||
nStep = 3
|
||||
if frame < 3
|
||||
frame++
|
||||
else
|
||||
frame=1
|
||||
ok
|
||||
ok
|
||||
if x <= 0 x=0 ok
|
||||
if y <= 0 y=0 ok
|
||||
if x >= 750 x= 750 ok
|
||||
if y > 550 y=550 ok
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Sound {
|
||||
file = "sound/music2.wav"
|
||||
}
|
||||
}
|
||||
if oGameState.startplay
|
||||
oGame.refresh()
|
||||
playstart(oGame)
|
||||
oGame.refresh()
|
||||
ok
|
||||
|
||||
end
|
||||
|
||||
|
||||
func playstart oGame
|
||||
|
||||
oGame {
|
||||
FPS = 60
|
||||
FixedFPS = 120
|
||||
Title = "Flappy Bird 3000"
|
||||
Sprite {
|
||||
file = "images/fbback.png"
|
||||
x = 0 y=0 width=800 height = 600 scaled = true animate = false
|
||||
keypress = func ogame,oself,nKey {
|
||||
if nkey = key_esc or nKey = GE_AC_BACK
|
||||
ogame.shutdown()
|
||||
ok
|
||||
}
|
||||
}
|
||||
|
||||
Map {
|
||||
blockwidth = 80
|
||||
blockheight = 80
|
||||
aMap = [
|
||||
[0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],
|
||||
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],
|
||||
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0],
|
||||
[0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0],
|
||||
[0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0],
|
||||
[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
|
||||
[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
|
||||
[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
|
||||
]
|
||||
newmap(aMap)
|
||||
aImages = ["images/fbwall.png","images/fbwallup.png",
|
||||
"images/fbwalldown.png"]
|
||||
state = func oGame,oSelf {
|
||||
if oGameState.gameresult = false
|
||||
px = oGame.aObjects[3].x
|
||||
py = oGame.aObjects[3].y
|
||||
oSelf {
|
||||
x -= 3
|
||||
if x < - 2100
|
||||
x = 0
|
||||
newmap(aMap)
|
||||
ok
|
||||
nCol = getcol(px,0)
|
||||
if nCol=11 or nCol=15 or nCol=19 or nCol=23 or nCol=27
|
||||
if nCol != oGameState.lastcol
|
||||
oGameState.lastcol = nCol
|
||||
oGameState.Score += 100
|
||||
oGame { Sound {
|
||||
once = true
|
||||
file = "sound/sfx_point.wav"
|
||||
} }
|
||||
checkwin(oGame)
|
||||
ok
|
||||
ok
|
||||
}
|
||||
if oSelf.getvalue(px+40,py) != 0 or
|
||||
oSelf.getvalue(px+40,py+40) != 0 or
|
||||
oSelf.getvalue(px,py) != 0 or
|
||||
oSelf.getvalue(px,py+40) != 0
|
||||
oGameState.gameresult = true
|
||||
oGame {
|
||||
text {
|
||||
point = 550
|
||||
size = 30
|
||||
nStep = 3
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "Game Over !!!"
|
||||
x = 500 y=10
|
||||
state = func ogame,oself {
|
||||
if oself.y >= 550
|
||||
ogame.shutdown = true
|
||||
ok
|
||||
if oself.y = 90
|
||||
ogame {
|
||||
Sound {
|
||||
once = true
|
||||
file = "sound/sfx_die.wav"
|
||||
}
|
||||
}
|
||||
ok
|
||||
}
|
||||
}
|
||||
Sound {
|
||||
once = true
|
||||
file = "sound/sfx_hit.wav"
|
||||
}
|
||||
}
|
||||
ok
|
||||
ok
|
||||
}
|
||||
}
|
||||
|
||||
animate {
|
||||
file = "images/fbbird.png"
|
||||
x = 10
|
||||
y = 10
|
||||
framewidth = 20
|
||||
scaled = true
|
||||
height = 50
|
||||
width = 50
|
||||
nStep = 3
|
||||
transparent = true
|
||||
state = func oGame,oSelf {
|
||||
oSelf {
|
||||
nStep--
|
||||
if nStep = 0
|
||||
nStep = 3
|
||||
if frame < 3
|
||||
frame++
|
||||
else
|
||||
frame=1
|
||||
ok
|
||||
ok
|
||||
}
|
||||
|
||||
if not oGameState.playerwin
|
||||
oGameState.down --
|
||||
if oGameState.down = 0
|
||||
oGameState.down = 3
|
||||
oself {
|
||||
y += 25
|
||||
if y > 550 y=550 ok
|
||||
}
|
||||
ok
|
||||
ok
|
||||
|
||||
}
|
||||
keypress = func ogame,oself,nKey {
|
||||
if oGameState.gameresult = false
|
||||
oself {
|
||||
if nkey = key_space
|
||||
y -= 55
|
||||
oGameState.down = 60
|
||||
if y<=0 y=0 ok
|
||||
ok
|
||||
}
|
||||
ok
|
||||
}
|
||||
mouse = func ogame,oself,nType,aMouseList {
|
||||
if nType = GE_MOUSE_UP
|
||||
call oself.keypress(oGame,oSelf,Key_Space)
|
||||
ok
|
||||
}
|
||||
}
|
||||
|
||||
text {
|
||||
animate = false
|
||||
point = 400
|
||||
size = 30
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "Score : " + oGameState.score
|
||||
x = 500 y=10
|
||||
state = func oGame,oSelf {
|
||||
oSelf { text = "Score : " + oGameState.score }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func newmap aMap
|
||||
aV = [
|
||||
[1,1,3,0,0,2,1,1],
|
||||
[1,3,0,0,0,2,1,1],
|
||||
[1,1,1,3,0,2,1,1],
|
||||
[1,1,1,3,0,0,0,0],
|
||||
[0,0,0,0,2,1,1,1],
|
||||
[0,0,2,1,1,1,1,1],
|
||||
[0,0,0,2,1,1,1,1],
|
||||
[1,1,1,3,0,2,1,1],
|
||||
[1,1,1,1,1,3,0,0],
|
||||
[3,0,0,2,1,1,1,1],
|
||||
[3,0,0,2,3,0,0,2]
|
||||
]
|
||||
for x = 10 to 24 step 4
|
||||
aVar = aV[ (random(10)+1) ]
|
||||
for y = 1 to 8
|
||||
aMap[y][x] = aVar[y]
|
||||
next
|
||||
next
|
||||
|
||||
func checkwin ogame
|
||||
if oGameState.score = 3000
|
||||
oGameState.gameresult = true
|
||||
oGameState.playerwin = true
|
||||
oGame {
|
||||
text {
|
||||
point = 400
|
||||
size = 30
|
||||
nStep = 3
|
||||
file = "fonts/pirulen.ttf"
|
||||
text = "You Win !!!"
|
||||
x = 500 y=10
|
||||
state = func ogame,oself {
|
||||
if oself.y >= 400
|
||||
ogame.shutdown = true
|
||||
oGameState.Score = 0
|
||||
ok
|
||||
}
|
||||
}
|
||||
}
|
||||
ok
|
||||
|
||||
Class GameState
|
||||
down = 3
|
||||
gameresult = false
|
||||
Score = 0
|
||||
startplay=false
|
||||
lastcol = 0
|
||||
playerwin = false
|
||||
44
samples/Ring/natural.ring
Normal file
44
samples/Ring/natural.ring
Normal file
@@ -0,0 +1,44 @@
|
||||
New App
|
||||
{
|
||||
I want window
|
||||
The window title = "hello world"
|
||||
}
|
||||
|
||||
Class App
|
||||
|
||||
func geti
|
||||
if nIwantwindow = 0
|
||||
nIwantwindow++
|
||||
ok
|
||||
|
||||
func getwant
|
||||
if nIwantwindow = 1
|
||||
nIwantwindow++
|
||||
ok
|
||||
|
||||
func getwindow
|
||||
if nIwantwindow = 2
|
||||
nIwantwindow= 0
|
||||
see "Instruction : I want window" + nl
|
||||
ok
|
||||
if nWindowTitle = 0
|
||||
nWindowTitle++
|
||||
ok
|
||||
|
||||
func settitle cValue
|
||||
if nWindowTitle = 1
|
||||
nWindowTitle=0
|
||||
see "Instruction : Window Title = " + cValue + nl
|
||||
ok
|
||||
|
||||
private
|
||||
|
||||
# Attributes for the instruction I want window
|
||||
i want window
|
||||
nIwantwindow = 0
|
||||
# Attributes for the instruction Window title
|
||||
# Here we don't define the window attribute again
|
||||
title
|
||||
nWindowTitle = 0
|
||||
# Keywords to ignore, just give them any value
|
||||
the=0
|
||||
48
samples/Ring/weblib.ring
Normal file
48
samples/Ring/weblib.ring
Normal file
@@ -0,0 +1,48 @@
|
||||
# Sample : Using the Web Library
|
||||
|
||||
Load "weblib.ring"
|
||||
Load "datalib.ring"
|
||||
Import System.Web
|
||||
|
||||
website = "ex24.ring"
|
||||
|
||||
New SalaryController { Routing() }
|
||||
|
||||
Class SalaryModel from ModelBase
|
||||
|
||||
Class SalaryController From ControllerBase
|
||||
|
||||
Class SalaryView From ViewBase
|
||||
|
||||
oLanguage = new SalaryLanguageEnglish
|
||||
|
||||
Func AddFuncScript oPage,oController
|
||||
return oPage.scriptfuncajax("myadd",oController.cMainURL+
|
||||
oController.cOperation+"=add","mysubpage")
|
||||
|
||||
Func FormViewContent oController,oTranslation,oPage
|
||||
return [
|
||||
[ oTranslation.aColumnsTitles[2], "textbox", "name",
|
||||
oController.oModel.Name, oPage.stylewidth("100%") ],
|
||||
[ oTranslation.aColumnsTitles[3], "textbox", "salary",
|
||||
oController.oModel.Salary, oPage.stylewidth("50%") ]
|
||||
]
|
||||
|
||||
Class SalaryLanguageEnglish
|
||||
cTitle = "Salary Table"
|
||||
cBack = "back"
|
||||
aColumnsTitles = ["ID","Name","Salary"]
|
||||
cOptions = "Options"
|
||||
cSearch = "Search"
|
||||
comboitems = ["Select Option...","Edit","Delete"]
|
||||
cAddRecord = "Add Record"
|
||||
cEditRecord = "Edit Record"
|
||||
cRecordDeleted = "Record Deleted!"
|
||||
aMovePages = ["First","Prev","Next","Last"]
|
||||
cPage = "Page"
|
||||
cOf = "of"
|
||||
cRecordsCount = "Records Count"
|
||||
cSave = "Save"
|
||||
temp = new page
|
||||
cTextAlign = temp.StyleTextRight()
|
||||
cNoRecords = "No records!"
|
||||
174
samples/Ring/weighthistory.ring
Normal file
174
samples/Ring/weighthistory.ring
Normal file
@@ -0,0 +1,174 @@
|
||||
Load "guilib.ring"
|
||||
|
||||
MyApp = new qApp
|
||||
{
|
||||
$ApplicationObject = "oApp" # To be used when calling events
|
||||
oApp = new App
|
||||
exec()
|
||||
oApp.CloseDatabase()
|
||||
}
|
||||
|
||||
class App
|
||||
|
||||
cDir = currentdir() + "/"
|
||||
oCon
|
||||
aIDs = []
|
||||
|
||||
win1 = new qWidget()
|
||||
{
|
||||
setWindowTitle("Weight History")
|
||||
resize(600,600)
|
||||
layoutButtons = new qhboxlayout()
|
||||
{
|
||||
label1 = new qLabel(win1) { setText("Weight") }
|
||||
text1 = new qlineedit(win1)
|
||||
btnAdd = new qpushbutton(win1) {
|
||||
setText("Add")
|
||||
setClickEvent($ApplicationObject+".AddWeight()")
|
||||
}
|
||||
btnDelete = new qpushbutton(win1) {
|
||||
setText("Delete")
|
||||
setClickEvent($ApplicationObject+".Deleteweight()")
|
||||
}
|
||||
addwidget(label1)
|
||||
addwidget(text1)
|
||||
addwidget(btnAdd)
|
||||
addwidget(btnDelete)
|
||||
}
|
||||
layoutData = new qhboxlayout()
|
||||
{
|
||||
Table1 = new qTableWidget(win1) {
|
||||
setrowcount(0)
|
||||
setcolumncount(3)
|
||||
setselectionbehavior(QAbstractItemView_SelectRows)
|
||||
setHorizontalHeaderItem(0, new QTableWidgetItem("Date"))
|
||||
setHorizontalHeaderItem(1, new QTableWidgetItem("Time"))
|
||||
setHorizontalHeaderItem(2, new QTableWidgetItem("Weight"))
|
||||
setitemChangedEvent($ApplicationObject+".ItemChanged()")
|
||||
setAlternatingRowColors(true)
|
||||
horizontalHeader().setStyleSheet("color: blue")
|
||||
verticalHeader().setStyleSheet("color: red")
|
||||
}
|
||||
addWidget(Table1)
|
||||
}
|
||||
layoutClose = new qhboxlayout()
|
||||
{
|
||||
btnclose = new qpushbutton(win1) {
|
||||
setText("Close")
|
||||
setClickEvent("MyApp.Quit()")
|
||||
}
|
||||
addwidget(btnClose)
|
||||
}
|
||||
layoutMain = new qvboxlayout()
|
||||
{
|
||||
addlayout(layoutButtons)
|
||||
addLayout(LayoutData)
|
||||
addLayout(layoutClose)
|
||||
}
|
||||
setlayout(layoutMain)
|
||||
self.OpenDatabase()
|
||||
self.ShowRecords()
|
||||
show()
|
||||
}
|
||||
|
||||
Func OpenDatabase
|
||||
lCreate = False
|
||||
if not fexists(cDir + "weighthistory.db")
|
||||
lCreate = True
|
||||
ok
|
||||
new QSqlDatabase() {
|
||||
this.oCon = addDatabase("QSQLITE") {
|
||||
setDatabaseName("weighthistory.db")
|
||||
Open()
|
||||
}
|
||||
}
|
||||
if lCreate
|
||||
new QSqlQuery( ) {
|
||||
exec("create table weighthistory (id integer primary key,"+
|
||||
" f_date varchar(10),"+
|
||||
" f_time varchar(8), f_weight varchar(8) );")
|
||||
delete()
|
||||
}
|
||||
ok
|
||||
|
||||
|
||||
Func CloseDatabase
|
||||
oCon.Close()
|
||||
|
||||
Func AddWeight
|
||||
cWeight = text1.text()
|
||||
AddRecord(cWeight)
|
||||
|
||||
Func DeleteWeight
|
||||
Table1 {
|
||||
nRow = CurrentRow()
|
||||
if nRow >= 0
|
||||
nID = this.aIDs[nROW+1]
|
||||
new QSqlQuery( ) {
|
||||
exec("delete from weighthistory where id = " + nID )
|
||||
}
|
||||
Del(this.aIDs,nRow+1)
|
||||
removerow(nRow)
|
||||
selectrow(nRow)
|
||||
ok
|
||||
}
|
||||
|
||||
|
||||
Func AddRecord cWeight
|
||||
new QSqlQuery( ) {
|
||||
cStr = "insert into weighthistory (f_date,f_time,f_weight) values"+
|
||||
" ('%f1','%f2','%f3')"
|
||||
cDate = Date()
|
||||
cTime = Time()
|
||||
cStr = substr(cStr,"%f1",cDate)
|
||||
cStr = substr(cStr,"%f2",cTime)
|
||||
cStr = substr(cStr,"%f3",cWeight)
|
||||
exec(cStr)
|
||||
delete()
|
||||
}
|
||||
ShowRecords()
|
||||
Table1.selectrow(table1.rowcount()-1)
|
||||
|
||||
|
||||
Func ShowRecords
|
||||
table1.setitemChangedEvent("")
|
||||
aIDs = []
|
||||
query = new QSqlQuery() {
|
||||
exec("select * from weighthistory")
|
||||
nRows = 0
|
||||
this.Table1.setrowcount(0)
|
||||
while movenext()
|
||||
this.table1 {
|
||||
insertRow(nRows)
|
||||
this.aIDs + query.value(0).tostring()
|
||||
for x = 1 to 3
|
||||
cStr = query.value(x).tostring()
|
||||
item = new qTableWidgetItem(cStr)
|
||||
setItem(nRows,x-1,item)
|
||||
next
|
||||
}
|
||||
nRows++
|
||||
end
|
||||
delete()
|
||||
}
|
||||
table1.setitemChangedEvent($ApplicationObject+".ItemChanged()")
|
||||
|
||||
Func ItemChanged
|
||||
nRow = table1.currentrow()
|
||||
if nRow >= 0
|
||||
myitem = Table1.item(table1.currentrow(),0)
|
||||
cDate = myitem.text()
|
||||
myitem = Table1.item(table1.currentrow(),1)
|
||||
cTime = myitem.text()
|
||||
myitem = Table1.item(table1.currentrow(),2)
|
||||
cWeight = myitem.text()
|
||||
new QSqlQuery( ) {
|
||||
cStr = "update weighthistory set f_date ='%f1' , f_time = '%f2' , "+
|
||||
"f_weight ='%f3' where id = " + this.aIDs[nROW+1]
|
||||
cStr = substr(cStr,"%f1",cDate)
|
||||
cStr = substr(cStr,"%f2",cTime)
|
||||
cStr = substr(cStr,"%f3",cWeight)
|
||||
exec(cStr)
|
||||
delete()
|
||||
}
|
||||
ok
|
||||
1
vendor/grammars/language-ring
vendored
Submodule
1
vendor/grammars/language-ring
vendored
Submodule
Submodule vendor/grammars/language-ring added at 45f3bb0af7
26
vendor/licenses/grammar/language-ring.txt
vendored
Normal file
26
vendor/licenses/grammar/language-ring.txt
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
type: grammar
|
||||
name: language-ring
|
||||
license: mit
|
||||
---
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016-2017 Mahmoud Fayed
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
Reference in New Issue
Block a user