| 
									
										
										
										
											2018-01-21 10:33:32 -05:00
										 |  |  | <!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> | 
					
						
							| 
									
										
										
										
											2018-10-07 12:02:07 +02:00
										 |  |  |   <a href="https://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a> | 
					
						
							| 
									
										
										
										
											2018-01-21 10:33:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   <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> |