From 632bcdc1adc340c4813b53289405e3d632224ed9 Mon Sep 17 00:00:00 2001 From: Mahmoud Samir Fayed Date: Sat, 24 Jun 2017 18:22:01 +0300 Subject: [PATCH] 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 --- .gitmodules | 3 + grammars.yml | 2 + lib/linguist/languages.yml | 8 + samples/Ring/hello.ring | 335 ++++++++++++++++++++++ samples/Ring/natural.ring | 44 +++ samples/Ring/weblib.ring | 48 ++++ samples/Ring/weighthistory.ring | 174 +++++++++++ vendor/grammars/language-ring | 1 + vendor/licenses/grammar/language-ring.txt | 26 ++ 9 files changed, 641 insertions(+) create mode 100644 samples/Ring/hello.ring create mode 100644 samples/Ring/natural.ring create mode 100644 samples/Ring/weblib.ring create mode 100644 samples/Ring/weighthistory.ring create mode 160000 vendor/grammars/language-ring create mode 100644 vendor/licenses/grammar/language-ring.txt diff --git a/.gitmodules b/.gitmodules index b719135f..1b14be30 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 diff --git a/grammars.yml b/grammars.yml index 095a8510..f31a77be 100755 --- a/grammars.yml +++ b/grammars.yml @@ -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 diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index a7e712f7..ab42d92f 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -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: diff --git a/samples/Ring/hello.ring b/samples/Ring/hello.ring new file mode 100644 index 00000000..5ab5e66e --- /dev/null +++ b/samples/Ring/hello.ring @@ -0,0 +1,335 @@ +# The Ring Standard Library +# Game Engine for 2D Games +# Flappy Bird 3000 Game +# 2016, Mahmoud Fayed + +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 diff --git a/samples/Ring/natural.ring b/samples/Ring/natural.ring new file mode 100644 index 00000000..cfcdfeae --- /dev/null +++ b/samples/Ring/natural.ring @@ -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 diff --git a/samples/Ring/weblib.ring b/samples/Ring/weblib.ring new file mode 100644 index 00000000..9e52e2bf --- /dev/null +++ b/samples/Ring/weblib.ring @@ -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!" diff --git a/samples/Ring/weighthistory.ring b/samples/Ring/weighthistory.ring new file mode 100644 index 00000000..14454e55 --- /dev/null +++ b/samples/Ring/weighthistory.ring @@ -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 diff --git a/vendor/grammars/language-ring b/vendor/grammars/language-ring new file mode 160000 index 00000000..45f3bb0a --- /dev/null +++ b/vendor/grammars/language-ring @@ -0,0 +1 @@ +Subproject commit 45f3bb0af7ce72b21cc5545673878255d720ab6c diff --git a/vendor/licenses/grammar/language-ring.txt b/vendor/licenses/grammar/language-ring.txt new file mode 100644 index 00000000..e7cd9ab3 --- /dev/null +++ b/vendor/licenses/grammar/language-ring.txt @@ -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.