4

我想使用 CoffeeScript(CS) 和 CS 编译器,但不必安装 Node.js。

我看到CS的核心编译器是JavaScript,所以不需要安装Node.js,但是我找不到任何用Python/Java或任何其他语言编写的编译器,只有Node.js。

我错过了什么吗?我必须用 Python 编写自己的实现吗?

4

4 回答 4

2

您可以使用http://code.google.com/p/pyv8/在 python 中运行 javascript 。

您将运行CoffeeScript 编译器的 javascript 代码,然后用它编译 CoffeeScript。

于 2012-07-20T08:20:27.400 回答
1

如果你不想安装 node.js,你可以在你的浏览器中编译它们。文档中有关如何执行此操作的粗略细节。

如果您不想使用浏览器,您可以在任何能够运行 javascript 的环境中运行该脚本,例如 Java 上的 Rhino、python 中的 pyv8 等。

于 2012-07-20T08:36:16.363 回答
1

您可以使用如下内容:http : //hovet.biz/blog/?p=27 这是一个基于 Python2 的编译器,使用 CoffeScript 编译器的 Js 版本和 Qt WebKit。注意,不涉及 Qt GUI,它只是文本。

这是来源,根据要求:

import sys, os, glob
import time, htmllib
from os.path import splitext
from PyQt5.QtCore import QUrl
from PyQt5.QtWebKitWidgets import QWebPage
from PyQt5.QtWidgets import QApplication

coffee_script_js = os.path.expanduser('~/src/coffee-monitor/coffee-script.js')

assert os.path.exists(coffee_script_js)

sleep_time = 0.05

class CoffeeMonitor(QWebPage):  
    def __init__(self, src_dir):
        self._cs_src = None
        self._div_start = '<div id="cssrc">'
        self._app = QApplication(sys.argv)  
        QWebPage.__init__(self)  
        self.loadFinished.connect(self.load_finished)

        self._cs_src_dir = src_dir

        if not self.prep_compile_file():
            exit()

        self._app.exec_()

    def prep_compile_file(self):
        while 1:
            try:
                src = self.get_cs_src()

                if src:
                    self.mainFrame().load(QUrl(src))
                    return True

                time.sleep(sleep_time)

            except KeyboardInterrupt:
                break

        return False

    def create_cs_html(self, f):
        f_html = f + '.html'

        src = open(f).read()

        fil = open(f_html, 'w')
        fil.write('''<html>
<body>
'''+ self._div_start +''' </div>
<script type="text/coffeescript">
''')

        fil.write('try\n')
        #fil.write("  src = CoffeeScript.compile '" + src.replace('\n', '\\n').replace("'", "\\'") + "', bare: on\n")
        fil.write("  src = CoffeeScript.compile '" + src.replace('\n', '\\n').replace("'", "\\'") + "', bare: off\n")

        fil.write('''  document.getElementById("cssrc").textContent = src
catch {location, message}
  if location?
    message = "'''+f+''': Error on line #{location.first_line + 1}: #{message}"
  document.getElementById("cssrc").textContent = message

</script>
<script src="''' + coffee_script_js + '''"></script>
</body>
</html>
''')
        fil.close()

        return 'file://' + f_html

    def get_cs_src(self):
        #files = []
        #for exts in [ 'coffee', 'cof', 'coffe', 'cofee', 'cofe', 'kaffe' ]:
        #    files += glob.glob(self._cs_src_dir + '/*.' + exts)
        files = glob.glob(self._cs_src_dir + '/*.coffee')

        self._cs_src = None

        for f in files:
            name,ext = splitext(f)
            js = name + '.js'
            if not os.path.exists(js):
                self._cs_src = f
                return self.create_cs_html(f)

            c_time_cof = os.stat(f).st_ctime
            c_time_js = os.stat(js).st_ctime
            if c_time_cof > c_time_js:
                self._cs_src = f
                return self.create_cs_html(f)

    def get_compiled_js_src(self):
        html = self.mainFrame().toHtml()
        js_src = ''
        error = False

        for line in html.split('\n'):
            if line.startswith(self._div_start):
                js_src = line[len(self._div_start):]
                if js_src.find('Error on line ') > 0:
                    js_src = '!'*5 + ' ' + js_src.rstrip('</div>\n')
                    js_src = 'alert("'+ js_src.replace('"', "'") +'");'
                    error = True
                    #print js_src
                    break

            elif js_src:
                js_src += line.rstrip('</div>\n')
                if line.find('</div>') >= 0:
                    break

        js_src = unescape(js_src)

        return js_src, error

    def load_finished(self, result):
        js_src, error = self.get_compiled_js_src()

        name,ext = splitext(self._cs_src)
        js = name + '.js'
        print '*** updating', js

        if error:
            print js_src

        fil = open(js, 'w')
        fil.write(js_src.replace(';',';\n'))      
        fil.close()

        if not self.prep_compile_file():
            self._app.quit()

def unescape(s):
    p = htmllib.HTMLParser(None)
    p.save_bgn()
    p.feed(s)
    return p.save_end()

if __name__ == '__main__':
    print 'This Python script comes with absolutely no warranty.'
    print 'Ctrl+C to quit'

    if len(sys.argv) == 1:
        print 'coffee-monitor.py  cs-src-dir (note: recursive search is not implemented)'
        exit()

    cs_dir = os.path.abspath(os.path.expanduser(sys.argv[1]))

    assert os.path.isdir(cs_dir)
    CoffeeMonitor(cs_dir)
于 2015-12-10T02:00:24.543 回答
0

在我看来, DukPy是用 Python 编写的最好的 javascript 解释器!它可以编译CoffeeScript,TypeScript和. 用法很简单:BabelJSJSX

import dukpy
dukpy.coffee_compile("CoffeeScript goes here!")

DukPy 是Python-CoffeeScript包的继承者,不再维护。

于 2022-03-02T10:03:06.780 回答