mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
5.6 KiB
183 lines
5.6 KiB
<!doctype html> |
|
|
|
<title>CodeMirror: Ruby mode</title> |
|
<meta charset="utf-8"/> |
|
<link rel=stylesheet href="../../doc/docs.css"> |
|
|
|
<link rel="stylesheet" href="../../lib/codemirror.css"> |
|
<script src="../../lib/codemirror.js"></script> |
|
<script src="../../addon/edit/matchbrackets.js"></script> |
|
<script src="ruby.js"></script> |
|
<style> |
|
.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;} |
|
.cm-s-default span.cm-arrow { color: red; } |
|
</style> |
|
<div id=nav> |
|
<a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a> |
|
|
|
<ul> |
|
<li><a href="../../index.html">Home</a> |
|
<li><a href="../../doc/manual.html">Manual</a> |
|
<li><a href="https://github.com/codemirror/codemirror">Code</a> |
|
</ul> |
|
<ul> |
|
<li><a href="../index.html">Language modes</a> |
|
<li><a class=active href="#">Ruby</a> |
|
</ul> |
|
</div> |
|
|
|
<article> |
|
<h2>Ruby mode</h2> |
|
<form><textarea id="code" name="code"> |
|
# Code from http://sandbox.mc.edu/~bennet/ruby/code/poly_rb.html |
|
# |
|
# This program evaluates polynomials. It first asks for the coefficients |
|
# of a polynomial, which must be entered on one line, highest-order first. |
|
# It then requests values of x and will compute the value of the poly for |
|
# each x. It will repeatly ask for x values, unless you the user enters |
|
# a blank line. It that case, it will ask for another polynomial. If the |
|
# user types quit for either input, the program immediately exits. |
|
# |
|
|
|
# |
|
# Function to evaluate a polynomial at x. The polynomial is given |
|
# as a list of coefficients, from the greatest to the least. |
|
def polyval(x, coef) |
|
sum = 0 |
|
coef = coef.clone # Don't want to destroy the original |
|
while true |
|
sum += coef.shift # Add and remove the next coef |
|
break if coef.empty? # If no more, done entirely. |
|
sum *= x # This happens the right number of times. |
|
end |
|
return sum |
|
end |
|
|
|
# |
|
# Function to read a line containing a list of integers and return |
|
# them as an array of integers. If the string conversion fails, it |
|
# throws TypeError. If the input line is the word 'quit', then it |
|
# converts it to an end-of-file exception |
|
def readints(prompt) |
|
# Read a line |
|
print prompt |
|
line = readline.chomp |
|
raise EOFError.new if line == 'quit' # You can also use a real EOF. |
|
|
|
# Go through each item on the line, converting each one and adding it |
|
# to retval. |
|
retval = [ ] |
|
for str in line.split(/\s+/) |
|
if str =~ /^\-?\d+$/ |
|
retval.push(str.to_i) |
|
else |
|
raise TypeError.new |
|
end |
|
end |
|
|
|
return retval |
|
end |
|
|
|
# |
|
# Take a coeff and an exponent and return the string representation, ignoring |
|
# the sign of the coefficient. |
|
def term_to_str(coef, exp) |
|
ret = "" |
|
|
|
# Show coeff, unless it's 1 or at the right |
|
coef = coef.abs |
|
ret = coef.to_s unless coef == 1 && exp > 0 |
|
ret += "x" if exp > 0 # x if exponent not 0 |
|
ret += "^" + exp.to_s if exp > 1 # ^exponent, if > 1. |
|
|
|
return ret |
|
end |
|
|
|
# |
|
# Create a string of the polynomial in sort-of-readable form. |
|
def polystr(p) |
|
# Get the exponent of first coefficient, plus 1. |
|
exp = p.length |
|
|
|
# Assign exponents to each term, making pairs of coeff and exponent, |
|
# Then get rid of the zero terms. |
|
p = (p.map { |c| exp -= 1; [ c, exp ] }).select { |p| p[0] != 0 } |
|
|
|
# If there's nothing left, it's a zero |
|
return "0" if p.empty? |
|
|
|
# *** Now p is a non-empty list of [ coef, exponent ] pairs. *** |
|
|
|
# Convert the first term, preceded by a "-" if it's negative. |
|
result = (if p[0][0] < 0 then "-" else "" end) + term_to_str(*p[0]) |
|
|
|
# Convert the rest of the terms, in each case adding the appropriate |
|
# + or - separating them. |
|
for term in p[1...p.length] |
|
# Add the separator then the rep. of the term. |
|
result += (if term[0] < 0 then " - " else " + " end) + |
|
term_to_str(*term) |
|
end |
|
|
|
return result |
|
end |
|
|
|
# |
|
# Run until some kind of endfile. |
|
begin |
|
# Repeat until an exception or quit gets us out. |
|
while true |
|
# Read a poly until it works. An EOF will except out of the |
|
# program. |
|
print "\n" |
|
begin |
|
poly = readints("Enter a polynomial coefficients: ") |
|
rescue TypeError |
|
print "Try again.\n" |
|
retry |
|
end |
|
break if poly.empty? |
|
|
|
# Read and evaluate x values until the user types a blank line. |
|
# Again, an EOF will except out of the pgm. |
|
while true |
|
# Request an integer. |
|
print "Enter x value or blank line: " |
|
x = readline.chomp |
|
break if x == '' |
|
raise EOFError.new if x == 'quit' |
|
|
|
# If it looks bad, let's try again. |
|
if x !~ /^\-?\d+$/ |
|
print "That doesn't look like an integer. Please try again.\n" |
|
next |
|
end |
|
|
|
# Convert to an integer and print the result. |
|
x = x.to_i |
|
print "p(x) = ", polystr(poly), "\n" |
|
print "p(", x, ") = ", polyval(x, poly), "\n" |
|
end |
|
end |
|
rescue EOFError |
|
print "\n=== EOF ===\n" |
|
rescue Interrupt, SignalException |
|
print "\n=== Interrupted ===\n" |
|
else |
|
print "--- Bye ---\n" |
|
end |
|
</textarea></form> |
|
<script> |
|
var editor = CodeMirror.fromTextArea(document.getElementById("code"), { |
|
mode: "text/x-ruby", |
|
matchBrackets: true, |
|
indentUnit: 4 |
|
}); |
|
</script> |
|
|
|
<p><strong>MIME types defined:</strong> <code>text/x-ruby</code>.</p> |
|
|
|
<p>Development of the CodeMirror Ruby mode was kindly sponsored |
|
by <a href="http://ubalo.com/">Ubalo</a>.</p> |
|
|
|
</article>
|
|
|