-
Notifications
You must be signed in to change notification settings - Fork 11
/
yamlWriter.R
144 lines (134 loc) · 4.99 KB
/
yamlWriter.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#' DIRECTIONS:
#' 1. Source this file and invoke newYaml(courseName, lessonName), where
#' courseName and lessonName are strings of your choice such as "My Course" and
#' "My Lesson 1". Spaces are allowed in course and lesson names.
#' This will create a file such as My_Course/My_Lesson_1/lesson.yaml.
#' The file should appear in the editor automatically. If not, open it manually.
#'
#' 2. Fill in the course meta-information, Author, Organization, etc. as indicated in
#' lesson.yaml.
#'
#' 3. Append instructional units such as multiple-choice questions to lesson.yaml by
#' invoking appropriate helper functions. Type hlp() for a brief list. Typing qmult(),
#' for instance would append the following template to lesson.yaml:
#' - Class: mult_question
#' Output: ask the multiple choice question here
#' AnswerChoices: ANS;2;3
#' CorrectAnswer: ANS
#' AnswerTests: omnitest(correctVal= 'ANS')
#' Hint: hint
#' which might be manually edited as follows.
#' - Class: mult_question
#' Output: This demonstrates a multiple choice question. Which Scooby-Doo character wears an ascot?
#' AnswerChoices: Fred Jones;Velma Dinkley;Daphne Blake;Shaggy Rogers
#' CorrectAnswer: Fred Jones
#' AnswerTests: omnitest(correctVal= 'Fred Jones')
#' Hint: This person doesn't say "Jinkies."
#'
#' 4. Save lesson.yaml whenever you append and edit a unit of instruction.
#'
#' 5. Strings may take more than one line provided they are surrounded by double quotes. For instance,
#' in the following question the Output: field takes up two lines:
#' - Class: text_question
#' Output: "This illustrates a question requiring a single phrase text answer.
#' What is the name of the van which carries Scooby's gang?"
#' CorrectAnswer: Mystery Machine
#' AnswerTests: omnitest(correctVal='Mystery Machine')
#' Hint: The gang generally solves a M------? It's the M------ Machine.
newYaml <- function(course, lesson){
lessonDir <<- file.path(gsub(" ", "_", course), gsub(" ", "_", lesson))
if(!file.exists(lessonDir))dir.create(lessonDir, recursive=TRUE)
writeLines("# Put initialization code in this file.", file.path(lessonDir,"initLesson.R"))
writeLines("# Put custom tests in this file.", file.path(lessonDir,"customTests.R"))
# The yaml faq, http://www.yaml.org/faq.html, encourages
# use of the .yaml (as opposed to .yml) file extension
# whenever possible.
lessonFile <<- file.path(lessonDir, "lesson.yaml")
writeLines(c("- Class: meta",
paste(" Course:", course),
paste(" Lesson:", lesson),
" Author: your name goes here",
" Type: Standard",
" Organization: your organization",
" Version: 2.1.0"),
lessonFile)
file.edit(lessonFile)
}
# yaml writer help
hlp <- function(){
print("newYaml(course, lesson) -- create a new yaml lesson")
print("txt -- just text, no question")
print("qmult -- multiple choice question")
print("qcmd -- command line question")
print("vid -- video")
print("fig -- figure")
print("qx -- question requiring exact numerical answer")
print("qtxt -- question requiring a short text answer")
}
# template for presentation without a question
txt <- function(){
lessonFileCheck()
cat("\n- Class: text
Output: put your exposition here.\n", file=lessonFile, append=TRUE)
invisible()
}
# template for multiple choice question
qmult <- function(){
lessonFileCheck()
cat("\n- Class: mult_question
Output: ask the multiple choice question here
AnswerChoices: ANS;2;3
CorrectAnswer: ANS
AnswerTests: omnitest(correctVal= 'ANS')
Hint: hint\n", file=lessonFile, append=TRUE)
invisible()
}
qcmd <- function(){
lessonFileCheck()
cat("\n- Class: cmd_question
Output: explain what the user must do here
CorrectAnswer: EXPR or VAL
AnswerTests: omnitest(correctExpr='EXPR', correctVal=VAL)
Hint: hint\n", file=lessonFile, append=TRUE)
invisible()
}
vid <- function(){
lessonFileCheck()
cat("\n- Class: video
Output: Would you like to watch a short video about ___?
VideoLink: 'http://address.of.video'\n", file=lessonFile, append=TRUE)
invisible()
}
fig <- function(){
lessonFileCheck()
cat("\n- Class: figure
Output: explain the figure here
Figure: sourcefile.R
FigureType: new or add\n", file=lessonFile, append=TRUE)
invisible()
}
qx<- function(){
lessonFileCheck()
cat("\n- Class: exact_question
Output: explain the question here
CorrectAnswer: n
AnswerTests: omnitest(correctVal=n)
Hint: hint\n", file=lessonFile, append=TRUE)
invisible()
}
qtxt <- function(){
lessonFileCheck()
cat("\n- Class: text_question
Output: explain the question here
CorrectAnswer: answer
AnswerTests: omnitest(correctVal='answer')
Hint: hint\n", file=lessonFile, append=TRUE)
invisible()
}
lessonFileCheck <- function(){
while(!exists("lessonFile", globalenv()) || !file.exists(lessonFile)){
course <- gsub(" ", "_", readline("Course name? "))
lesson <- gsub(" ", "_", readline("Lesson name? "))
lessonFile <<- file.path(course, lesson)
}
}