tutor: allow metadata to exist outside of the documents.

this makes 'expect' regions simpler to handle.
This commit is contained in:
Felipe Morales 2017-07-13 19:04:15 -04:00
parent 2dc5b141da
commit ec67d07065
4 changed files with 151 additions and 49 deletions

View File

@ -209,7 +209,15 @@ function! tutor#InfoText()
return join(l:info_parts, " ")
endfunction
" Marks {{{1
function! tutor#LoadMetadata()
try
let b:tutor_metadata = json_decode(join(readfile(expand('%').'.json'), "\n"))
catch
endtry
endfunction
" Marks: {{{1
" Internal: {{{2
function! tutor#PlaceXMarks()
call cursor(1, 1)
let b:tutor_sign_id = 1
@ -241,13 +249,47 @@ function! tutor#CheckText(text)
endif
endfunction
function! tutor#OnTextChanged()
function! tutor#XmarksOnTextChanged()
let l:text = getline('.')
if match(l:text, '^--->') > -1
call tutor#CheckText(l:text)
endif
endfunction
" External: {{{2
function! tutor#ApplyMarks()
if exists('b:tutor_metadata') && has_key(b:tutor_metadata, 'expect')
let b:tutor_sign_id = 1
for expct in keys(b:tutor_metadata['expect'])
let lnum = eval(expct)
call matchaddpos('tutorSampleText', [lnum])
call tutor#CheckLine(lnum)
endfor
endif
endfunction
function! tutor#ApplyMarksOnChanged()
if exists('b:tutor_metadata') && has_key(b:tutor_metadata, 'expect')
let lnum = line('.')
if index(keys(b:tutor_metadata['expect']), string(lnum)) > -1
call tutor#CheckLine(lnum)
endif
endif
endfunction
function! tutor#CheckLine(line)
if exists('b:tutor_metadata') && has_key(b:tutor_metadata, 'expect')
let bufn = bufnr('%')
let ctext = getline(a:line)
if b:tutor_metadata['expect'][string(a:line)] == -1 || ctext ==# b:tutor_metadata['expect'][string(a:line)]
exe "sign place ".b:tutor_sign_id." line=".a:line." name=tutorok buffer=".bufn
else
exe "sign place ".b:tutor_sign_id." line=".a:line." name=tutorbad buffer=".bufn
endif
let b:tutor_sign_id+=1
endif
endfunction
" Tutor Cmd: {{{1
function! s:Locale()

View File

@ -28,18 +28,29 @@ setlocal nowrap
setlocal statusline=%{toupper(expand('%:t:r'))}\ tutorial%=
setlocal statusline+=%{tutor#InfoText()}
" Load metadata if it exists: {{{1
if filereadable(expand('%').'.json')
call tutor#LoadMetadata()
endif
" Mappings: {{{1
call tutor#SetNormalMappings()
call tutor#SetSampleTextMappings()
if exists('b:tutor_metadata') && b:tutor_metadata['settings']['use_maps'] == 1
call tutor#SetSampleTextMappings()
endif
" Checks: {{{1
sign define tutorok text=texthl=tutorOK
sign define tutorbad text=texthl=tutorX
if !exists('g:tutor_debug') || g:tutor_debug == 0
call tutor#PlaceXMarks()
autocmd! TextChanged <buffer> call tutor#OnTextChanged()
autocmd! TextChangedI <buffer> call tutor#OnTextChanged()
if !exists('g:tutor_debug') || g:tutor_debug == 0
if !(exists('b:tutor_metadata') && b:tutor_metadata['settings']['check_internal_expects'] == '0')
call tutor#PlaceXMarks()
autocmd! TextChanged,TextChangedI <buffer> call tutor#XmarksOnTextChanged()
else
call tutor#ApplyMarks()
autocmd! TextChanged,TextChangedI <buffer> call tutor#ApplyMarksOnChanged()
endif
endif

View File

@ -18,10 +18,10 @@ be saved. Don't worry about messing things up; just remember that pressing
[<Esc>](<Esc>) and then [u](u) will undo the latest change.
This tutorial is interactive, and there are a few things you should know.
Pressing [<Enter>](<Enter>) over text highlighted [like this](holy-grail) will take you to some
Pressing [<Enter>](<Enter>) over text highlighted [like this](holy-grail) will take you to some
relevant help (hopefully), and pressing K over any word will try to do so too.
Sometimes you will be required to modify text like
---> this here {expect:this here}
this here
Once you have done the changes correctly, the ✗ sign at the left will change
to ✓. I imagine you can already see how neat Vim can be ;)
Other times, you'll be prompted to run a command (I'll explain this later):
@ -99,7 +99,7 @@ NOTE: [:q!](:q) <Enter> discards any changes you made. In a few lessons you
4. Repeat steps 2 through 4 until the sentence is correct.
---> The ccow jumpedd ovverr thhe mooon. {expect:The cow jumped over the moon.}
The ccow jumpedd ovverr thhe mooon.
5. Now that the line is correct, go on to Lesson 1.4.
@ -119,8 +119,8 @@ NOTE: As you go through this tutor, do not try to memorize, learn by usage.
4. As each error is fixed press <Esc> to return to Normal mode.
Repeat steps 2 through 4 to correct the sentence.
---> There is text misng this . {expect:There is some text missing from this line.}
---> There is some text missing from this line. {expect:There is some text missing from this line.}
There is text misng this .
There is some text missing from this line.
5. When you are comfortable inserting text move to lesson 1.5.
@ -138,10 +138,10 @@ NOTE: As you go through this tutor, do not try to memorize, learn by usage.
4. Move the cursor to the second line marked ---> and repeat
steps 2 and 3 to correct this sentence.
---> There is some text missing from th {expect:There is some text missing from this line.}
---> There is some text missing from this line. {expect:There is some text missing from this line.}
---> There is also some text miss {expect:There is also some text missing here.}
---> There is also some text missing here. {expect:There is also some text missing here.}
There is some text missing from th
There is some text missing from this line.
There is also some text miss
There is also some text missing here.
5. When you are comfortable appending text move to lesson 1.6.
@ -212,7 +212,7 @@ Now continue with Lesson 2.
4. Type [d](d)[w](w) to make the word disappear.
---> There are a some words fun that don't belong paper in this sentence. {expect:There are some words that don't belong in this sentence.}
There are a some words fun that don't belong paper in this sentence.
5. Repeat steps 3 and 4 until the sentence is correct and go to Lesson 2.2.
@ -228,7 +228,7 @@ Now continue with Lesson 2.
4. Type `d$`{normal} to delete to the end of the line.
---> Somebody typed the end of this line twice. end of this line twice. {expect:ANYTHING}
Somebody typed the end of this line twice. end of this line twice.
5. Move on to Lesson 2.3 to understand what is happening.
@ -268,7 +268,7 @@ NOTE: Pressing just the motion while in Normal mode without an operator will
5. Repeat steps 2 and 3 with different numbers.
---> This is just a line with words you can move around in. {expect:ANYTHING}
This is just a line with words you can move around in.
6. Move on to Lesson 2.5.
@ -287,7 +287,7 @@ insert a count before the motion to delete more:
3. Repeat steps 1 and 2 with a different count to delete the consecutive
UPPER CASE words with one command
---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up. {expect:this line of words is cleaned up.}
this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.
# Lesson 2.6: OPERATING ON LINES
@ -301,13 +301,13 @@ insert a count before the motion to delete more:
3. Now move to the fourth line.
4. Type `2dd`{normal} to delete two lines.
---> 1) Roses are red, {expect:ANYTHING}
---> 2) Mud is fun, {expect:ANYTHING}
---> 3) Violets are blue, {expect:ANYTHING}
---> 4) I have a car, {expect:ANYTHING}
---> 5) Clocks tell time, {expect:ANYTHING}
---> 6) Sugar is sweet {expect:ANYTHING}
---> 7) And so are you. {expect:ANYTHING}
1) Roses are red,
2) Mud is fun,
3) Violets are blue,
4) I have a car,
5) Clocks tell time,
6) Sugar is sweet
7) And so are you.
# Lesson 2.7: THE UNDO COMMAND
@ -322,7 +322,7 @@ insert a count before the motion to delete more:
6. Now type `u`{normal} a few times to undo the U and preceding commands.
7. Now type `<Ctrl-r>`{normal} a few times to redo the commands (undo the undo's).
---> Fiix the errors oon thhis line and reeplace them witth undo. {expect:Fix the errors on this line and replace them with undo.}
Fiix the errors oon thhis line and reeplace them witth undo.
8. These are very useful commands. Now move on to the Lesson 2 Summary.
@ -362,10 +362,10 @@ insert a count before the motion to delete more:
5. Repeat steps 2 through 4 to put all the lines in correct order.
---> d) Can you learn too? {expect:ANYTHING}
---> b) Violets are blue, {expect:ANYTHING}
---> c) Intelligence is learned, {expect:ANYTHING}
---> a) Roses are red, {expect:ANYTHING}
d) Can you learn too?
b) Violets are blue,
c) Intelligence is learned,
a) Roses are red,
# Lesson 3.2: THE REPLACE COMMAND
@ -379,8 +379,8 @@ insert a count before the motion to delete more:
4. Repeat steps 2 and 3 until the first line is equal to the second one.
---> Whan this lime was tuoed in, someone presswd some wrojg keys! {expect:When this line was typed in, someone pressed some wrong keys!}
---> When this line was typed in, someone pressed some wrong keys! {expect:When this line was typed in, someone pressed some wrong keys!}
Whan this lime was tuoed in, someone presswd some wrojg keys!
When this line was typed in, someone pressed some wrong keys!
5. Now move on to Lesson 3.3.
@ -400,8 +400,8 @@ NOTE: Remember that you should be learning by doing, not memorization.
5. Repeat steps 3 and 4 until the first sentence is the same as the second.
---> This lubw has a few wptfd that mrrf changing usf the change operator. {expect:This line has a few words that need changing using the change operator.}
---> This line has a few words that need changing using the change operator. {expect:This line has a few words that need changing using the change operator.}
This lubw has a few wptfd that mrrf changing usf the change operator.
This line has a few words that need changing using the change operator.
Notice that [c](c)e deletes the word and places you in Insert mode.
@ -421,8 +421,8 @@ Notice that [c](c)e deletes the word and places you in Insert mode.
5. Type `c$`{normal} and type the rest of the line like the second and press `<Esc>`{normal}.
---> The end of this line needs some help to make it like the second. {expect:The end of this line needs to be corrected using the c$ command.}
---> The end of this line needs to be corrected using the c$ command. {expect:The end of this line needs to be corrected using the c$ command.}
The end of this line needs some help to make it like the second.
The end of this line needs to be corrected using the c$ command.
NOTE: You can use the Backspace key to correct mistakes while typing.
@ -484,7 +484,7 @@ NOTE: You may see the cursor position in the lower right corner of the screen
5. To go back to where you came from press `<Ctrl-o>`{normal} (Keep Ctrl down while
pressing the letter o). Repeat to go back further. `<Ctrl-i>`{normal} goes forward.
---> "errroor" is not the way to spell error; errroor is an error. {expect:ANYTHING}
"errroor" is not the way to spell error; errroor is an error.
NOTE: When the search reaches the end of the file it will continue at the
start, unless the ['wrapscan']('wrapscan') option has been reset.
@ -503,7 +503,7 @@ NOTE: When the search reaches the end of the file it will continue at the
5. Move the cursor to another (,),[,],{ or } and see what `%`{normal} does.
---> This ( is a test line with ('s, ['s ] and {'s } in it. )) {expect:ANYTHING}
This ( is a test line with ('s, ['s ] and {'s } in it. ))
NOTE: This is very useful in debugging a program with unmatched parentheses!
@ -528,7 +528,7 @@ NOTE: This is very useful in debugging a program with unmatched parentheses!
Adding the g [flag](:s_flags) means to substitute globally in the line, change
all occurrences of "thee" in the line.
---> thee best time to see thee flowers is in thee spring. {expect:the best time to see the flowers is in the spring.}
thee best time to see thee flowers is in thee spring.
4. To change every occurrence of a character string between two lines, type
~~~ cmd
@ -719,12 +719,12 @@ NOTE: You can also read the output of an external command. For example,
3. Now type some text and press `<Esc>`{normal} to exit Insert mode.
---> After typing o the cursor is placed on the open line in Insert mode. {expect:ANYTHING}
After typing o the cursor is placed on the open line in Insert mode.
4. To open up a line ABOVE the cursor, simply type a [capital O](O), rather
than a lowercase `o`{normal}. Try this on the line below.
---> Open up a line above this by typing O while the cursor is on this line. {expect:ANYTHING}
Open up a line above this by typing O while the cursor is on this line.
# Lesson 6.2: THE APPEND COMMAND
@ -741,8 +741,8 @@ NOTE: You can also read the output of an external command. For example,
5. Use `e`{normal} to move to the next incomplete word and repeat steps 3 and 4.
---> This li will allow you to pract appendi text to a line. {expect:This line will allow you to practice appending text to a line.}
---> This line will allow you to practice appending text to a line. {expect:This line will allow you to practice appending text to a line.}
This li will allow you to pract appendi text to a line.
This line will allow you to practice appending text to a line.
NOTE: [a](a), [i](i) and [A](A) all go to the same Insert mode, the only difference is where
the characters are inserted.
@ -762,8 +762,8 @@ NOTE: [a](a), [i](i) and [A](A) all go to the same Insert mode, the only differ
4. Repeat the steps to replace the remaining "xxx".
---> Adding 123 to xxx gives you xxx. {expect:Adding 123 to 456 gives you 579.}
---> Adding 123 to 456 gives you 579. {expect:Adding 123 to 456 gives you 579.}
Adding 123 to xxx gives you xxx.
Adding 123 to 456 gives you 579.
NOTE: Replace mode is like Insert mode, but every typed character deletes an
existing character.
@ -785,8 +785,8 @@ NOTE: Replace mode is like Insert mode, but every typed character deletes an
6. Use Visual mode to select " item.", yank it with `y`{normal}, move to the end of
the next line with `j$`{normal} and put the text there with `p`{normal}.
---> a) this is the first item.
---> b) {expect: b) this is the second item}
a) this is the first item.
b)
NOTE: you can also use `y`{normal} as an operator; `yw`{normal} yanks one word.

View File

@ -0,0 +1,49 @@
{
"settings" : {
"use_maps": 0,
"check_internal_expects": 0
},
"expect": {
"24": -1,
"102": "The cow jumped over the moon.",
"122": "There is some text missing from this line.",
"123": "There is some text missing from this line.",
"141": "There is some text missing from this line.",
"142": "There is some text missing from this line.",
"143": "There is also some text missing here.",
"144": "There is also some text missing here.",
"215": "There are some words that don't belong in this sentence.",
"231": "Somebody typed the end of this line twice.",
"271": -1,
"290": "this line of words is cleaned up.",
"304": -1,
"305": -1,
"306": -1,
"307": -1,
"308": -1,
"309": -1,
"310": -1,
"325": "Fix the errors on this line and replace them with undo.",
"365": -1,
"366": -1,
"367": -1,
"368": -1,
"382": "When this line was typed in, someone pressed some wrong keys!",
"383": "When this line was typed in, someone pressed some wrong keys!",
"403": "This line has a few words that need changing using the change operator.",
"404": "This line has a few words that need changing using the change operator.",
"424": "The end of this line needs to be corrected using the c$ command.",
"425": "The end of this line needs to be corrected using the c$ command.",
"487": -1,
"506": -1,
"531": "the best time to see the flowers is in the spring.",
"722": -1,
"727": -1,
"744": "This line will allow you to practice appending text to a line.",
"745": "This line will allow you to practice appending text to a line.",
"765": "Adding 123 to 456 gives you 579.",
"766": "Adding 123 to 456 gives you 579.",
"788": "a) this is the first item.",
"789": " b) this is the second item."
}
}