【问题标题】:CoffeeScript compiler without node.js?没有 node.js 的 CoffeeScript 编译器?
【发布时间】:2012-07-19 11:56:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: python node.js compiler-construction coffeescript


    【解决方案1】:

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

    您将运行 javascript code for CoffeeScript compiler,然后用它编译 CoffeeScript。

    【讨论】:

    • 是的,我考虑过这一点,即使使用packages.python.org/watchdog/quickstart.html 进行更新,但我想知道我是否没有做一些已经存在的事情:/
    • @CyrilN。当然,如果你能找到一个原生的 python cs 编译器会更好。使用 js one,您可以更快地获得最新更新。
    【解决方案2】:

    如果你不想安装 node.js,你可以在你的浏览器中编译它们。 如何做到这一点的粗略细节是in the docs

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

    【讨论】:

      【解决方案3】:

      你可以这样使用: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)
      

      【讨论】:

      • 欢迎来到 Stack Overflow!这在理论上可以回答这个问题,但最好在此处包含答案的基本部分以供将来的用户使用,并提供链接以供参考。 Link-dominated answers 可以通过link rot 失效。
      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多