diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..c7dff64 --- /dev/null +++ b/public/index.html @@ -0,0 +1,1513 @@ + + + + RailwayJS + + + + + + + + + + + + + + Fork me on GitHub +
+
+ +
+
+ +
+

RightwayJS - MVC framework
Create NodeJS web apps faster with more energy, using RailwayJS

+
+ +
+ +
+ +

What is railway?

+ +

Railway is the Node.JS MVC framework based on ExpressJS, fully ExpressJS-compatible. It allows you to build web applications in a similar manner as in Ruby On Rails.

+ +

The main objective of the framework - web development without pain.

+ +

Check this out

+ + + +
+ +
+ +

1. Install

+ +
sudo npm install railway -g
+
+ +

2. Use

+ +

You can use app generator and the scaffold generator to build your first railway app in seconds

+ +
rw i blog && cd blog
+npm install -l
+rw g crud post title content
+rw s 8888
+open http://127.0.0.1/posts
+
+ +
+ +
+ +

What is under the hood

+ + + +
+ +
+ +
+ +
+ +

The purpose of routes is to connect URL with controller action. For example you can define the following route in config/routes.js file:

+ +
map.get('signup', 'users#new');
+
+ +

to link GET /signup with new action of users controller.

+ +
map.root('home#index');
+
+ +

Will link GET / to index action of home controller

+ +
+ +
+ +

Resource-based routing

+ +

Resource-based routing provides standart mapping between HTTP verbs and controller actions:

+ +
map.resources('posts');
+
+ +

will provide following routes:

+ +
   helper | method | path                   | controller#action
+---------------------------------------------------------------
+     posts GET      /posts                   posts#index
+     posts POST     /posts                   posts#create
+  new_post GET      /posts/new               posts#new
+ edit_post GET      /posts/:id/edit          posts#edit
+      post DELETE   /posts/:id               posts#destroy
+      post PUT      /posts/:id               posts#update
+      post GET      /posts/:id               posts#show
+
+ +

to list available routes you can run command railway routes.

+ +

First column in table is helper - you can use this identifier in views and controllers to get route. Some examples:

+ +
path_to.new_post            # /posts/new
+path_to.edit_post(1)        # /posts/1/edit
+path_to.edit_post(post)     # /posts/1/edit (in this example post = {id: 1})
+path_to.posts               # /posts
+path_to.post(post)          # /posts/1
+
+ +
+ +
+ +

Aliases for resourceful routes

+ +
+ +
+ +

If you want to override default routes behaviour, you can use two options: +as and path to specify helper name and path you want to have in the result.

+ +
+ +
+ +

{ as: 'helperName' }

+ +

Path helper aliasing:

+ +
map.resources('posts', {as: 'articles'});
+
+ +

will produce

+ +
     articles GET    /posts.:format?          posts#index
+     articles POST   /posts.:format?          posts#create
+  new_article GET    /posts/new.:format?      posts#new
+ edit_article GET    /posts/:id/edit.:format? posts#edit
+      article DELETE /posts/:id.:format?      posts#destroy
+      article PUT    /posts/:id.:format?      posts#update
+      article GET    /posts/:id.:format?      posts#show
+
+ +

{ path: 'alternatePath' }

+ +

If you want to change base path:

+ +
map.resources('posts', {path: 'articles'});
+
+ +

this will create following routes:

+ +
     posts GET    /articles.:format?          posts#index
+     posts POST   /articles.:format?          posts#create
+  new_post GET    /articles/new.:format?      posts#new
+ edit_post GET    /articles/:id/edit.:format? posts#edit
+      post DELETE /articles/:id.:format?      posts#destroy
+      post PUT    /articles/:id.:format?      posts#update
+      post GET    /articles/:id.:format?      posts#show
+
+ +

all together

+ +

And if you want alias both helper and path, use both:

+ +
map.resources('posts', {path: 'articles', as: 'stories'});
+
+ +

and you will get:

+ +
    stories GET    /articles.:format?          posts#index
+    stories POST   /articles.:format?          posts#create
+  new_story GET    /articles/new.:format?      posts#new
+ edit_story GET    /articles/:id/edit.:format? posts#edit
+      story DELETE /articles/:id.:format?      posts#destroy
+      story PUT    /articles/:id.:format?      posts#update
+      story GET    /articles/:id.:format?      posts#show
+
+ +
+ +
+ +

Nested resources

+ +
+ +
+ +

Some resources may have nested sub-resources, for example Post has many Comments, and of course we want to get comments of the post using GET /post/1/comments

+ +
+ +
+ +

Let's describe route for nested resource

+ +
map.resources('post', function (post) {
+    post.resources('comments');
+});
+
+ +

This routing map will provide the following routes:

+ +
$ rw r
+     post_comments GET      /posts/:post_id/comments          comments#index
+     post_comments POST     /posts/:post_id/comments          comments#create
+  new_post_comment GET      /posts/:post_id/comments/new      comments#new
+ edit_post_comment GET      /posts/:post_id/comments/:id/edit comments#edit
+      post_comment DELETE   /posts/:post_id/comments/:id      comments#destroy
+      post_comment PUT      /posts/:post_id/comments/:id      comments#update
+      post_comment GET      /posts/:post_id/comments/:id      comments#show
+             posts GET      /posts                            posts#index
+             posts POST     /posts                            posts#create
+          new_post GET      /posts/new                        posts#new
+         edit_post GET      /posts/:id/edit                   posts#edit
+              post DELETE   /posts/:id                        posts#destroy
+              post PUT      /posts/:id                        posts#update
+              post GET      /posts/:id                        posts#show
+
+ +

Using url helpers for nested routes

+ +

To use routes like post_comments you should call helper with param: parent resource or identifier before nested resource:

+ +
path_to.post_comments(post)               # /posts/1/comments
+path_to.edit_post_comment(post, comment)  # /posts/1/comments/10/edit
+path_to.edit_post_comment(2, 300)         # /posts/2/comments/300/edit
+
+ +
+ +
+ +

Namespaces

+ +
+ +
+ +

You may wish to organize groups of controllers under a namespace. The most common use-case is Admin area. All controllers within admin namespace should be located inside app/controllers/ dir.

+ +
+ +
+ +

For example, let's create admin namespace:

+ +
namespace('admin', function (admin) {
+    admin.resources('users');
+});
+
+ +

This routing rule will match with urls /admin/users, admin/users/new, and create appropriated url helpers

+ +
      admin_users GET    /admin/users.:format?          admin/users#index
+      admin_users POST   /admin/users.:format?          admin/users#create
+   new_admin_user GET    /admin/users/new.:format?      admin/users#new
+  edit_admin_user GET    /admin/users/:id/edit.:format? admin/users#edit
+       admin_user DELETE /admin/users/:id.:format?      admin/users#destroy
+       admin_user PUT    /admin/users/:id.:format?      admin/users#update
+       admin_user GET    /admin/users/:id.:format?      admin/users#show
+
+ +
+ +
+ +
+ +
+ +

Restricting routes

+ +

If you need routes only for several actions (e.g. index, show) you can specify only option:

+ +
map.resources('users', {only: ['index', 'show']});
+
+ +

If you want to have all routes except some route, you can specify except option:

+ +
map.resources('users', {except: ['create', 'destroy']});
+
+ +
+ +
+ +

Custom actions in resourceful routes

+ +

If you need some specific action to be added to you resource-based route, use this example:

+ +
map.resources('users', function (user) {
+    user.get('avatar', 'users#avatar');
+});
+
+ +
+ +
+ +
+ +
+ +

Synopsis

+ +

Controllers in railway - is a module, that receives user input and initiates response. Controller consists of a set of actions. Each action is called by the request of particular route. To define action you should use reserved global function action:

+ +
action('index', function () {
+    render();
+});
+
+ +
+ +
+ +

Features overview

+ +

Inside controller you can use following reserved global functions to control response:

+ +
    +
  • render - render view template related to this action
  • +
  • send - send to client text, status code or json object
  • +
  • redirect - redirect client to specific location
  • +
  • header - send header to client
  • +
  • flash - display flash message
  • +
+ +

And here is a bunch of functions to control execution flow:

+ +
    +
  • before - invoke this method before any action
  • +
  • after - invoke this method after any action
  • +
  • load - load another controller to use it methods
  • +
  • use or export - get method defined in another controller, loaded with load function
  • +
  • publish or import - allow method to be used in other controller
  • +
+ +

Let's learn more about each of this functions.

+ +
+ +
+ +
+ +

Response control

+ +
+ +

NOTE: each action should invoke one output method. This is the only requirement imposed by the asynchronous nature Node.JS. If output method wouldn't called, client will wait for server responce indefinitely.

+ +
+ +
+ +

render

+ +

render method accepts 0, 1, or 2 arguments. Called without agruments it just render view associated with this action. For example:

+ +

posts_controller.js

+ +
action('index', function () {
+    render();
+});
+
+ +

will render view app/views/posts/index.ejs.

+ +

If you want to pass some data to the view, there are two ways to do it. First:

+ +
action('index', function () {
+    render({title: "Posts index"});
+});
+
+ +

and second:

+ +
action('index', function () {
+    this.title = "Posts index";
+    render();
+});
+
+ +

And if you want to render another view, just put it's name as first argument:

+ +
action('update', function () {
+    this.title = "Update post";
+    render('edit');
+});
+
+ +

or

+ +
action('update', function () {
+    render('edit', {title: "Update post"});
+});
+
+ +

send

+ +

Send function useful for debugging and one-page apps, where you don't want to render heavy template and just want to send text or JSON data.

+ +

This function can be called with number (status code):

+ +
action('destroy', function () {
+    send(403); // client will receive statusCode = 403 Forbidden
+});
+
+ +

or with string:

+ +
action('sayHello', function () {
+    send('Hello!'); // client will receive 'Hello!'
+});
+
+ +

or with object:

+ +
action('apiCall', function () {
+    send({hello: 'world'}); // client will receive '{"hello":"world"}'
+});
+
+ +

redirect

+ +

This function just set status code and location header, so client will be redirected to another location.

+ +
redirect('/'); // root redirection
+redirect('http://example.com'); // redirect to another host
+
+ +

flash

+ +

Flash function stores message in session for future displaying, this is regular expressjs function, refer to expressjs guide to learn how it works. Few examples:

+ +

posts_controller.js

+ +
action('create', function () {
+    Post.create(req.body, function (err) {
+        if (err) {
+            flash('error', 'Error while post creation');
+            render('new', {post: req.body});
+        } else {
+            flash('info', 'Post has been successfully created');
+            redirect(path_to.posts);
+        }
+    });
+});
+
+ +

This create action sends flash info on success and flash error on fail.

+ +
+ +
+ +

Execution flow control

+ +
+ +
+ +

To provide ability of DRY-ing controller code, and reusing common code parts Railway provides few additional tools: method chaining and external controllers loading.

+ +
+ +
+ +

To chain methods you can use before and after methods:

+ +

checkout_controller.js

+ +
before(userRequired, {only: 'order'});
+before(prepareBasket, {except: 'order'});
+before(loadProducts, {only: ['products', 'featuredProducts']});
+
+action('products', function () {...});
+action('featuredProducts', function () {...});
+action('order', function () {...});
+action('basket', function () {...});
+
+function userRequired () {next()}
+function prepareBasket () {next()}
+function loadProducts () {next()}
+
+ +

In this example function userRequired will called only for order action, prepareBasket function will called for all actions except order, and loadProducts function will called only for actions products and featuredProducts.

+ +

Note, that the before-functions should call global method next that will pass controll to the next function in chain.

+ +
+ +
+ +

Common execution context

+ +
+ +
+ +

There is one implicit feature in chaining: all functions in chain invoked in one context, so you can pass data between chain using this object:

+ +
+ +
+ +
function loadProducts () {
+    Product.find(function (err, prds) {
+        this.products = prds;
+        next();
+    }.bind(this));
+}
+
+action('products', function () {
+    assert.ok(this.products, 'Products available here');
+    render(); // also products will available in view
+});
+
+ +
+ +
+ +

Sharing code between controllers

+ +
+ +
+ +

Some methods, like userRequired for example, can be used in different controllers, to allow cross-controller code sharing railway provides few methods: load, use and publish.

+ +
+ +
+ +

You can define requireUser in application_controller.js and call publish, and then you will be able to use it in your controller:

+ +

application_controller.js

+ +
publish('requireUser', requireUser);
+function requireUser () {
+}
+
+ +

then load application controller and use requireUser function here:

+ +

products_controller.js

+ +
load('application'); // note that _controller siffix omitted
+before(use('userRequired'), {only: 'products'});
+
+ +
+ +
+ +

Other express.js features

+ +
+ +
+ +

To get familiar with railway controllers look to few examples available at github: coffee controller, javascript controller

+ +
+ +
+ +

All other expressjs features have no global shortcuts yet, but they still can be used, because object request (or, shorter req) and response (alias res), are available as global variables in controller context. In view context only available long aliases: response and request to provide better coding style (it is bad to use this variables in views, but it's possible).

+ +
+ +
+ +
+ +
+ +

Templating engines

+ +

By default railway use ejs templating engine, but you can switch to jade, using settings

+ +
app.set('view engine', 'jade');
+
+ +

and add line

+ +
require('jade-ext');
+
+ +

to ./npmfile.js

+ +
+ +
+ +

View rendering flow

+ +

Every controller action may call render method to display associated view. For example, action index in controller users will render view in file app/views/users/index.ejs.

+ +

This view will be rendered within the layout specified by layout call in the controller. By default layout name is the same as controller name, app/views/layouts/users_layout.ejs in this case. If this layout file is not exists, application layout used.

+ +

If you need render view without layout you can call layout(false) inside controller, this will skip layout rendering.

+ +
+ +
+ +

Built-in Helpers

+ +
+ +
+ +
    +
  • link_to
  • +
+ +
+ +
+ +
link_to('Users index', '/users');
+// <a href="/users">Users index</a>
+link_to('Users index', '/users', {class: 'menu-item'});
+// <a href="/users" class="menu-item">Users index</a>
+link_to('Users index', '/users', {remote: true});
+// <a href="/users" data-remote="true">Users index</a>
+
+ +
    +
  • First argument is link text.
  • +
  • Second argument is link path.
  • +
  • Third argument is object with link properties.
  • +
+ +

In the last example third argument is {remote: true}, and as you can see it will add data-remote="true" attribute to a tag. Clicking on this link will send async GET request to /users. Result will be executed as javascript.

+ +

Here you can also specify jsonp param to handle response:

+ +
link_to('Users index', '/users', {remote: true, jsonp: 'renderUsers'});
+// <a href="/users" data-remote="true" data-jsonp="renderUsers">Users index</a>
+
+ +

Server will send you json {users: [{},{},{}]}, and this object will be passed as an argument to the renderUsers function:

+ +
renderUsers({users: [{},{},{}]});
+
+ +

You can also specify anonimous function in jsonp param:

+ +
{jsonp: '(function (url) {location.href = url;})'}
+
+ +

When server will send you "http://google.com/" following javascript will be evaluated:

+ +
(function (url) {location.href = url;})("http://google.com");
+
+ +

This is why you should wrap anonimous function with parentheses.

+ +
+ +
+ +
+ +
+ +
    +
  • form_for
  • +
+ +
+ +
+ +

Accepts three params: resource, params and block. Block is function that receives as single param special object, which provide helpers with pre-filled values. Available helpers:

+ +
    +
  • input
  • +
  • label
  • +
  • textarea
  • +
  • submit
  • +
  • checkbox

    + +<% form_for(user, {action: path_to.users}, function (form) { %> + +

    + <%- form.label('name', 'Username') %> + <%- form.input('name') %> +

    +

    + <%- form.submit('Save') %> +

    +<% }); %>
  • +
+ +

will generate

+ +
<form action="/users/1" method="POST">
+    <input type="hidden" name="_method" value="PUT" />
+    <input type="hidden" name="authencity_token" value="qwertyuiop1234567890!@#$%^&*()" />
+   <p>
+       <label for="name">Username</label>
+       <input id="name" name="name" value="Anatoliy" />
+   </p>
+   <p>
+       <input type="submit" value="Save" />
+   </p>        
+</form>
+
+ +
+ +
+ +
+ +
+ +
    +
  • form_tag
  • +
+ +
+ +
+ +

This is "light" version of form_for helper. It accepts just two arguments: params and block. Block didn't receives any params. +Use this helper when you have no any resource, but still want to be able to use simple method overriding and csrf protection tokens. +TODO: add code sample

+ +
+ +
+ +
+ +
+ +
    +
  • input_tag and form.input
  • +
+ +
+ +
+ +

TODO: describe input_tag

+ +
+ +
+ +
+ +
+ +
    +
  • label_tag and form.label
  • +
+ +
+ +
+ +

TODO: describe label_tag

+ +
+ +
+ +
+ +
+ +
    +
  • stylesheet_link_tag
  • +
+ +
+ +
+ +
<%- stylesheet_link_tag('reset', 'style', 'mobile') %>
+
+ +

will generate

+ +
<link media="screen" rel="stylesheet" type="text/css" href="/stylesheets/reset.css?1306993455523" /> 
+<link media="screen" rel="stylesheet" type="text/css" href="/stylesheets/style.css?1306993455523" />
+
+ +

Timestamps ?1306993455523 added to assets only in development mode in order to prevent browser from caching scripts and style in client-side

+ +
+ +
+ +
+ +
+ +
    +
  • javascript_include_tag
  • +
+ +
+ +
+ +
<%- javascript_include_tag(
+  'https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js',
+  'rails', 'application') %>
+
+ +

will generate

+ +
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
+<script type="text/javascript" src="/javascripts/rails.js?1306993455524"></script> 
+<script type="text/javascript" src="/javascripts/application.js?1306993455524"></script> 
+
+ +

Timestamps ?1306993455524 added to assets only in development mode in order to prevent browser from caching scripts and style in client-side

+ +

By default railway expect assets to be located in public/javascripts and public/stylesheets directories, but this settings can be overwritten in config/environment.js file:

+ +
app.set('jsDirectory', '/js/');
+app.set('cssDirectory', '/css/');
+
+ + + +
+ +
+ +
+ +Railway generators - are automated tools allows you to create bunch of files automatically. +
+ +
+ +

Each generator can be invoked by command

+ +
rw generate GENERATOR_NAME
+
+ +

or, using shortcut

+ +
rw g GENERATOR_NAME
+
+ +Built-in generators: model, controller, scaffold (crud) +
+ +
+ +

Generate controller

+ +
+ +
+ +

Usecase: you do not need standart RESTful controller, just few non-standart actions

+ +
+ +
+ +

Example call:

+ +
rw g controller controllername actionName anotherActionName
+
+ +

Generate files:

+ +
exists  app/
+exists  app/controllers/
+create  app/controllers/controllername_controller.js
+exists  app/helpers/
+create  app/helpers/controllername_helper.js
+exists  app/views/
+create  app/views/controllername/
+create  app/views/controllername/actionName.ejs
+create  app/views/controllername/anotherActionName.ejs
+
+ +

Generated contents of controller file:

+ +
load('application');
+
+action("actionName", function () {
+    render();
+});
+
+action("anotherActionName", function () {
+    render();
+});
+
+ +
+ +
+ +

Generate model

+ +
+ +
+ +

Usecase: you want to access some database entity using ORM interface (mongoose by default)

+ +
+ +
+ +

Example call:

+ +
railway g model user name password
+
+ +

Will generate

+ +
exists  app/
+exists  app/models/
+create  app/models/user.js
+
+ +

Following mongoose schema will be created:

+ +
/**
+ * User
+ */
+var UserSchema = new Schema;
+UserSchema.add({
+    name: { type: String },
+    password: { type: String }
+});
+mongoose.model("User", UserSchema);
+module.exports["User"] = mongoose.model("User");
+
+ +

If you need to specify field types (String by default):

+ +
railway g model user name password createdAt:date activated:boolean
+
+ +
+ +
+ +

Generate scaffold (crud)

+ +
+ +
+ +

The most commonly used generator. It creates ready-to-use resource controller with all actions, views, schema definitions, routes, and tests. RW also can generated scaffold in CoffeeScript.

+ +
+ +
+ +

Example call:

+ +
rw g scaffold post title content createdAt:date
+exists  app/
+exists  app/models/
+create  app/models/post.js
+exists  app/
+exists  app/controllers/
+create  app/controllers/posts_controller.js
+exists  app/helpers/
+create  app/helpers/posts_helper.js
+create  app/views/layouts/posts_layout.ejs
+create  public/stylesheets/scaffold.css
+exists  app/views/
+create  app/views/posts/
+create  app/views/posts/_form.ejs
+create  app/views/posts/new.ejs
+create  app/views/posts/edit.ejs
+create  app/views/posts/index.ejs
+create  app/views/posts/show.ejs
+patch   config/routes.js
+
+ +

Using scaffold generator - fastest way to create prototype of application.

+ +
+ +
+ +

REPL console Learn, debug, investigate

+ +
+ +
+ +
+ +

To run REPL console use command

+ +
rw console
+
+ +

or it's shortcut

+ +
rw c
+
+ +
+ +
+ +

It just simple node-js console with some Railway bindings, e.g. models. Just one note +about working with console. Node.js is asynchronous by its nature, and it's great +but it made console debugging much more complicated, because you should use callback +to fetch result from database, for example. I have added one useful method to +simplify async debugging using railway console. It's name c, you can pass it +as parameter to any function requires callback, and it will store parameters passed +to callback to variables _0, _1, ..., _N where N is index in arguments.

+ +

Example:

+ +
railway c
+railway> User.find(53, c)
+Callback called with 2 arguments:
+_0 = null
+_1 = [object Object]
+railway> _1
+{ email: [Getter/Setter],
+  password: [Getter/Setter],
+  activationCode: [Getter/Setter],
+  activated: [Getter/Setter],
+  forcePassChange: [Getter/Setter],
+  isAdmin: [Getter/Setter],
+  id: [Getter/Setter] }
+
+ +
+ +
+ +

Write your app in CoffeeScript Drink coffee — do stupid things faster with more energy

+ +
+ +
+ +
+ +

Almost all parts of app can be written in CoffeeScript. If you like coding in Coffee, please do. Just put --coffee option to rw commands.

+ +
+ +
+ +
rw init blog --coffee
+cd blog
+rw g scaffold post title content --coffee
+
+ +

And then you can run railway server or coffee server.coffee to have server running on 3000 port

+ +

For example, here is generated coffee-controller:

+ +
before ->
+    Post.findById req.params.id, (err, post) =>
+        if err or not post
+            redirect path_to.posts
+        else
+            @post = post
+            next()
+, only: ['show', 'edit', 'update', 'destroy']
+
+# GET /posts/new
+action 'new', ->
+    @post = new Post
+    render
+        title: 'New post'
+
+# POST /posts
+action 'create', ->
+    @post = new Post
+    ['title', 'content'].forEach (field) =>
+        @post[field] = req.body[field] if req.body[field]?
+
+    @post.save (errors) ->
+        if errors
+            flash 'error', 'Post can not be created'
+            render 'new',
+                title: 'New post'
+        else
+            flash 'info', 'Post created'
+            redirect path_to.posts
+
+# GET /posts
+action 'index', ->
+    Post.find (err, posts) ->
+        render
+            posts: posts
+            title: 'Posts index'
+
+# GET /posts/:id
+action 'show', ->
+    render
+        title: 'Post show'
+
+# GET /posts/:id/edit
+action 'edit', ->
+    render
+        title: 'Post edit'
+
+# PUT /posts/:id
+action 'update', ->
+    ['title', 'content'].forEach (field) =>
+        @post[field] = req.body[field] if req.body[field]?
+
+    @post.save (err) =>
+        if not err
+            flash 'info', 'Post updated'
+            redirect path_to.post(@post)
+        else
+            flash 'error', 'Post can not be updated'
+            render 'edit',
+                title: 'Edit post details'
+
+# DELETE /posts/:id
+action 'destroy', ->
+    @post.remove (error) ->
+        if error
+            flash 'error', 'Can not destroy post'
+        else
+            flash 'info', 'Post successfully removed'
+        send "'" + path_to.posts + "'"
+
+ +
+ +
+ +
+ +
+ +

Basic steps:

+ +
    +
  1. create dictionary to translate tokens to natural language (config/locales/*.yml)
  2. +
  3. Use tokens instead of natural language everywhere in app (t helper)
  4. +
  5. Manually detect language of each user request (setLocale method)
  6. +
+ +
+ +
+ +

Railway allows you to create application translated to different languages: just place localization file in yaml format to config/locales dir:

+ +

config/locales/en.yml

+ +
en:
+  session:
+    new: "Sign in"
+    destroy: "Sign out"
+  user:
+    new: "Sign up"
+    destroy: "Cancel my account"
+    welcome: "Hello %, howdy?
+    validation:
+      name: "Username required"
+
+ +

NOTE: translations can contain % symbol(s), that means variable substitution

+ +

Define user locale in application controller:

+ +

app/controllers/application_controller.js

+ +
before(setUserLocale);
+function setUserLocale () {
+    // define locale from user settings, or from headers or use default
+    var locale = req.user ? req.user.locale : 'en';
+    // call global function setLocale
+    setLocale(locale);
+}
+
+ +

and use localized tokens inside app views with t helper:

+ +
<%= t('session.new') %>
+<%= t('user.new') %>
+<%= t(['user.welcome', user.name]) %>
+
+ +

or inside controllers:

+ +
flash('error', t('user.validation.name'));
+
+ +

or inside models:

+ +
return t('email.activate', 'en');
+
+ +

NOTE: when use t helpers inside models you must pass locale as second param to t helper.

+ +

Configuration

+ +

Localization behavior can be configured using following settings:

+ +
    +
  • defaultLocale: name of default locale
  • +
  • translationMissing: what action perfor when translation is missing, possible values: default - display translation for default locale, display - show error like "Translation missing for email.activate"
  • +
+ +

Example:

+ +
app.configure(function () {
+    app.set('defaultLocale', 'en');
+});
+
+app.configure('development', function(){
+    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
+    app.set('translationMissing', 'display');
+});
+
+app.configure('production', function () {
+    app.use(express.errorHandler()); 
+    app.set('translationMissing', 'default');
+});
+
+ + + +
+ +
+ +
+ +

Any npm package is already extension for railway. Just put line to npmfile.js, for example:

+ +
require('railway-twitter');
+
+ +

Just one note: if package have init method, it will be invoked after application initialization.

+ +

For example you can check out twitter-auth extension for railway.

+ +
+ +
+ +

Installation script

+ +

If your extension have install.js script in the root, it will be invoked after installation with railway install command.

+ +

This script will be executed in application context, i.e. you can access global variables app and railway. You must call process.exit() when installation process has been completed.

+ +

Railway extension API

+ +

All railway modules published as global singleton railway. Any module can be extended or monkey-patched. Let's take a look to most common use-cases.

+ +

Tools

+ +

Hash railway.tools contains commands that can be invoked using command line, for example railway routes command will call railway.tools.routes() method.

+ +

To write tool, just add method to railway.tools object, name of this method will become the command:

+ +
railway.tools.database = function () {
+    switch (railway.args.shift()) {
+    case 'clean':
+        // clean db
+        break;
+    case 'backup':
+        // backup db
+        break;
+    case 'restore':
+        // restore db
+        break;
+    default:
+        console.log('Usage: railway database [clean|backup|restore]');
+    }
+};
+
+ +

then the following commands will be available for call:

+ +
railway database
+railway database backup
+railway database clean
+railway database restore
+
+ +

If you want to see this command in help message railway help you can provide some information about tool using help hash:

+ +
railway.tools.db.help = {
+    shortcut: 'db',
+    usage: 'database [backup|restore|clean]',
+    description: 'Some database features'
+};
+
+ +

Next time you will call railway help you'll see:

+ +
Commands:
+   ...
+   db, database [backup|restore|clean]  Some database features
+
+ +

If you have defined shortcut, it can be used instead of full command name:

+ +
 railway db clean
+
+ +

To learn more, please check out the sources: lib/tools.js

+ +

Generators

+ +

Coming soon. It's about railway.generators module and railway generate smth family of commands.

+ +

Discussion in google groups

+ +

API is still in develop now, feel free to leave comments about it in the related google groups thread.

+ +
+ +
+ +

Heroku nodejs hosting is available for public using now. You can deploy your RailwayJS application as simple as git push.

+ +

To work with heroku you also need: ruby, heroku gem

+ +
+ +
+ +

First of all, create app

+ +
railway init heroku-app
+cd heroku-app
+sudo npm link
+railway g crud post title content
+
+ +

Then init git repo

+ +
git init
+git add .
+git commit -m 'Init'
+
+ +

Create heroku app

+ +
heroku create --stack cedar
+
+ +

We need mongodb

+ +
heroku addons:add mongohq:free
+
+ +

And deploy

+ +
git push heroku master
+
+ +

Hook up Procfile (only once)

+ +
heroku ps:scale web=1
+
+ +

Check application state

+ +
heroku ps
+
+ +

Visit app

+ +
heroku open
+
+ +

If something went wrong, you can check out logs

+ +
heroku logs
+
+ +

But for me it useless. Better to run commands in node console:

+ +
heroku run node
+> var app = require('railway').createServer();
+
+ +

It helps to identify exact problems with app installation. +Also you can access railway console using command

+ +
heroku run railway console
+
+ +

BTW, mongohq provides web interface for browsing your mongo database, to use it go to http://mongohq.com/ and create account, +then click "Add remote connection" and configure link to database. You can retrieve details required for connection using command

+ +
heroku config --long
+
+ +
+ +
+ +
+
+
+ +
+
+ + diff --git a/public/javascripts/prettyprint/lang-apollo.js b/public/javascripts/prettyprint/lang-apollo.js new file mode 100644 index 0000000..7098baf --- /dev/null +++ b/public/javascripts/prettyprint/lang-apollo.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["com",/^#[^\n\r]*/,null,"#"],["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \xa0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"']],[["kwd",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/, +null],["typ",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[ES]?BANK=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[!-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["apollo","agc","aea"]); diff --git a/public/javascripts/prettyprint/lang-clj.js b/public/javascripts/prettyprint/lang-clj.js new file mode 100644 index 0000000..542a220 --- /dev/null +++ b/public/javascripts/prettyprint/lang-clj.js @@ -0,0 +1,18 @@ +/* + Copyright (C) 2011 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +var a=null; +PR.registerLangHandler(PR.createSimpleLexer([["opn",/^[([{]+/,a,"([{"],["clo",/^[)\]}]+/,a,")]}"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \xa0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/,a], +["typ",/^:[\dA-Za-z-]+/]]),["clj"]); diff --git a/public/javascripts/prettyprint/lang-css.js b/public/javascripts/prettyprint/lang-css.js new file mode 100644 index 0000000..041e1f5 --- /dev/null +++ b/public/javascripts/prettyprint/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/public/javascripts/prettyprint/lang-go.js b/public/javascripts/prettyprint/lang-go.js new file mode 100644 index 0000000..fc18dc0 --- /dev/null +++ b/public/javascripts/prettyprint/lang-go.js @@ -0,0 +1 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \xa0"],["pln",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])+(?:'|$)|`[^`]*(?:`|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\/\*[\S\s]*?\*\/)/],["pln",/^(?:[^"'/`]|\/(?![*/]))+/]]),["go"]); diff --git a/public/javascripts/prettyprint/lang-hs.js b/public/javascripts/prettyprint/lang-hs.js new file mode 100644 index 0000000..9d77b08 --- /dev/null +++ b/public/javascripts/prettyprint/lang-hs.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n \r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^\n\f\r'\\]|\\[^&])'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:--+[^\n\f\r]*|{-(?:[^-]|-+[^}-])*-})/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^\d'A-Za-z]|$)/, +null],["pln",/^(?:[A-Z][\w']*\.)*[A-Za-z][\w']*/],["pun",/^[^\d\t-\r "'A-Za-z]+/]]),["hs"]); diff --git a/public/javascripts/prettyprint/lang-lisp.js b/public/javascripts/prettyprint/lang-lisp.js new file mode 100644 index 0000000..02a30e8 --- /dev/null +++ b/public/javascripts/prettyprint/lang-lisp.js @@ -0,0 +1,3 @@ +var a=null; +PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,a,"("],["clo",/^\)+/,a,")"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \xa0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,a], +["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["cl","el","lisp","scm"]); diff --git a/public/javascripts/prettyprint/lang-lua.js b/public/javascripts/prettyprint/lang-lua.js new file mode 100644 index 0000000..e83a3c4 --- /dev/null +++ b/public/javascripts/prettyprint/lang-lua.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \xa0"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\S\s]*?(?:]\1]|$)|[^\n\r]*)/],["str",/^\[(=*)\[[\S\s]*?(?:]\1]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i], +["pln",/^[_a-z]\w*/i],["pun",/^[^\w\t\n\r \xa0][^\w\t\n\r "'+=\xa0-]*/]]),["lua"]); diff --git a/public/javascripts/prettyprint/lang-ml.js b/public/javascripts/prettyprint/lang-ml.js new file mode 100644 index 0000000..6df02d7 --- /dev/null +++ b/public/javascripts/prettyprint/lang-ml.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \xa0"],["com",/^#(?:if[\t\n\r \xa0]+(?:[$_a-z][\w']*|``[^\t\n\r`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])(?:'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\(\*[\S\s]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/], +["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^(?:[_a-z][\w']*[!#?]?|``[^\t\n\r`]*(?:``|$))/i],["pun",/^[^\w\t\n\r "'\xa0]+/]]),["fs","ml"]); diff --git a/public/javascripts/prettyprint/lang-n.js b/public/javascripts/prettyprint/lang-n.js new file mode 100644 index 0000000..6c2e85b --- /dev/null +++ b/public/javascripts/prettyprint/lang-n.js @@ -0,0 +1,4 @@ +var a=null; +PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:'(?:[^\n\r'\\]|\\.)*'|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,a,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,a,"#"],["pln",/^\s+/,a," \r\n\t\xa0"]],[["str",/^@"(?:[^"]|"")*(?:"|$)/,a],["str",/^<#[^#>]*(?:#>|$)/,a],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,a],["com",/^\/\/[^\n\r]*/,a],["com",/^\/\*[\S\s]*?(?:\*\/|$)/, +a],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/, +a],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,a],["lit",/^@[$_a-z][\w$@]*/i,a],["typ",/^@[A-Z]+[a-z][\w$@]*/,a],["pln",/^'?[$_a-z][\w$@]*/i,a],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,a,"0123456789"],["pun",/^.[^\s\w"-$'./@`]*/,a]]),["n","nemerle"]); diff --git a/public/javascripts/prettyprint/lang-proto.js b/public/javascripts/prettyprint/lang-proto.js new file mode 100644 index 0000000..f006ad8 --- /dev/null +++ b/public/javascripts/prettyprint/lang-proto.js @@ -0,0 +1 @@ +PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]); diff --git a/public/javascripts/prettyprint/lang-scala.js b/public/javascripts/prettyprint/lang-scala.js new file mode 100644 index 0000000..60d034d --- /dev/null +++ b/public/javascripts/prettyprint/lang-scala.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \xa0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/], +["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]); diff --git a/public/javascripts/prettyprint/lang-sql.js b/public/javascripts/prettyprint/lang-sql.js new file mode 100644 index 0000000..da705b0 --- /dev/null +++ b/public/javascripts/prettyprint/lang-sql.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \xa0"],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|merge|national|nocheck|nonclustered|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|percent|plan|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rule|save|schema|select|session_user|set|setuser|shutdown|some|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|union|unique|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|writetext)(?=[^\w-]|$)/i, +null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]); diff --git a/public/javascripts/prettyprint/lang-tex.js b/public/javascripts/prettyprint/lang-tex.js new file mode 100644 index 0000000..ce96fbb --- /dev/null +++ b/public/javascripts/prettyprint/lang-tex.js @@ -0,0 +1 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \xa0"],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]); diff --git a/public/javascripts/prettyprint/lang-vb.js b/public/javascripts/prettyprint/lang-vb.js new file mode 100644 index 0000000..07506b0 --- /dev/null +++ b/public/javascripts/prettyprint/lang-vb.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null,"\t\n\r \xa0

"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"“”'],["com",/^['\u2018\u2019].*/,null,"'‘’"]],[["kwd",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\b/i, +null],["com",/^rem.*/i],["lit",/^(?:true\b|false\b|nothing\b|\d+(?:e[+-]?\d+[dfr]?|[dfilrs])?|(?:&h[\da-f]+|&o[0-7]+)[ils]?|\d*\.\d+(?:e[+-]?\d+)?[dfr]?|#\s+(?:\d+[/-]\d+[/-]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:am|pm))?)?|\d+:\d+(?::\d+)?(\s*(?:am|pm))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*|\[(?:[a-z]|_\w)\w*])/i],["pun",/^[^\w\t\n\r "'[\]\xa0\u2018\u2019\u201c\u201d\u2028\u2029]+/],["pun",/^(?:\[|])/]]),["vb","vbs"]); diff --git a/public/javascripts/prettyprint/lang-vhdl.js b/public/javascripts/prettyprint/lang-vhdl.js new file mode 100644 index 0000000..128b5b6 --- /dev/null +++ b/public/javascripts/prettyprint/lang-vhdl.js @@ -0,0 +1,3 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \xa0"]],[["str",/^(?:[box]?"(?:[^"]|"")*"|'.')/i],["com",/^--[^\n\r]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i, +null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w.\\]+#(?:[+-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:e[+-]?\d+(?:_\d+)*)?)/i], +["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'\xa0-]*/]]),["vhdl","vhd"]); diff --git a/public/javascripts/prettyprint/lang-wiki.js b/public/javascripts/prettyprint/lang-wiki.js new file mode 100644 index 0000000..9b0b448 --- /dev/null +++ b/public/javascripts/prettyprint/lang-wiki.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null,"\t \xa0abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[*=[\]^~]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^[A-Z][a-z][\da-z]+[A-Z][a-z][^\W_]+\b/],["lang-",/^{{{([\S\s]+?)}}}/],["lang-",/^`([^\n\r`]+)`/],["str",/^https?:\/\/[^\s#/?]*(?:\/[^\s#?]*)?(?:\?[^\s#]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\S\s])[^\n\r#*=A-[^`h{~]*/]]),["wiki"]); +PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]); diff --git a/public/javascripts/prettyprint/lang-xq.js b/public/javascripts/prettyprint/lang-xq.js new file mode 100644 index 0000000..e323ae3 --- /dev/null +++ b/public/javascripts/prettyprint/lang-xq.js @@ -0,0 +1,3 @@ +PR.registerLangHandler(PR.createSimpleLexer([["var pln",/^\$[\w-]+/,null,"$"]],[["pln",/^[\s=][<>][\s=]/],["lit",/^@[\w-]+/],["tag",/^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["com",/^\(:[\S\s]*?:\)/],["pln",/^[(),/;[\]{}]$/],["str",/^(?:"(?:[^"\\{]|\\[\S\s])*(?:"|$)|'(?:[^'\\{]|\\[\S\s])*(?:'|$))/,null,"\"'"],["kwd",/^(?:xquery|where|version|variable|union|typeswitch|treat|to|then|text|stable|sortby|some|self|schema|satisfies|returns|return|ref|processing-instruction|preceding-sibling|preceding|precedes|parent|only|of|node|namespace|module|let|item|intersect|instance|in|import|if|function|for|follows|following-sibling|following|external|except|every|else|element|descending|descendant-or-self|descendant|define|default|declare|comment|child|cast|case|before|attribute|assert|ascending|as|ancestor-or-self|ancestor|after|eq|order|by|or|and|schema-element|document-node|node|at)\b/], +["typ",/^(?:xs:yearMonthDuration|xs:unsignedLong|xs:time|xs:string|xs:short|xs:QName|xs:Name|xs:long|xs:integer|xs:int|xs:gYearMonth|xs:gYear|xs:gMonthDay|xs:gDay|xs:float|xs:duration|xs:double|xs:decimal|xs:dayTimeDuration|xs:dateTime|xs:date|xs:byte|xs:boolean|xs:anyURI|xf:yearMonthDuration)\b/,null],["fun pln",/^(?:xp:dereference|xinc:node-expand|xinc:link-references|xinc:link-expand|xhtml:restructure|xhtml:clean|xhtml:add-lists|xdmp:zip-manifest|xdmp:zip-get|xdmp:zip-create|xdmp:xquery-version|xdmp:word-convert|xdmp:with-namespaces|xdmp:version|xdmp:value|xdmp:user-roles|xdmp:user-last-login|xdmp:user|xdmp:url-encode|xdmp:url-decode|xdmp:uri-is-file|xdmp:uri-format|xdmp:uri-content-type|xdmp:unquote|xdmp:unpath|xdmp:triggers-database|xdmp:trace|xdmp:to-json|xdmp:tidy|xdmp:subbinary|xdmp:strftime|xdmp:spawn-in|xdmp:spawn|xdmp:sleep|xdmp:shutdown|xdmp:set-session-field|xdmp:set-response-encoding|xdmp:set-response-content-type|xdmp:set-response-code|xdmp:set-request-time-limit|xdmp:set|xdmp:servers|xdmp:server-status|xdmp:server-name|xdmp:server|xdmp:security-database|xdmp:security-assert|xdmp:schema-database|xdmp:save|xdmp:role-roles|xdmp:role|xdmp:rethrow|xdmp:restart|xdmp:request-timestamp|xdmp:request-status|xdmp:request-cancel|xdmp:request|xdmp:redirect-response|xdmp:random|xdmp:quote|xdmp:query-trace|xdmp:query-meters|xdmp:product-edition|xdmp:privilege-roles|xdmp:privilege|xdmp:pretty-print|xdmp:powerpoint-convert|xdmp:platform|xdmp:permission|xdmp:pdf-convert|xdmp:path|xdmp:octal-to-integer|xdmp:node-uri|xdmp:node-replace|xdmp:node-kind|xdmp:node-insert-child|xdmp:node-insert-before|xdmp:node-insert-after|xdmp:node-delete|xdmp:node-database|xdmp:mul64|xdmp:modules-root|xdmp:modules-database|xdmp:merging|xdmp:merge-cancel|xdmp:merge|xdmp:md5|xdmp:logout|xdmp:login|xdmp:log-level|xdmp:log|xdmp:lock-release|xdmp:lock-acquire|xdmp:load|xdmp:invoke-in|xdmp:invoke|xdmp:integer-to-octal|xdmp:integer-to-hex|xdmp:http-put|xdmp:http-post|xdmp:http-options|xdmp:http-head|xdmp:http-get|xdmp:http-delete|xdmp:hosts|xdmp:host-status|xdmp:host-name|xdmp:host|xdmp:hex-to-integer|xdmp:hash64|xdmp:hash32|xdmp:has-privilege|xdmp:groups|xdmp:group-serves|xdmp:group-servers|xdmp:group-name|xdmp:group-hosts|xdmp:group|xdmp:get-session-field-names|xdmp:get-session-field|xdmp:get-response-encoding|xdmp:get-response-code|xdmp:get-request-username|xdmp:get-request-user|xdmp:get-request-url|xdmp:get-request-protocol|xdmp:get-request-path|xdmp:get-request-method|xdmp:get-request-header-names|xdmp:get-request-header|xdmp:get-request-field-names|xdmp:get-request-field-filename|xdmp:get-request-field-content-type|xdmp:get-request-field|xdmp:get-request-client-certificate|xdmp:get-request-client-address|xdmp:get-request-body|xdmp:get-current-user|xdmp:get-current-roles|xdmp:get|xdmp:function-name|xdmp:function-module|xdmp:function|xdmp:from-json|xdmp:forests|xdmp:forest-status|xdmp:forest-restore|xdmp:forest-restart|xdmp:forest-name|xdmp:forest-delete|xdmp:forest-databases|xdmp:forest-counts|xdmp:forest-clear|xdmp:forest-backup|xdmp:forest|xdmp:filesystem-file|xdmp:filesystem-directory|xdmp:exists|xdmp:excel-convert|xdmp:eval-in|xdmp:eval|xdmp:estimate|xdmp:email|xdmp:element-content-type|xdmp:elapsed-time|xdmp:document-set-quality|xdmp:document-set-property|xdmp:document-set-properties|xdmp:document-set-permissions|xdmp:document-set-collections|xdmp:document-remove-properties|xdmp:document-remove-permissions|xdmp:document-remove-collections|xdmp:document-properties|xdmp:document-locks|xdmp:document-load|xdmp:document-insert|xdmp:document-get-quality|xdmp:document-get-properties|xdmp:document-get-permissions|xdmp:document-get-collections|xdmp:document-get|xdmp:document-forest|xdmp:document-delete|xdmp:document-add-properties|xdmp:document-add-permissions|xdmp:document-add-collections|xdmp:directory-properties|xdmp:directory-locks|xdmp:directory-delete|xdmp:directory-create|xdmp:directory|xdmp:diacritic-less|xdmp:describe|xdmp:default-permissions|xdmp:default-collections|xdmp:databases|xdmp:database-restore-validate|xdmp:database-restore-status|xdmp:database-restore-cancel|xdmp:database-restore|xdmp:database-name|xdmp:database-forests|xdmp:database-backup-validate|xdmp:database-backup-status|xdmp:database-backup-purge|xdmp:database-backup-cancel|xdmp:database-backup|xdmp:database|xdmp:collection-properties|xdmp:collection-locks|xdmp:collection-delete|xdmp:collation-canonical-uri|xdmp:castable-as|xdmp:can-grant-roles|xdmp:base64-encode|xdmp:base64-decode|xdmp:architecture|xdmp:apply|xdmp:amp-roles|xdmp:amp|xdmp:add64|xdmp:add-response-header|xdmp:access|trgr:trigger-set-recursive|trgr:trigger-set-permissions|trgr:trigger-set-name|trgr:trigger-set-module|trgr:trigger-set-event|trgr:trigger-set-description|trgr:trigger-remove-permissions|trgr:trigger-module|trgr:trigger-get-permissions|trgr:trigger-enable|trgr:trigger-disable|trgr:trigger-database-online-event|trgr:trigger-data-event|trgr:trigger-add-permissions|trgr:remove-trigger|trgr:property-content|trgr:pre-commit|trgr:post-commit|trgr:get-trigger-by-id|trgr:get-trigger|trgr:document-scope|trgr:document-content|trgr:directory-scope|trgr:create-trigger|trgr:collection-scope|trgr:any-property-content|thsr:set-entry|thsr:remove-term|thsr:remove-synonym|thsr:remove-entry|thsr:query-lookup|thsr:lookup|thsr:load|thsr:insert|thsr:expand|thsr:add-synonym|spell:suggest-detailed|spell:suggest|spell:remove-word|spell:make-dictionary|spell:load|spell:levenshtein-distance|spell:is-correct|spell:insert|spell:double-metaphone|spell:add-word|sec:users-collection|sec:user-set-roles|sec:user-set-password|sec:user-set-name|sec:user-set-description|sec:user-set-default-permissions|sec:user-set-default-collections|sec:user-remove-roles|sec:user-privileges|sec:user-get-roles|sec:user-get-description|sec:user-get-default-permissions|sec:user-get-default-collections|sec:user-doc-permissions|sec:user-doc-collections|sec:user-add-roles|sec:unprotect-collection|sec:uid-for-name|sec:set-realm|sec:security-version|sec:security-namespace|sec:security-installed|sec:security-collection|sec:roles-collection|sec:role-set-roles|sec:role-set-name|sec:role-set-description|sec:role-set-default-permissions|sec:role-set-default-collections|sec:role-remove-roles|sec:role-privileges|sec:role-get-roles|sec:role-get-description|sec:role-get-default-permissions|sec:role-get-default-collections|sec:role-doc-permissions|sec:role-doc-collections|sec:role-add-roles|sec:remove-user|sec:remove-role-from-users|sec:remove-role-from-role|sec:remove-role-from-privileges|sec:remove-role-from-amps|sec:remove-role|sec:remove-privilege|sec:remove-amp|sec:protect-collection|sec:privileges-collection|sec:privilege-set-roles|sec:privilege-set-name|sec:privilege-remove-roles|sec:privilege-get-roles|sec:privilege-add-roles|sec:priv-doc-permissions|sec:priv-doc-collections|sec:get-user-names|sec:get-unique-elem-id|sec:get-role-names|sec:get-role-ids|sec:get-privilege|sec:get-distinct-permissions|sec:get-collection|sec:get-amp|sec:create-user-with-role|sec:create-user|sec:create-role|sec:create-privilege|sec:create-amp|sec:collections-collection|sec:collection-set-permissions|sec:collection-remove-permissions|sec:collection-get-permissions|sec:collection-add-permissions|sec:check-admin|sec:amps-collection|sec:amp-set-roles|sec:amp-remove-roles|sec:amp-get-roles|sec:amp-doc-permissions|sec:amp-doc-collections|sec:amp-add-roles|search:unparse|search:suggest|search:snippet|search:search|search:resolve-nodes|search:resolve|search:remove-constraint|search:parse|search:get-default-options|search:estimate|search:check-options|prof:value|prof:reset|prof:report|prof:invoke|prof:eval|prof:enable|prof:disable|prof:allowed|ppt:clean|pki:template-set-request|pki:template-set-name|pki:template-set-key-type|pki:template-set-key-options|pki:template-set-description|pki:template-in-use|pki:template-get-version|pki:template-get-request|pki:template-get-name|pki:template-get-key-type|pki:template-get-key-options|pki:template-get-id|pki:template-get-description|pki:need-certificate|pki:is-temporary|pki:insert-trusted-certificates|pki:insert-template|pki:insert-signed-certificates|pki:insert-certificate-revocation-list|pki:get-trusted-certificate-ids|pki:get-template-ids|pki:get-template-certificate-authority|pki:get-template-by-name|pki:get-template|pki:get-pending-certificate-requests-xml|pki:get-pending-certificate-requests-pem|pki:get-pending-certificate-request|pki:get-certificates-for-template-xml|pki:get-certificates-for-template|pki:get-certificates|pki:get-certificate-xml|pki:get-certificate-pem|pki:get-certificate|pki:generate-temporary-certificate-if-necessary|pki:generate-temporary-certificate|pki:generate-template-certificate-authority|pki:generate-certificate-request|pki:delete-template|pki:delete-certificate|pki:create-template|pdf:make-toc|pdf:insert-toc-headers|pdf:get-toc|pdf:clean|p:status-transition|p:state-transition|p:remove|p:pipelines|p:insert|p:get-by-id|p:get|p:execute|p:create|p:condition|p:collection|p:action|ooxml:runs-merge|ooxml:package-uris|ooxml:package-parts-insert|ooxml:package-parts|msword:clean|mcgm:polygon|mcgm:point|mcgm:geospatial-query-from-elements|mcgm:geospatial-query|mcgm:circle|math:tanh|math:tan|math:sqrt|math:sinh|math:sin|math:pow|math:modf|math:log10|math:log|math:ldexp|math:frexp|math:fmod|math:floor|math:fabs|math:exp|math:cosh|math:cos|math:ceil|math:atan2|math:atan|math:asin|math:acos|map:put|map:map|map:keys|map:get|map:delete|map:count|map:clear|lnk:to|lnk:remove|lnk:insert|lnk:get|lnk:from|lnk:create|kml:polygon|kml:point|kml:interior-polygon|kml:geospatial-query-from-elements|kml:geospatial-query|kml:circle|kml:box|gml:polygon|gml:point|gml:interior-polygon|gml:geospatial-query-from-elements|gml:geospatial-query|gml:circle|gml:box|georss:point|georss:geospatial-query|georss:circle|geo:polygon|geo:point|geo:interior-polygon|geo:geospatial-query-from-elements|geo:geospatial-query|geo:circle|geo:box|fn:zero-or-one|fn:years-from-duration|fn:year-from-dateTime|fn:year-from-date|fn:upper-case|fn:unordered|fn:true|fn:translate|fn:trace|fn:tokenize|fn:timezone-from-time|fn:timezone-from-dateTime|fn:timezone-from-date|fn:sum|fn:subtract-dateTimes-yielding-yearMonthDuration|fn:subtract-dateTimes-yielding-dayTimeDuration|fn:substring-before|fn:substring-after|fn:substring|fn:subsequence|fn:string-to-codepoints|fn:string-pad|fn:string-length|fn:string-join|fn:string|fn:static-base-uri|fn:starts-with|fn:seconds-from-time|fn:seconds-from-duration|fn:seconds-from-dateTime|fn:round-half-to-even|fn:round|fn:root|fn:reverse|fn:resolve-uri|fn:resolve-QName|fn:replace|fn:remove|fn:QName|fn:prefix-from-QName|fn:position|fn:one-or-more|fn:number|fn:not|fn:normalize-unicode|fn:normalize-space|fn:node-name|fn:node-kind|fn:nilled|fn:namespace-uri-from-QName|fn:namespace-uri-for-prefix|fn:namespace-uri|fn:name|fn:months-from-duration|fn:month-from-dateTime|fn:month-from-date|fn:minutes-from-time|fn:minutes-from-duration|fn:minutes-from-dateTime|fn:min|fn:max|fn:matches|fn:lower-case|fn:local-name-from-QName|fn:local-name|fn:last|fn:lang|fn:iri-to-uri|fn:insert-before|fn:index-of|fn:in-scope-prefixes|fn:implicit-timezone|fn:idref|fn:id|fn:hours-from-time|fn:hours-from-duration|fn:hours-from-dateTime|fn:floor|fn:false|fn:expanded-QName|fn:exists|fn:exactly-one|fn:escape-uri|fn:escape-html-uri|fn:error|fn:ends-with|fn:encode-for-uri|fn:empty|fn:document-uri|fn:doc-available|fn:doc|fn:distinct-values|fn:distinct-nodes|fn:default-collation|fn:deep-equal|fn:days-from-duration|fn:day-from-dateTime|fn:day-from-date|fn:data|fn:current-time|fn:current-dateTime|fn:current-date|fn:count|fn:contains|fn:concat|fn:compare|fn:collection|fn:codepoints-to-string|fn:codepoint-equal|fn:ceiling|fn:boolean|fn:base-uri|fn:avg|fn:adjust-time-to-timezone|fn:adjust-dateTime-to-timezone|fn:adjust-date-to-timezone|fn:abs|feed:unsubscribe|feed:subscription|feed:subscribe|feed:request|feed:item|feed:description|excel:clean|entity:enrich|dom:set-pipelines|dom:set-permissions|dom:set-name|dom:set-evaluation-context|dom:set-domain-scope|dom:set-description|dom:remove-pipeline|dom:remove-permissions|dom:remove|dom:get|dom:evaluation-context|dom:domains|dom:domain-scope|dom:create|dom:configuration-set-restart-user|dom:configuration-set-permissions|dom:configuration-set-evaluation-context|dom:configuration-set-default-domain|dom:configuration-get|dom:configuration-create|dom:collection|dom:add-pipeline|dom:add-permissions|dls:retention-rules|dls:retention-rule-remove|dls:retention-rule-insert|dls:retention-rule|dls:purge|dls:node-expand|dls:link-references|dls:link-expand|dls:documents-query|dls:document-versions-query|dls:document-version-uri|dls:document-version-query|dls:document-version-delete|dls:document-version-as-of|dls:document-version|dls:document-update|dls:document-unmanage|dls:document-set-quality|dls:document-set-property|dls:document-set-properties|dls:document-set-permissions|dls:document-set-collections|dls:document-retention-rules|dls:document-remove-properties|dls:document-remove-permissions|dls:document-remove-collections|dls:document-purge|dls:document-manage|dls:document-is-managed|dls:document-insert-and-manage|dls:document-include-query|dls:document-history|dls:document-get-permissions|dls:document-extract-part|dls:document-delete|dls:document-checkout-status|dls:document-checkout|dls:document-checkin|dls:document-add-properties|dls:document-add-permissions|dls:document-add-collections|dls:break-checkout|dls:author-query|dls:as-of-query|dbk:convert|dbg:wait|dbg:value|dbg:stopped|dbg:stop|dbg:step|dbg:status|dbg:stack|dbg:out|dbg:next|dbg:line|dbg:invoke|dbg:function|dbg:finish|dbg:expr|dbg:eval|dbg:disconnect|dbg:detach|dbg:continue|dbg:connect|dbg:clear|dbg:breakpoints|dbg:break|dbg:attached|dbg:attach|cvt:save-converted-documents|cvt:part-uri|cvt:destination-uri|cvt:basepath|cvt:basename|cts:words|cts:word-query-weight|cts:word-query-text|cts:word-query-options|cts:word-query|cts:word-match|cts:walk|cts:uris|cts:uri-match|cts:train|cts:tokenize|cts:thresholds|cts:stem|cts:similar-query-weight|cts:similar-query-nodes|cts:similar-query|cts:shortest-distance|cts:search|cts:score|cts:reverse-query-weight|cts:reverse-query-nodes|cts:reverse-query|cts:remainder|cts:registered-query-weight|cts:registered-query-options|cts:registered-query-ids|cts:registered-query|cts:register|cts:query|cts:quality|cts:properties-query-query|cts:properties-query|cts:polygon-vertices|cts:polygon|cts:point-longitude|cts:point-latitude|cts:point|cts:or-query-queries|cts:or-query|cts:not-query-weight|cts:not-query-query|cts:not-query|cts:near-query-weight|cts:near-query-queries|cts:near-query-options|cts:near-query-distance|cts:near-query|cts:highlight|cts:geospatial-co-occurrences|cts:frequency|cts:fitness|cts:field-words|cts:field-word-query-weight|cts:field-word-query-text|cts:field-word-query-options|cts:field-word-query-field-name|cts:field-word-query|cts:field-word-match|cts:entity-highlight|cts:element-words|cts:element-word-query-weight|cts:element-word-query-text|cts:element-word-query-options|cts:element-word-query-element-name|cts:element-word-query|cts:element-word-match|cts:element-values|cts:element-value-ranges|cts:element-value-query-weight|cts:element-value-query-text|cts:element-value-query-options|cts:element-value-query-element-name|cts:element-value-query|cts:element-value-match|cts:element-value-geospatial-co-occurrences|cts:element-value-co-occurrences|cts:element-range-query-weight|cts:element-range-query-value|cts:element-range-query-options|cts:element-range-query-operator|cts:element-range-query-element-name|cts:element-range-query|cts:element-query-query|cts:element-query-element-name|cts:element-query|cts:element-pair-geospatial-values|cts:element-pair-geospatial-value-match|cts:element-pair-geospatial-query-weight|cts:element-pair-geospatial-query-region|cts:element-pair-geospatial-query-options|cts:element-pair-geospatial-query-longitude-name|cts:element-pair-geospatial-query-latitude-name|cts:element-pair-geospatial-query-element-name|cts:element-pair-geospatial-query|cts:element-pair-geospatial-boxes|cts:element-geospatial-values|cts:element-geospatial-value-match|cts:element-geospatial-query-weight|cts:element-geospatial-query-region|cts:element-geospatial-query-options|cts:element-geospatial-query-element-name|cts:element-geospatial-query|cts:element-geospatial-boxes|cts:element-child-geospatial-values|cts:element-child-geospatial-value-match|cts:element-child-geospatial-query-weight|cts:element-child-geospatial-query-region|cts:element-child-geospatial-query-options|cts:element-child-geospatial-query-element-name|cts:element-child-geospatial-query-child-name|cts:element-child-geospatial-query|cts:element-child-geospatial-boxes|cts:element-attribute-words|cts:element-attribute-word-query-weight|cts:element-attribute-word-query-text|cts:element-attribute-word-query-options|cts:element-attribute-word-query-element-name|cts:element-attribute-word-query-attribute-name|cts:element-attribute-word-query|cts:element-attribute-word-match|cts:element-attribute-values|cts:element-attribute-value-ranges|cts:element-attribute-value-query-weight|cts:element-attribute-value-query-text|cts:element-attribute-value-query-options|cts:element-attribute-value-query-element-name|cts:element-attribute-value-query-attribute-name|cts:element-attribute-value-query|cts:element-attribute-value-match|cts:element-attribute-value-geospatial-co-occurrences|cts:element-attribute-value-co-occurrences|cts:element-attribute-range-query-weight|cts:element-attribute-range-query-value|cts:element-attribute-range-query-options|cts:element-attribute-range-query-operator|cts:element-attribute-range-query-element-name|cts:element-attribute-range-query-attribute-name|cts:element-attribute-range-query|cts:element-attribute-pair-geospatial-values|cts:element-attribute-pair-geospatial-value-match|cts:element-attribute-pair-geospatial-query-weight|cts:element-attribute-pair-geospatial-query-region|cts:element-attribute-pair-geospatial-query-options|cts:element-attribute-pair-geospatial-query-longitude-name|cts:element-attribute-pair-geospatial-query-latitude-name|cts:element-attribute-pair-geospatial-query-element-name|cts:element-attribute-pair-geospatial-query|cts:element-attribute-pair-geospatial-boxes|cts:document-query-uris|cts:document-query|cts:distance|cts:directory-query-uris|cts:directory-query-depth|cts:directory-query|cts:destination|cts:deregister|cts:contains|cts:confidence|cts:collections|cts:collection-query-uris|cts:collection-query|cts:collection-match|cts:classify|cts:circle-radius|cts:circle-center|cts:circle|cts:box-west|cts:box-south|cts:box-north|cts:box-east|cts:box|cts:bearing|cts:arc-intersection|cts:and-query-queries|cts:and-query-options|cts:and-query|cts:and-not-query-positive-query|cts:and-not-query-negative-query|cts:and-not-query|css:get|css:convert|cpf:success|cpf:failure|cpf:document-set-state|cpf:document-set-processing-status|cpf:document-set-last-updated|cpf:document-set-error|cpf:document-get-state|cpf:document-get-processing-status|cpf:document-get-last-updated|cpf:document-get-error|cpf:check-transition|alert:spawn-matching-actions|alert:rule-user-id-query|alert:rule-set-user-id|alert:rule-set-query|alert:rule-set-options|alert:rule-set-name|alert:rule-set-description|alert:rule-set-action|alert:rule-remove|alert:rule-name-query|alert:rule-insert|alert:rule-id-query|alert:rule-get-user-id|alert:rule-get-query|alert:rule-get-options|alert:rule-get-name|alert:rule-get-id|alert:rule-get-description|alert:rule-get-action|alert:rule-action-query|alert:remove-triggers|alert:make-rule|alert:make-log-action|alert:make-config|alert:make-action|alert:invoke-matching-actions|alert:get-my-rules|alert:get-all-rules|alert:get-actions|alert:find-matching-rules|alert:create-triggers|alert:config-set-uri|alert:config-set-trigger-ids|alert:config-set-options|alert:config-set-name|alert:config-set-description|alert:config-set-cpf-domain-names|alert:config-set-cpf-domain-ids|alert:config-insert|alert:config-get-uri|alert:config-get-trigger-ids|alert:config-get-options|alert:config-get-name|alert:config-get-id|alert:config-get-description|alert:config-get-cpf-domain-names|alert:config-get-cpf-domain-ids|alert:config-get|alert:config-delete|alert:action-set-options|alert:action-set-name|alert:action-set-module-root|alert:action-set-module-db|alert:action-set-module|alert:action-set-description|alert:action-remove|alert:action-insert|alert:action-get-options|alert:action-get-name|alert:action-get-module-root|alert:action-get-module-db|alert:action-get-module|alert:action-get-description|zero-or-one|years-from-duration|year-from-dateTime|year-from-date|upper-case|unordered|true|translate|trace|tokenize|timezone-from-time|timezone-from-dateTime|timezone-from-date|sum|subtract-dateTimes-yielding-yearMonthDuration|subtract-dateTimes-yielding-dayTimeDuration|substring-before|substring-after|substring|subsequence|string-to-codepoints|string-pad|string-length|string-join|string|static-base-uri|starts-with|seconds-from-time|seconds-from-duration|seconds-from-dateTime|round-half-to-even|round|root|reverse|resolve-uri|resolve-QName|replace|remove|QName|prefix-from-QName|position|one-or-more|number|not|normalize-unicode|normalize-space|node-name|node-kind|nilled|namespace-uri-from-QName|namespace-uri-for-prefix|namespace-uri|name|months-from-duration|month-from-dateTime|month-from-date|minutes-from-time|minutes-from-duration|minutes-from-dateTime|min|max|matches|lower-case|local-name-from-QName|local-name|last|lang|iri-to-uri|insert-before|index-of|in-scope-prefixes|implicit-timezone|idref|id|hours-from-time|hours-from-duration|hours-from-dateTime|floor|false|expanded-QName|exists|exactly-one|escape-uri|escape-html-uri|error|ends-with|encode-for-uri|empty|document-uri|doc-available|doc|distinct-values|distinct-nodes|default-collation|deep-equal|days-from-duration|day-from-dateTime|day-from-date|data|current-time|current-dateTime|current-date|count|contains|concat|compare|collection|codepoints-to-string|codepoint-equal|ceiling|boolean|base-uri|avg|adjust-time-to-timezone|adjust-dateTime-to-timezone|adjust-date-to-timezone|abs)\b/], +["pln",/^[\w:-]+/],["pln",/^[\t\n\r \xa0]+/]]),["xq","xquery"]); diff --git a/public/javascripts/prettyprint/lang-yaml.js b/public/javascripts/prettyprint/lang-yaml.js new file mode 100644 index 0000000..c38729b --- /dev/null +++ b/public/javascripts/prettyprint/lang-yaml.js @@ -0,0 +1,2 @@ +var a=null; +PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \t\r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]); diff --git a/public/javascripts/prettyprint/prettify.css b/public/javascripts/prettyprint/prettify.css new file mode 100644 index 0000000..5e73651 --- /dev/null +++ b/public/javascripts/prettyprint/prettify.css @@ -0,0 +1,42 @@ +.com { color: #93a1a1; } +.lit { color: #195f91; } +.pun, .opn, .clo { color: #93a1a1; } +.fun { color: #dc322f; } +.str, .atv { color: #268bd2; } +.kwd, .tag { color: #195f91; } +.typ, .atn, .dec, .var { color: #CB4B16; } +.pln { color: #93a1a1; } +pre.prettyprint { + background: #fefbf3; + padding: 9px; + border: 1px solid rgba(0,0,0,.2); + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.1); + -moz-box-shadow: 0 1px 2px rgba(0,0,0,.1); + box-shadow: 0 1px 2px rgba(0,0,0,.1); +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin: 0 0 0 40px; } /* IE indents via margin-left */ +ol.linenums li { color: rgba(0,0,0,.15); line-height: 20px; } +/* Alternate shading for lines */ +li.L1, li.L3, li.L5, li.L7, li.L9 { } + +/* +$base03: #002b36; +$base02: #073642; +$base01: #586e75; +$base00: #657b83; +$base0: #839496; +$base1: #93a1a1; +$base2: #eee8d5; +$base3: #fdf6e3; +$yellow: #b58900; +$orange: #cb4b16; +$red: #dc322f; +$magenta: #d33682; +$violet: #6c71c4; +$blue: #268bd2; +$cyan: #2aa198; +$green: #859900; +*/ + diff --git a/public/javascripts/prettyprint/prettify.js b/public/javascripts/prettyprint/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/public/javascripts/prettyprint/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p