摘要:方法回調(diào)函數(shù),該回調(diào)函數(shù)會在命令準(zhǔn)備好執(zhí)行時(shí)返回,在命令未完整時(shí)返回。方法回調(diào)函數(shù),事件被觸發(fā)時(shí)將會被調(diào)用。超時(shí)如果在實(shí)例化時(shí)選擇了,當(dāng)正在運(yùn)行的程序在限定時(shí)間內(nèi)未調(diào)用指定的回調(diào)函數(shù)見實(shí)例化,那么將會觸發(fā)此事件。
一個(gè)兼容多種語言的瀏覽器 REPL 沙盒。
當(dāng)前支持的語言Javascript 系列
Javascript
CoffeeScript
Kaffeine
Move
Traceur (JavaScript.next)
Esoteric
Bloop
Brainfuck
LOLCODE
Unlambda
Emoticon
Classic
Quick Basic
Forth
Serious
Scheme
Lua
Python
Ruby (beta)
支持的瀏覽器
IE 9-10
Chrome 10+
Safari 5
Firefox 3.6+
Opera 11+
iOS 5 Safari
開始 建立 JSREPL 建立依賴curl http://npmjs.org/install.sh | sh
使用 npm 安裝:sudo npm install -g coffee-script
獲取源碼git clone git://github.com/replit/jsrepl.git
git submodule update --init --recursive
進(jìn)行 Bake 操作cake bake
引入 JSREPLhtml實(shí)例化 JSREPL
javascriptvar jsrepl = new JSREPL({ input: inputCallback, output: outputCallback, result: resultCallback, error: errorCallback, progress: progressCallback, timeout: { time: 30000, callback: timeoutCallback } });
inputCallback:一個(gè)回調(diào)函數(shù),當(dāng)語言解釋器在請求用戶輸入時(shí)會被調(diào)用。
outputCallback:一個(gè)可選的回調(diào)函數(shù),當(dāng)引擎需要將輸出發(fā)送到標(biāo)準(zhǔn)輸出時(shí)會被調(diào)用。
resultCallback:一個(gè)可選的回調(diào)函數(shù), 當(dāng)解釋器成功地執(zhí)行(evaluated)一條程序并產(chǎn)生結(jié)果時(shí)會被調(diào)用。
errorCallback:一個(gè)可選的函數(shù),如果一條程序在被執(zhí)行(evaluated)的過程中產(chǎn)生錯(cuò)誤時(shí)會被調(diào)用。
progress:一個(gè)可選的函數(shù),當(dāng)加載一種語言時(shí)會被不斷調(diào)用,用來顯示進(jìn)度條百分值。
timeout:為程序運(yùn)行設(shè)置一個(gè)超時(shí)值。
time:等待時(shí)間(毫秒)。
callback:超時(shí)后會調(diào)用的回調(diào)函數(shù)。這個(gè)回調(diào)必須處理垃圾回收系統(tǒng)(比如說調(diào)用 jsrepl.loadLanguage 之類的)。必須返回 true 以停止超時(shí)的重復(fù)觸發(fā)。
API JSREPL::loadLanguage它會加載一個(gè)語言解釋器,并帶有三個(gè)參數(shù):
* 字符串 lang_name:需要加載的語言名。
* 方法 callback:回調(diào)函數(shù),當(dāng)語言成功加載后會被調(diào)用。
* 布爾值 worker_friendly (可選):JSREPL 默認(rèn)會嘗試加載一個(gè)解釋器到 Web Workers,這個(gè)參數(shù)會決定解釋器是加載到 Worker(true) 還是加載到一個(gè) iframe(false)。
例子:
coffeescript jsrepl.loadLanguage("python", function () { alert("Python loaded"); });JSREPL::eval
在當(dāng)前已加載的解釋器中執(zhí)行一條程序。帶有一個(gè)參數(shù):
字符串 command:需要執(zhí)行的程序字符串。
例子:
javascript jsrepl.eval("1+1");JSREPL::getLangConfig
返回該語言相應(yīng)的配置對象。帶有一個(gè)參數(shù):
字符串 lang_name:需要返回配置對象的語言。默認(rèn)為當(dāng)前語言名。
JSREPL::checkLineEnd給定一條命令,決定是否準(zhǔn)備好執(zhí)行。因?yàn)橛行┣闆r是會導(dǎo)致暫時(shí)不準(zhǔn)備執(zhí)行的,比如缺少右括號。
字符串 command:字符串,一條程序。
方法 callback:回調(diào)函數(shù),該回調(diào)函數(shù)會在命令(command)準(zhǔn)備好執(zhí)行時(shí)返回 true,在命令未完整時(shí)返回 false。
JSREPL::on向一個(gè)或多個(gè)事件綁定一個(gè)監(jiān)聽器。帶有兩個(gè)參數(shù):
字符串 | 數(shù)組 event_type:事件類型,表示需要監(jiān)聽的事件。
方法 callback:回調(diào)函數(shù),事件被觸發(fā)時(shí)將會被調(diào)用。調(diào)用時(shí)會帶有事件提供的若干個(gè)參數(shù)。
JSREPL::off解除某事件的一個(gè)或全部的監(jiān)聽器的綁定。帶有兩個(gè)參數(shù):
字符串 | 數(shù)組 event_type:事件類型,表示需要解綁方法的事件。
方法 callback:回調(diào)函數(shù),提供需要解綁的方法。如果不提供將會解除所有方法。
JSREPL::once向一個(gè)或多個(gè)事件綁定一個(gè)只執(zhí)行一次的監(jiān)聽器。帶有兩個(gè)參數(shù):
字符串 | 數(shù)組 event_type:事件類型,表示需要監(jiān)聽的事件。
方法 callback:回調(diào)函數(shù),事件被觸發(fā)時(shí)將會被調(diào)用。調(diào)用時(shí)會帶有事件提供的若干個(gè)參數(shù)。
事件 input (輸入)當(dāng)當(dāng)前的語言解釋器請求輸入時(shí)會被觸發(fā)。參數(shù):
方法 callback:回調(diào)函數(shù),程序會連續(xù)執(zhí)行這個(gè)回調(diào)函數(shù)。調(diào)用時(shí)必須帶有用戶輸入的字符串。注意,這個(gè)回調(diào)函數(shù)只能被一個(gè)監(jiān)聽器調(diào)用。
output (輸出)當(dāng)前的語言解釋器每次向標(biāo)準(zhǔn)輸出進(jìn)行輸出時(shí)都會被觸發(fā)。參數(shù):
字符串 data:數(shù)據(jù),即輸出的字符串。
result (返回)當(dāng)語言解釋器有最終返回值時(shí)會被觸發(fā)。參數(shù):
字符串 data:數(shù)據(jù),字符串的形式的最終返回值。
progress (進(jìn)度)當(dāng) JSREPL 在加載語言解釋器時(shí)的進(jìn)度百分比有變化時(shí)會被觸發(fā),用于報(bào)告進(jìn)度。參數(shù):
浮點(diǎn)型 percentage:百分比,表示加載了多少文件。
timeout (超時(shí))如果 JSREPL 在實(shí)例化時(shí)選擇了 timeout ,當(dāng)正在運(yùn)行的程序在限定時(shí)間內(nèi)未調(diào)用指定的回調(diào)函數(shù)(見 實(shí)例化 JSREPL),那么將會觸發(fā)此事件。
ready (已準(zhǔn)備好)當(dāng)語言已經(jīng)被加載完成并準(zhǔn)備執(zhí)行時(shí),將會觸發(fā)此事件。
一些標(biāo)準(zhǔn)輸入的 hack 問題編譯時(shí)使用 Emscripten 的語言解釋器期望輸入的是一個(gè)阻塞式的調(diào)用(同步),要使之變成阻塞式調(diào)用的唯一方法是在瀏覽器里用 window.prompt 提示。雖然不理想,但它是可行的。然而,這種方法將會使我們失去在 Web Workers 中加載解釋器的能力(因?yàn)?Workers 沒有使用對話框)。
在 Workers 中加載解釋器會有很多好處,包括當(dāng)解釋器初始化或工作時(shí)不阻塞主 UI 線程,以及擁有捕獲無限循環(huán)的能力(見 timeout 事件)。盡管有這些優(yōu)勢,但為了能夠輸入,直到目前為止我們依然避免使用 Workers。所以我們加載阻塞式調(diào)用時(shí)應(yīng)該使用 iframe 而不是 Worker。不過,在當(dāng)前 Firefox 和 Chrome 的版本中打破了我們這個(gè)方法,因?yàn)槲覀冊僖膊荒茏鐾降亩M(jìn)制 XHR 操作了(比如去讀取庫文件)。
解決方案 Webkit 瀏覽器在基于 Webkit 的瀏覽器中,我們可以利用非標(biāo)準(zhǔn)的 Web SQL 數(shù)據(jù)庫在主線程和 worker 線程之間共享資源。例如它們提供的同步機(jī)制,使它可以訪問主頁面線程和 Worker(見 repl.coffee 和 sandbox.js)。
Firefox遺憾,我們不能在 Firefox 進(jìn)行同樣的處理,因?yàn)樗鼪]有實(shí)現(xiàn) Web SQL,而且仍然不支持標(biāo)準(zhǔn)的瀏覽器端數(shù)據(jù)庫(IndexedDB)同步 API。相反,我們可以使用 XHR 在 Worker 和主線程之間進(jìn)行同步通訊,而我們的服務(wù)器就是天然的代理。這里有一個(gè)樣例服務(wù)器安裝在 repl.it static server 。
許可jsREPL 在 MIT 許可下使用。jsREPL 的開發(fā)者對語言解釋器和修改過的 jsREPL 版本擁有自己的許可證,可以在它們的 extern/{語言名} 文件夾或子模塊下找到。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/85441.html
摘要:你可以指定導(dǎo)航欄文件名的內(nèi)容可以是這樣中文當(dāng)然也支持二級列表,將生成一個(gè)下拉列表中文為什么是而不用想要實(shí)現(xiàn)的是用最簡單的方式動(dòng)態(tài)渲染內(nèi)容。 showImg(https://segmentfault.com/img/bVGh1i?w=2562&h=1972); docsify 無需構(gòu)建快速生成文檔頁 網(wǎng)站:https://github.com/qingwei-li...文檔:https:...
摘要:你可以指定導(dǎo)航欄文件名的內(nèi)容可以是這樣中文當(dāng)然也支持二級列表,將生成一個(gè)下拉列表中文為什么是而不用想要實(shí)現(xiàn)的是用最簡單的方式動(dòng)態(tài)渲染內(nèi)容。 showImg(https://segmentfault.com/img/bVGh1i?w=2562&h=1972); docsify 無需構(gòu)建快速生成文檔頁 網(wǎng)站:https://github.com/qingwei-li...文檔:https:...
摘要:用于檢查中文編寫格式規(guī)范的命令行工具,基于開發(fā),且方便集成。忽略不檢查該規(guī)則警告,但不阻斷錯(cuò)誤,且阻斷通過來忽略文件和目錄,語法。 lint-md 用于檢查中文 markdown 編寫格式規(guī)范的命令行工具,基于 AST 開發(fā),且方便集成 ci。Cli tool to lint your markdown file for Chinese. showImg(https://segment...
閱讀 3821·2021-09-09 09:33
閱讀 3133·2019-08-30 15:56
閱讀 3104·2019-08-30 15:56
閱讀 3390·2019-08-30 15:55
閱讀 567·2019-08-30 15:53
閱讀 2237·2019-08-30 15:52
閱讀 725·2019-08-28 18:16
閱讀 2542·2019-08-26 13:51