auto merge of #12783 : adrientetar/rust/more-docs, r=alexcrichton

- remove `node.js` dep., it has no effect as of #12747 (1)
- switch between LaTeX compilers, some cleanups
- CSS: fixup the print stylesheet, refactor highlighting code (2)

(1): `prep.js` outputs its own HTML directives, which `pandoc` cannot recognize when converting the document into LaTeX (this is why the PDF docs have never been highlighted as of now).

Note that if we were to add the `.rust` class to snippets, we could probably use pandoc's native highlighting capatibilities i.e. Kate ([here is](http://adrientetar.github.io/rust-tuts/tutorial/tutorial.pdf) an example of that).

(2): the only real highlighting change is for lifetimes which are now brown instead of red, the rest is just refactor of twos shades of red that look the same.
Also I made numbers highlighting for src in rustdoc a tint more clear so that it is less bothering.

@alexcrichton, @huonw

Closes #9873. Closes #12788.
This commit is contained in:
bors 2014-03-11 12:36:58 -07:00
commit 74bfa7108a
12 changed files with 67 additions and 764 deletions

5
configure vendored
View file

@ -454,9 +454,8 @@ probe CFG_ISCC iscc
probe CFG_LLNEXTGEN LLnextgen probe CFG_LLNEXTGEN LLnextgen
probe CFG_PANDOC pandoc probe CFG_PANDOC pandoc
probe CFG_PDFLATEX pdflatex probe CFG_PDFLATEX pdflatex
probe CFG_XETEX xetex probe CFG_XELATEX xelatex
probe CFG_LUATEX luatex probe CFG_LUALATEX lualatex
probe CFG_NODE nodejs node
probe CFG_GDB gdb probe CFG_GDB gdb
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ] if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then then

View file

@ -27,9 +27,9 @@
# translated. # translated.
###################################################################### ######################################################################
DOCS := index tutorial guide-ffi guide-macros guide-lifetimes \ DOCS := index tutorial guide-ffi guide-macros guide-lifetimes \
guide-tasks guide-container guide-pointers \ guide-tasks guide-container guide-pointers guide-testing \
complement-cheatsheet guide-runtime \ guide-runtime complement-bugreport complement-cheatsheet \
rust rustdoc complement-lang-faq complement-project-faq rust rustdoc
PDF_DOCS := tutorial rust PDF_DOCS := tutorial rust
@ -46,7 +46,7 @@ RUSTDOC_HTML_OPTS = --markdown-css rust.css \
--markdown-in-header=doc/favicon.inc --markdown-after-content=doc/footer.inc --markdown-in-header=doc/favicon.inc --markdown-after-content=doc/footer.inc
PANDOC_BASE_OPTS := --standalone --toc --number-sections PANDOC_BASE_OPTS := --standalone --toc --number-sections
PANDOC_TEX_OPTS = $(PANDOC_BASE_OPTS) --include-before-body=doc/version.md \ PANDOC_TEX_OPTS = $(PANDOC_BASE_OPTS) --include-before-body=doc/version.tex \
--from=markdown --include-before-body=doc/footer.tex --to=latex --from=markdown --include-before-body=doc/footer.tex --to=latex
PANDOC_EPUB_OPTS = $(PANDOC_BASE_OPTS) --to=epub PANDOC_EPUB_OPTS = $(PANDOC_BASE_OPTS) --to=epub
@ -73,18 +73,20 @@ endif
# Check for the various external utilities for the EPUB/PDF docs: # Check for the various external utilities for the EPUB/PDF docs:
ifeq ($(CFG_PDFLATEX),) ifeq ($(CFG_PDFLATEX),)
$(info cfg: no pdflatex found, omitting doc/rust.pdf) $(info cfg: no pdflatex found, deferring to xelatex)
NO_PDF_DOCS = 1 ifeq ($(CFG_XELATEX),)
else $(info cfg: no xelatex found, deferring to lualatex)
ifeq ($(CFG_XETEX),) ifeq ($(CFG_LUALATEX),)
$(info cfg: no xetex found, disabling doc/rust.pdf) $(info cfg: no lualatex found, disabling LaTeX docs)
NO_PDF_DOCS = 1 NO_PDF_DOCS = 1
else
CFG_LATEX := $(CFG_LUALATEX)
endif
else else
ifeq ($(CFG_LUATEX),) CFG_LATEX := $(CFG_XELATEX)
$(info cfg: lacking luatex, disabling pdflatex)
NO_PDF_DOCS = 1
endif
endif endif
else
CFG_LATEX := $(CFG_PDFLATEX)
endif endif
@ -93,17 +95,12 @@ $(info cfg: no pandoc found, omitting PDF and EPUB docs)
ONLY_HTML_DOCS = 1 ONLY_HTML_DOCS = 1
endif endif
ifeq ($(CFG_NODE),)
$(info cfg: no node found, omitting PDF and EPUB docs)
ONLY_HTML_DOCS = 1
endif
###################################################################### ######################################################################
# Rust version # Rust version
###################################################################### ######################################################################
doc/version.md: $(MKFILE_DEPS) $(wildcard $(D)/*.*) | doc/ doc/version.tex: $(MKFILE_DEPS) $(wildcard $(D)/*.*) | doc/
@$(call E, version-stamp: $@) @$(call E, version-stamp: $@)
$(Q)echo "$(CFG_VERSION)" >$@ $(Q)echo "$(CFG_VERSION)" >$@
@ -115,10 +112,10 @@ doc/version_info.html: $(D)/version_info.html.template $(MKFILE_DEPS) \
$(CFG_VER_HASH) | head -c 8)/;\ $(CFG_VER_HASH) | head -c 8)/;\
s/STAMP/$(CFG_VER_HASH)/;" $< >$@ s/STAMP/$(CFG_VER_HASH)/;" $< >$@
GENERATED += doc/version.md doc/version_info.html GENERATED += doc/version.tex doc/version_info.html
###################################################################### ######################################################################
# Docs, from rustdoc and sometimes pandoc & node # Docs, from rustdoc and sometimes pandoc
###################################################################### ######################################################################
doc/: doc/:
@ -143,10 +140,6 @@ doc/footer.inc: $(D)/footer.inc | doc/
@$(call E, cp: $@) @$(call E, cp: $@)
$(Q)cp -a $< $@ 2> /dev/null $(Q)cp -a $< $@ 2> /dev/null
doc/footer.tex: $(D)/footer.tex | doc/
@$(call E, cp: $@)
$(Q)cp -a $< $@ 2> /dev/null
# The (english) documentation for each doc item. # The (english) documentation for each doc item.
define DEF_SHOULD_BUILD_PDF_DOC define DEF_SHOULD_BUILD_PDF_DOC
@ -168,22 +161,24 @@ ifneq ($(ONLY_HTML_DOCS),1)
DOC_TARGETS += doc/$(1).epub DOC_TARGETS += doc/$(1).epub
doc/$(1).epub: $$(D)/$(1).md | doc/ doc/$(1).epub: $$(D)/$(1).md | doc/
@$$(call E, pandoc: $$@) @$$(call E, pandoc: $$@)
$$(Q)$$(CFG_NODE) $$(D)/prep.js --highlight $$< | \ $$(CFG_PANDOC) $$(PANDOC_EPUB_OPTS) $$< --output=$$@
$$(CFG_PANDOC) $$(PANDOC_EPUB_OPTS) --output=$$@
doc/footer.tex: $(D)/footer.inc | doc/
@$$(call E, pandoc: $$@)
$$(CFG_PANDOC) --from=html --to=latex $$< --output=$$@
# PDF (md =(pandoc)=> tex =(pdflatex)=> pdf) # PDF (md =(pandoc)=> tex =(pdflatex)=> pdf)
DOC_TARGETS += doc/$(1).tex DOC_TARGETS += doc/$(1).tex
doc/$(1).tex: $$(D)/$(1).md doc/footer.tex doc/version.md | doc/ doc/$(1).tex: $$(D)/$(1).md doc/footer.tex doc/version.tex | doc/
@$$(call E, pandoc: $$@) @$$(call E, pandoc: $$@)
$$(Q)$$(CFG_NODE) $$(D)/prep.js $$< | \ $$(CFG_PANDOC) $$(PANDOC_TEX_OPTS) $$< --output=$$@
$$(CFG_PANDOC) $$(PANDOC_TEX_OPTS) --output=$$@
ifneq ($(NO_PDF_DOCS),1) ifneq ($(NO_PDF_DOCS),1)
ifeq ($$(SHOULD_BUILD_PDF_DOC_$(1)),1) ifeq ($$(SHOULD_BUILD_PDF_DOC_$(1)),1)
DOC_TARGETS += doc/$(1).pdf DOC_TARGETS += doc/$(1).pdf
doc/$(1).pdf: doc/$(1).tex doc/$(1).pdf: doc/$(1).tex
@$$(call E, pdflatex: $$@) @$$(call E, latex compiler: $$@)
$$(Q)$$(CFG_PDFLATEX) \ $$(Q)$$(CFG_LATEX) \
-interaction=batchmode \ -interaction=batchmode \
-output-directory=doc \ -output-directory=doc \
$$< $$<

View file

@ -4,10 +4,6 @@
document converter, is required to generate docs as HTML from Rust's document converter, is required to generate docs as HTML from Rust's
source code. source code.
[Node.js](http://nodejs.org/) is also required for generating HTML from
the Markdown docs (reference manual, tutorials, etc.) distributed with
this git repository.
[po4a](http://po4a.alioth.debian.org/) is required for generating translated [po4a](http://po4a.alioth.debian.org/) is required for generating translated
docs from the master (English) docs. docs from the master (English) docs.
@ -30,8 +26,8 @@ rustdoc --output-dir html-doc/ --output-format html ../src/libstd/path.rs
# Additional notes # Additional notes
To generate an HTML version of a doc from Markdown without having Node.js To generate an HTML version of a doc from Markdown manually, you can do
installed, you can do something like: something like:
~~~~ ~~~~
pandoc --from=markdown --to=html5 --number-sections -o rust.html rust.md pandoc --from=markdown --to=html5 --number-sections -o rust.html rust.md

View file

@ -1,7 +0,0 @@
Copyright © 2011-2014 The Rust Project Developers. Licensed under the
\href{http://www.apache.org/licenses/LICENSE-2.0}{Apache License,
Version 2.0} or the \href{http://opensource.org/licenses/MIT}{MIT
license}, at your option.
This file may not be copied, modified, or distributed except according
to those terms.

View file

@ -1,146 +0,0 @@
// Copyright (C) 2013 by Marijn Haverbeke <marijnh@gmail.com> and others
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
exports.htmlEscape = function(text) {
var replacements = {"<": "&lt;", ">": "&gt;",
"&": "&amp;", "\"": "&quot;"};
return text.replace(/[<>&"]/g, function(character) {
return replacements[character];
});
};
exports.splitLines = function(string){return string.split(/\r?\n/);};
// Counts the column offset in a string, taking tabs into account.
// Used mostly to find indentation.
function countColumn(string, end) {
tabSize = 4;
if (end == null) {
end = string.search(/[^\s\u00a0]/);
if (end == -1) end = string.length;
}
for (var i = 0, n = 0; i < end; ++i) {
if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
else ++n;
}
return n;
}
function StringStream(string) {
this.pos = this.start = 0;
this.string = string;
}
StringStream.prototype = {
eol: function() {return this.pos >= this.string.length;},
sol: function() {return this.pos == 0;},
peek: function() {return this.string.charAt(this.pos);},
next: function() {
if (this.pos < this.string.length)
return this.string.charAt(this.pos++);
},
eat: function(match) {
var ch = this.string.charAt(this.pos);
if (typeof match == "string") var ok = ch == match;
else var ok = ch && (match.test ? match.test(ch) : match(ch));
if (ok) {++this.pos; return ch;}
},
eatWhile: function(match) {
var start = this.pos;
while (this.eat(match)){}
return this.pos > start;
},
eatSpace: function() {
var start = this.pos;
while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
return this.pos > start;
},
skipToEnd: function() {this.pos = this.string.length;},
skipTo: function(ch) {
var found = this.string.indexOf(ch, this.pos);
if (found > -1) {this.pos = found; return true;}
},
backUp: function(n) {this.pos -= n;},
column: function() {return countColumn(this.string, this.start);},
indentation: function() {return countColumn(this.string);},
match: function(pattern, consume, caseInsensitive) {
if (typeof pattern == "string") {
function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
if (consume !== false) this.pos += pattern.length;
return true;
}
}
else {
var match = this.string.slice(this.pos).match(pattern);
if (match && consume !== false) this.pos += match[0].length;
return match;
}
},
current: function(){return this.string.slice(this.start, this.pos);}
};
exports.StringStream = StringStream;
exports.startState = function(mode, a1, a2) {
return mode.startState ? mode.startState(a1, a2) : true;
};
var modes = {}, mimeModes = {};
exports.defineMode = function(name, mode) { modes[name] = mode; };
exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; };
exports.getMode = function(options, spec) {
if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
spec = mimeModes[spec];
if (typeof spec == "string")
var mname = spec, config = {};
else if (spec != null)
var mname = spec.name, config = spec;
var mfactory = modes[mname];
if (!mfactory) throw new Error("Unknown mode: " + spec);
return mfactory(options, config || {});
};
exports.runMode = function(string, modespec, callback) {
var mode = exports.getMode({indentUnit: 2}, modespec);
var isNode = callback.nodeType == 1;
if (isNode) {
var node = callback, accum = [];
callback = function(string, style) {
if (string == "\n")
accum.push("<br>");
else if (style)
accum.push("<span class=\"cm-" + exports.htmlEscape(style) + "\">" +
exports.htmlEscape(string) + "</span>");
else
accum.push(exports.htmlEscape(string));
}
}
var lines = exports.splitLines(string), state = exports.startState(mode);
for (var i = 0, e = lines.length; i < e; ++i) {
if (i) callback("\n");
var stream = new exports.StringStream(lines[i]);
while (!stream.eol()) {
var style = mode.token(stream, state);
callback(stream.current(), style, i, stream.start);
stream.start = stream.pos;
}
}
if (isNode)
node.innerHTML = accum.join("");
};

View file

@ -1,453 +0,0 @@
// Copyright (C) 2013 by Marijn Haverbeke <marijnh@gmail.com> and others
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
CodeMirror.defineMode("rust", function() {
var indentUnit = 4, altIndentUnit = 2;
var valKeywords = {
"if": "if-style", "while": "if-style", "loop": "if-style", "else": "else-style",
"do": "else-style", "return": "else-style",
"break": "atom", "cont": "atom", "const": "let", "resource": "fn",
"let": "let", "fn": "fn", "for": "for", "match": "match", "trait": "trait",
"impl": "impl", "type": "type", "enum": "enum", "struct": "atom", "mod": "mod",
"as": "op", "true": "atom", "false": "atom", "assert": "op", "check": "op",
"claim": "op", "extern": "ignore", "unsafe": "ignore", "import": "else-style",
"export": "else-style", "copy": "op", "log": "op",
"use": "op", "self": "atom", "pub": "atom", "priv": "atom"
};
var typeKeywords = function() {
var keywords = {"fn": "fn"};
var atoms = "bool uint int i8 i16 i32 i64 u8 u16 u32 u64 float f32 f64 str char".split(" ");
for (var i = 0, e = atoms.length; i < e; ++i) keywords[atoms[i]] = "atom";
return keywords;
}();
var operatorChar = /[+\-*&%=<>!?|\.@]/;
// Tokenizer
// Used as scratch variable to communicate multiple values without
// consing up tons of objects.
var tcat, content;
function r(tc, style) {
tcat = tc;
return style;
}
function tokenBase(stream, state) {
var ch = stream.next();
if (ch == '"') {
state.tokenize = tokenString;
return state.tokenize(stream, state);
}
if (ch == "'") {
tcat = "atom";
if (stream.eat("\\")) {
if (stream.skipTo("'")) { stream.next(); return "string"; }
else { return "error"; }
} else {
stream.next();
return stream.eat("'") ? "string" : "error";
}
}
if (ch == "/") {
if (stream.eat("/")) { stream.skipToEnd(); return "comment"; }
if (stream.eat("*")) {
state.tokenize = tokenComment(1);
return state.tokenize(stream, state);
}
}
if (ch == "#") {
if (stream.eat("[")) { tcat = "open-attr"; return null; }
stream.eatWhile(/\w/);
return r("macro", "meta");
}
if (ch == ":" && stream.match(":<")) {
return r("op", null);
}
if (ch.match(/\d/) || (ch == "." && stream.eat(/\d/))) {
var flp = false;
if (!stream.match(/^x[\da-f]+/i) && !stream.match(/^b[01]+/)) {
stream.eatWhile(/\d/);
if (stream.eat(".")) { flp = true; stream.eatWhile(/\d/); }
if (stream.match(/^e[+\-]?\d+/i)) { flp = true; }
}
if (flp) stream.match(/^f(?:32|64)/);
else stream.match(/^[ui](?:8|16|32|64)/);
return r("atom", "number");
}
if (ch.match(/[()\[\]{}:;,]/)) return r(ch, null);
if (ch == "-" && stream.eat(">")) return r("->", null);
if (ch.match(operatorChar)) {
stream.eatWhile(operatorChar);
return r("op", null);
}
stream.eatWhile(/\w/);
content = stream.current();
if (stream.match(/^::\w/)) {
stream.backUp(1);
return r("prefix", "variable-2");
}
if (state.keywords.propertyIsEnumerable(content))
return r(state.keywords[content], content.match(/true|false/) ? "atom" : "keyword");
return r("name", "variable");
}
function tokenString(stream, state) {
var ch, escaped = false;
while (ch = stream.next()) {
if (ch == '"' && !escaped) {
state.tokenize = tokenBase;
return r("atom", "string");
}
escaped = !escaped && ch == "\\";
}
// Hack to not confuse the parser when a string is split in
// pieces.
return r("op", "string");
}
function tokenComment(depth) {
return function(stream, state) {
var lastCh = null, ch;
while (ch = stream.next()) {
if (ch == "/" && lastCh == "*") {
if (depth == 1) {
state.tokenize = tokenBase;
break;
} else {
state.tokenize = tokenComment(depth - 1);
return state.tokenize(stream, state);
}
}
if (ch == "*" && lastCh == "/") {
state.tokenize = tokenComment(depth + 1);
return state.tokenize(stream, state);
}
lastCh = ch;
}
return "comment";
};
}
// Parser
var cx = {state: null, stream: null, marked: null, cc: null};
function pass() {
for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
}
function cont() {
pass.apply(null, arguments);
return true;
}
function pushlex(type, info) {
var result = function() {
var state = cx.state;
state.lexical = {indented: state.indented, column: cx.stream.column(),
type: type, prev: state.lexical, info: info};
};
result.lex = true;
return result;
}
function poplex() {
var state = cx.state;
if (state.lexical.prev) {
if (state.lexical.type == ")")
state.indented = state.lexical.indented;
state.lexical = state.lexical.prev;
}
}
function typecx() { cx.state.keywords = typeKeywords; }
function valcx() { cx.state.keywords = valKeywords; }
poplex.lex = typecx.lex = valcx.lex = true;
function commasep(comb, end) {
function more(type) {
if (type == ",") return cont(comb, more);
if (type == end) return cont();
return cont(more);
}
return function(type) {
if (type == end) return cont();
return pass(comb, more);
};
}
function stat_of(comb, tag) {
return cont(pushlex("stat", tag), comb, poplex, block);
}
function block(type) {
if (type == "}") return cont();
if (type == "let") return stat_of(letdef1, "let");
if (type == "fn") return stat_of(fndef);
if (type == "type") return cont(pushlex("stat"), tydef, endstatement, poplex, block);
if (type == "enum") return stat_of(tagdef);
if (type == "mod") return stat_of(mod);
if (type == "trait") return stat_of(trait);
if (type == "impl") return stat_of(impl);
if (type == "open-attr") return cont(pushlex("]"), commasep(expression, "]"), poplex);
if (type == "ignore" || type.match(/[\]\);,]/)) return cont(block);
return pass(pushlex("stat"), expression, poplex, endstatement, block);
}
function endstatement(type) {
if (type == ";") return cont();
return pass();
}
function expression(type) {
if (type == "atom" || type == "name") return cont(maybeop);
if (type == "{") return cont(pushlex("}"), exprbrace, poplex);
if (type.match(/[\[\(]/)) return matchBrackets(type, expression);
if (type.match(/[\]\)\};,]/)) return pass();
if (type == "if-style") return cont(expression, expression);
if (type == "else-style" || type == "op") return cont(expression);
if (type == "for") return cont(pattern, maybetype, inop, expression, expression);
if (type == "match") return cont(expression, altbody);
if (type == "fn") return cont(fndef);
if (type == "macro") return cont(macro);
return cont();
}
function maybeop(type) {
if (content == ".") return cont(maybeprop);
if (content == "::<"){return cont(typarams, maybeop);}
if (type == "op" || content == ":") return cont(expression);
if (type == "(" || type == "[") return matchBrackets(type, expression);
return pass();
}
function maybeprop(type) {
if (content.match(/^\w+$/)) {cx.marked = "variable"; return cont(maybeop);}
return pass(expression);
}
function exprbrace(type) {
if (type == "op") {
if (content == "|") return cont(blockvars, poplex, pushlex("}", "block"), block);
if (content == "||") return cont(poplex, pushlex("}", "block"), block);
}
if (content == "mut" || (content.match(/^\w+$/) && cx.stream.peek() == ":"
&& !cx.stream.match("::", false)))
return pass(record_of(expression));
return pass(block);
}
function record_of(comb) {
function ro(type) {
if (content == "mut" || content == "with") {cx.marked = "keyword"; return cont(ro);}
if (content.match(/^\w*$/)) {cx.marked = "variable"; return cont(ro);}
if (type == ":") return cont(comb, ro);
if (type == "}") return cont();
return cont(ro);
}
return ro;
}
function blockvars(type) {
if (type == "name") {cx.marked = "def"; return cont(blockvars);}
if (type == "op" && content == "|") return cont();
return cont(blockvars);
}
function letdef1(type) {
if (type.match(/[\]\)\};]/)) return cont();
if (content == "=") return cont(expression, letdef2);
if (type == ",") return cont(letdef1);
return pass(pattern, maybetype, letdef1);
}
function letdef2(type) {
if (type.match(/[\]\)\};,]/)) return pass(letdef1);
else return pass(expression, letdef2);
}
function maybetype(type) {
if (type == ":") return cont(typecx, rtype, valcx);
return pass();
}
function inop(type) {
if (type == "name" && content == "in") {cx.marked = "keyword"; return cont();}
return pass();
}
function fndef(type) {
if (content == "@" || content == "~") {cx.marked = "keyword"; return cont(fndef);}
if (type == "name") {cx.marked = "def"; return cont(fndef);}
if (content == "<") return cont(typarams, fndef);
if (type == "{") return pass(expression);
if (type == "(") return cont(pushlex(")"), commasep(argdef, ")"), poplex, fndef);
if (type == "->") return cont(typecx, rtype, valcx, fndef);
if (type == ";") return cont();
return cont(fndef);
}
function tydef(type) {
if (type == "name") {cx.marked = "def"; return cont(tydef);}
if (content == "<") return cont(typarams, tydef);
if (content == "=") return cont(typecx, rtype, valcx);
return cont(tydef);
}
function tagdef(type) {
if (type == "name") {cx.marked = "def"; return cont(tagdef);}
if (content == "<") return cont(typarams, tagdef);
if (content == "=") return cont(typecx, rtype, valcx, endstatement);
if (type == "{") return cont(pushlex("}"), typecx, tagblock, valcx, poplex);
return cont(tagdef);
}
function tagblock(type) {
if (type == "}") return cont();
if (type == "(") return cont(pushlex(")"), commasep(rtype, ")"), poplex, tagblock);
if (content.match(/^\w+$/)) cx.marked = "def";
return cont(tagblock);
}
function mod(type) {
if (type == "name") {cx.marked = "def"; return cont(mod);}
if (type == "{") return cont(pushlex("}"), block, poplex);
return pass();
}
function trait(type) {
if (type == "name") {cx.marked = "def"; return cont(trait);}
if (content == "<") return cont(typarams, trait);
if (type == "{") return cont(pushlex("}"), block, poplex);
return pass();
}
function impl(type) {
if (content == "<") return cont(typarams, impl);
if (content == "of" || content == "for") {cx.marked = "keyword"; return cont(rtype, impl);}
if (type == "name") {cx.marked = "def"; return cont(impl);}
if (type == "{") return cont(pushlex("}"), block, poplex);
return pass();
}
function typarams(type) {
if (content == ">") return cont();
if (content == ",") return cont(typarams);
if (content == ":") return cont(rtype, typarams);
return pass(rtype, typarams);
}
function argdef(type) {
if (type == "name") {cx.marked = "def"; return cont(argdef);}
if (type == ":") return cont(typecx, rtype, valcx);
return pass();
}
function rtype(type) {
if (type == "name") {cx.marked = "variable-3"; return cont(rtypemaybeparam); }
if (content == "mut") {cx.marked = "keyword"; return cont(rtype);}
if (type == "atom") return cont(rtypemaybeparam);
if (type == "op" || type == "obj") return cont(rtype);
if (type == "fn") return cont(fntype);
if (type == "{") return cont(pushlex("{"), record_of(rtype), poplex);
return matchBrackets(type, rtype);
}
function rtypemaybeparam(type) {
if (content == "<") return cont(typarams);
return pass();
}
function fntype(type) {
if (type == "(") return cont(pushlex("("), commasep(rtype, ")"), poplex, fntype);
if (type == "->") return cont(rtype);
return pass();
}
function pattern(type) {
if (type == "name") {cx.marked = "def"; return cont(patternmaybeop);}
if (type == "atom") return cont(patternmaybeop);
if (type == "op") return cont(pattern);
if (type.match(/[\]\)\};,]/)) return pass();
return matchBrackets(type, pattern);
}
function patternmaybeop(type) {
if (type == "op" && content == ".") return cont();
if (content == "to") {cx.marked = "keyword"; return cont(pattern);}
else return pass();
}
function altbody(type) {
if (type == "{") return cont(pushlex("}", "match"), altblock1, poplex);
return pass();
}
function altblock1(type) {
if (type == "}") return cont();
if (type == "|") return cont(altblock1);
if (content == "when") {cx.marked = "keyword"; return cont(expression, altblock2);}
if (type.match(/[\]\);,]/)) return cont(altblock1);
return pass(pattern, altblock2);
}
function altblock2(type) {
if (type == "{") return cont(pushlex("}", "match"), block, poplex, altblock1);
else return pass(altblock1);
}
function macro(type) {
if (type.match(/[\[\(\{]/)) return matchBrackets(type, expression);
return pass();
}
function matchBrackets(type, comb) {
if (type == "[") return cont(pushlex("]"), commasep(comb, "]"), poplex);
if (type == "(") return cont(pushlex(")"), commasep(comb, ")"), poplex);
if (type == "{") return cont(pushlex("}"), commasep(comb, "}"), poplex);
return cont();
}
function parse(state, stream, style) {
var cc = state.cc;
// Communicate our context to the combinators.
// (Less wasteful than consing up a hundred closures on every call.)
cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
while (true) {
var combinator = cc.length ? cc.pop() : block;
if (combinator(tcat)) {
while(cc.length && cc[cc.length - 1].lex)
cc.pop()();
return cx.marked || style;
}
}
}
return {
startState: function() {
return {
tokenize: tokenBase,
cc: [],
lexical: {indented: -indentUnit, column: 0, type: "top", align: false},
keywords: valKeywords,
indented: 0
};
},
token: function(stream, state) {
if (stream.sol()) {
if (!state.lexical.hasOwnProperty("align"))
state.lexical.align = false;
state.indented = stream.indentation();
}
if (stream.eatSpace()) return null;
tcat = content = null;
var style = state.tokenize(stream, state);
if (style == "comment") return style;
if (!state.lexical.hasOwnProperty("align"))
state.lexical.align = true;
if (tcat == "prefix") return style;
if (!content) content = stream.current();
return parse(state, stream, style);
},
indent: function(state, textAfter) {
if (state.tokenize != tokenBase) return 0;
var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
type = lexical.type, closing = firstChar == type;
if (type == "stat") return lexical.indented + indentUnit;
if (lexical.align) return lexical.column + (closing ? 0 : 1);
return lexical.indented +
(closing ? 0 : (lexical.info == "match" ? altIndentUnit : indentUnit));
},
electricChars: "{}"
};
});
CodeMirror.defineMIME("text/x-rustsrc", "rust");

View file

@ -1,87 +0,0 @@
#!/usr/local/bin/node
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
/***
* Pandoc-style markdown preprocessor that drops extra directives
* included for running doc code, and that optionally, when
* --highlight is provided, replaces code blocks that are Rust code
* with highlighted HTML blocks. The directives recognized are:
*
* '## ignore' tells the test extractor (extract-tests.js) to ignore
* the block completely.
* '## notrust' makes the test extractor ignore the block, makes
* this script not highlight the block.
* '# [any text]' is a line that is stripped out by this script, and
* converted to a normal line of code (without the leading #) by
* the test extractor.
*/
var fs = require("fs");
CodeMirror = require("./lib/codemirror-node");
require("./lib/codemirror-rust");
function help() {
console.log("usage: " + process.argv[0] + " [--highlight] [-o outfile] [infile]");
process.exit(1);
}
var highlight = false, infile, outfile;
for (var i = 2; i < process.argv.length; ++i) {
var arg = process.argv[i];
if (arg == "--highlight") highlight = true;
else if (arg == "-o" && outfile == null && ++i < process.argv.length) outfile = process.argv[i];
else if (arg[0] != "-") infile = arg;
else help();
}
var lines = fs.readFileSync(infile || "/dev/stdin").toString().split(/\n\r?/g), cur = 0, line;
var out = outfile ? fs.createWriteStream(outfile) : process.stdout;
while ((line = lines[cur++]) != null) {
if (/^~~~/.test(line)) {
var block = "", bline;
var notRust =
/notrust/.test(line)
// These are all used by the language ref to indicate things
// that are not Rust source code
|| /ebnf/.test(line)
|| /abnf/.test(line)
|| /keyword/.test(line)
|| /field/.test(line)
|| /precedence/.test(line);
var isRust = !notRust;
while ((bline = lines[cur++]) != null) {
if (/^~~~/.test(bline)) break;
if (!/^\s*##? /.test(bline)) block += bline + "\n";
}
if (!highlight || !isRust)
out.write(line + "\n" + block + bline + "\n");
else {
var html = '<pre class="cm-s-default">', curstr = "", curstyle = null;
function add(str, style) {
if (style != curstyle) {
if (curstyle) html +=
'<span class="cm-' + CodeMirror.htmlEscape(curstyle) + '">' +
CodeMirror.htmlEscape(curstr) + "</span>";
else if (curstr) html += CodeMirror.htmlEscape(curstr);
curstr = str; curstyle = style;
} else curstr += str;
}
CodeMirror.runMode(block, "rust", add);
add("", "bogus"); // Flush pending string.
out.write(html + "</pre>\n");
}
} else {
out.write(line + "\n");
}
}

View file

@ -75,6 +75,14 @@ p {
margin: 0 0 10px; margin: 0 0 10px;
} }
strong {
font-weight: bold;
}
em {
font-style: italic;
}
footer { footer {
border-top: 1px solid #ddd; border-top: 1px solid #ddd;
font-size: 12px; font-size: 12px;
@ -107,6 +115,8 @@ a:hover, a:active {
h1 a:link, h1 a:visited, h2 a:link, h2 a:visited, h1 a:link, h1 a:visited, h2 a:link, h2 a:visited,
h3 a:link, h3 a:visited, h4 a:link, h4 a:visited, h3 a:link, h3 a:visited, h4 a:link, h4 a:visited,
h5 a:link, h5 a:visited {color: black;} h5 a:link, h5 a:visited {color: black;}
h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover,
h5 a:hover {text-decoration: none;}
/* Code /* Code
========================================================================== */ ========================================================================== */
@ -144,16 +154,14 @@ pre code {
/* Code highlighting */ /* Code highlighting */
pre.rust .kw { color: #8959A8; } pre.rust .kw { color: #8959A8; }
pre.rust .kw-2, pre.rust .prelude-ty { color: #4271AE; } pre.rust .kw-2, pre.rust .prelude-ty { color: #4271AE; }
pre.rust .number { color: #718C00; } pre.rust .number, pre.rust .string { color: #718C00; }
pre.rust .self { color: #C13928; } pre.rust .self, pre.rust .boolval, pre.rust .prelude-val,
pre.rust .boolval { color: #C13928; } pre.rust .attribute, pre.rust .attribute .ident { color: #C82829; }
pre.rust .prelude-val { color: #C13928; }
pre.rust .comment { color: #8E908C; } pre.rust .comment { color: #8E908C; }
pre.rust .doccomment { color: #4D4D4C; } pre.rust .doccomment { color: #4D4D4C; }
pre.rust .macro, pre.rust .macro-nonterminal { color: #3E999f; } pre.rust .macro, pre.rust .macro-nonterminal { color: #3E999F; }
pre.rust .string { color: #718C00; } pre.rust .lifetime { color: #B76514; }
pre.rust .lifetime { color: #C13928; }
pre.rust .attribute, pre.rust .attribute .ident { color: #C82829; }
/* The rest /* The rest
========================================================================== */ ========================================================================== */
@ -162,7 +170,7 @@ pre.rust .attribute, pre.rust .attribute .ident { color: #C82829; }
margin: 0.5em; margin: 0.5em;
font-size: 1.1em; font-size: 1.1em;
} }
@media (min-width: 768px) { @media only screen, handheld and (min-width: 768px) {
#versioninfo { #versioninfo {
position: fixed; position: fixed;
bottom: 0px; bottom: 0px;
@ -262,9 +270,12 @@ table th {
a, a:visited { a, a:visited {
text-decoration: underline; text-decoration: underline;
} }
a[href]:after { p a[href]:after {
content: " (" attr(href) ")"; content: " (" attr(href) ")";
} }
footer a[href]:after {
content: "";
}
a[href^="javascript:"]:after, a[href^="#"]:after { a[href^="javascript:"]:after, a[href^="#"]:after {
content: ""; content: "";
} }
@ -275,6 +286,9 @@ table th {
@page { @page {
margin: 2cm .5cm; margin: 2cm .5cm;
} }
h1:not(.title), h2, h3 {
border-bottom: 0px none;
}
p, h2, h3 { p, h2, h3 {
orphans: 3; orphans: 3;
widows: 3; widows: 3;

View file

@ -57,7 +57,7 @@ they don't contain references to names that aren't actually defined.
# Getting started # Getting started
> **WARNING**: The tarball and installer links are for the most recent > ***Warning:*** The tarball and installer links are for the most recent
> release, not master. To use master, you **must** build from [git]. > release, not master. To use master, you **must** build from [git].
The Rust compiler currently must be built from a [tarball] or [git], unless The Rust compiler currently must be built from a [tarball] or [git], unless
@ -80,13 +80,10 @@ You may find that other platforms work, but these are our "tier 1"
supported build environments that are most likely to work. supported build environments that are most likely to work.
> ***Note:*** Windows users should read the detailed > ***Note:*** Windows users should read the detailed
> "[getting started][wiki-start]" notes on the wiki. Even when using > [Getting started][wiki-start] notes on the wiki. Even when using
> the binary installer, the Windows build requires a MinGW installation, > the binary installer, the Windows build requires a MinGW installation,
> the precise details of which are not discussed here. Finally, `rustc` may > the precise details of which are not discussed here.
> need to be [referred to as `rustc.exe`][bug-3319]. It's a bummer, we
> know.
[bug-3319]: https://github.com/mozilla/rust/issues/3319
[wiki-start]: https://github.com/mozilla/rust/wiki/Note-getting-started-developing-Rust [wiki-start]: https://github.com/mozilla/rust/wiki/Note-getting-started-developing-Rust
[git]: https://github.com/mozilla/rust.git [git]: https://github.com/mozilla/rust.git

View file

@ -33,8 +33,6 @@ license4 = """ The Rust Project Developers. See the COPYRIGHT
""" """
exceptions = [ exceptions = [
"doc/lib/codemirror-node.js", # MIT
"doc/lib/codemirror-rust.js", # MIT
"rt/rust_android_dummy.cpp", # BSD, chromium "rt/rust_android_dummy.cpp", # BSD, chromium
"rt/rust_android_dummy.h", # BSD, chromium "rt/rust_android_dummy.h", # BSD, chromium
"rt/isaac/randport.cpp", # public domain "rt/isaac/randport.cpp", # public domain

View file

@ -126,7 +126,7 @@ nav.sub {
.content pre.line-numbers { float: left; border: none; } .content pre.line-numbers { float: left; border: none; }
.line-numbers span { color: #c67e2d; } .line-numbers span { color: #c67e2d; }
.line-numbers .line-highlighted { .line-numbers .line-highlighted {
background-color: #fff871; background-color: #f6fdb0;
} }
.content .highlighted { .content .highlighted {
@ -306,19 +306,16 @@ a {
pre.rust, pre.line-numbers { background-color: #FDFDFD; } pre.rust, pre.line-numbers { background-color: #FDFDFD; }
/* Code Highlighting */ /* Code highlighting */
pre.rust .kw { color: #8959A8; } pre.rust .kw { color: #8959A8; }
pre.rust .kw-2, pre.rust .prelude-ty { color: #4271AE; } pre.rust .kw-2, pre.rust .prelude-ty { color: #4271AE; }
pre.rust .number { color: #718C00; } pre.rust .number, pre.rust .string { color: #718C00; }
pre.rust .self { color: #C13928; } pre.rust .self, pre.rust .boolval, pre.rust .prelude-val,
pre.rust .boolval { color: #C13928; } pre.rust .attribute, pre.rust .attribute .ident { color: #C82829; }
pre.rust .prelude-val { color: #C13928; }
pre.rust .comment { color: #8E908C; } pre.rust .comment { color: #8E908C; }
pre.rust .doccomment { color: #4D4D4C; } pre.rust .doccomment { color: #4D4D4C; }
pre.rust .macro, pre.rust .macro-nonterminal { color: #3E999f; } pre.rust .macro, pre.rust .macro-nonterminal { color: #3E999F; }
pre.rust .string { color: #718C00; } pre.rust .lifetime { color: #B76514; }
pre.rust .lifetime { color: #C13928; }
pre.rust .attribute, pre.rust .attribute .ident { color: #C82829; }
h1:hover a:after, h1:hover a:after,
h2:hover a:after, h2:hover a:after,

View file

@ -117,7 +117,7 @@ pub fn render(input: &str, mut output: Path, matches: &getopts::Matches) -> int
let err = write!( let err = write!(
&mut out, &mut out,
r#"<!doctype html> r#"<!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">