├── .gitignore ├── .gitmodules ├── .nojekyll ├── CNAME ├── LICENSE ├── README.md ├── css ├── app-header.css ├── app-markdownSyntax.css ├── app-typography.css ├── app-views.css ├── cm-codemirror.css ├── cm-dialog.css ├── cm-foldgutter.css ├── firepad.css └── fonts.css ├── firebase-config ├── security-rules.json └── security-test.sh ├── index.html ├── mathdown.css ├── mathdown.js ├── package.json ├── samples ├── Einstein.md ├── bugs.md └── demo.md └── smoke-test.coffee /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "CodeMirror-MathJax"] 2 | path = CodeMirror-MathJax 3 | url = https://github.com/cben/CodeMirror-MathJax.git 4 | branch = gh-pages 5 | [submodule "firepad"] 6 | path = firepad 7 | url = https://github.com/firebase/firepad.git 8 | branch = master 9 | [submodule "CodeMirror"] 10 | path = CodeMirror 11 | url = https://github.com/marijnh/CodeMirror 12 | branch = master 13 | [submodule "firebase"] 14 | path = firebase 15 | url = https://github.com/firebase/firebase-bower.git 16 | branch = master 17 | [submodule "MathJax"] 18 | path = MathJax 19 | url = https://github.com/mathjax/MathJax.git 20 | branch = v2.3-latest 21 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rhythmus/mathdown/bb6e98fd833010c3bacc59427fc472b69bceacf2/.nojekyll -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | mathdown.net 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Beni Cherniavsky-Paskin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mathdown 2 | 3 | ## Collaborative Markdown + math 4 | 5 | ### Demo 6 | 7 | - (original) 8 | - [http://rhythmus.be/mathdown](http://rhythmus.be/mathdown/?doc=K2b13TExFUJ#Mathdown) (redesign fork) 9 | - [Einstein’s 1905 paper on special relativity](http://rhythmus.be/mathdown/?doc=NzbDnWwn2nF#Zur-Elektrodynamik-bewegter-K-rper) 10 | 11 | --- 12 | 13 | ℹ **THIS REPO IS FORKED FROM [cben/mathdown](https://github.com/cben/mathdown).** [I](https://github.com/rhythmus) just did the redesign. 14 | 15 | ⚠ **Alpha quality! Will eat your math, burn your bookmarks & expose your secrets.** 16 | 17 | :bug: **Known bugs are listed [here](http://rhythmus.be/mathdown/index.html?doc=DCJtdsxteYC#Mathdown-Bugs).** 18 | 19 | ![](http://rhythmus.be/mathdown/screengrab.gif) 20 | 21 | ![Typesetting special relativity in a web browser is delightful…](http://rhythmus.be/mathdown/delightful.png)](http://rhythmus.be/mathdown/index.html?doc=NzbDnWwn2nF#Zur-Elektrodynamik-bewegter-K-rper) 22 | 23 | --- 24 | 25 | ### Powered by 26 | 27 | - [CodeMirror](http://codemirror.net), as the basis for wysiwyg editing in `contentEditable`; 28 | - [MathJax](http://mathjax.org), for magical typesetting of LaTeX equations; 29 | - glued by [CodeMirror-MathJax](http://github.com/cben/CodeMirror-MathJax); 30 | - [Firebase](http://firebase.com)’s [Firepad](http://firepad.io), for real-time collaboration. 31 | - Free testing courtesy of [Sause Labs](https://saucelabs.com/opensauce). 32 | 33 | 34 | ### License 35 | 36 | - [@cben](https://github.com/cben)’s code (including [CodeMirror-MathJax](http://github.com/cben/CodeMirror-MathJax)) is under [MIT License](LICENSE). 37 | - [My](https://github.com/rhythmus) css too. 38 | - CodeMirror is also MIT. 39 | - Firebase is a **proprietary** service ([#4](https://github.com/cben/mathdown/issues/4)); their client-side javascript API [firebase.js](https://github.com/firebase/firebase-bower) is MIT. 40 | - The collaborative editor [Firepad](http://firepad.io) is MIT. It calls firebase javascript API. 41 | 42 | 43 | ### Git trivia 44 | 45 | After checking out, run this to materialize `subdirs://` 46 | 47 | git submodule update --init --recursive 48 | 49 | Append ` --remote` to upgrade to newest versions of all submodules (need to commit afterwards if anything changed). 50 | 51 | [@cben](https://github.com/cben) is directly working in the gh-pages branch without a master branch, as that’s the simplest thing that could possibly work ( lists several alternatives). 52 | 53 | ### Note 54 | 55 | ###### About the redesign 56 | The redesign was inspired by [this discussion](https://github.com/quilljs/quill/issues/74#issuecomment-42942223), and as an experiment in search for how wysiwyg Markdown editing could look like. 57 | 58 | ###### Other things called “mathdown” 59 | 60 | - https://github.com/mayoff/Mathdown/tree/mathjax — Markdown.pl hacked for MathJax pass-through 61 | - https://github.com/keishi/kernlog/blob/master/markdown/extensions/mathdown.py 62 | - http://kwkbtr.info/log/201010050320 — a way to combine Showdown + Mathjax 63 | - http://www.urbandictionary.com/define.php?term=mathdown 64 | -------------------------------------------------------------------------------- /css/app-header.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | /* APPLICATION HEADER ======================================================= */ 4 | @media print { #header { display: none; } } 5 | #header { 6 | display: block; 7 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 8 | background-color: rgb(0,20,10); 9 | color:rgb(40,130,52); 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | font-weight : 400; 13 | font-size : 1.0rem; 14 | line-height : 1.0rem; 15 | padding : 0.5rem; 16 | padding-left : 1.0rem; 17 | padding-right : 1.0rem; 18 | } #header > * { display: inline-block; } 19 | @media screen and (max-width: 500px) { #header { font-size: 1rem; } } 20 | #header a { text-decoration: none; color:inherit; } 21 | #header a:hover { color:white; } 22 | #header h1 { font-size: inherit; } 23 | #header h1 a#logo { font-weight: 800; color: rgb(70,160,82); } 24 | #header h1 i { font-style: normal; font-weight: 400; } 25 | @media screen and (max-width: 850px) { #header h1 i { display: none; } } 26 | #header nav { min-width: 5rem; } 27 | #header nav a { color: white; display: inline-block; } 28 | #header nav a:hover{ 29 | -webkit-transform:scale(1.5,1.5); 30 | -moz-transform:scale(1.5,1.5); 31 | -ms-transform:scale(1.5,1.5); 32 | -o-transform:scale(1.5,1.5); 33 | transform:scale(1.5,1.5); 34 | } 35 | #header nav a + a { margin-left: 0.25em; } 36 | #header nav a:before, #header span.github { 37 | font-family: FontAwesome; 38 | font-style: normal; 39 | font-weight: normal; 40 | line-height: 1; 41 | -webkit-font-smoothing: antialiased; 42 | -moz-osx-font-smoothing: grayscale; 43 | } 44 | #header nav a#new:before { content: "\f15c"; font-size: 0.9em; position: relative; bottom: 0.05em; } 45 | #header nav a#about:before { content: "\f1cd"; font-size: 0.9em; position: relative; bottom: 0.05em; } 46 | #header nav a#primer:before { content: "\f05a"; } 47 | #header nav a#bugs:before { content: "\f188"; } 48 | span.github:before { content: "\f126"; font-size: 0.9em; margin-right: 0.25em;} 49 | #header .warning, 50 | #header .forkme { 51 | padding-top: 0.5rem; 52 | padding-bottom: 0.5rem; 53 | font-size: 1rem !important; 54 | text-align: center; 55 | text-decoration: none; 56 | position: fixed; 57 | -webkit-transform: rotate(45deg); 58 | -moz-transform: rotate(45deg); 59 | -ms-transform: rotate(45deg); 60 | -o-transform: rotate(45deg); 61 | -webkit-box-shadow: 0px 1px 3px 0px rgba(50, 50, 50, 0.75); 62 | -moz-box-shadow: 0px 1px 3px 0px rgba(50, 50, 50, 0.75); 63 | -ms-box-shadow: 0px 1px 3px 0px rgba(50, 50, 50, 0.75); 64 | -o-box-shadow: 0px 1px 3px 0px rgba(50, 50, 50, 0.75); 65 | box-shadow: 0px 1px 3px 0px rgba(50, 50, 50, 0.75); 66 | z-index:9; 67 | } 68 | #header .warning { 69 | background-color : orange; 70 | color : rgb(190,50,0); 71 | font-weight : 800; 72 | font-size : 0.8em; 73 | padding-left : 3rem; 74 | padding-right : 3rem; 75 | top : 2rem; 76 | right : -2.5rem; 77 | } 78 | #header .forkme { 79 | background-color : rgb(40,40,40); 80 | color : white; 81 | font-size : 0.5em; 82 | padding-left : 3rem; 83 | padding-right : 3rem; 84 | top : 2rem; 85 | right : -2.5rem; 86 | } 87 | #header .forkme:hover { 88 | background-color : white; 89 | color : rgb(40,40,40); 90 | } 91 | -------------------------------------------------------------------------------- /css/app-markdownSyntax.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | /* MARKDOWN SYNTAX HIGHLIGHTING --------------------------------------------- */ 4 | /* Instead of color highlighting, we use typography (alternative font, font size), 5 | and color contrast (dimmed gray) to highlight Markdown’s syntax markers. 6 | Alternatively — or rather as an addition, we might implement colorization, too: 7 | cfr “Color-coded token highlighting”, below. */ 8 | .cm-formatting { 9 | background-color: transparent !important; 10 | display:inline-block; 11 | vertical-align:text-top; 12 | } 13 | .cm-formatting-header, 14 | .cm-formatting-em, 15 | .cm-formatting-strong, 16 | .cm-formatting-code, 17 | .cm-formatting-code-block, 18 | .cm-formatting-link, 19 | .cm-formatting-link-string, 20 | .cm-formatting-link-string + .cm-string, 21 | /*.cm-formatting-link + .cm-link + .cm-formatting-link + .cm-link,*/ 22 | .cm-tag, 23 | .cm-formatting-quote, 24 | .cm-formatting-quote-1, 25 | /*.cm-formatting-list, 26 | .cm-formatting-list-ol, 27 | .cm-formatting-list-ul,*/ 28 | .cm-hr { 29 | color:rgb(67,67,67) !important; 30 | opacity: 0.2; 31 | font-family: Cousine, Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; 32 | font-style:normal !important; 33 | font-weight:normal !important; 34 | font-size: 0.8rem; 35 | } 36 | .cm-tag, 37 | .cm-formatting-link-string + .cm-string { opacity: 0.5; } 38 | 39 | /* Hang syntax markers of block-level elements into the margin */ 40 | /* To do: 41 | - fix regex for headings (in CodeMirror submodule, markdown.js): `atxHeaderRE = /^#+\s/` 42 | - fix headings’ index (ibidem): `state.header = match[0].length <= 6 ? match[0].length-1 : 6;` 43 | */ 44 | @media (min-width: 800px) { 45 | .cm-formatting-header, 46 | .cm-formatting-quote, 47 | .cm-formatting-list, 48 | .cm-hr:before { 49 | color:inherit; 50 | position: absolute; 51 | bottom:top; 52 | left:-5rem; 53 | width:4.5rem; 54 | text-align: right; 55 | -webkit-box-sizing: border-box; 56 | -moz-box-sizing: border-box; 57 | -ms-box-sizing: border-box; 58 | -o-box-sizing: border-box; 59 | box-sizing: border-box; 60 | } 61 | } 62 | 63 | .cm-formatting-list-ul { visibility: hidden; } 64 | .cm-formatting-list-ul:before { content:"–"; visibility: visible; } 65 | /* To do: 66 | - fix regex for ordered lists (in CodeMirror submodule, markdown.js): `olRE = /^([0-9]+\.|[A-z]+\))\s+/` 67 | */ 68 | .cm-formatting-code-block { visibility: hidden; } 69 | .cm-formatting-code-block:before { content:"┄"; visibility: visible; } 70 | .cm-hr { 71 | display: block; 72 | border-bottom: solid 1px rgb(150,150,150); 73 | color: transparent !important; 74 | }.cm-hr:before { 75 | content:"⁂"; /* U+2042 'ASTERISM' */ 76 | color: rgb(67,67,67) !important; 77 | } 78 | -------------------------------------------------------------------------------- /css/app-typography.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | /* TYPOGRAPHY FOR TOKENIZED, SEMANTIC ELEMENTS ============================== */ 4 | 5 | /* Headings ----------------------------------------------------------------- */ 6 | .cm-header { color:rgb(67,67,67); } 7 | .cm-header-1, .cm-header-2, .cm-header-3, .cm-header-4 { padding-bottom: 1rem; } 8 | .cm-header-1:first-of-type { line-height: 4.0rem; font-size: 3.9rem; padding-top:1.0rem; } 9 | .cm-header-1 { line-height: 3.0rem; font-size: 2.9rem; padding-top:3.0rem; } 10 | .cm-header-2 { line-height: 2.5rem; font-size: 2.4rem; padding-top:3.0rem; } 11 | .cm-header-3 { line-height: 2.0rem; font-size: 1.9rem; padding-top:2.0rem; } 12 | .cm-header-4 { line-height: 1.0rem; font-size: 1.0rem; padding-top:2.0rem; text-transform: uppercase; } 13 | .cm-header-5 { line-height: 1.0rem; font-size: 1.0rem; padding-top:2.0rem; font-weight: bold; } 14 | .cm-header-6 { line-height: 1.0rem; font-size: 1.0rem; padding-top:2.0rem; font-style: italic; } 15 | .cm-formatting-header-1:first-of-type { padding-top: 1rem; } 16 | .cm-formatting-header-1 { padding-top: 0.70rem; } 17 | .cm-formatting-header-2 { padding-top: 0.55rem; } 18 | .cm-formatting-header-3 { padding-top: 0.45rem; } 19 | @media screen and (max-width: 460px) { 20 | .cm-header-1:first-of-type { line-height: 2.5rem; font-size: 2.4rem; padding-top:1.0rem; } 21 | .cm-header-1, .cm-header-2 { line-height: 2.0rem; font-size: 1.9rem; padding-top:2.0rem; } 22 | .cm-header-3 { line-height: 1.5rem; font-size: 1.4rem; padding-top:1.5rem; } 23 | } 24 | 25 | /* Emphasis ----------------------------------------------------------------- */ 26 | .cm-em { font-style:italic; } 27 | .cm-strong { 28 | font-weight: bold; 29 | -webkit-font-feature-settings: "smcp"; 30 | -moz-font-feature-settings: "smcp"; 31 | -ms-font-feature-settings: "smcp"; 32 | -o-font-feature-settings: "smcp"; 33 | font-feature-settings: "smcp"; 34 | } 35 | 36 | /* Hyperlinks --------------------------------------------------------------- */ 37 | .cm-link { color: rgb(0,0,180); text-decoration: none;} 38 | .cm-link:hover { color: rgb(0,0,200); text-decoration: underline; cursor:pointer;} 39 | 40 | 41 | /* Referenced links --------------------------------------------------------- */ 42 | /* .cm-formatting-link + .cm-link + .cm-formatting-link + .cm-link { } */ 43 | .cm-formatting-link + .cm-link + .cm-formatting-link + .cm-string, 44 | .cm-formatting-link + .cm-link + .cm-formatting-link + .cm-string + * { 45 | color:red; 46 | font-size: 0.7em; 47 | } 48 | 49 | /* Blockquotes -------------------------------------------------------------- */ 50 | .cm-quote, 51 | .cm-quote-1 { 52 | font-style: italic; 53 | /* To do: 54 | We want an empty white space above and below the blockquote. 55 | We also want the blockquote to be indented both on the left and the right. 56 | We would do that by setting margings or paddings, but then we have to also 57 | set a display:block; on the , which we cannot do, because that fucks 58 | up the editing behaviour of CodeMirror. 59 | display : block; 60 | padding-top : 0.5rem; 61 | padding-bottom : 0.5rem; 62 | padding-left : 1rem; 63 | padding-right : 1rem; 64 | */ 65 | /* To do: bug: 66 | Apparently, the blockquote needs to be followed by an empty line, if not 67 | it leaks into the following line. 68 | */ 69 | } 70 | 71 | /* (Fenced) Code blocks ----------------------------------------------------- */ 72 | .cm-comment, .cm-leadingspace { 73 | /* markdown mode styles `...` and indented code blocks as "comment". */ 74 | max-width: 60rem; 75 | overflow-x:scroll; 76 | /*white-space: nowrap;*/ 77 | font-family: Courier, monospace; 78 | font-size:0.9em; 79 | background-color: rgb(245,245,245); 80 | } 81 | 82 | /* Inline code -------------------------------------------------------------- */ 83 | .cm-formatting-code + .cm-comment { 84 | padding-left: 0.25em; 85 | padding-right: 0.25em; 86 | } 87 | 88 | /* Math --------------------------------------------------------------------- */ 89 | .math.cm-comment { 90 | /* exclude math from monospace style to avoid mathjax vertically 91 | squishing formulas, especially display. */ 92 | font-family: serif; 93 | } 94 | /* Below are **very** ugly hacks that hack on CodeMirror’s very ugly DOM structure. 95 | To do: bug: if an equation is the only marked-up element in a paragraph, it will 96 | break the line as if it were a stand-alone equation. */ 97 | .CodeMirror-code { counter-reset: equation; } 98 | pre > span.CodeMirror-widget { text-align: center; } 99 | pre > span.CodeMirror-widget:only-of-type { display:block; } 100 | pre > span.CodeMirror-widget:only-of-type > .math { display:block !important; width:100%; } 101 | pre > span.CodeMirror-widget:only-of-type > .math > .MathJax_Display { display:block !important; width:100%; counter-increment: equation; } 102 | pre > span.CodeMirror-widget:only-of-type > .math > .MathJax_Display:after { 103 | display: block; 104 | position: absolute; 105 | width:2rem; 106 | white-space: nowrap; 107 | overflow:visible; 108 | right:-3rem; 109 | top:0; 110 | bottom:0; 111 | content:"("counter(equation, lower-greek)")"; 112 | text-transform: uppercase; 113 | display: -ms-flexbox; 114 | display: -webkit-flex; 115 | display: flex; 116 | -webkit-flex-direction: row; 117 | -ms-flex-direction: row; 118 | flex-direction: row; 119 | -webkit-flex-wrap: nowrap; 120 | -ms-flex-wrap: nowrap; 121 | flex-wrap: nowrap; 122 | -webkit-justify-content: flex-start; 123 | -ms-flex-pack: start; 124 | justify-content: flex-start; 125 | -webkit-align-content: center; 126 | -ms-flex-line-pack: center; 127 | align-content: center; 128 | -webkit-align-items: center; 129 | -ms-flex-align: center; 130 | align-items: center; 131 | } 132 | -------------------------------------------------------------------------------- /css/app-views.css: -------------------------------------------------------------------------------- 1 | /* ALTERNATIVE VIEWS ======================================================== */ 2 | /* To Do: Put controls in the GUI which allow the user to toggle alternative views on and off. 3 | We assume a view’s class name will be set on the .CodeMirror container. */ 4 | 5 | /* Justified layout --------------------------------------------------------- */ 6 | .justified .CodeMirror-sizer { 7 | max-width: 35rem; 8 | margin-left: auto !important; 9 | margin-right: auto !important; 10 | } 11 | .justified .CodeMirror-code pre { 12 | text-align: justify; 13 | white-space: normal !important; /* https://bugs.webkit.org/show_bug.cgi?id=84448 */ 14 | } 15 | 16 | /* Hide formatting syntax markers ------------------------------------------- */ 17 | /* Cfr https://github.com/cben/mathdown/issues/29 */ 18 | .hideSyntax .cm-formatting, 19 | .hideSyntax .cm-hr:before, 20 | .hideSyntax .cm-formatting-link-string + .cm-string { display: none; } 21 | 22 | /* Color-coded token highlighting ------------------------------------------- */ 23 | /* To Do (if colored token highlighting would be desirable at all): 24 | implement theme with subtle color scheme, 25 | e.g. http://chriskempson.github.io/base16/#eighties */ 26 | .colorize .cm-keyword { /* color: #708; */ } 27 | .colorize .cm-atom { /* color: #219; */ } 28 | .colorize .cm-number { /* color: #164; */ } 29 | .colorize .cm-def { /* color: #00f; */ } 30 | .colorize .cm-variable { /* color: black;*/ } 31 | .colorize .cm-variable-2 { /* color: #05a; */ } 32 | .colorize .cm-variable-3 { /* color: #085; */ } 33 | .colorize .cm-property { /* color: black;*/ } 34 | .colorize .cm-operator { /* color: black;*/ } 35 | .colorize .cm-comment { /* color: #a50; */ } 36 | .colorize .cm-string { /* color: #a11; */ } 37 | .colorize .cm-string-2 { /* color: #f50; */ } 38 | .colorize .cm-meta { /* color: #555; */ } 39 | .colorize .cm-qualifier { /* color: #555; */ } 40 | .colorize .cm-builtin { /* color: #30a; */ } 41 | .colorize .cm-bracket { /* color: #997; */ } 42 | .colorize .cm-tag { /* color: #170; */ } 43 | .colorize .cm-attribute { /* color: #00c; */ } 44 | .colorize .cm-header { } 45 | .colorize .cm-quote { /* color: #090; */ } 46 | .colorize .cm-hr { /* color: #999; */ } 47 | .colorize .cm-link { /* color: #00c; */ } 48 | .colorize .cm-negative { /* color: #d44; */ } 49 | .colorize .cm-positive { /* color: #292; */ } 50 | .colorize .cm-header { } 51 | .colorize .cm-strong { } 52 | .colorize .cm-em { } 53 | .colorize .cm-link { } 54 | .colorize .cm-error { /* color: #f00; */ } 55 | .colorize .cm-invalidchar { /* color: #f00; */ } 56 | .colorize .CodeMirror-matchingbracket { /* color: #0f0; */ } 57 | .colorize .CodeMirror-nonmatchingbracket { /* color: #f22; */ } 58 | .colorize .CodeMirror-activeline-background { /* background: #e8f2ff; */ } 59 | -------------------------------------------------------------------------------- /css/cm-codemirror.css: -------------------------------------------------------------------------------- 1 | /* CODEMIRROR MECHANICS ===================================================== */ 2 | /* Adapted from `CodeMirror/lib/codemirror.css` */ 3 | 4 | /* BASICS ------------------------------------------------------------------- */ 5 | .CodeMirror { 6 | line-height: 1.3; 7 | position: relative; 8 | overflow: hidden; 9 | background: white; 10 | color: black; 11 | } 12 | .CodeMirror-scroll { 13 | /* Set scrolling behaviour here */ 14 | overflow: auto; 15 | /* 30px is the magic margin used to hide the element's real scrollbars */ 16 | /* See overflow: hidden in .CodeMirror */ 17 | margin-bottom: -30px; 18 | margin-right: -30px; 19 | padding-bottom: 30px; 20 | height: 100%; 21 | outline: none; /* Prevent dragging from highlighting the element */ 22 | position: relative; 23 | -webkit-box-sizing: content-box; 24 | -moz-box-sizing: content-box; 25 | -ms-box-sizing: content-box; 26 | -o-box-sizing: content-box; 27 | box-sizing: content-box; 28 | } 29 | 30 | /* PADDING ------------------------------------------------------------------ */ 31 | .CodeMirror-lines { } /* Vertical padding around content */ 32 | .CodeMirror pre { } /* Horizontal padding of content */ 33 | .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { 34 | background-color: transparent; /* The little square between H and V scrollbars */ 35 | } 36 | 37 | /* GUTTER ------------------------------------------------------------------- */ 38 | .CodeMirror-gutter { background-color: transparent; } 39 | .CodeMirror-gutter-wrapper { background-color: transparent; } 40 | .CodeMirror-gutters { background-color: transparent; 41 | white-space: nowrap; 42 | border-right: 1px dotted #ddd; 43 | } 44 | .CodeMirror-linenumbers {} 45 | .CodeMirror-linenumber { 46 | padding : 0 3px 0 5px; 47 | min-width : 20px; 48 | text-align : right; 49 | color : #999; 50 | -webkit-box-sizing: content-box; 51 | -moz-box-sizing: content-box; 52 | -ms-box-sizing: content-box; 53 | -o-box-sizing: content-box; 54 | box-sizing: content-box; 55 | } 56 | 57 | /* CURSOR ------------------------------------------------------------------- */ 58 | .CodeMirror-cursor, 59 | .CodeMirror-secondarycursor { 60 | z-index: 3; 61 | border-style: solid; 62 | border-left-width: 2px; 63 | border-right-width: 1px; 64 | } .CodeMirror-cursor { 65 | border-color: rgba(70,160,82,0.6); 66 | } .CodeMirror-secondarycursor { 67 | /* Shown when moving in bi-directional text */ 68 | border-color: silver; 69 | } 70 | .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor { 71 | width: auto; 72 | border: 0; 73 | background-color: rgba(70,160,82,0.6); 74 | z-index: 1; 75 | } 76 | /* Can style cursor different in overwrite (non-insert) mode */ 77 | .CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite { } 78 | .cm-tab { display: inline-block; } 79 | .CodeMirror-ruler { position: absolute; } 80 | @media print { 81 | /* Hide the cursor when printing */ 82 | .CodeMirror div.CodeMirror-cursor { 83 | visibility: hidden; 84 | } 85 | } 86 | 87 | /* STOP --------------------------------------------------------------------- */ 88 | 89 | .CodeMirror-sizer { 90 | position: relative; 91 | padding: 1em; 92 | -webkit-box-sizing: content-box; 93 | -moz-box-sizing: content-box; 94 | -ms-box-sizing: content-box; 95 | -o-box-sizing: content-box; 96 | box-sizing: content-box; 97 | } 98 | @media (min-width: 800px) { 99 | .CodeMirror-sizer { padding:5em; } 100 | } 101 | 102 | /* The fake, visible scrollbars. Used to force redraw during scrolling 103 | before actuall scrolling happens, thus preventing shaking and 104 | flickering artifacts. */ 105 | .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { 106 | position: absolute; 107 | z-index: 6; 108 | display: none; 109 | } 110 | .CodeMirror-vscrollbar { 111 | right: 0; top: 0; 112 | overflow-x: hidden; 113 | overflow-y: scroll; 114 | } 115 | .CodeMirror-hscrollbar { 116 | bottom: 0; left: 0; 117 | overflow-y: hidden; 118 | overflow-x: scroll; 119 | } 120 | .CodeMirror-scrollbar-filler { 121 | right: 0; bottom: 0; 122 | } 123 | .CodeMirror-gutter-filler { 124 | left: 0; bottom: 0; 125 | } 126 | 127 | .CodeMirror-gutters { 128 | position: absolute; left: 0; top: 0; 129 | padding-bottom: 30px; 130 | z-index: 3; 131 | } 132 | .CodeMirror-gutter { 133 | white-space: normal; 134 | height: 100%; 135 | -moz-box-sizing: content-box; 136 | box-sizing: content-box; 137 | padding-bottom: 30px; 138 | margin-bottom: -32px; 139 | display: inline-block; 140 | /* Hack to make IE7 behave */ 141 | *zoom:1; 142 | *display:inline; 143 | } 144 | 145 | .CodeMirror-gutter-elt { 146 | cursor: default; 147 | z-index: 4; 148 | position: absolute; 149 | } 150 | 151 | .CodeMirror-lines { 152 | cursor: text; 153 | } 154 | .CodeMirror pre { 155 | /* Reset some styles that the rest of the page might have set */ 156 | -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; 157 | border-width: 0; 158 | background: transparent; 159 | font-family: inherit; 160 | /*font-size: inherit;*/ 161 | margin: 0; 162 | white-space: pre; 163 | word-wrap: normal; 164 | /* 165 | line-height: inherit; 166 | */ 167 | color: inherit; 168 | z-index: 2; 169 | position: relative; 170 | overflow: visible; 171 | } 172 | .CodeMirror-wrap pre { 173 | word-wrap: break-word; 174 | white-space: pre-wrap; 175 | word-break: normal; 176 | } 177 | 178 | .CodeMirror-linebackground { 179 | position: absolute; 180 | left: 0; right: 0; top: 0; bottom: 0; 181 | z-index: 0; 182 | } 183 | 184 | .CodeMirror-linewidget { 185 | position: relative; 186 | z-index: 2; 187 | overflow: auto; 188 | } 189 | 190 | .CodeMirror-widget {} 191 | 192 | .CodeMirror-wrap .CodeMirror-scroll { 193 | overflow-x: hidden; 194 | } 195 | 196 | .CodeMirror-measure { 197 | position: absolute; 198 | width: 100%; 199 | height: 0; 200 | overflow: hidden; 201 | visibility: hidden; 202 | } 203 | .CodeMirror-measure pre { position: static; } 204 | 205 | .CodeMirror div.CodeMirror-cursor { 206 | position: absolute; 207 | visibility: hidden; 208 | border-right: none; 209 | width: 0; 210 | } 211 | .CodeMirror-focused div.CodeMirror-cursor { 212 | visibility: visible; 213 | } 214 | 215 | .CodeMirror-selected { background: yellow; } 216 | .CodeMirror-focused .CodeMirror-selected { background: yellow; } 217 | 218 | .cm-searching { 219 | background: #ffa; 220 | background: rgba(255, 255, 0, .4); 221 | } 222 | 223 | /* IE7 hack to prevent it from returning funny offsetTops on the spans */ 224 | .CodeMirror span { *vertical-align: text-bottom; } 225 | -------------------------------------------------------------------------------- /css/cm-dialog.css: -------------------------------------------------------------------------------- 1 | /* CODEMIRROR DIALOG ----------------------------------------------------- */ 2 | /* Adapted from `CodeMirror/addon/dialog/dialog.css` ------------------------ */ 3 | .CodeMirror-dialog { 4 | z-index: 15; 5 | position: absolute; 6 | left: 0; right: 0; 7 | overflow: hidden; 8 | padding-left : 1.0rem; 9 | padding-right : 1.0rem; 10 | padding-top : 0.6rem; 11 | padding-bottom : 0.4rem; 12 | font-size: 0.7rem; 13 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 14 | background-color: rgb(30,30,30); 15 | color: rgb(200,200,200); 16 | } 17 | .CodeMirror-dialog-top { top : 0; border-bottom: 1px solid #eee; } 18 | .CodeMirror-dialog-bottom { bottom: 0; border-top : 1px solid #eee; } 19 | .CodeMirror-dialog input { 20 | border: none; 21 | outline: none; 22 | background: transparent; 23 | width: 50em; 24 | color: white; 25 | font-size: 2em; 26 | font-family: Cousine, Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; 27 | } 28 | .CodeMirror-dialog button { } 29 | -------------------------------------------------------------------------------- /css/cm-foldgutter.css: -------------------------------------------------------------------------------- 1 | /* CODEMIRROR FOLD GUTTER ------------------------------------------------ */ 2 | /* Adapted from `CodeMirror/addon/fold/foldgutter.css` ---------------------- */ 3 | 4 | .CodeMirror-foldmarker { 5 | cursor: pointer; 6 | line-height: .3; 7 | display: inline-block; 8 | -webkit-transform:scale(.7,.7); 9 | -moz-transform:scale(.7,.7); 10 | -ms-transform:scale(.7,.7); 11 | -o-transform:scale(.7,.7); 12 | transform:scale(.7,.7); 13 | } .CodeMirror-foldmarker:after { 14 | display: inline-block; 15 | content: "…"; 16 | font-family: Cousine, Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; 17 | font-size: 1rem; 18 | margin-left:1rem; 19 | padding-top:5px; 20 | padding-bottom: 5px; 21 | padding-left: 7px; 22 | padding-right: 7px; 23 | height:10px; 24 | bottom:5px; 25 | background-color: rgb(20,170,255);; 26 | color:white; 27 | -webkit-border-radius: 2px; 28 | -moz-border-radius: 2px; 29 | -ms-border-radius: 2px; 30 | border-radius: 2px; 31 | position: absolute; 32 | } 33 | 34 | .CodeMirror-foldgutter { 35 | background-color: transparent; 36 | width: 1.5rem; 37 | /* Small triagles are not covered by default fonts on WinXP and Android. */ 38 | font-family: Cousine, Consolas, "Lucida Sans Unicode", "Droid Sans Fallback", "Arial Unicode", Arial, serif; 39 | } 40 | .CodeMirror-foldgutter-open, 41 | .CodeMirror-foldgutter-folded { 42 | cursor: pointer; 43 | } 44 | .CodeMirror-foldgutter-open:after { 45 | content: "▾"; /* U+25BE BLACK DOWN-POINTING SMALL TRIANGLE */ 46 | color:rgb(200,200,200); 47 | } 48 | .CodeMirror-foldgutter-folded:after { 49 | content: "▸"; /* U+25B8 BLACK RIGHT-POINTING SMALL TRIANGLE */ 50 | color:rgb(20,170,255); 51 | } 52 | 53 | .CodeMirror-gutter-elt { 54 | left:-0.5rem !important; 55 | } 56 | -------------------------------------------------------------------------------- /css/firepad.css: -------------------------------------------------------------------------------- 1 | .firepad { 2 | /* Default height for a firepad. */ 3 | height: 400px; 4 | position: relative; 5 | } 6 | 7 | .firepad { 8 | text-align: left; 9 | line-height: normal; 10 | } 11 | 12 | .firepad .CodeMirror { 13 | /* Use width / height of the firepad wrapper element. */ 14 | position: absolute; 15 | height: auto; 16 | top: 0; 17 | left: 0; 18 | right: 0; 19 | bottom: 0; 20 | } 21 | 22 | .firepad-richtext .CodeMirror { 23 | font-family: Verdana, sans-serif; 24 | font-size: 14px; 25 | } 26 | 27 | .firepad-with-toolbar .CodeMirror { 28 | /* Leave room for toolbar and add some padding on the left. */ 29 | top: 70px; 30 | left: 10px; 31 | } 32 | 33 | /** Styles for all of the rich-text formatting we support. */ 34 | .firepad-b { font-weight: bold; } 35 | .firepad-i { font-style: italic; } 36 | .firepad-u { text-decoration: underline; } 37 | .firepad-s { text-decoration: line-through; } 38 | .firepad-u.firepad-s { text-decoration: underline line-through; } 39 | 40 | .firepad-f-arial { font-family: Arial, Helvetica, sans-serif; } 41 | .firepad-f-comic-sans-ms { font-family: "Comic Sans MS", cursive, sans-serif; } 42 | .firepad-f-courier-new { font-family: "Courier New", Courier, monospace; } 43 | .firepad-f-impact { font-family: Impact, Charcoal, sans-serif; } 44 | .firepad-f-times-new-roman { font-family: "Times New Roman", Times, serif; } 45 | .firepad-f-verdana { font-family: Verdana, Geneva, sans-serif; } 46 | 47 | .firepad-la-left { text-align: left; } 48 | .firepad-la-center { text-align: center; } 49 | .firepad-la-right { text-align: right; } 50 | 51 | /** Line Styles */ 52 | pre.firepad-lt-o, pre.firepad-lt-u, pre.firepad-lt-t, pre.firepad-lt-tc { 53 | margin-left: 40px; 54 | } 55 | 56 | .firepad-list-left { 57 | display:inline-block; 58 | margin-left: -40px; 59 | width: 40px; 60 | padding-right: 5px; 61 | text-align: right; 62 | } 63 | 64 | .firepad-todo-left { 65 | display:inline-block; 66 | margin-left: -20px; 67 | width: 20px; 68 | } 69 | 70 | .powered-by-firepad { 71 | position: absolute; 72 | display: block; 73 | z-index: 5; 74 | right: 20px; 75 | bottom: 20px; 76 | width: 129px; 77 | height: 23px; 78 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIEAAAAXCAYAAAAsnywOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowN0M3OUFEQTk4ODUxMUUyQUFBRTg2NUQxMTExQTUxQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowN0M3OUFEQjk4ODUxMUUyQUFBRTg2NUQxMTExQTUxQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkRBNEIyOTA5OTg4NDExRTJBQUFFODY1RDExMTFBNTFDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRBNEIyOTBBOTg4NDExRTJBQUFFODY1RDExMTFBNTFDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+o21teAAABctJREFUeNrEWttV8zgQFjl5X1EBTgVr3vKGqYBQQZIKgAoMFUAqiKkgTgUxT/CGUwH+K8DbwVrnjDbzKzOjS9jdOUcnCVjyXD7NTTp7f39XkZQPoxjGn8PI4Lulbhi3w2jht4bnzXMX8Jkx6zbD+DWMSnj3Yhh38H2J3vMTlCN+DfUeXixlwJPVSwfrtDBeE/g0a85hbhf4fDmM7TDqmBdNp1N1FgACDco3Rp/Bb4mM8p6G8ZxojEeY79Ia+MC0DDSUS8ZYV/ApAfMFeOmZ/5fAr4/MOg8R/O3Q5jIgWMEaHN0jfdvnK4HvIBBoMPgNfP7X5AJBUnYIEGYA4sLxXD8NSokePIa09AxGdeksYU7l8w4GBCMCUQaF3yDk/wEAatdKu03i07jor2FsYI0i4f17ZuctItcpPV5UC8ZUHt63Qvg0sn+iMHdEY0dhsS68g9E6rmcPa2We+XieXWvr5BTrAD7WkFP0xN+zRPD1sHtrxqCxZL1rRQD1MzBnaZj/3QTM3YFHe5FAoAONXiND9Z5nS/h8A0apmN4yqG+B8ewEBfeRgLbJ3J4Bld1dOhFYc4LHTeDcPzxGdmXJGE9zA8n7P7KNnF0pZbGG+QnsjiZAwS28jNtNPfO+BRj/ixDOzLlm5t0xPEjUILkmwO8T8MvJd8XkDecQt8/g+5LI7AtC1lBPlXt0jcnKQslRgH41BYIeGO8j405MbHcNIClZMwBo4LMnlJQH8rwEY10zxpISTDf/qIkKQqPhyxNS9SflLQXwdQuAeHT4yzEQRgSizgmldLH1J2GgLNBAnLDYA3BeJCeAVjNAK8AIdjwHGGxDGPYV8b2A+P4F62nPeplQSVAhTwuhjNODLdkvCSCUbk6AGw9ZpFv1EZW41IygGVNnt6iJEuNGMybkLJj3L5k1HoXyLDSud45X4UrSF9BZwezwlPyhg420RiC5//j4WI0dpnom9mwRExpqbktvgmvnBOaSylww5KcnLlIhpgiY44IjJ8LNPBJkHK08fDWoJ9EQILg60SO3INs3ts0YjLpTv7dLqRJsLSheqhSoWP0akXSpwH4FFdtTSzlNxPhTCTeLSkEGqT+xAF20sF6XwMcRsEbq0PdOFdjXhYvJ2lOaUzahperv2OZQBbHTl9XHUANrvnj0VavDWUzJhFAbLmfgGWeCjjn9rqU+wSlC1h4X6xqtSSiDKCC9Kr5HvmYA0xBA9x30NJG82UR6RQBqHlF5+DxWz4Skvwi9lsz6b2MQ/jExvnRMIsUBQCm+z58FKncFCu483ilnXHKVIKuJ0/eCJ2oBKHukF07GxQ9svB71azJCVtxx3QiezPBZjZEhpfZsDQu/CeVZaB28OgEEvtM0KQQ1gQDQhGfh8p1JZFwuBe8U4wVwyCoYj1p6wph57+10Ou3HaHfeEfXlRMW1Xl33lhHIywJqWyWUY3O0CyRDKk8ymqPncojBOdGTkAAaAwDOCzyAjmeMh6FKdu1Jpn09j1ahlv0YMZgTbjsUABoplbpsghWxQ8lc7eklcHnDDgzQoBK1c4QsIiocl3YOf6ckhlIu0CLvZN53AfG8QSCkjqy1J+RKdHRHYiwgPaZNHHvsbGMVLps0s0u4I9iMaPo0sON/nWgwDZ6xFnZbk+AZJe9UEfLFJou+BP6J4nsU0XjxJSopdCGUjT0A5DrC7RbgCn/i2tmDJxy0kaDSTK4l5Q9U67lzbBNySHatDucuigNBm9h4kBobPqrV7zd2toTbsrxdquNDEEnhXcJOxUq+dJTbnugpe8LgvUfnSwYkywAw2g00kYxvCV8vK9ThgCT2TpyZ84VQ26O4tke7qfEgdwPur1b8ieZC+a+9naMEibsX2anDhdBOHV9oceX7dhR/mRBibGfWHrP7Nt4CeQNbxTVE2PhEsqxiymDujmGRuItsFtud6FUyFX7DdqYOJ4Ia1c+VUAnElLju+woiCf235HP16quGshS5DAj+FmAA6gfBqr4bldAAAAAASUVORK5CYII='); 79 | opacity: 0.5; 80 | } 81 | 82 | .powered-by-firepad:hover { 83 | opacity: 1; 84 | } 85 | 86 | .firepad-toolbar { 87 | position: absolute; 88 | top: 20px; 89 | left: 10px; 90 | right: 0; 91 | white-space: nowrap; 92 | 93 | /* Don't select text when double-clicking in toolbar */ 94 | -webkit-touch-callout: none; 95 | -webkit-user-select: none; 96 | -khtml-user-select: none; 97 | -moz-user-select: none; 98 | -ms-user-select: none; 99 | user-select: none; 100 | } 101 | 102 | .firepad-btn-group { 103 | margin: 0 5px; 104 | display: inline-block; 105 | } 106 | 107 | a.firepad-btn, a.firepad-btn:visited, a.firepad-btn:active { 108 | font-family: "Arial" sans-serif; 109 | cursor: pointer; 110 | text-decoration: none; 111 | display: inline-block; 112 | padding: 6px 6px 4px 6px; 113 | text-align: center; 114 | vertical-align: middle; 115 | font-size: 16px; 116 | background-color: #fcfcfc; 117 | border: 1px solid #c9c9c9; 118 | border-bottom-width: 4px; 119 | color: #9c9c9c; 120 | } 121 | 122 | a.firepad-btn:hover { 123 | color: #fff; 124 | background-color: #ffbf86; 125 | border-color: #e6a165; 126 | text-decoration: none; 127 | } 128 | 129 | a.firepad-btn:active { 130 | -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); 131 | -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); 132 | box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); 133 | } 134 | 135 | .firepad-btn-group > .firepad-btn { 136 | -webkit-border-radius: 0; 137 | -moz-border-radius: 0; 138 | border-radius: 0; 139 | margin-left: -1px; 140 | } 141 | 142 | 143 | .firepad-btn-group > .firepad-btn:first-child { 144 | border-bottom-left-radius: 6px; 145 | border-top-left-radius: 6px; 146 | -webkit-border-bottom-left-radius: 6px; 147 | -webkit-border-top-left-radius: 6px; 148 | -moz-border-radius-bottomleft: 6px; 149 | -moz-border-radius-topleft: 6px; 150 | margin-left: 0px; 151 | } 152 | 153 | .firepad-btn-group > .firepad-btn:last-child { 154 | border-bottom-right-radius: 6px; 155 | border-top-right-radius: 6px; 156 | -webkit-border-bottom-right-radius: 6px; 157 | -webkit-border-top-right-radius: 6px; 158 | -moz-border-radius-bottomright: 6px; 159 | -moz-border-radius-topright: 6px; 160 | } 161 | 162 | .firepad-dropdown { 163 | position: relative; 164 | } 165 | 166 | .firepad-dropdown-menu { 167 | position: absolute; 168 | top: 100%; 169 | left: 0; 170 | z-index: 1000; 171 | display: none; 172 | float: left; 173 | padding: 4px 0; 174 | margin: 4px 0 0; 175 | list-style: none; 176 | background-color: #ffffff; 177 | border: 1px solid #ccc; 178 | border: 1px solid rgba(0, 0, 0, 0.2); 179 | *border-right-width: 2px; 180 | *border-bottom-width: 2px; 181 | -webkit-border-radius: 5px; 182 | -moz-border-radius: 5px; 183 | border-radius: 5px; 184 | -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 185 | -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 186 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 187 | -webkit-background-clip: padding-box; 188 | -moz-background-clip: padding; 189 | background-clip: padding-box; 190 | } 191 | 192 | .firepad-dropdown-menu a { 193 | text-align: left; 194 | display: block; 195 | padding: 3px 15px; 196 | clear: both; 197 | font-weight: normal; 198 | line-height: 18px; 199 | color: #333333; 200 | white-space: nowrap; 201 | } 202 | 203 | .firepad-dropdown-menu a:hover { 204 | color: #fff; 205 | text-decoration: none; 206 | background-color: #ffbf86; 207 | } 208 | 209 | .firepad-color-dropdown-item { 210 | height: 25px; 211 | width: 25px; 212 | } 213 | 214 | .firepad-dialog { 215 | position: absolute; 216 | left: 0px; 217 | top: 0px; 218 | width: 100%; 219 | height: 100%; 220 | z-index: 1000; 221 | } 222 | 223 | .firepad-dialog-div { 224 | position: relative; 225 | width: 520px; 226 | height: 100px; 227 | margin: 100px auto; 228 | background-color: #fff; 229 | border: 1px solid #000; 230 | padding: 15px; 231 | } 232 | 233 | .firepad-dialog-input { 234 | width: 500px; 235 | display: block; 236 | padding: 5px 5px; 237 | margin: 10px 10px 10px 5px; 238 | clear: both; 239 | font-weight: normal; 240 | line-height: 25px; 241 | color: #333333; 242 | white-space: nowrap; 243 | } 244 | 245 | /******************************************************************** 246 | * Generated via icomoon.io. 247 | If you want to make changes, you can go to http://icomoon.io/app/, go to the bottom right and click the 248 | database-looking icon, then "Load Session" and use the checked-in font/firepad-icomoon.json file. 249 | 250 | Note: When you download the generated font, turn on the "Base 64 Encode ..." option to generate the font inline 251 | in the CSS (to avoid needing to distribute a font file with firepad). 252 | */ 253 | @font-face { 254 | font-family: 'firepad'; 255 | src:url('firepad.eot'); 256 | } 257 | @font-face { 258 | font-family: 'firepad'; 259 | src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'), 260 | url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'); 261 | font-weight: normal; 262 | font-style: normal; 263 | } 264 | 265 | .firepad-tb-bold, .firepad-tb-italic, .firepad-tb-underline, .firepad-tb-strikethrough, .firepad-tb-list, .firepad-tb-list-2, .firepad-tb-numbered-list, .firepad-tb-paragraph-left, .firepad-tb-paragraph-center, .firepad-tb-paragraph-right, .firepad-tb-paragraph-justify, .firepad-tb-menu, .firepad-tb-link, .firepad-tb-undo, .firepad-tb-redo, .firepad-tb-box-add, .firepad-tb-box-remove, .firepad-tb-print, .firepad-tb-indent-decrease, .firepad-tb-indent-increase, .firepad-tb-insert-image, .firepad-tb-bubble { 266 | font-family: 'firepad'; 267 | speak: none; 268 | font-style: normal; 269 | font-weight: normal; 270 | font-variant: normal; 271 | text-transform: none; 272 | line-height: 1; 273 | -webkit-font-smoothing: antialiased; 274 | } 275 | .firepad-tb-bold:before { 276 | content: "\e000"; 277 | } 278 | .firepad-tb-italic:before { 279 | content: "\e001"; 280 | } 281 | .firepad-tb-underline:before { 282 | content: "\e002"; 283 | } 284 | .firepad-tb-strikethrough:before { 285 | content: "\e003"; 286 | } 287 | .firepad-tb-list:before { 288 | content: "\e004"; 289 | } 290 | .firepad-tb-list-2:before { 291 | content: "\e005"; 292 | } 293 | .firepad-tb-numbered-list:before { 294 | content: "\e006"; 295 | } 296 | .firepad-tb-paragraph-left:before { 297 | content: "\e007"; 298 | } 299 | .firepad-tb-paragraph-center:before { 300 | content: "\e008"; 301 | } 302 | .firepad-tb-paragraph-right:before { 303 | content: "\e009"; 304 | } 305 | .firepad-tb-paragraph-justify:before { 306 | content: "\e00a"; 307 | } 308 | .firepad-tb-menu:before { 309 | content: "\e00b"; 310 | } 311 | .firepad-tb-link:before { 312 | content: "\e00c"; 313 | } 314 | .firepad-tb-undo:before { 315 | content: "\e00d"; 316 | } 317 | .firepad-tb-redo:before { 318 | content: "\e00e"; 319 | } 320 | .firepad-tb-box-add:before { 321 | content: "\e010"; 322 | } 323 | .firepad-tb-box-remove:before { 324 | content: "\e011"; 325 | } 326 | .firepad-tb-print:before { 327 | content: "\e012"; 328 | } 329 | .firepad-tb-indent-decrease:before { 330 | content: "\e013"; 331 | } 332 | .firepad-tb-indent-increase:before { 333 | content: "\e014"; 334 | } 335 | .firepad-tb-insert-image:before { 336 | content: "\e015"; 337 | } 338 | .firepad-tb-bubble:before { 339 | content: "\e00f"; 340 | } 341 | -------------------------------------------------------------------------------- /css/fonts.css: -------------------------------------------------------------------------------- 1 | /* Get Web fonts ------------------------------------------------------------ */ 2 | 3 | @font-face { 4 | font-family: 'FontAwesome'; 5 | src: url('http://fontawesome.io/assets/font-awesome/fonts/fontawesome-webfont.eot') format('embedded-opentype'), url('http://fontawesome.io/assets/font-awesome/fonts/fontawesome-webfont.woff') format('woff'), url('http://fontawesome.io/assets/font-awesome/fonts/fontawesome-webfont.ttf') format('truetype'), url('http://fontawesome.io/assets/font-awesome/fonts/fontawesome-webfont.svg#fontawesomeregular') format('svg'); 6 | font-weight: normal; 7 | font-style: normal; 8 | } 9 | 10 | /* To do: Don’t load fonts as an external dependency, but serve our own, 11 | likely from the MathJax lib. */ 12 | @font-face { 13 | font-family: "Computer Modern"; 14 | src: url('http://mirrors.ctan.org/fonts/cm-unicode/fonts/otf/cmunbi.otf'); 15 | font-weight: bold; 16 | font-style: italic; 17 | } 18 | @font-face { 19 | font-family: "Computer Modern"; 20 | src: url('http://mirrors.ctan.org/fonts/cm-unicode/fonts/otf/cmunrb.otf'); 21 | font-weight: bold; 22 | } 23 | @font-face { 24 | font-family: "Computer Modern"; 25 | src: url('http://mirrors.ctan.org/fonts/cm-unicode/fonts/otf/cmunci.otf'); 26 | font-style: italic; 27 | } 28 | @font-face { 29 | font-family: "Computer Modern"; 30 | src: url('http://mirrors.ctan.org/fonts/cm-unicode/fonts/otf/cmunrm.otf'); 31 | font-weight: normal; 32 | } 33 | -------------------------------------------------------------------------------- /firebase-config/security-rules.json: -------------------------------------------------------------------------------- 1 | /* Based on firepad's examples/security/secret-url.json */ 2 | { 3 | "rules": { 4 | "firepads": { 5 | "$secretid": { 6 | "history": { 7 | ".read": true, 8 | "$revision": { 9 | /* Prevent overwriting existing revisions. */ 10 | ".write": "data.val() === null" 11 | } 12 | }, 13 | "checkpoint": { 14 | ".read": true, 15 | /* Ensure author of checkpoint is the same as the author of the revision they're checkpointing. */ 16 | ".write": "root.child('firepads').child($secretid).child('history').child(newData.child('id').val()).child('a').val() === newData.child('a').val()", 17 | ".validate": "newData.hasChildren(['a', 'o', 'id'])" 18 | }, 19 | "users": { 20 | ".read": true, 21 | "$user": { 22 | ".write": true 23 | } 24 | } 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /firebase-config/security-test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # TODO: learn to write this kind of theng in Node.js. 3 | 4 | firebase=mathdown.firebaseio.com 5 | 6 | fails=0 7 | # Can't read list of pads 8 | curl --silent --head -X GET https://$firebase/firepads.json | grep '40[0-9]' || let fails++ 9 | # Can read pad with known name 10 | curl --silent --head -X GET https://$firebase/firepads/help/history.json | grep 200 || let fails++ 11 | curl --silent --head -X GET https://$firebase/firepads/help/checkpoint.json | grep 200 || let fails++ 12 | curl --silent --head -X GET https://$firebase/firepads/help/users.json | grep 200 || let fails++ 13 | 14 | echo 15 | if [ $fails != 0 ]; then 16 | echo "$fails FAILURES" 17 | else 18 | echo "PASS" 19 | fi 20 | exit $fails 21 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 20 | ℳ↧ ⋯ 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 78 | 79 | 80 | 81 | 104 |
105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /mathdown.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | /* OVERRIDE LIBS ============================================================ */ 4 | 5 | /* Override fixed editor size from firepad.css ------------------------------ */ 6 | .firepad { height: 100%; } 7 | .firepad .CodeMirror { height: 100%; position: relative; } 8 | .powered-by-firepad { background-image: none; } /* Disable Firepad logo */ 9 | 10 | /* CodeMirror Hacks --------------------------------------------------------- */ 11 | /* These are relevant to the app; other overrides of the original CodeMirror css 12 | are in `css/cm-codemirror.css` */ 13 | .CodeMirror { min-height: 100vh; } 14 | @media (min-width: 800px) { .CodeMirror-gutter-wrapper { 15 | height: 100%; 16 | left:-5.5rem !important; 17 | } 18 | } 19 | .CodeMirror-code > pre, 20 | .CodeMirror-code > div { text-indent: 0 !important; padding-left: 0; } 21 | .CodeMirror pre[style] { text-indent: 0; padding-left:0 !important; } 22 | /* We set (in "renderLine" event) negative text-indent on indented lines, 23 | which if inherited by any nested inline-block breaks their positioning 24 | (math overlaps text, tabs become almost invisible). Thanks to 25 | https://github.com/mathjax/MathJax/issues/473 for easy fix. */ 26 | .CodeMirror pre > * { text-indent: 0 !important; } 27 | 28 | .CodeMirror-selected { background: yellow; } 29 | .CodeMirror-focused .CodeMirror-selected { background: yellow; } 30 | .CodeMirror-gutter-elt { 31 | /* To do: When there are more lines in a header, the gutter folding arrow 32 | should sit on the baseline of the first line. */ 33 | position: absolute; 34 | bottom:1rem; 35 | } 36 | 37 | /* NORMALIZE BROWSERS ======================================================= */ 38 | html { 39 | height: 100%; 40 | width: 100%; 41 | -webkit-box-sizing: border-box; 42 | -moz-box-sizing: border-box; 43 | -ms-box-sizing: border-box; 44 | -o-box-sizing: border-box; 45 | box-sizing: border-box; 46 | } 47 | html * { 48 | -webkit-box-sizing: border-box; 49 | -moz-box-sizing: border-box; 50 | -ms-box-sizing: border-box; 51 | -o-box-sizing: border-box; 52 | box-sizing: border-box; 53 | } 54 | body { height: 100%; width: 100%; margin:0; } 55 | 56 | /* Auto-responsive scaling for various screen sizes ------------------------- */ 57 | 58 | @media screen and (max-width: 460px) { 59 | html { font-size: 14px; } 60 | } 61 | @media screen and (min-width: 461px) and (max-width: 800px) { 62 | html { font-size: 16px; } 63 | } 64 | @media screen and (min-width: 801px) { 65 | html { font-size: 18px; } 66 | } 67 | 68 | 69 | 70 | /* DEFAULT STYLES & SETUP =================================================== */ 71 | 72 | /* Setup and Dimensions of Editor Canvas ------------------------------------ */ 73 | #content { 74 | clear: both; 75 | background-color: rgb(250,250,250); 76 | min-height: 100%; 77 | } 78 | form, textarea, .CodeMirror { 79 | -webkit-box-sizing: border-box; 80 | -moz-box-sizing: border-box; 81 | -ms-box-sizing: border-box; 82 | -o-box-sizing: border-box; 83 | box-sizing: border-box; 84 | padding-right: 1rem; 85 | } 86 | /* TODO: downsizing body is ugly but works better than downsizing form. */ 87 | /*body { height: 80%; width: 95%; }*/ 88 | /* These would make the editor exactly fill the available space, 89 | but also cause CM to auto-resize and never scroll 90 | (instead whole page scrolls), which makes CM slower. 91 | body { display: table; } 92 | form { display: table-row; } */ 93 | 94 | .firedpad { 95 | max-width: 100%; 96 | } 97 | .CodeMirror-sizer { 98 | max-width: 35rem; 99 | /*margin-right: 22px;*/ 100 | } 101 | .CodeMirror-code { 102 | max-width: 35rem; 103 | } 104 | 105 | 106 | /* Fonts & Colors ----------------------------------------------------------- */ 107 | .CodeMirror, 108 | .CodeMirror-code { 109 | /* Homage to Don Knuth’s Computer Modern fonts; for alternatives 110 | cfr Math.SE: http://graphicdesign.stackexchange.com/a/12961 */ 111 | font-family: "Computer Modern", "Times New Roman", Times, serif; 112 | -webkit-text-rendering: optimizeLegibility; 113 | text-rendering: optimizeLegibility; 114 | -webkit-font-kerning: auto; 115 | font-kerning: auto; 116 | line-height: 1.3em; 117 | color: rgb(67,67,67); 118 | } 119 | 120 | 121 | /* TO DO’s ===================================================================*/ 122 | 123 | /* Want to disable/de-emphasize coloring of list lines, leaving only bullet colored. 124 | But can't, as long as color is important for lining up continuation lines. 125 | .cm-s-default .cm-variable-2 { color: #003366; } 126 | .cm-s-default .cm-variable-2.cm-formatting-list { color: #05a; } 127 | .cm-s-default .cm-variable-3 { color: #005233; } 128 | .cm-s-default .cm-variable-3.cm-formatting-list { color: #085; } 129 | .cm-s-default .cm-keyword { color: #470052; } 130 | .cm-s-default .cm-keyword.cm-formatting-list { color: #708; } 131 | */ 132 | -------------------------------------------------------------------------------- /mathdown.js: -------------------------------------------------------------------------------- 1 | // Main code running in every mathdown document (all shown via index.html). 2 | 3 | "use strict"; 4 | 5 | // Prevent errors on IE. Might not actually log. 6 | function log() { 7 | try { console.log.apply(console, arguments); } catch (err) {} 8 | } 9 | 10 | // Send MathJax messages to log. 11 | log("MJ:", MathJax.Message.Log()); 12 | var origFilterText = MathJax.Message.filterText; 13 | MathJax.Message.filterText = function(text, n, msgType) { 14 | // Exclude non-informative "Processing/Typesetting math: 0% / 100%". 15 | if(msgType != "ProcessMath" && msgType != "TypesetMath") { 16 | log("MJ:", text, "[" + msgType + "]"); 17 | } 18 | return origFilterText(text, n, msgType); 19 | } 20 | 21 | function locationQueryParams() { 22 | /* If more is needed, use https://github.com/medialize/URI.js */ 23 | var queryParts = window.location.search.replace(/^\?/g, "").split("&"); 24 | var params = {}; 25 | for(var i = 0; i < queryParts.length; i++) { 26 | var keyval = queryParts[i].split("="); 27 | params[decodeURIComponent(keyval[0])] = decodeURIComponent(keyval[1] || ""); 28 | } 29 | return params; 30 | } 31 | 32 | // Return an int in [0, 62). 33 | var random62 = (window.crypto && window.crypto.getRandomValues) ? 34 | function() { 35 | var buf = new Uint8Array(1); 36 | var n; 37 | do { 38 | window.crypto.getRandomValues(buf); 39 | n = (buf[0] % 64); 40 | } while(n >= 62); 41 | return n; 42 | } 43 | : 44 | function() { 45 | // Math.random is pathetic on most browsers, though some initialize 46 | // with secure seed: http://stackoverflow.com/a/18507748/239657 47 | return Math.floor(Math.random() * 62); 48 | }; 49 | 50 | function randomBase62(length) { 51 | var base62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 52 | var text = ""; 53 | for(var i=0; i < length; i++) 54 | text += base62.charAt(random62()); 55 | return text; 56 | } 57 | 58 | function newPad() { 59 | var doc = randomBase62(11); // 62**11 ~= 2**65. 60 | window.open("?doc=" + doc, "_blank"); 61 | } 62 | 63 | var doc = locationQueryParams()["doc"]; 64 | if(!doc) { 65 | window.location.search = "?doc=about"; 66 | } 67 | var firepadsRef = new Firebase("https://mathdown.firebaseIO.com/firepads"); 68 | var firepadRef = firepadsRef.child(doc); 69 | log("firebase ref:", firepadRef.toString()); 70 | 71 | // Stolen from CodeMirror/addon/edit/trailingspace.js. 72 | CodeMirror.defineOption("showLeadingSpace", false, function(cm, val, prev) { 73 | if (prev == CodeMirror.Init) prev = false; 74 | if (prev && !val) 75 | cm.removeOverlay("leadingspace"); 76 | else if (!prev && val) 77 | cm.addOverlay({ 78 | token: function(stream) { 79 | if (stream.sol() && stream.eatSpace()) { 80 | return "leadingspace"; 81 | } else { 82 | stream.skipToEnd(); 83 | return null; 84 | } 85 | }, 86 | name: "leadingspace" 87 | }); 88 | }); 89 | 90 | // To add vertical margin to headers, the .cm-header[N] classes must apply to 91 | //
 and not the .  Wrap the mode to achieve this.
 92 | CodeMirror.defineMode("gfm_header_line_classes", function(cmConfig, modeCfg) {
 93 |   modeCfg.name = "gfm";
 94 |   modeCfg.highlightFormatting = true;
 95 |   var mode = CodeMirror.getMode(cmConfig, modeCfg);
 96 |   var origToken = mode.token;
 97 |   // We use GFM mostly for URLs but don't want GitHub-specific formatting that
 98 |   // makes `0123456789` a link.  TODO: add mode option of gfm.js.
 99 |   var shaOrIssueRE = /^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40})|b^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+$/;
100 |   mode.token = function(stream, state) {
101 |     var classes = origToken(stream, state) || "";
102 |     if (shaOrIssueRE.test(stream.current())) {
103 |       classes = classes.replace(/(^| )link( |$)/, " ");
104 |     }
105 |     classes = classes.replace(/(^| )(header\S*)/g, "$1line-cm-$2");
106 |     return /^\s*$/.test(classes) ? null : classes;
107 |   }
108 |   return mode;
109 | });
110 | 
111 | // Defaults are insert \t / reindent.  Indent / dedent are more expected & useful.
112 | CodeMirror.keyMap["default"]["Tab"] = "indentMore";
113 | CodeMirror.keyMap["default"]["Shift-Tab"] = "indentLess";
114 | 
115 | var editor = CodeMirror.fromTextArea(document.getElementById("code"),
116 |                                      {foldGutter: true,
117 |                                       gutters: ["CodeMirror-foldgutter"],
118 |                                       indentUnit: 4,
119 |                                       lineNumbers: false,
120 |                                       lineWrapping: true,
121 |                                       mode: "gfm_header_line_classes",
122 |                                       showLeadingSpace: true});
123 | 
124 | // Indent soft-wrapped lines.  Based on CodeMirror/demo/indentwrap.html.
125 | var leadingSpaceAndListBullets = /^\s*([*+-]\s+|\d+\.\s+)?/;
126 | editor.on("renderLine", function(cm, line, elt) {
127 |   // Would like to measure real sizes of /leadingspace|formatting-list/ styled
128 |   // spans, but can't do that without inserting them into the DOM.
129 |   var leading = (leadingSpaceAndListBullets.exec(line.text) || [""])[0];
130 |   var off = CodeMirror.countColumn(leading, leading.length, cm.getOption("tabSize"));
131 |   // Using "ex" is a bit better than cm.defaultCharWidth() — it picks up
132 |   // increased font if applied to whole line, i.e. in header lines
133 |   // (not that it makes sense to indent headers).
134 |   elt.style.textIndent = "-" + off + "ex";
135 |   elt.style.paddingLeft = off + "ex";
136 | });
137 | editor.refresh();
138 | 
139 | // Keep title and url #hash part in sync with first line of document.
140 | function updateTitle() {
141 |   var text = editor.getLine(0); // TODO: find first # Title line?
142 |   text = text.replace(/^\s*#+\s*/, "");
143 |   document.title = text + " | mathdown";
144 |   window.location.hash = text.replace(/\W+/g, "-").replace(/^-/, "").replace(/-$/, "");
145 | }
146 | CodeMirror.on(editor.getDoc(), "change", function(doc, changeObj) {
147 |   if (changeObj.from.line == 0) {
148 |     updateTitle();
149 |   }
150 | });
151 | 
152 | CodeMirror.hookMath(editor, MathJax);
153 | 
154 | var firepad =  Firepad.fromCodeMirror(firepadRef, editor);
155 | firepad.on("ready", function() {
156 |   if (firepad.isHistoryEmpty()) {
157 |     firepad.setText(
158 |       "# Untitled\n" +
159 |         "Bookmark this page — the random-looking address is the only way to access this document!\n" +
160 |         "Share the link to collaborate.\n" +
161 |         "Edits are saved in real time.\n" +
162 |         "\n" +
163 |         "Use Markdown for document structure and $\\LaTeX$ math syntax (see **Help** link above).\n" +
164 |         "To edit formulas just enter them with arrow keys.\n" +
165 |         // HACK: Pad the editor with a few empty lines so it looks
166 |         // more inviting to write in.
167 |         "\n" +
168 |         "\n"
169 |     );
170 |   } else {
171 |     // Keeping cursor at start (hopefully) reduces CM redrawing as
172 |     // syntax highlight and math rendering changes line heights.
173 |     editor.setCursor({line: 0, ch: 0});
174 |   }
175 | 
176 |   // CM's autofocus option doesn't work with Firepad - seems focused
177 |   // but can't type.  Focusing here after Firepad init works.
178 |   editor.focus();
179 | 
180 |   // Queuing this allows text to appear before math.
181 |   MathJax.Hub.Queue(function() {
182 |     editor.renderAllMath();
183 |   });
184 | });
185 | 


--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "mathdown",
 3 |   "version": "0.0.0",
 4 |   "description": "http://mathdown.net",
 5 |   "devDependencies": {
 6 |     "coffee-script": "~1.7.1",
 7 |     "wd": "~0.2.19",
 8 |     "chalk": "~0.4.0"
 9 |   },
10 |   "scripts": {
11 |     "test": "coffee smoke-test.coffee"
12 |   },
13 |   "repository": {
14 |     "type": "git",
15 |     "url": "https://github.com/cben/mathdown"
16 |   },
17 |   "author": "Beni Cherniavsky-Paskin ",
18 |   "license": "MIT",
19 |   "readmeFilename": "README.md"
20 | }
21 | 


--------------------------------------------------------------------------------
/samples/Einstein.md:
--------------------------------------------------------------------------------
  1 | # Zur Elektrodynamik bewegter Körper
  2 | 
  3 | von **A. Einstein**
  4 | 
  5 | _Annalen der Physik_, 322 (10): 891–921.[^†][^‡]
  6 | 
  7 | 
  8 | 
  9 | Daß die Elektrodynamik __Maxwell__s — wie dieselbe gegenwärtig aufgefaßt zu werden pflegt — in ihrer Anwendung auf bewegte Körper zu Asymmetrien führt, welche den Phänomenen nicht anzuhaften scheinen, ist bekannt. Man denke z.B. an die elektrodynamische Wechselwirkung zwischen einem Magneten und einem Leiter. Das beobachtbare Phänomen hängt hier nur ab von der Relativbewegung von Leiter und Magnet, während nach der üblichen Auffassung die beiden Fälle, daß der eine oder der andere dieser Körper der bewegte sei, streng voneinander zu trennen sind. Bewegt sich nämlich der Magnet und ruht der Leiter, so entsteht in der Umgebung des Magneten ein elektrisches Feld von gewissem Energiewerte, welches an den Orten, wo sich Teile des Leiters befinden, einen Strom erzeugt. Ruht aber der Magnet und bewegt sich der Leiter, so entsteht in der Umgebung des Magneten kein elektrisches Feld, dagegen im Leiter eine elektromotorische Kraft, welcher an sich keine Energie entspricht, die aber — Gleichheit der Relativbewegung bei den beiden ins Auge gefaßten Fällen vorausgesetzt — zu elektrischen Strömen von derselben Größe und demselben Verlaufe Veranlassung gibt, wie im ersten Falle die elektrischen Kräfte.
 10 | 
 11 | Beispiele ähnlicher Art, sowie die mißlungenen Versuche, eine Bewegung der Erde relativ zum »Lichtmedium« zu konstatieren, führen zu der Vermutung, daß dem Begriffe der absoluten Ruhe nicht nur in der Mechanik, sondern auch in der Elektrodynamik keine Eigenschaften der Erscheinungen entsprechen, sondern daß vielmehr für alle Koordinatensysteme, für welche die mechanischen Gleichungen gelten, auch die gleichen elektrodynamischen und optischen Gesetze gelten, wie dies für die Größen erster Ordnung bereits erwiesen ist. Wir wollen diese Vermutung (deren Inhalt im folgenden »Prinzip der Relativität« genannt werden wird) zur Voraussetzung erheben und außerdem die mit ihm nur scheinbar unverträgliche [[p.892]] Voraussetzung einführen, daß sich das Licht im leeren Raume stets mit einer bestimmten, vom Bewegungszustande des emittierenden Körpers unabhängigen Geschwindigkeit _V_ fortpflanze. Diese beiden Voraussetzungen genügen, um zu einer einfachen und widerspruchsfreien Elektrodynamik bewegter Körper zu gelangen unter Zugrundelegung der __Maxwell__schen Theorie für ruhende Körper. Die Einführung eines »Lichtäthers« wird sich insofern als überflüssig erweisen, als nach der zu entwickelnden Auffassung weder ein mit besonderen Eigenschaften ausgestatteter »absolut ruhender Raum« eingeführt, noch einem Punkte des leeren Raumes, in welchem elektromagnetische Prozesse stattfinden, ein Geschwindigkeitsvektor zugeordnet wird.
 12 | 
 13 | Die zu entwickelnde Theorie stützt sich — wie jede andere Elektrodynamik — auf die Kinematik des starren Körpers, da die Aussagen einer jeden Theorie Beziehungen zwischen starren Körpern (Koordinatensystemen), Uhren und elektromagnetischen Prozessen betreffen. Die nicht genügende Berücksichtigung dieses Umstandes ist die Wurzel der Schwierigkeiten, mit denen die Elektrodynamik bewegter Körper gegenwärtig zu kämpfen hat.
 14 | ## I. Kinematischer Teil
 15 | ### §1. Definition der Gleichzeitigkeit
 16 | Es liege ein Koordinatensystem vor, in welchem die __Newton__schen mechanischen Gleichungen gelten. Wir nennen dies Koordinatensystem zur sprachlichen Unterscheidung von später einzuführenden Koordinatensystemen und zur Präzisierung der Vorstellung das »ruhende System«.
 17 | 
 18 | Ruht ein materieller Punkt relativ zu diesem Koordinatensystem, so kann seine Lage relativ zu letzterem durch starre Maßstäbe unter Benutzung der Methoden der euklidischen Geometrie bestimmt und in kartesischen Koordinaten ausgedrückt werden.
 19 | 
 20 | Wollen wir die _Bewegung_ eines materiellen Punktes beschreiben, so geben wir die Werte seiner Koordinaten in Funktion der Zeit. Es ist nun wohl im Auge zu behalten, daß eine derartige mathematische Beschreibung erst dann einen physikalischen Sinn hat, wenn man sich vorher darüber klar geworden ist, was hier unter »Zeit« verstanden wird. [[p.893]] Wir haben zu berücksichtigen , daß alle unsere Urteile, in welchen die Zeit eine Rolle spielt, immer Urteile über _gleichzeitige Ereignisse_ sind. Wenn ich z.B. sage: »Jener Zug kommt hier um 7 Uhr an,« so heißt dies etwa: »Das Zeigen des kleinen Zeigers meiner Uhr auf 7 und das Ankommen des Zuges sind gleichzeitige Ereignisse.«[^1] 
 21 | 
 22 | Es könnte scheinen, daß alle die Definition der »Zeit« betreffenden Schwierigkeiten dadurch überwunden werden könnten, daß ich an Stelle der »Zeit« die »Stellung des kleinen Zeigers meiner Uhr« setze. Eine solche Definition genügt in der Tat, wenn es sich darum handelt, eine Zeit zu definieren ausschließlich für den Ort, an welchem sich die Uhr eben befindet; die Definition genügt aber nicht mehr, sobald es sich darum handelt, an verschiedenen Orten stattfindende Ereignisreihen miteinander zeitlich zu verknüpfen, oder — was auf dasselbe hinausläuft — Ereignisse zeitlich zu werten, welche in von der Uhr entfernten Orten stattfinden.
 23 | 
 24 | Wir könnten uns allerdings damit begnügen, die Ereignisse dadurch zeitlich zu werten, daß ein samt der Uhr im Koordinatenursprung befindlicher Beobachter jedem von einem zu wertenden Ereignis Zeugnis gebenden, durch den leeren Raum zu ihm gelangenden Lichtzeichen die entsprechende Uhrzeigerstellung zuordnet. Eine solche Zuordnung bringt aber den Übelstand mit sich, daß sie vom Standpunkte des mit der Uhr versehenen Beobachters nicht unabhängig ist, wie wir durch die Erfahrung wissen. Zu einer weit praktischeren Festsetzung gelangen wir durch folgende Betrachtung.
 25 | 
 26 | Befindet sich im Punkte $A$ des Raumes eine Uhr, so kann ein in $A$ befindlicher Beobachter die Ereignisse in der unmittelbaren Umgebung von _A_ zeitlich werten durch Aufsuchen der mit diesen Ereignissen gleichzeitigen Uhr Zeigerstellungen. Befindet sich auch im Punkte _B_ des Raumes eine Uhr — wir wollen hinzufügen, »eine Uhr von genau derselben Beschaffenheit wie die in _A_ befindliche« — so ist auch eine zeitliche Wertung der Ereignisse in der unmittelbaren Umgebung von [[p.894]] _B_ durch einen in _B_ befindlichen Beobachter möglich. Es ist aber ohne weitere Festsetzung nicht möglich, ein Ereignis in _A_ mit einem Ereignis in _B_ zeitlich zu vergleichen; wir haben bisher nur eine »_A_-Zeit« und eine »_B_-Zeit«, aber keine für _A_ und _B_ gemeinsame »Zeit« definiert. Die letztere Zeit kann nun definiert werden, indem man _durch Definition_ festsetzt, daß die »Zeit«, welche das Licht braucht, um von _A_ nach _B_ zu gelangen, gleich ist der »Zeit«, welche es braucht, um von _B_ nach _A_ zu gelangen. Es gehe nämlich ein Lichtstrahl zur »_A_-Zeit« $t_A$ von _A_ nach _B_ ab, werde zur »_B_-Zeit« $t_B$ in _B_ gegen _A_ zu reflektiert und gelange zur »_A_-Zeit« $t'_A$_ nach _A_ zurück. Die beiden Uhren laufen definitionsgemäß synchron, wenn
 27 | $$t_{B}-t_{A}=t'_{A}-t_{B}$$
 28 | 
 29 | Wir nehmen an, daß diese Definition des Synchronismus in widerspruchsfreier Weise möglich sei, und zwar für beliebig viele Punkte, daß also allgemein die Beziehungen gelten:
 30 | 
 31 | 1. Wenn die Uhr in _B_ synchron mit der Uhr in _A_ läuft, so läuft die Uhr in _A_ synchron mit der Uhr in _B_.
 32 | 
 33 | 2. Wenn die Uhr in _A_ sowohl mit der Uhr in _B_ als auch mit der Uhr in _C_ synchron läuft, so laufen auch die Uhren in _B_ und _C_ synchron relativ zueinander.
 34 | 
 35 | Wir haben so unter Zuhilfenahme gewisser (gedachter) physikalischer Erfahrungen festgelegt, was unter synchron laufenden, an verschiedenen Orten befindlichen, ruhenden Uhren zu verstehen ist und damit offenbar eine Definition von »gleichzeitig« und »Zeit« gewonnen. Die »Zeit« eines Ereignisses ist die mit dem Ereignis gleichzeitige Angabe einer am Orte des Ereignisses befindlichen, ruhenden Uhr, welche mit einer bestimmten, ruhenden Uhr, und zwar für alle Zeitbestimmungen mit der nämlichen Uhr, synchron läuft.
 36 | 
 37 | Wir setzen noch der Erfahrung gemäß fest, daß die Größe
 38 | $$\frac{2\overline{AB}}{t'_{A}-t_{A}}=V$$
 39 | eine universelle Konstante (die Lichtgeschwindigkeit im leeren Raume) sei.
 40 | 
 41 | Wesentlich ist, daß wir die Zeit mittels im ruhenden System [[p.895]] ruhender Uhren definiert haben; wir nennen die eben definierte Zeit wegen dieser Zugehörigkeit zum ruhenden System »die Zeit des ruhenden Systems«.
 42 | 
 43 | ### §2. Über die Relativität von Längen und Zeiten
 44 | Die folgenden Überlegungen stützen sich auf das Relativitätsprinzip und auf das Prinzip der Konstanz der Lichtgeschwindigkeit, welche beiden Prinzipien wir folgendermaßen definieren.
 45 | 
 46 | 1. Die Gesetze, nach denen sich die Zustände der physikalischen Systeme ändern, sind unabhängig davon, auf welches von zwei relativ zueinander in gleichförmiger Translationsbewegung befindlichen Koordinatensystemen diese Zustandsänderungen bezogen werden.
 47 | 
 48 | 2. Jeder Lichtstrahl bewegt sich im »ruhenden« Koordinatensystem mit der bestimmten Geschwindigkeit _V_, unabhängig davon, ob dieser Lichtstrahl von einem ruhenden oder bewegten Körper emittiert ist. Hierbei ist
 49 | $$Geschwindigkeit = \frac{Lichtweg}{Zeitdauer},$$
 50 | wobei »Zeitdauer« im Sinne der Definition des § 1 aufzufassen ist.
 51 | 
 52 | Es sei ein ruhender starrer Stab gegeben; derselbe besitze, mit einem ebenfalls ruhenden Maßstabe gemessen, die Länge _l_. Wir denken uns nun die Stabachse in die _X_-Achse des ruhenden Koordinatensystems gelegt und dem Stabe hierauf eine gleichförmige Paralleltranslationsbewegung (Geschwindigkeit _v_) längs der _X_-Achse im Sinne der wachsenden _x_ erteilt. Wir fragen nun nach der Länge des _bewegten_ Stabes, welche wir uns durch folgende zwei Operationen ermittelt denken:
 53 | 
 54 | a) Der Beobachter bewegt sich samt dem vorher genannten Maßstabe mit dem auszumessenden Stabe und mißt direkt durch Anlegen des Maßstabes die Länge des Stabes, ebenso, wie wenn sich auszumessender Stab, Beobachter und Maßstab in Ruhe befänden.
 55 | 
 56 | b) Der Beobachter ermittelt mittels im ruhenden Systeme aufgestellter, gemäß § 1 synchroner, ruhender Uhren, in welchen Punkten des ruhenden Systems sich Anfang und Ende des auszumessenden Stabes zu einer bestimmten Zeit _t_ befinden. [[p.896]] Die Entfernung dieser beiden Punkte, gemessen mit dem schon benutzten, in diesem Falle ruhenden Maßstabe ist ebenfalls eine Länge, welche man als »Länge des Stabes« bezeichnen kann.
 57 | 
 58 | Nach dem Relativitätsprinzip muß die bei der Operation a) zu findende Länge, welche wir »die Länge des Stabes im bewegten System« nennen wollen, gleich der Länge _l_ des ruhenden Stabes sein.
 59 | 
 60 | Die bei der Operation b) zu findende Länge, welche wir »die Länge des (bewegten) Stabes im ruhenden System« nennen wollen, werden wir unter Zugrundelegung unserer beiden Prinzipien bestimmen und finden, daß sie von _l_ verschieden ist.
 61 | 
 62 | Die allgemein gebrauchte Kinematik nimmt stillschweigend an, daß die durch die beiden erwähnten Operationen bestimmten Längen einander genau gleich seien, oder mit anderen Worten, daß ein bewegter starrer Körper in der Zeitepoche _t_ in geometrischer Beziehung vollständig durch _denselben_ Körper, wenn er in bestimmter Lage _ruht_, ersetzbar sei.
 63 | 
 64 | Wir denken uns ferner an den beiden Stabenden (_A_ und _B_) Uhren angebracht, welche mit den Uhren des ruhenden Systems synchron sind, d. h. deren Angaben jeweilen der »Zeit des ruhenden Systems« an den Orten, an welchen sie sich gerade befinden, entsprechen; diese Uhren sind also »synchron im ruhenden System«.
 65 | 
 66 | Wir denken uns ferner, daß sich bei jeder Uhr ein mit ihr bewegter Beobachter befinde, und daß diese Beobachter auf die beiden Uhren das im § 1 aufgestellte Kriterium für den synchronen Gang zweier Uhren anwenden. Zur Zeit[^2] $t_A$ gehe ein Lichtstrahl von _A_ aus, werde zur Zeit $t_B$ in _B_ reflektiert und gelange zur Zeit $t'_A$ nach _A_ zurück. Unter Berücksichtigung des Prinzipes von der Konstanz der Lichtgeschwindigkeit finden wir:
 67 | $$t_{B}-t_{A}=\frac{r_{AB}}{V-v}$$
 68 | [[p.897]] und
 69 | $$t'_{A}-t_{B}=\frac{r_{AB}}{V+v},$$
 70 | wobei $r_{AB}$ die Länge des bewegten Stabes — im ruhenden System gemessen — bedeutet. Mit dem bewegten Stabe bewegte Beobachter würden also die beiden Uhren nicht synchron gehend finden, während im ruhenden System befindliche Beobachter die Uhren als synchron laufend erklären würden.
 71 | 
 72 | Wir sehen also, daß wir dem Begriffe der Gleichzeitigkeit keine _absolute_ Bedeutung beimessen dürfen, sondern daß zwei Ereignisse, welche, von einem Koordinatensystem aus betrachtet, gleichzeitig sind, von einem relativ zu diesem System bewegten System aus betrachtet, nicht mehr als gleichzeitige Ereignisse aufzufassen sind.
 73 | ### §3. Theorie der Koordinaten- und Zeittransformation von dem ruhenden auf ein relativ zu diesem in gleichförmiger Translationsbewegung befindliches System
 74 | Seien im »ruhenden« Raume zwei Koordinatensysteme, d. h. zwei Systeme von je drei von einem Punkte ausgehenden, aufeinander senkrechten starren materiellen Linien, gegeben. Die _X_-Achsen beider Systeme mögen zusammenfallen, ihre _Y_- und _Z_-Achsen bezüglich parallel sein. Jedem Systeme sei ein starrer Maßstab und eine Anzahl Uhren beigegeben, und es seien beide Maßstäbe sowie alle Uhren beider Systeme einander genau gleich.
 75 | 
 76 | Es werde nun dem Anfangspunkte des einen der beiden Systeme (_k_) eine (konstante) Geschwindigkeit _v_ in Richtung der wachsenden _x_ des anderen, ruhenden Systems (_K_) erteilt, welche sich auch den Koordinatenachsen, dem betreffenden Maßstabe sowie den Uhren mitteilen möge. Jeder Zeit _t_ des ruhenden Systems _K_ entspricht dann eine bestimmte Lage der Achsen des bewegten Systems und wir sind aus Symmetriegründen befugt anzunehmen, daß die Bewegung von _k_ so beschaffen sein kann, daß die Achsen des bewegten Systems zur Zeit _t_ (es ist mit »_t_« immer eine Zeit des ruhenden Systems bezeichnet) den Achsen des ruhenden Systems parallel seien.
 77 | 
 78 | Wir denken uns nun den Raum sowohl vom ruhenden System _K_ aus mittels des ruhenden Maßstabes als auch vom [[p.898]] bewegten System _k_ mittels des mit ihm bewegten Maßstabes ausgemessen und so die Koordinaten _x, y, z_ bez. _ξ, η, ζ_ ermittelt. Es werde ferner mittels der im ruhenden System befindlichen ruhenden Uhren durch Lichtsignale in der in § 1 angegebenen Weise die Zeit _t_ des ruhenden Systems für alle Punkte des letzteren bestimmt, in denen sich Uhren befinden; ebenso werde die Zeit _τ_ des bewegten Systems für alle Punkte des bewegten Systems, in welchen sich relativ zu letzterem ruhende Uhren befinden, bestimmt durch Anwendung der in § 1 genannten Methode der Lichtsignale zwischen den Punkten, in denen sich die letzteren Uhren befinden.
 79 | 
 80 | Zu jedem Wertsystem _x, y, z, t,_ welches Ort und Zeit eines Ereignisses im ruhenden System vollkommen bestimmt, gehört ein jenes Ereignis relativ zum System _k_ festlegendes Wert System _ξ, η, ζ, τ,_ und es ist nun die Aufgabe zu lösen, das diese Größen verknüpfende Gleichungssystem zu finden.
 81 | 
 82 | Zunächst ist klar, daß die Gleichungen _linear_ sein müssen wegen der Homogenitätseigenschaften, welche wir Raum und Zeit beilegen.
 83 | 
 84 | Setzen wir _x = x - vt_, so ist klar, daß einem im System _k_ ruhenden Punkte ein bestimmtes, von der Zeit unabhängiges Wertsystem _x', y, z_ zukommt. Wir bestimmen zuerst _τ_ als Funktion von _x', y, z_ und _t_. Zu diesem Zwecke haben wir in Gleichungen auszudrücken, daß _τ_ nichts anderes ist als der Inbegriff der Angaben von im System _k_ ruhenden Uhren, welche nach der im § 1 gegebenen Regel synchron gemacht worden sind.
 85 | 
 86 | Vom Anfangspunkt des Systems _k_ aus werde ein Lichtstrahl zur Zeit $τ_0$_ längs der $X$-Achse nach _x'_ gesandt und von dort zur Zeit _τ₁_ nach dem Koordinatenursprung reflektiert, wo er zur Zeit _τ₂_ anlange; so muß dann sein:
 87 | $$\frac{1}{2}(\tau_{0}+\tau_{2})=\tau_{1}$$
 88 | oder, indem man die Argumente der Funktion _τ_ beifügt und das Prinzip der Konstanz der Lichtgeschwindigkeit im ruhenden Systeme anwendet:
 89 | $$\frac{1}{2}\left[\tau(0,0,0,t)+\tau\left(0,0,0,t+\frac{x'}{V-v}+\frac{x'}{V+v}\right)\right]$$
 90 | $$=\tau\left(x',0,0,t+\frac{x'}{V-v}\right).$$
 91 | [[p.899]] Hieraus folgt, wenn man _x'_ unendlich klein wählt:
 92 | $$\frac{1}{2}\left(\frac{1}{V-v}+\frac{1}{V+v}\right)\frac{\partial\tau}{\partial t}=\frac{\partial\tau}{\partial x'}+\frac{1}{V-v}\frac{\partial\tau}{\partial t},$$
 93 | oder
 94 | $$\frac{\partial\tau}{\partial x'}+\frac{v}{V^{2}-v^{2}}\frac{\partial\tau}{\partial t}=0.$$
 95 | 
 96 | Es ist zu bemerken, daß wir statt des Koordinatenursprunges jeden anderen Punkt als Ausgangspunkt des Lichtstrahles hätten wählen können und es gilt deshalb die eben erhaltene Gleichung für alle Werte von _x', y, z_.
 97 | 
 98 | Eine analoge Überlegung — auf die _H_- und _Z_-Achse angewandt — liefert, wenn man beachtet, daß sich das Licht längs dieser Achsen vom ruhenden System aus betrachtet stets mit der Geschwindigkeit $\sqrt{V^{2}-v^{2}}$ fortpflanzt:
 99 | $$\frac{\partial\tau}{\partial y}=0$$
100 | $$\frac{\partial\tau}{\partial z}=0.$$
101 | Aus diesen Gleichungen folgt, da _τ_ eine _lineare_ Funktion ist:
102 | $$\tau=a\left(t-\frac{v}{V^{2}-v^{2}}x'\right)$$
103 | wobei _a_ eine vorläufig unbekannte Funktion _φ(v)_ ist und der Kürze halber angenommen ist, daß im Anfangspunkte von _k_ für _τ_ = 0 _t_ = 0 sei.
104 | 
105 | Mit Hilfe dieses Resultates ist es leicht, die Größen _ξ, η, ζ_ zu ermitteln, indem man durch Gleichungen ausdrückt, daß sich das Licht (wie das Prinzip der Konstanz der Lichtgeschwindigkeit in Verbindung mit dem Relativitätsprinzip verlangt) auch im bewegten System gemessen mit der Geschwindigkeit _V_ fortpflanzt. Für einen zur Zeit _τ_ = 0 in Richtung der wachsenden _ξ_ ausgesandten Lichtstrahl gilt:
106 | $$ξ = Vτ_,$$
107 | oder
108 | $$\xi=aV\left(t-\frac{v}{V^{2}-v^{2}}x'\right)$$
109 | 
110 | Nun bewegt sich aber der Lichtstrahl relativ zum Anfangspunkt [[p.900]] von _k_ im ruhenden System gemessen mit der Geschwindigkeit $V - v$, so daß gilt:
111 | $$\frac{x'}{V-v}=t.$$
112 | 
113 | Setzen wir diesen Wert von _t_ in die Gleichung für ξ ein, so erhalten wir:
114 | $$\xi=a\frac{V^{2}}{V^{2}-v^{2}}x'.$$
115 | 
116 | Auf analoge Weise finden wir durch Betrachtung von längs den beiden anderen Achsen bewegte Lichtstrahlen:
117 | $$\eta=V\tau=aV\left(t-\frac{v}{V^{2}-v^{2}}x'\right),$$
118 | wobei
119 | $$\frac{y}{\sqrt{V^{2}-v^{2}}}=t,\ x'=0.$$
120 | also
121 | $$\eta=a\frac{V}{\sqrt{V^{2}-v^{2}}}y$$
122 | und
123 | $$\zeta=a\frac{V}{\sqrt{V^{2}-v^{2}}}z.$$
124 | Setzen wir für _x' _seinen Wert ein, so erhalten wir:
125 | ```
126 | $$\begin{matrix}\tau & = & \varphi(v)\beta(t-\frac{v}{V^{2}}x),\\
127 | \\\xi & = & \varphi(v)\beta(x-vt),\\
128 | \\\eta & = & \varphi(v)y,\\
129 | \\\zeta & = & \varphi(v)z,\\
130 | \end{matrix}$$
131 | ```
132 | wobei
133 | $$\beta=\frac{1}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}$$
134 | und _φ_ eine vorläufig unbekannte Funktion von _v_ ist. Macht man über die Anfangslage des bewegten Systems und über den Nullpunkt von _τ_ keinerlei Voraussetzung, so ist auf den rechten Seiten dieser Gleichungen je eine additive Konstante zuzufügen.
135 | 
136 | Wir haben nun zu beweisen, daß jeder Lichtstrahl sich, im bewegten System gemessen, mit der Geschwindigkeit _V_ fortpflanzt, falls dies, wie wir angenommen haben, im ruhenden [[p.901]] System der Fall ist; denn wir haben den Beweis dafür noch nicht geliefert, daß das Prinzip der Konstanz der Lichtgeschwindigkeit mit dem Relativitätsprinzip vereinbar sei.
137 | 
138 | Zur Zeit $t = τ = 0$ werde von dem zu dieser Zeit gemeinsamen Koordinatenursprung beider Systeme aus eine Kugelwelle ausgesandt, welche sich im System _K_ mit der Geschwindigkeit _V_ ausbreitet. Ist (_x, y, z_) ein eben von dieser Welle ergriffener Punkt, so ist also
139 | $$x^{2}+y^{2}+z^{2}=V^{2}t^{2}.$$
140 | Diese Gleichung transformieren wir mit Hilfe unserer Transformationsgleichungen und erhalten nach einfacher Rechnung:
141 | $$\xi^{2}+\eta^{2}+\zeta^{2}=V^{2}\tau^{2}.$$
142 | Die betrachtete Welle ist also auch im bewegten System betrachtet eine Kugelwelle von der Ausbreitungsgeschwindigkeit _V_. Hiermit ist gezeigt, daß unsere beiden Grundprinzipien miteinander vereinbar sind.
143 | 
144 | In den entwickelten Transformationsgleichungen tritt noch eine unbekannte Funktion _φ_ von _v_ auf, welche wir nun bestimmen wollen.
145 | 
146 | Wir führen zu diesem Zwecke noch ein drittes Koordinatensystem _K' _ein, welches relativ zum System _k_ derart in Paralleltranslationsbewegung parallel zur _Ξ_- Achse begriffen sei, daß sich dessen Koordinatenursprung mit der Geschwindigkeit -_v_ auf der _Ξ_-Achse bewege. Zur Zeit _t_ = 0 mögen alle drei Koordinatenanfangspunkte zusammenfallen und es sei für _t_ = _x_ — _y_ = _z_ = 0 die Zeit _t' _des Systems _K' _gleich Null. Wir nennen _x', y', z' _die Koordinaten, im System _K' _gemessen, und erhalten durch zweimalige Anwendung unserer Transformationsgleichungen:
147 | 
148 | ```
149 | $$\begin{matrix}t' & = & \varphi(-v)\beta(-v)\left\{ \tau+\frac{v}{V^{2}}\xi\right\}  & = & \varphi(v)\varphi(-v)t,\\
150 | \\x' & = & \varphi(-v)\beta(-v)(\xi+v\tau) & = & \varphi(v)\varphi(-v)x,\\
151 | \\y' & = & \varphi(-v)\eta & = & \varphi(v)\varphi(-v)y,\\
152 | \\z' & = & \varphi(-v)\zeta & = & \varphi(v)\varphi(-v)z.\end{matrix}$$
153 | ```
154 | 
155 | Da die Beziehungen zwischen _x', y', z' _und _x, y, z_ die Zeit _t_ nicht enthalten, so ruhen die Systeme _K_ und _K' _gegeneinander, [[p.902]] und es ist klar, daß die Transformation von _K_ auf _K' _die identische Transformation sein muß. Es ist also:
156 | $$φ(v)φ(-v) = 1.$$
157 | Wir fragen nun nach der Bedeutung von _φ(v)_. Wir fassen das Stück der $H$-Achse des Systems _k_ ins Auge, das zwischen $ξ = 0, η = 0, ζ = 0$ und $ξ = 0, η = l, ζ = 0$ gelegen ist. Dieses Stück der _H_-Achse ist ein relativ zum System _K_ mit der Geschwindigkeit _v_ senkrecht zu seiner Achse bewegter Stab, dessen Enden in _K_ die Koordinaten besitzen:
158 | $$x_{1}=vt,\ y_{1}=\frac{l}{\varphi(v)},\ z_{1}=0$$
159 | und
160 | $$x_{2}=vt,\ y_{2}=0,\ z_{2}=0.$$
161 | Die Länge des Stabes, in _K_ gemessen, ist also _l/φ(v)_; damit ist die Bedeutung der Funktion _φ_ gegeben. Aus Symmetriegründen ist nun einleuchtend, daß die im ruhenden System gemessene Länge eines bestimmten Stabes, welcher senkrecht zu seiner Achse bewegt ist, nur von der Geschwindigkeit, nicht aber von der Richtung und dem Sinne der Bewegung abhängig sein kann. Es ändert sich also die im ruhenden System gemessene Länge des bewegten Stabes nicht, wenn _v_ mit -_v_ vertauscht wird. Hieraus folgt:
162 | $$\frac{l}{\varphi(v)}=\frac{l}{\varphi(-v)},$$
163 | oder
164 | $$\phi(v)=\phi(-v).$$
165 | Aus dieser und der vorhin gefundenen Relation folgt, daß _φ(v)_ = 1 sein muß, so daß die gefundenen Transformationsgleichungen übergehen in:
166 | ```
167 | $$\begin{matrix}\tau & = & \beta(t-\frac{v}{V^{2}}x),\\
168 | \\\xi & = & \beta(x-vt),\\
169 | \\\eta & = & y,\\
170 | \\\zeta & = & z,\\
171 | \end{matrix}$$
172 | ```
173 | wobei
174 | $$\beta=\frac{1}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}.$$
175 | ### § 4. Physikalische Bedeutung der erhaltenen Gleichungen, bewegte starre Körper und bewegte Uhren betreffend
176 | [[p.903]] Wir betrachten eine starre Kugel[^3] vom Radius _R_, welche relativ zum bewegten System _k_ ruht, und deren Mittelpunkt im Koordinatenursprung von _k_ liegt. Die Gleichung der Oberfläche dieser relativ zum System _K_ mit der Geschwindigkeit _v_ bewegten Kugel ist:
177 | $$ξ² + η² + ζ² = R².$$
178 | Die Gleichung dieser Oberfläche ist in _x_, _y_, _z_ ausgedrückt zur Zeit $t = 0$ :
179 | $$\frac{x^{2}}{\left(\sqrt{1-\left(\frac{v}{V}\right)^{2}}\right)^{2}}+y^{2}+z^{2}=R^{2}.$$
180 | Ein starrer Körper, welcher in ruhendem Zustande ausgemessen die Gestalt einer Kugel hat, hat also in bewegtem Zustande — vom ruhenden System aus betrachtet — die Gestalt eines Rotationsellipsoides mit den Achsen
181 | $$R\sqrt{1-\left(\frac{v}{V}\right)^{2}},\ R,\ R.$$
182 | Während also die _Y_- und _Z_-Dimension der Kugel (also auch jedes starren Körpers von beliebiger Gestalt) durch die Bewegung nicht modifiziert erscheinen, erscheint die _X_-Dimension im Verhältnis $1\ :\ \sqrt{1-(v/V)^{2}}$ verkürzt, also um so stärker, je größer _v_ ist. Für _v_ = _V_ schrumpfen alle bewegten Objekte — vom »ruhenden« System aus betrachtet — in flächenhafte Gebilde zusammen. Für Überlichtgeschwindigkeiten werden unsere Überlegungen sinnlos; wir werden übrigens in den folgenden Betrachtungen finden, daß die Lichtgeschwindigkeit in unserer Theorie physikalisch die Rolle der unendlich großen Geschwindigkeiten spielt.
183 | 
184 | Es ist klar, daß die gleichen Resultate von im »ruhenden« System ruhenden Körpern gelten, welche von einem gleichförmig bewegten System aus betrachtet werden. —
185 | 
186 | Wir denken uns ferner eine der Uhren, welche relativ zum ruhenden System ruhend die Zeit _t_, relativ zum bewegten [[p.904]] System ruhend die Zeit _τ_ anzugeben befähigt sind, im Koordinatenursprung von _k_ gelegen und so gerichtet, daß sie die Zeit _τ_ angibt. Wie schnell geht diese Uhr, vom ruhenden System aus betrachtet?
187 | 
188 | Zwischen die Größen _x, t_ und _τ_, welche sich auf den Ort dieser Uhr beziehen, gelten offenbar die Gleichungen:
189 | $$\tau=\frac{1}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}(t-\frac{v}{V^{2}}x).$$
190 | und
191 | $$x = vt.$$
192 | Es ist also
193 | $$\tau=t\sqrt{1-\left(\frac{v}{V}\right)^{2}}=t-\left(1-\sqrt{1-\left(\frac{v}{V}\right)^{2}}\right)t$$
194 | woraus folgt, daß die Angabe der Uhr (im ruhenden System betrachtet) pro Sekunde um $\left(1-\sqrt{1-(v/V)^{2}}\right)$ Sek. oder — bis auf Größen vierter und höherer Ordnung um $\frac{1}{2}(v/V)^{2}$ Sek. zurückbleibt.
195 | 
196 | Hieraus ergibt sich folgende eigentümliche Konsequenz. Sind in den Punkten _A_ und _B_ von _K_ ruhende, im ruhenden System betrachtet, synchron gehende Uhren vorhanden, und bewegt man die Uhr in _A_ mit der Geschwindigkeit _v_ auf der Verbindungslinie nach _B_, so gehen nach Ankunft dieser Uhr in _B_ die beiden Uhren nicht mehr synchron, sondern die von _A_ nach _B_ bewegte Uhr geht gegenüber der von Anfang an in _B_ befindlichen um $\frac{1}{2}tv^{2}/V^{2}$ Sek. (bis auf Größen vierter und höherer Ordnung) nach, wenn _t_ die Zeit ist, welche die Uhr von _A_ nach _B_ braucht.
197 | 
198 | Man sieht sofort, daß dies Resultat auch dann noch gilt, wenn die Uhr in einer beliebigen polygonalen Linie sich von _A_ nach _B_ bewegt, und zwar auch dann, wenn die Punkte _A_ und _B_ zusammenfallen.
199 | 
200 | Nimmt man an, daß das für eine polygonale Linie bewiesene Resultat auch für eine stetig gekrümmte Kurve gelte, so erhält man den Satz: Befinden sich in _A_ zwei synchron gehende Uhren und bewegt man die eine derselben auf einer geschlossenen Kurve mit konstanter Geschwindigkeit, bis sie wieder nach _A_ zurückkommt, was _t_ Sek. dauern möge, so geht die letztere Uhr bei ihrer Ankunft in _A_ gegenüber der unbewegt [[p.905]] gebliebenen um $\frac{1}{2}t(v/V)^{2}$ Sek. nach. Man schließt daraus, daß eine am Erdäquator befindliche Unruhuhr um einen sehr kleinen Betrag langsamer laufen muß als eine genau gleich beschaffene, sonst gleichen Bedingungen unterworfene, an einem Erdpole befindliche Uhr.
201 | ### § 5. Additionstheorem der Geschwindigkeiten
202 | In dem längs der _X_-Achse des Systems _K_ mit der Geschwindigkeit _v_ bewegten System _k_ bewege sich ein Punkt gemäß den Gleichungen:
203 | ```
204 | $$\begin{matrix}
205 | \xi= & w_{\xi}\tau,\\
206 | \\\eta= & w_{\eta}\tau,\\
207 | \\\zeta= & 0,\end{matrix}$$
208 | ```
209 | wobei $w_ξ$ und $w_η$ Konstanten bedeuten.
210 | 
211 | Gesucht ist die Bewegung des Punktes relativ zum System _K_. Führt man in die Bewegungsgleichungen des Punktes mit Hilfe der in § 3 entwickelten Transformationsgleichungen die Größen _x, y, z, t_ ein, so erhält man:
212 | ```
213 | $$\begin{matrix}x & = & \frac{w_{\xi}+v}{1+\frac{vw_{\xi}}{V^{2}}}t,\\
214 | \\y & = & \frac{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}{1+\frac{vw_{\xi}}{V^{2}}}w_{\eta}t,\\
215 | \\z & = & 0.\\
216 | \end{matrix}$$
217 | ```
218 | Das Gesetz vom Parallelogramm der Geschwindigkeiten gilt also nach unserer Theorie nur in erster Annäherung. Wir setzen:
219 | ```
220 | $$\begin{matrix}U^{2} & = & \left(\frac{dx}{dt}\right)^{2}+\left(\frac{dy}{dt}\right)^{2},\\
221 | \\w^{2} & = & w_{\xi}^{2}+w_{\eta}^{2}\\
222 | \\\end{matrix}$$
223 | ```
224 | und
225 | $$\alpha=arctg\frac{w_{\eta}}{w_{\xi}};$$
226 | [[p.906]] α ist dann als der Winkel zwischen den Geschwindigkeiten _v_ und _w_ anzusehen. Nach einfacher Rechnung ergibt sich:
227 | $$U=\frac{\sqrt{(v^{2}+w^{2}+2v\ w\ \cos\alpha)-\left(\frac{v\ w\ \sin\alpha}{V}\right){}^{2}}}{1+\frac{v\ w\ \sin\alpha}{V^{2}}}.$$
228 | 
229 | Es ist bemerkenswert, daß _v_ und _w_ in symmetrischer Weise in den Ausdruck für die resultierende Geschwindigkeit eingehen. Hat auch _w_ die Richtung der _X_-Achse (_Ξ_-Achse), so erhalten wir:
230 | $$U=\frac{v+w}{1+\frac{vw}{V^{2}}}.$$
231 | Aus dieser Gleichung folgt, daß aus der Zusammensetzung zweier Geschwindigkeiten, welche kleiner sind als _V_, stets eine Geschwindigkeit kleiner als _V_ resultiert. Setzt man nämlich $v=V-\varkappa,\ w=V-\lambda$, wobei $\varkappa$ und λ positiv und kleiner als _V_ seien, so ist:
232 | $$U=V\frac{2V-\varkappa-\lambda}{2V-\varkappa-\lambda+\frac{\varkappa\lambda}{V}}X_0, Y_0, Z_0) und (L_0, M_0, N_0) die Vektoren, welche die Amplitude des Wellenzuges bestimmen, _a, b, c_ die Richtungskosinus der Wellennormalen.
309 | 
310 | Wir fragen nach der Beschaffenheit dieser Wellen, wenn dieselben von einem in dem bewegten System _k_ ruhenden [[p.911]] Beobachter untersucht werden. — Durch Anwendung der in § 6 gefundenen Transformationsgleichungen für die elektrischen und magnetischen Kräfte und der in § 3 gefundenen Transformationsgleichungen für die Koordinaten und die Zeit erhalten wir unmittelbar:
311 | ```
312 | $$\begin{matrix}X'= & X_{0}\sin\Phi', & L'= & L_{0}\sin\Phi',\\
313 | \\Y'= & \beta(Y_{0}-\frac{v}{V}N_{0})\sin\Phi', & M'= & \beta(M_{0}+\frac{v}{V}Z_{0})\sin\Phi',\\
314 | \\Z'= & \beta(Z_{0}+\frac{v}{V}M_{0})\sin\Phi', & N'= & \beta(N_{0}-\frac{v}{V}Y_{0})\sin\Phi',\\
315 | \end{matrix}$$
316 | ```
317 | $$\Phi'=\omega'\left(\tau-\frac{a'\xi+b'\eta+c'\zeta}{V}\right),$$
318 | wobei
319 | ```
320 | 
\begin{matrix}\omega' & = & \omega\beta(1-a\frac{v}{V}),\\ 321 | \\a' & = & \frac{a-\frac{v}{V}}{1-a\frac{v}{V}},\\ 322 | \\b' & = & \frac{b}{\beta\left(1-a\frac{v}{V}\right)},\\ 323 | \\c' & = & \frac{c}{\beta\left(1-a\frac{v}{V}\right)}\\ 324 | \end{matrix}
325 | ``` 326 | gesetzt ist. 327 | 328 | Aus der Gleichung für _ω' _folgt: Ist ein Beobachter relativ zu einer unendlich fernen Lichtquelle von der Frequenz _ν_ mit der Geschwindigkeit _v_ derart bewegt, daß die Verbindungslinie »Lichtquelle-Beobachter« mit der auf ein relativ zur Lichtquelle ruhendes Koordinatensystem bezogenen Geschwindigkeit des Beobachters den Winkel _φ_ bildet, so ist die von dem Beobachter wahrgenommene Frequenz _ν' _des Lichtes durch die Gleichung gegeben: 329 | $$\nu'=\nu\frac{1-\cos\phi\cdot v/V}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}.$$ 330 | Dies ist das __Doppeler__sche Prinzip für beliebige Geschwindigkeiten. [[p.912]] Für _φ_ = 0 nimmt die Gleichung die übersichtliche Form an: 331 | $$\nu'=\nu\sqrt{\frac{1-\frac{v}{V}}{1+\frac{v}{V}}}.$$ 332 | Man sieht, daß — im Gegensatz zu der üblichen Auffassung — für _v_ = -∞, _ν_ = ∞ ist. 333 | 334 | Nennt man _φ' _den Winkel zwischen Wellennormale (Strahlrichtung) im bewegten System und der Verbindungslinie »Lichtquelle-Beobachter«, so nimmt die Gleichung für _a' _die Form an: 335 | $$\cos\varphi'=\frac{\cos\varphi-\frac{v}{V}}{1-\frac{v}{V}\cos\varphi}.$$ 336 | Diese Gleichung drückt das Aberrationsgesetz in seiner allgemeinsten Form aus. Ist _φ = π/2_, so nimmt die Gleichung die einfache Gestalt an: 337 | $$\cos\varphi'=-\frac{v}{V}.$$ 338 | Wir haben nun noch die Amplitude der Wellen, wie dieselbe im bewegten System erscheint, zu suchen. Nennt man _A_ bez. _A' _die Amplitude der elektrischen oder magnetischen Kraft im ruhenden bez. im bewegten System gemessen, so erhält man: 339 | $$A'^{2}=A^{2}\frac{\left(1-\frac{v}{V}\cos\varphi\right)^{2}}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}$$ 340 | welche Gleichung für _φ_ = 0 in die einfachere übergeht: 341 | $$A'^{2}=A^{2}\frac{1-\frac{v}{V}}{1+\frac{v}{V}}.$$ 342 | Es folgt aus den entwickelten Gleichungen, daß für einen Beobachter, der sich mit der Geschwindigkeit _V_ einer Lichtquelle näherte, diese Lichtquelle unendlich intensiv erscheinen müßte. [[p.913]] 343 | ### § 8. Transformation der Energie der Lichtstrahlen. Theorie des auf vollkommene Spiegel ausgeübten Strahlungsdruckes 344 | Da _A²/8π_ gleich der Lichtenergie pro Volumeneinheit ist, so haben wir nach dem Relativitätsprinzip _A'²/8π_ als die Lichtenergie im bewegten System zu betrachten. Es wäre daher _A'²/A²_ das Verhältnis der »bewegt gemessenen« und »ruhend gemessenen« Energie eines bestimmten Lichtkomplexes, wenn das Volumen eines Lichtkomplexes in _K_ gemessen und in _k_ gemessen das gleiche wäre. Dies ist jedoch nicht der Fall. Sind _a_, _b_, _c_ die Richtungskosinus der Wellennormalen des Lichtes im ruhenden System, so wandert durch die Oberflächenelemente der mit Lichtgeschwindigkeit bewegten Kugelfläche 345 | $$(x-Vat)^{2}+(y-Vbt)^{2}+(z-Vct)^{2}=R^{2}$$ 346 | keine Energie hindurch; wir können daher sagen, daß diese Fläche dauernd denselben Lichtkomplex umschließt. Wir fragen nach der Energiemenge, welche diese Fläche im System _k_ betrachtet umschließt, d. h. nach der Energie des Lichtkomplexes relativ zum System _k_. 347 | 348 | Die Kugelfläche ist — im bewegten System betrachtet — eine Ellipsoidfläche, welche zur Zeit $τ = 0$ die Gleichung besitzt: 349 | $$\left(\beta\xi-a\beta\frac{v}{V}\xi\right)^{2}+\left(\eta-b\beta\frac{v}{V}\xi\right)^{2}+\left(\zeta-c\beta\frac{v}{V}\xi\right)^{2}=R^{2}.$$ 350 | Nennt man _S_ das Volumen der Kugel, _S' _dasjenige dieses Ellipsoides, so ist, wie eine einfache Rechnung zeigt: 351 | $$\frac{S'}{S}=\frac{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}{1-\frac{v}{V}\cos\varphi}.$$ 352 | Nennt man also _E_ die im ruhenden System gemessene, _E' _die im bewegten System gemessene Lichtenergie, welche von der betrachteten Fläche umschlossen wird, so erhält man: 353 | $$\frac{E'}{E}=\frac{\frac{A'^{2}}{8\pi}S'}{\frac{A^{2}}{8\pi}S}=\frac{1-\frac{v}{V}\cos\varphi}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}},$$ 354 | [[p.914]] welche Formel für _φ_ = 0 in die einfachere übergeht: 355 | $$\frac{E'}{E}=\sqrt{\frac{1-\frac{v}{V}}{1+\frac{v}{V}}}.$$ 356 | Es ist bemerkenswert, daß die Energie und die Frequenz eines Lichtkomplexes sich nach demselben Gesetze mit dem Bewegungszustande des Beobachters ändern. 357 | 358 | Es sei nun die Koordinatenebene _ξ_ = 0 eine vollkommen spiegelnde Fläche, an welcher die im letzten Paragraph betrachteten ebenen Wellen reflektiert werden. Wir fragen nach dem auf die spiegelnde Fläche ausgeübten Lichtdruck und nach der Richtung, Frequenz und Intensität des Lichtes nach der Reflexion. 359 | 360 | Das einfallende Licht sei durch die Größen _A, cos φ, ν_ (auf das System _K_ bezogen) definiert. Von _k_ aus betrachtet sind die entsprechenden Größen: 361 | ``` 362 | $$\begin{matrix}A' & = & A\frac{1-\frac{v}{V}\cos\varphi}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}},\\ 363 | \\\cos\varphi' & = & \frac{\cos\varphi-v/V}{1-\frac{v}{V}\cos\varphi},\\ 364 | \\\nu' & = & \nu\frac{1-\frac{v}{V}\cos\varphi}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}.\\ 365 | \end{matrix}$$ 366 | ``` 367 | Für das reflektierte Licht erhalten wir, wenn wir den Vorgang auf das System _k_ beziehen: 368 | ``` 369 | $$\begin{matrix}A_ & = & A'\\ 370 | \\\cos\varphi_ & = & -\cos\varphi'\\ 371 | \\\nu_ & = & \nu'\\ 372 | \end{matrix}$$ 373 | ``` 374 | Endlich erhält man durch Rücktransformieren aufs ruhende System _K_ für das reflektierte Licht: [915] 375 | ``` 376 | $$\begin{matrix}A_' & = & A_\frac{1+\frac{v}{V}cos\varphi_}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}=A\frac{1-2\frac{v}{V}\cos\varphi+\left(\frac{v}{V}\right)^{2}}{1-\left(\frac{v}{V}\right)^{2}},\\ 377 | \\\cos\varphi_' & = & \frac{\cos\varphi_+\frac{v}{V}}{1+\frac{v}{V}\cos\varphi_}=-\frac{\left(1+\left(\frac{v}{V}\right)^{2}\right)\cos\varphi-2\frac{v}{V}}{1-2\frac{v}{V}\cos\varphi+\left(\frac{v}{V}\right)^{2}},\\ 378 | \\\nu_' & = & \nu_\frac{1+\frac{v}{V}\cos\varphi_}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}=\nu\frac{1-2\frac{v}{V}\cos\varphi+\left(\frac{v}{V}\right)^{2}}{\left(1-\frac{v}{V}\right)^{2}}.\\ 379 | \end{matrix}$$ 380 | ``` 381 | Die auf die Flächeneinheit des Spiegels pro Zeiteinheit auftreffende (im ruhenden System gemessene) Energie ist offenbar A^{2}/8\pi(V\ \cos\varphi-v). Die von der Flächeneinheit des Spiegels in der Zeiteinheit sich entfernende Energie ist A_'^{2}/8\pi(-V\ \cos\varphi_'+v). Die Differenz dieser beiden Ausdrücke ist nach dem Energieprinzip die vom Lichtdrucke in der Zeiteinheit geleistete Arbeit. Setzt man die letztere gleich dem Produkt _P.v_, wobei _P_ der Lichtdruck ist, so erhält man: 382 | $$P=2\frac{A^{2}}{8\pi}\frac{\left(\cos\varphi-\frac{v}{V}\right)^{2}}{1-\left(\frac{v}{V}\right)^{2}}.$$ 383 | In erster Annäherung erhält man in Übereinstimmung mit der Erfahrung und mit anderen Theorien 384 | $$P=2\frac{A^{2}}{8\pi}\cos^{2}\varphi.$$ 385 | Nach der hier benutzten Methode können alle Probleme der Optik bewegter Körper gelöst werden. Das Wesentliche ist, daß die elektrische und magnetische Kraft des Lichtes, welches durch einen bewegten Körper beeinflußt wird, auf ein relativ zu dem Körper ruhendes Koordinatensystem transformiert werden. Dadurch wird jedes Problem der Optik bewegter Körper auf eine Reihe von Problemen der Optik ruhender Körper zurückgeführt. [[p.916]] 386 | 387 | ### § 9. Transformation der __Maxwell-Hertz__schen Gleichungen mit Berücksichtigung der Konvektionsströme 388 | Wir gehen aus von den Gleichungen: 389 | ``` 390 | $$\begin{matrix}\frac{1}{V}\left\{ u_{x}\varrho+\frac{\partial X}{\partial t}\right\} & = & \frac{\partial N}{\partial y}-\frac{\partial M}{\partial z}, & \frac{1}{V}\frac{\partial L}{\partial t} & = & \frac{\partial Y}{\partial z}-\frac{\partial Z}{\partial y},\\ 391 | \\\frac{1}{V}\left\{ u_{y}\varrho+\frac{\partial Y}{\partial t}\right\} & = & \frac{\partial L}{\partial z}-\frac{\partial N}{\partial x}, & \frac{1}{V}\frac{\partial M}{\partial t} & = & \frac{\partial Z}{\partial x}-\frac{\partial X}{\partial z},\\ 392 | \\\frac{1}{V}\left\{ u_{z}\varrho+\frac{\partial Z}{\partial t}\right\} & = & \frac{\partial M}{\partial x}-\frac{\partial L}{\partial y}, & \frac{1}{V}\frac{\partial N}{\partial t} & = & \frac{\partial X}{\partial y}-\frac{\partial Y}{\partial x},\end{matrix}$$ 393 | ``` 394 | wobei 395 | $$\varrho=\frac{\partial X}{\partial x}+\frac{\partial Y}{\partial y}+\frac{\partial Z}{\partial z}$$ 396 | die 4_π_-fache Dichte der Elektrizität und ($u_x, uy, uz$) den Geschwindigkeitsvektor der Elektrizität bedeutet. Denkt man sich die elektrischen Massen unveränderlich an kleine, starre Körper (Ionen, Elektronen) gebunden, so sind diese Gleichungen die elektromagnetische Grundlage der __Lorentz__schen Elektrodynamik und Optik bewegter Körper. 397 | 398 | Transformiert man diese Gleichungen, welche im System _K_ gelten mögen, mit Hilfe der Transformationsgleichungen von § 3 und § 6 auf das System _k_, so erhält man die Gleichungen: 399 | ``` 400 | $$\begin{matrix}\frac{1}{V}\left\{ u_{\xi}\varrho'+\frac{\partial X'}{\partial\tau}\right\} & = & \frac{\partial N'}{\partial\eta}-\frac{\partial M'}{\partial\zeta}, & \frac{\partial L'}{\partial\tau} & = & \frac{\partial Y'}{\partial\zeta}-\frac{\partial Z'}{\partial\eta},\\ 401 | \\\frac{1}{V}\left\{ u_{\eta}\varrho'+\frac{\partial Y'}{\partial\tau}\right\} & = & \frac{\partial L'}{\partial\zeta}-\frac{\partial N'}{\partial\xi}, & \frac{\partial M'}{\partial\tau} & = & \frac{\partial Z'}{\partial\xi}-\frac{\partial X'}{\partial\zeta},\\ 402 | \\\frac{1}{V}\left\{ u_{\zeta}\varrho'+\frac{\partial Z'}{\partial\tau}\right\} & = & \frac{\partial M'}{\partial\xi}-\frac{\partial L'}{\partial\eta}, & \frac{\partial N'}{\partial\tau} & = & \frac{\partial X'}{\partial\eta}-\frac{\partial Y'}{\partial\xi},\end{matrix}$$ 403 | ``` 404 | wobei 405 | ``` 406 | $$\begin{matrix}\frac{u_{x}-v}{1-\frac{u_{x}v}{V^{2}}} & = & u_{\xi},\\ 407 | \\\frac{u_{y}}{\beta(1-\frac{u_{x}v}{V^{2}})} & = & u_{\eta}, & \varrho'=\frac{\partial X'}{\partial\xi}+\frac{\partial Y'}{\partial\eta}+\frac{\partial Z'}{\partial\zeta}=\beta\left(1-\frac{v\ ux_{x}}{V2}\right)\varrho.\\ 408 | \\\frac{u_{z}}{\beta(1-\frac{u_{x}v}{V^{2}})} & = & u_{\zeta}.\\ 409 | \end{matrix}$$ 410 | ``` 411 | [[p.917]] Da — wie aus dem Additionstheorem der Geschwindigkeiten (§ 5) folgt — der Vektor ($u_ξ$, $u_η$, $u_ζ$)_ nichts anderes ist als die Geschwindigkeit der elektrischen Massen im System _k_ gemessen, so ist damit gezeigt, daß unter Zugrundelegung unserer kinematischen Prinzipien die elektrodynamische Grundlage der __Lorentz__schen Theorie der Elektrodynamik bewegter Körper dem Relativitätsprinzip entspricht. 412 | 413 | Es möge noch kurz bemerkt werden, daß aus den entwickelten Gleichungen leicht der folgende wichtige Satz gefolgert werden kann: Bewegt sich ein elektrisch geladener Körper beliebig im Räume und ändert sich hierbei seine Ladung nicht, von einem mit dem Körper bewegten Koordinatensystem aus betrachtet, so bleibt seine Ladung auch — von dem »ruhenden« System _K_ aus betrachtet — konstant. 414 | ### § 10. Dynamik des (langsam beschleunigten) Elektrons 415 | In einem elektromagnetischen Felde bewege sich ein punktförmiges, mit einer elektrischen Ladung _ε_ versehenes Teilchen (im folgenden »Elektron« genannt), über dessen Bewegungsgesetz wir nur folgendes annehmen: 416 | 417 | Ruht das Elektron in einer bestimmten Epoche, so erfolgt in dem nächsten Zeitteilchen die Bewegung des Elektrons nach den Gleichungen 418 | ``` 419 | $$\begin{matrix}\mu\frac{d^{2}x}{dt^{2}} & = & \epsilon X\\ 420 | \\\mu\frac{d^{2}y}{dt^{2}} & = & \epsilon Y\\ 421 | \\\mu\frac{d^{2}z}{dt^{2}} & = & \epsilon Z\\ 422 | \end{matrix}$$ 423 | ``` 424 | wobei _x_, _y_, _z_ die Koordinaten des Elektrons, _μ_ die Masse des Elektrons bedeutet, sofern dasselbe langsam bewegt ist. 425 | 426 | Es besitze nun zweitens das Elektron in einer gewissen Zeitepoche die Geschwindigkeit _v_. Wir suchen das Gesetz, nach welchem sich das Elektron im unmittelbar darauf folgenden Zeitteilchen bewegt. 427 | 428 | Ohne die Allgemeinheit der Betrachtung zu beeinflussen, können und wollen wir annehmen, daß das Elektron in dem Momente, wo wir es ins Auge fassen, sich im Koordinatensprung [[p.918]] befinde und sich längs der _X_-Achse des Systems _K_ mit der Geschwindigkeit _v_ bewege. Es ist dann einleuchtend, daß das Elektron im genannten Momente ($t= 0$) relativ zu einem längs der _X_-Achse mit der konstanten Geschwindigkeit _v_ parallelbewegten Koordinatensystem _k_ ruht. 429 | 430 | Aus der oben gemachten Voraussetzung in Verbindung mit dem Relativitätsprinzip ist klar, daß sich das Elektron in der unmittelbar folgenden Zeit (für kleine Werte von _t_) vom System _k_ aus betrachtet nach den Gleichungen bewegt: 431 | ``` 432 | $$\begin{matrix}\mu\frac{d^{2}\xi}{d\tau^{2}} & = & \epsilon X',\\ 433 | \\\mu\frac{d^{2}\eta}{d\tau^{2}} & = & \epsilon Y',\\ 434 | \\\mu\frac{d^{2}\zeta}{d\tau^{2}} & = & \epsilon Z',\\ 435 | \end{matrix}$$ 436 | ``` 437 | wobei die Zeichen _ξ, η, ζ, X', Y', Z' _sich auf das System _k_ beziehen. Setzen wir noch fest, daß für $t = x = y = z$ = 0, $τ = ξ = η = ζ$ = 0 sein soll, so gelten die Transformationsgleichungen der §§ 3 und 6, so daß gilt: 438 | ``` 439 | $$\begin{matrix} 440 | \tau= & \beta\left(t-\frac{v}{V^{2}}x\right),\\ 441 | \\\xi= & \beta(x-vt), & X'= & X,\\ 442 | \\\eta= & y, & Y'= & \beta(Y-\frac{v}{V}N),\\ 443 | \\\zeta= & z, & Z'= & \beta(Z+\frac{v}{V}M).\end{matrix}$$ 444 | ``` 445 | Mit Hilfe dieser Gleichungen transformieren wir die obigen Bewegungsgleichungen vom System _k_ auf das System _K_ und erhalten: 446 | ``` 447 | $$(A)\qquad\begin{cases} 448 | \frac{d^{2}x}{dt^{2}} & =\frac{\epsilon}{\mu}\frac{1}{\beta^{3}}X\\ 449 | \\\frac{d^{2}y}{dt^{2}} & =\frac{\epsilon}{\mu}\frac{1}{\beta}\left(Y-\frac{v}{V}N\right)\\ 450 | \\\frac{d^{2}z}{dt^{2}} & =\frac{\epsilon}{\mu}\frac{1}{\beta}\left(Z+\frac{v}{V}M\right).\end{cases}$$ 451 | ``` 452 | Wir fragen nun in Anlehnung an die übliche Betrachtungsweise nach der »longitudinalen« und »transversalen« Masse [[p.919]] des bewegten Elektrons. Wir schreiben die Gleichungen (A) in der Form 453 | ``` 454 | $$\begin{matrix}\mu\beta^{3}\frac{d^{2}x}{dt^{2}} & = & \epsilon X & = & \epsilon X',\\ 455 | \\\mu\beta^{2}\frac{d^{2}y}{dt^{2}} & = & \epsilon\beta\left(Y-\frac{v}{V}N\right) & = & \epsilon Y',\\ 456 | \\\mu\beta^{2}\frac{d^{2}z}{dt^{2}} & = & \epsilon\beta\left(Z+\frac{v}{V}M\right) & = & \epsilon Z',\end{matrix}$$ 457 | ``` 458 | und bemerken zunächst, daß _εX', εY', εZ' _die Komponenten der auf das Elektron wirkenden ponderomotorischen Kraft sind, und zwar in einem in diesem Moment mit dem Elektron mit gleicher Geschwindigkeit wie dieses bewegten System betrachtet. (Diese Kraft könnte beispielsweise mit einer im letzten System ruhenden Federwage gemessen werden.) Wenn wir nun diese Kraft schlechtweg »die auf das Elektron wirkende Kraft« nennen und die Gleichung 459 | $$Massenzahl × Beschleunigungszahl = Kraftzahl$$ 460 | aufrechterhalten, und wenn wir ferner festsetzen, daß die Beschleunigungen im ruhenden System _K_ gemessen werden sollen, so erhalten wir aus obigen Gleichungen: 461 | $$Longitudinale Masse = \frac{\mu}{\left(\sqrt{1-\left(\frac{v}{V}\right)^{2}}\right)^{3}},$$ 462 | $$Transversale Masse = \frac{\mu}{1-\left(\frac{v}{V}\right)^{2}}.$$ 463 | Natürlich würde man bei anderer Definition der Kraft und der Beschleunigung andere Zahlen für die Massen erhalten; man ersieht daraus, daß man bei der Vergleichung verschiedener Theorien der Bewegung des Elektrons sehr vorsichtig verfahren muß. 464 | 465 | Wir bemerken, daß diese Resultate über die Masse auch für die ponderabeln materiellen Punkte gilt; denn ein ponderabler materieller Punkt kann durch Zufügen einer _beliebig kleinen_ elektrischen Ladung zu einem Elektron (in unserem Sinne) gemacht werden. 466 | 467 | Wir bestimmen die kinetische Energie des Elektrons. Bewegt sich ein Elektron vom Koordinatenursprung des Systems _K_ aus mit der Anfangsgeschwindigkeit 0 beständig auf der [[p.920]] _X_-Achse unter der Wirkung einer elektrostatischen Kraft _X_, so ist klar, daß die dem elektrostatischen Felde entzogene Energie den Wert _∫ ε X dx_ hat. Da das Elektron langsam beschleunigt sein soll und infolgedessen keine Energie in Form von Strahlung abgeben möge, so muß die dem elektrostatischen Felde entzogene Energie gleich der Bewegungsenergie _W_ des Elektrons gesetzt werden. Man erhält daher, indem man beachtet, daß während des ganzen betrachteten Bewegungsvorganges die erste der Gleichungen (A) gilt: 468 | $$W=\int\epsilon X\, dx=\int\limits _{0}^{v}\beta^{3}v\, dv=\mu V^{2}\left\{ \frac{1}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}-1\right\} .$$ 469 | 470 | _W_ wird also für _v_ = _V_ unendlich groß. Überlichtgeschwindigkeiten haben — wie bei unseren früheren Resultaten — keine Existenzmöglichkeit. 471 | 472 | Auch dieser Ausdruck für die kinetische Energie muß dem oben angeführten Argument zufolge ebenso für ponderable Massen gelten. 473 | 474 | Wir wollen nun die aus dem Gleichungssystem (A) resultierenden, dem Experimente zugänglichen Eigenschaften der Bewegung des Elektrons aufzählen. 475 | 476 | 1. Aus der zweiten Gleichung des Systems (A) folgt, daß eine elektrische Kraft _Y_ und eine magnetische Kraft _N_ dann gleich stark ablenkend wirken auf ein mit der Geschwindigkeit _v_ bewegtes Elektron, wenn _Y = N.v/V_. Man ersieht also, daß die Ermittelung der Geschwindigkeit des Elektrons aus dem Verhältnis der magnetischen Ablenkbarkeit $A_m$ und der elektrischen Ablenkbarkeit $A_e$ nach unserer Theorie für beliebige Geschwindigkeiten möglich ist durch Anwendung des Gesetzes: 477 | $$\frac{A_{m}}{A_{e}}=\frac{v}{V}.$$ 478 | 479 | Diese Beziehung ist der Prüfung durch das Experiment zugänglich, da die Geschwindigkeit des Elektrons auch direkt, z.B. mittels rasch oszillierender elektrischer und magnetischer Felder, gemessen werden kann. 480 | 481 | 2. Aus der Ableitung für die kinetische Energie des Elektrons folgt, daß zwischen der durchlaufenen Potentialdifferenz [[p.921]] und der erlangten Geschwindigkeit _v_ des Elektrons die Beziehung gelten muß: 482 | $$P=\int X\ dx=\frac{\mu}{\epsilon}V^{2}\left\{ \frac{1}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}-1\right\} .$$ 483 | 484 | 3. Wir berechnen den Krümmungsradius _R_ der Bahn, wenn eine senkrecht zur Geschwindigkeit des Elektrons wirkende magnetische Kraft _N_ (als einzige ablenkende Kraft) vorhanden ist. Aus der zweiten der Gleichungen (A) erhalten wir: 485 | $$-\frac{d^{2}y}{dt^{2}}=\frac{v^{2}}{R}=\frac{\epsilon}{\mu}\frac{v}{V}N\cdot\sqrt{1-\left(\frac{v}{V}\right)^{2}}$$ 486 | oder 487 | $$R=V^{2}\frac{\epsilon}{\mu}\cdot\frac{\frac{v}{V}}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}\cdot\frac{1}{N}.$$ 488 | 489 | Diese drei Beziehungen sind ein vollständiger Ausdruck für die Gesetze, nach denen sich gemäß vorliegender Theorie das Elektron bewegen muß. 490 | 491 | Zum Schlusse bemerke ich, daß mir beim Arbeiten an dem hier behandelten Probleme mein Freund und Kollege __M. Besso__ treu zur Seite stand und daß ich demselben manche wertvolle Anregung verdanke. 492 | 493 | _Bern, Juni 1905._ 494 | 495 | ---- 496 | 497 | [^1]: Die Ungenauigkeit, welche in dem Begriffe der Gleichzeitigkeit zweier Ereignisse an (annähernd) demselben Orte steckt und gleichfalls durch eine Abstraktion überbrückt werden muß, soll hier nicht erörtert werden. 498 | [^2]: »Zeit« bedeutet hier »Zeit des ruhenden Systems« und zugleich »Zeigerstellung der bewegten Uhr, welche sich an dem Orte, von dem die Rede ist, befindet«. 499 | [^3]: Das heißt einen Körper, welcher ruhend untersucht Kugelgestalt besitzt. 500 | [^4]: Ist z.B. _X = Y = Z = L = M = 0_ und N ≠ 0, so ist aus Symmetriegründen klar, daß bei Zeichenwechsel von _v_ ohne Änderung des numerischen Wertes auch _Y' _sein Vorzeichen ändern muß, ohne seinen numerischen Wert zu ändern. 501 | 502 | --- 503 | 504 | [^†]: https://archive.org/details/annalenderphysi108unkngoog 505 | [^‡]: http://wikilivres.ca/wiki/Zur_Elektrodynamik_bewegter_K%C3%B6rper 506 | -------------------------------------------------------------------------------- /samples/bugs.md: -------------------------------------------------------------------------------- 1 | # Mathdown Bugs 2 | #### cursor 3 | - The cursor position is **very** buggy, due to how it’s implemented by CodeMirror. 4 | - CodeMirror tracks the supposed position of the native cursor based on the line/character index, but assumes an equal advance-width of all characters (i.e. same monospace font), no margins, no paddings, no absolutely positioned elements, etc. 5 | - In short: there is no direct relationship between the edited text and the rendered text; the mapping between DOM content and Visible content is [not well-behaved](https://medium.com/medium-eng/122d8a40e480). 6 | - Firepad’s multiple cursors add up to the problem. 7 | - If this is true, then we’re in great trouble to hack and mold CodeMirror into what we’re after: wysiwyg editing… 8 | #### Performance 9 | - MathJax webfonts load very slowly: this is especially noticeable on documents with lots of equations. 10 | 11 | ### Parsing 12 | #### Emphasis 13 | - When you have an isolated underscore_ at the end of a word, this will cause the emphasis to run all the way through to the end of the paragraph. 14 | - **This is especially troublesome with subscript syntax within math expressions. 15 | 16 | For example, $\LaTeX$ syntax uses a single underscore to render the immediately following character in subscript. Thus, `H_2O` will become $H_2$O, but the unpaired underscore will cause all following characters to become emphasized. 17 | #### Titles 18 | - In the CodeMirror submodule, in markdown.js, a space should be added (after the hashes) to the regex for matching of headers, like so: `atxHeaderRE = /^#+\s/`. 19 | - Ibidem: the CM class should match the actual heading level, like so: `state.header = match[0].length <= 6 ? match[0].length-1 : 6;`. 20 | #### Lists 21 | - In the CodeMirror submodule, in markdown.js, we want to add support for lettered ordered lists, like so: `olRE = /^([0-9]+\.|[A-z]+\))\s+/` 22 | #### Horizontal Rules 23 | The use of dashes (-) and asterisks (*) at the beginning of a new line is ambiguous: do they denote (unordered, bulleted) list items, or a horizontal rule? 24 | 25 | --- no horizontal rule, but a nested list item (three levels deep) 26 | --- 27 | 28 | No (nested) list item, but a horizontal rule. 29 | #### Inline HyperLinks 30 | Clickable links are [unsupported yet](https://github.com/cben/mathdown/issues/9), e.g.: 31 | 32 | - 33 | - [Mathdown](http://mathdown.net "Collaborative markdown + math"). 34 | #### Email addresses 35 | - Too greedy match: this:is@not-an-e-mail. (And the fulls-top period at the end of the string doesn’t belong to it, either.) 36 | - Colons folllowing two chars, then followed by at least three chars, except space, get tokenized: aa:a, aa:ab, aa:abc, aa:abcd — why? 37 | #### Referenced hyperlinks 38 | - Identifiers of [referenced links][id] are not recognized as such. 39 | - Neither are title attributes within the reference text: 40 | [id]: http://mathdown.net "The math editor for the Web" 41 | #### Footnotes and Inline References 42 | - Footnote markers are not tokenized. [^†] 43 | 44 | [^†]: Only the first word of the actual footnote text is tokenized.[^*] 45 | [^*]: The asterisk should be a lawful character for footnote markers; i.e. there should not be any parsing inside a footnote marker. 46 | 47 | - Cfr https://github.com/cben/mathdown/issues/40 48 | #### Images 49 | - No support for inline real-time rendering of images yet. 50 | - Image definitions are not recognized as such: 51 | ![logo](http://rhythmus.be/favicon.ico "Rhythmus Typography") 52 | #### Inline Code and Code blocks 53 | - Bakcticked inline code (`literals`) are fine, as long as you do not use `\escape` backslashes: the literal will run through beyond the closing backtick, unless it is `preceeded by a space. 54 | - 55 | ```` 56 | There should be no parsing *inside* code blocks, _no_ Markdown, but no $\LaTex$ MathJax, either. $$\backslashes$$ back lashes. 57 | ``` 58 | #### Math and Equations 59 | - Two single consecutive dollar signs within text may unintendly call MathJax, wich can cost you between $10 USD and $20 USD. 60 | 61 | - The same goes for double dollar signs: $$ no equation $$. 62 | 63 | - All formulas must be written on one line; there’s no support for complex math, like matrices: 64 | 65 | $$ 66 | \begin{matrix}\tau & = & \varphi(v)\beta(t-\frac{v}{V^{2}}x),\\ 67 | \\\xi & = & \varphi(v)\beta(x-vt),\\ 68 | \\\eta & = & \varphi(v)y,\\ 69 | \\\zeta & = & \varphi(v)z,\\ 70 | \end{matrix} 71 | $$ 72 | 73 | - `\newcommand` mostly works but you may need to reload the page for the definition to take effect. 74 | - Equations are numbered with a css hack: `\label` can’t be used; causes “multiply defined” error. 75 | #### Tables 76 | No support yet. 77 | #### Raw html 78 | No support yet. 79 | -------------------------------------------------------------------------------- /samples/demo.md: -------------------------------------------------------------------------------- 1 | # Mathdown 2 | (Click on the file icon, top left, to get started with a **new document**.) 3 | ## Mathdown takes simple Markdown syntax 4 | ### and MathJax for $\LaTeX$ equations 5 | #### And Firepad for REAL-TIME collaboration 6 | ##### So you can do, together, 7 | 8 | a) _italics_ with underscores (`_`) 9 | b) **boldface** with asterisks (`*`) 10 | c) `literals` with backticks (`_`) 11 | d) dollars signs (`$`) for math with $\LaTeX$ 12 | 13 | and _stuff_ like $H_2O$, and this: 14 | $$P=\int X\ dx=\frac{\mu}{\epsilon}V^{2}\left\{ \frac{1}{\sqrt{1-\left(\frac{v}{V}\right)^{2}}}-1\right\}$$ 15 | 16 | _(To edit a formula just move into it.)_ 17 | 18 | > Quotes. 19 | 20 | - Notes[^1] 21 | [^1]: As in footnotes. 22 | 23 | ```` 24 | Code 25 | on multiple 26 | lines 27 | ```` 28 | ###### Draw a line: 29 | 30 | *** 31 | -------------------------------------------------------------------------------- /smoke-test.coffee: -------------------------------------------------------------------------------- 1 | wd = require('wd') 2 | chalk = require('chalk') 3 | 4 | browser = wd.remote( 5 | 'ondemand.saucelabs.com', 80, 6 | 'mathdown', '23056294-abe8-4fe9-8140-df9a59c45c7d' 7 | ) 8 | 9 | browser.on 'status', (info) -> 10 | console.log(chalk.cyan(info)) 11 | 12 | browser.on 'command', (meth, path) -> 13 | console.log(' > %s: %s', chalk.yellow(meth), path) 14 | 15 | browser.on 'http', (meth, path, data) -> 16 | console.log(' > %s %s %s', chalk.magenta(meth), path, chalk.grey(data)) 17 | 18 | desired = { 19 | browserName: 'internet explorer' 20 | version: '8' 21 | platform: 'Windows XP' 22 | name: 'smoke test' 23 | } 24 | 25 | browser.init desired, -> 26 | # TODO: use current source (via Sauce Connect?) 27 | browser.get 'http://mathdown.net/?doc=_mathdown_test_smoke', -> 28 | browser.waitFor wd.asserters.jsCondition('document.title.match(/smoke test/)', 2000), (err, value) -> 29 | # TODO: err should not be ignored. Use promises for sanity? 30 | browser.waitForElementByCss '.MathJax_Display', 15000, (err, el) -> 31 | el.text (err, text) -> 32 | if not text.match(/^\s*α\s*$/) 33 | console.error('math', text, 'isn\'t alpha.') 34 | browser.quit() 35 | --------------------------------------------------------------------------------