Kaynağa Gözat

Merge pull request #3409 from flowolf/add-code-line-offset-to-markdown

[Markdown plugin] add line number offset for code sections to markdown
Hakim El Hattab 2 yıl önce
ebeveyn
işleme
0d699ec7f5

+ 19 - 0
examples/markdown.html

@@ -99,6 +99,25 @@
                     </script>
                     </script>
                 </section>
                 </section>
 
 
+                <!-- add optional line count offset, in this case 287 -->
+                <section data-markdown>
+                    <script type="text/template">
+                        ## echo.c
+
+                        ```c [287: 2|4,6]
+                        /* All of the options in this arg are valid, so handle them. */
+                        p = arg + 1;
+                        do {
+                            if (*p == 'n')
+                                nflag = 0;
+                            if (*p == 'e')
+                                eflag = '\\';
+                        } while (*++p); 
+                        ```
+                        [source](https://git.busybox.net/busybox/tree/coreutils/echo.c?h=1_36_stable#n287)
+                    </script>
+                </section>
+
                 <!-- Images -->
                 <!-- Images -->
                 <section data-markdown>
                 <section data-markdown>
                     <script type="text/template">
                     <script type="text/template">

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
plugin/markdown/markdown.esm.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
plugin/markdown/markdown.js


+ 16 - 3
plugin/markdown/plugin.js

@@ -13,7 +13,9 @@ const DEFAULT_SLIDE_SEPARATOR = '\r?\n---\r?\n',
 
 
 const SCRIPT_END_PLACEHOLDER = '__SCRIPT_END__';
 const SCRIPT_END_PLACEHOLDER = '__SCRIPT_END__';
 
 
-const CODE_LINE_NUMBER_REGEX = /\[([\s\d,|-]*)\]/;
+// match an optional line number offset and highlight line numbers
+// [<line numbers>] or [<offset>: <line numbers>]
+const CODE_LINE_NUMBER_REGEX = /\[\s*((\d*):)?\s*([\s\d,|-]*)\]/;
 
 
 const HTML_ESCAPE_MAP = {
 const HTML_ESCAPE_MAP = {
   '&': '&amp;',
   '&': '&amp;',
@@ -429,14 +431,23 @@ const Plugin = () => {
 				renderer.code = ( code, language ) => {
 				renderer.code = ( code, language ) => {
 
 
 					// Off by default
 					// Off by default
+					let lineNumberOffset = '';
 					let lineNumbers = '';
 					let lineNumbers = '';
 
 
 					// Users can opt in to show line numbers and highlight
 					// Users can opt in to show line numbers and highlight
 					// specific lines.
 					// specific lines.
 					// ```javascript []        show line numbers
 					// ```javascript []        show line numbers
 					// ```javascript [1,4-8]   highlights lines 1 and 4-8
 					// ```javascript [1,4-8]   highlights lines 1 and 4-8
+					// optional line number offset:
+					// ```javascript [25: 1,4-8]   start line numbering at 25,
+					//                             highlights lines 1 (numbered as 25) and 4-8 (numbered as 28-32)
 					if( CODE_LINE_NUMBER_REGEX.test( language ) ) {
 					if( CODE_LINE_NUMBER_REGEX.test( language ) ) {
-						lineNumbers = language.match( CODE_LINE_NUMBER_REGEX )[1].trim();
+						let lineNumberOffsetMatch =  language.match( CODE_LINE_NUMBER_REGEX )[2];
+						if (lineNumberOffsetMatch){
+							lineNumberOffset =  `data-ln-start-from="${lineNumberOffsetMatch.trim()}"`;
+						}
+
+						lineNumbers = language.match( CODE_LINE_NUMBER_REGEX )[3].trim();
 						lineNumbers = `data-line-numbers="${lineNumbers}"`;
 						lineNumbers = `data-line-numbers="${lineNumbers}"`;
 						language = language.replace( CODE_LINE_NUMBER_REGEX, '' ).trim();
 						language = language.replace( CODE_LINE_NUMBER_REGEX, '' ).trim();
 					}
 					}
@@ -446,7 +457,9 @@ const Plugin = () => {
 					// highlight.js is able to read it
 					// highlight.js is able to read it
 					code = escapeForHTML( code );
 					code = escapeForHTML( code );
 
 
-					return `<pre><code ${lineNumbers} class="${language}">${code}</code></pre>`;
+					// return `<pre><code ${lineNumbers} class="${language}">${code}</code></pre>`;
+					
+					return `<pre><code ${lineNumbers} ${lineNumberOffset} class="${language}">${code}</code></pre>`;
 				};
 				};
 			}
 			}
 
 

+ 34 - 0
test/test-markdown.html

@@ -274,6 +274,13 @@
 						```
 						```
 					</script>
 					</script>
 				</section>
 				</section>
+				<section data-markdown class="with-offset">
+					<script type="text/template">
+						```[123:]
+						code
+						```
+					</script>
+				</section>
 				<section data-markdown class="with-line-highlights-and-lanugage">
 				<section data-markdown class="with-line-highlights-and-lanugage">
 					<script type="text/template">
 					<script type="text/template">
 						```javascript [1,2,3]
 						```javascript [1,2,3]
@@ -281,6 +288,20 @@
 						```
 						```
 					</script>
 					</script>
 				</section>
 				</section>
+				<section data-markdown class="with-line-highlights-offset-and-lanugage">
+					<script type="text/template">
+						```javascript [456: 3,4,5]
+						code
+						```
+					</script>
+				</section>
+				<section data-markdown class="with-line-offset-and-lanugage">
+					<script type="text/template">
+						```javascript [756:]
+						code
+						```
+					</script>
+				</section>
 				<section data-markdown class="with-code-in-fragment">
 				<section data-markdown class="with-code-in-fragment">
 					<script type="text/template">
 					<script type="text/template">
 					```js
 					```js
@@ -460,9 +481,22 @@
 					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-highlights .hljs[data-line-numbers="1,2,3"]' ).length, 1 );
 					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-highlights .hljs[data-line-numbers="1,2,3"]' ).length, 1 );
 				});
 				});
 
 
+				QUnit.test( '```[234: ] line offset only', function( assert ) {
+					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-offset .hljs[data-ln-start-from="123"]' ).length, 1 );
+				});
+
 				QUnit.test( '```javascript [1,2,3] enables line highlights and sets language', function( assert ) {
 				QUnit.test( '```javascript [1,2,3] enables line highlights and sets language', function( assert ) {
 					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-highlights-and-lanugage .hljs.javascript[data-line-numbers="1,2,3"]' ).length, 1 );
 					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-highlights-and-lanugage .hljs.javascript[data-line-numbers="1,2,3"]' ).length, 1 );
 				});
 				});
+
+				QUnit.test( '```javascript [123: 3,4,5] add line offset and enables line highlights and sets language', function( assert ) {
+					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-highlights-offset-and-lanugage .hljs.javascript[data-line-numbers="3,4,5"]' ).length, 1 );
+					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-highlights-offset-and-lanugage .hljs.javascript[data-ln-start-from="456"]' ).length, 1 );
+				});
+
+				QUnit.test( '```javascript [756:] add line offset and sets no line highlights and sets language', function( assert ) {
+					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-offset-and-lanugage .hljs.javascript[data-ln-start-from="756"]' ).length, 1 );
+				});
 				
 				
 				QUnit.test( '```block should allow custom fragment', function( assert ) {
 				QUnit.test( '```block should allow custom fragment', function( assert ) {
 					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-code-in-fragment pre.fragment' ).length, 1 );
 					assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-code-in-fragment pre.fragment' ).length, 1 );

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor