Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
crowdsourcehinter
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
crowdsourcehinter
Commits
4a2ace3a
Commit
4a2ace3a
authored
Nov 10, 2014
by
Sola
Committed by
Piotr Mitros
Oct 12, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
implementing mustache templates
parent
4d6cf7a8
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
613 additions
and
18 deletions
+613
-18
crowdsourcehinter/crowdsourcehinter.py
+1
-0
crowdsourcehinter/public/3rdParty/mustache.js
+578
-0
crowdsourcehinter/static/html/crowdsourcehinter.html
+23
-2
crowdsourcehinter/static/js/src/crowdsourcehinter.js
+11
-4
crowdsourcehinter_xblock.egg-info/SOURCES.txt
+0
-12
No files found.
crowdsourcehinter/crowdsourcehinter.py
View file @
4a2ace3a
...
@@ -55,6 +55,7 @@ class CrowdsourceHinter(XBlock):
...
@@ -55,6 +55,7 @@ class CrowdsourceHinter(XBlock):
"""
"""
html
=
self
.
resource_string
(
"static/html/crowdsourcehinter.html"
)
html
=
self
.
resource_string
(
"static/html/crowdsourcehinter.html"
)
frag
=
Fragment
(
html
.
format
(
self
=
self
))
frag
=
Fragment
(
html
.
format
(
self
=
self
))
frag
.
add_javascript_url
(
'//cdnjs.cloudflare.com/ajax/libs/mustache.js/0.8.1/mustache.min.js'
)
frag
.
add_css
(
self
.
resource_string
(
"static/css/crowdsourcehinter.css"
))
frag
.
add_css
(
self
.
resource_string
(
"static/css/crowdsourcehinter.css"
))
frag
.
add_javascript
(
self
.
resource_string
(
"static/js/src/crowdsourcehinter.js"
))
frag
.
add_javascript
(
self
.
resource_string
(
"static/js/src/crowdsourcehinter.js"
))
frag
.
initialize_js
(
'CrowdsourceHinter'
)
frag
.
initialize_js
(
'CrowdsourceHinter'
)
...
...
crowdsourcehinter/public/3rdParty/mustache.js
0 → 100644
View file @
4a2ace3a
/*!
* mustache.js - Logic-less {{mustache}} templates with JavaScript
* http://github.com/janl/mustache.js
*/
/*global define: false*/
(
function
(
global
,
factory
)
{
if
(
typeof
exports
===
"object"
&&
exports
)
{
factory
(
exports
);
// CommonJS
}
else
if
(
typeof
define
===
"function"
&&
define
.
amd
)
{
define
([
'exports'
],
factory
);
// AMD
}
else
{
factory
(
global
.
Mustache
=
{});
// <script>
}
}(
this
,
function
(
mustache
)
{
var
Object_toString
=
Object
.
prototype
.
toString
;
var
isArray
=
Array
.
isArray
||
function
(
object
)
{
return
Object_toString
.
call
(
object
)
===
'[object Array]'
;
};
function
isFunction
(
object
)
{
return
typeof
object
===
'function'
;
}
function
escapeRegExp
(
string
)
{
return
string
.
replace
(
/
[\-\[\]
{}()*+?.,
\\\^
$|#
\s]
/g
,
"
\\
$&"
);
}
// Workaround for https://issues.apache.org/jira/browse/COUCHDB-577
// See https://github.com/janl/mustache.js/issues/189
var
RegExp_test
=
RegExp
.
prototype
.
test
;
function
testRegExp
(
re
,
string
)
{
return
RegExp_test
.
call
(
re
,
string
);
}
var
nonSpaceRe
=
/
\S
/
;
function
isWhitespace
(
string
)
{
return
!
testRegExp
(
nonSpaceRe
,
string
);
}
var
entityMap
=
{
"&"
:
"&"
,
"<"
:
"<"
,
">"
:
">"
,
'"'
:
'"'
,
"'"
:
'''
,
"/"
:
'/'
};
function
escapeHtml
(
string
)
{
return
String
(
string
).
replace
(
/
[
&<>"'
\/]
/g
,
function
(
s
)
{
return
entityMap
[
s
];
});
}
var
whiteRe
=
/
\s
*/
;
var
spaceRe
=
/
\s
+/
;
var
equalsRe
=
/
\s
*=/
;
var
curlyRe
=
/
\s
*
\}
/
;
var
tagRe
=
/#|
\^
|
\/
|>|
\{
|&|=|!/
;
/**
* Breaks up the given `template` string into a tree of tokens. If the `tags`
* argument is given here it must be an array with two string values: the
* opening and closing tags used in the template (e.g. [ "<%", "%>" ]). Of
* course, the default is to use mustaches (i.e. mustache.tags).
*
* A token is an array with at least 4 elements. The first element is the
* mustache symbol that was used inside the tag, e.g. "#" or "&". If the tag
* did not contain a symbol (i.e. {{myValue}}) this element is "name". For
* all text that appears outside a symbol this element is "text".
*
* The second element of a token is its "value". For mustache tags this is
* whatever else was inside the tag besides the opening symbol. For text tokens
* this is the text itself.
*
* The third and fourth elements of the token are the start and end indices,
* respectively, of the token in the original template.
*
* Tokens that are the root node of a subtree contain two more elements: 1) an
* array of tokens in the subtree and 2) the index in the original template at
* which the closing tag for that section begins.
*/
function
parseTemplate
(
template
,
tags
)
{
if
(
!
template
)
return
[];
var
sections
=
[];
// Stack to hold section tokens
var
tokens
=
[];
// Buffer to hold the tokens
var
spaces
=
[];
// Indices of whitespace tokens on the current line
var
hasTag
=
false
;
// Is there a {{tag}} on the current line?
var
nonSpace
=
false
;
// Is there a non-space char on the current line?
// Strips all whitespace tokens array for the current line
// if there was a {{#tag}} on it and otherwise only space.
function
stripSpace
()
{
if
(
hasTag
&&
!
nonSpace
)
{
while
(
spaces
.
length
)
delete
tokens
[
spaces
.
pop
()];
}
else
{
spaces
=
[];
}
hasTag
=
false
;
nonSpace
=
false
;
}
var
openingTagRe
,
closingTagRe
,
closingCurlyRe
;
function
compileTags
(
tags
)
{
if
(
typeof
tags
===
'string'
)
tags
=
tags
.
split
(
spaceRe
,
2
);
if
(
!
isArray
(
tags
)
||
tags
.
length
!==
2
)
throw
new
Error
(
'Invalid tags: '
+
tags
);
openingTagRe
=
new
RegExp
(
escapeRegExp
(
tags
[
0
])
+
'
\\
s*'
);
closingTagRe
=
new
RegExp
(
'
\\
s*'
+
escapeRegExp
(
tags
[
1
]));
closingCurlyRe
=
new
RegExp
(
'
\\
s*'
+
escapeRegExp
(
'}'
+
tags
[
1
]));
}
compileTags
(
tags
||
mustache
.
tags
);
var
scanner
=
new
Scanner
(
template
);
var
start
,
type
,
value
,
chr
,
token
,
openSection
;
while
(
!
scanner
.
eos
())
{
start
=
scanner
.
pos
;
// Match any text between tags.
value
=
scanner
.
scanUntil
(
openingTagRe
);
if
(
value
)
{
for
(
var
i
=
0
,
valueLength
=
value
.
length
;
i
<
valueLength
;
++
i
)
{
chr
=
value
.
charAt
(
i
);
if
(
isWhitespace
(
chr
))
{
spaces
.
push
(
tokens
.
length
);
}
else
{
nonSpace
=
true
;
}
tokens
.
push
([
'text'
,
chr
,
start
,
start
+
1
]);
start
+=
1
;
// Check for whitespace on the current line.
if
(
chr
===
'
\
n'
)
stripSpace
();
}
}
// Match the opening tag.
if
(
!
scanner
.
scan
(
openingTagRe
))
break
;
hasTag
=
true
;
// Get the tag type.
type
=
scanner
.
scan
(
tagRe
)
||
'name'
;
scanner
.
scan
(
whiteRe
);
// Get the tag value.
if
(
type
===
'='
)
{
value
=
scanner
.
scanUntil
(
equalsRe
);
scanner
.
scan
(
equalsRe
);
scanner
.
scanUntil
(
closingTagRe
);
}
else
if
(
type
===
'{'
)
{
value
=
scanner
.
scanUntil
(
closingCurlyRe
);
scanner
.
scan
(
curlyRe
);
scanner
.
scanUntil
(
closingTagRe
);
type
=
'&'
;
}
else
{
value
=
scanner
.
scanUntil
(
closingTagRe
);
}
// Match the closing tag.
if
(
!
scanner
.
scan
(
closingTagRe
))
throw
new
Error
(
'Unclosed tag at '
+
scanner
.
pos
);
token
=
[
type
,
value
,
start
,
scanner
.
pos
];
tokens
.
push
(
token
);
if
(
type
===
'#'
||
type
===
'^'
)
{
sections
.
push
(
token
);
}
else
if
(
type
===
'/'
)
{
// Check section nesting.
openSection
=
sections
.
pop
();
if
(
!
openSection
)
throw
new
Error
(
'Unopened section "'
+
value
+
'" at '
+
start
);
if
(
openSection
[
1
]
!==
value
)
throw
new
Error
(
'Unclosed section "'
+
openSection
[
1
]
+
'" at '
+
start
);
}
else
if
(
type
===
'name'
||
type
===
'{'
||
type
===
'&'
)
{
nonSpace
=
true
;
}
else
if
(
type
===
'='
)
{
// Set the tags for the next time around.
compileTags
(
value
);
}
}
// Make sure there are no open sections when we're done.
openSection
=
sections
.
pop
();
if
(
openSection
)
throw
new
Error
(
'Unclosed section "'
+
openSection
[
1
]
+
'" at '
+
scanner
.
pos
);
return
nestTokens
(
squashTokens
(
tokens
));
}
/**
* Combines the values of consecutive text tokens in the given `tokens` array
* to a single token.
*/
function
squashTokens
(
tokens
)
{
var
squashedTokens
=
[];
var
token
,
lastToken
;
for
(
var
i
=
0
,
numTokens
=
tokens
.
length
;
i
<
numTokens
;
++
i
)
{
token
=
tokens
[
i
];
if
(
token
)
{
if
(
token
[
0
]
===
'text'
&&
lastToken
&&
lastToken
[
0
]
===
'text'
)
{
lastToken
[
1
]
+=
token
[
1
];
lastToken
[
3
]
=
token
[
3
];
}
else
{
squashedTokens
.
push
(
token
);
lastToken
=
token
;
}
}
}
return
squashedTokens
;
}
/**
* Forms the given array of `tokens` into a nested tree structure where
* tokens that represent a section have two additional items: 1) an array of
* all tokens that appear in that section and 2) the index in the original
* template that represents the end of that section.
*/
function
nestTokens
(
tokens
)
{
var
nestedTokens
=
[];
var
collector
=
nestedTokens
;
var
sections
=
[];
var
token
,
section
;
for
(
var
i
=
0
,
numTokens
=
tokens
.
length
;
i
<
numTokens
;
++
i
)
{
token
=
tokens
[
i
];
switch
(
token
[
0
])
{
case
'#'
:
case
'^'
:
collector
.
push
(
token
);
sections
.
push
(
token
);
collector
=
token
[
4
]
=
[];
break
;
case
'/'
:
section
=
sections
.
pop
();
section
[
5
]
=
token
[
2
];
collector
=
sections
.
length
>
0
?
sections
[
sections
.
length
-
1
][
4
]
:
nestedTokens
;
break
;
default
:
collector
.
push
(
token
);
}
}
return
nestedTokens
;
}
/**
* A simple string scanner that is used by the template parser to find
* tokens in template strings.
*/
function
Scanner
(
string
)
{
this
.
string
=
string
;
this
.
tail
=
string
;
this
.
pos
=
0
;
}
/**
* Returns `true` if the tail is empty (end of string).
*/
Scanner
.
prototype
.
eos
=
function
()
{
return
this
.
tail
===
""
;
};
/**
* Tries to match the given regular expression at the current position.
* Returns the matched text if it can match, the empty string otherwise.
*/
Scanner
.
prototype
.
scan
=
function
(
re
)
{
var
match
=
this
.
tail
.
match
(
re
);
if
(
!
match
||
match
.
index
!==
0
)
return
''
;
var
string
=
match
[
0
];
this
.
tail
=
this
.
tail
.
substring
(
string
.
length
);
this
.
pos
+=
string
.
length
;
return
string
;
};
/**
* Skips all text until the given regular expression can be matched. Returns
* the skipped string, which is the entire tail if no match can be made.
*/
Scanner
.
prototype
.
scanUntil
=
function
(
re
)
{
var
index
=
this
.
tail
.
search
(
re
),
match
;
switch
(
index
)
{
case
-
1
:
match
=
this
.
tail
;
this
.
tail
=
""
;
break
;
case
0
:
match
=
""
;
break
;
default
:
match
=
this
.
tail
.
substring
(
0
,
index
);
this
.
tail
=
this
.
tail
.
substring
(
index
);
}
this
.
pos
+=
match
.
length
;
return
match
;
};
/**
* Represents a rendering context by wrapping a view object and
* maintaining a reference to the parent context.
*/
function
Context
(
view
,
parentContext
)
{
this
.
view
=
view
==
null
?
{}
:
view
;
this
.
cache
=
{
'.'
:
this
.
view
};
this
.
parent
=
parentContext
;
}
/**
* Creates a new context using the given view with this context
* as the parent.
*/
Context
.
prototype
.
push
=
function
(
view
)
{
return
new
Context
(
view
,
this
);
};
/**
* Returns the value of the given name in this context, traversing
* up the context hierarchy if the value is absent in this context's view.
*/
Context
.
prototype
.
lookup
=
function
(
name
)
{
var
cache
=
this
.
cache
;
var
value
;
if
(
name
in
cache
)
{
value
=
cache
[
name
];
}
else
{
var
context
=
this
,
names
,
index
;
while
(
context
)
{
if
(
name
.
indexOf
(
'.'
)
>
0
)
{
value
=
context
.
view
;
names
=
name
.
split
(
'.'
);
index
=
0
;
while
(
value
!=
null
&&
index
<
names
.
length
)
value
=
value
[
names
[
index
++
]];
}
else
{
value
=
context
.
view
[
name
];
}
if
(
value
!=
null
)
break
;
context
=
context
.
parent
;
}
cache
[
name
]
=
value
;
}
if
(
isFunction
(
value
))
value
=
value
.
call
(
this
.
view
);
return
value
;
};
/**
* A Writer knows how to take a stream of tokens and render them to a
* string, given a context. It also maintains a cache of templates to
* avoid the need to parse the same template twice.
*/
function
Writer
()
{
this
.
cache
=
{};
}
/**
* Clears all cached templates in this writer.
*/
Writer
.
prototype
.
clearCache
=
function
()
{
this
.
cache
=
{};
};
/**
* Parses and caches the given `template` and returns the array of tokens
* that is generated from the parse.
*/
Writer
.
prototype
.
parse
=
function
(
template
,
tags
)
{
var
cache
=
this
.
cache
;
var
tokens
=
cache
[
template
];
if
(
tokens
==
null
)
tokens
=
cache
[
template
]
=
parseTemplate
(
template
,
tags
);
return
tokens
;
};
/**
* High-level method that is used to render the given `template` with
* the given `view`.
*
* The optional `partials` argument may be an object that contains the
* names and templates of partials that are used in the template. It may
* also be a function that is used to load partial templates on the fly
* that takes a single argument: the name of the partial.
*/
Writer
.
prototype
.
render
=
function
(
template
,
view
,
partials
)
{
var
tokens
=
this
.
parse
(
template
);
var
context
=
(
view
instanceof
Context
)
?
view
:
new
Context
(
view
);
return
this
.
renderTokens
(
tokens
,
context
,
partials
,
template
);
};
/**
* Low-level method that renders the given array of `tokens` using
* the given `context` and `partials`.
*
* Note: The `originalTemplate` is only ever used to extract the portion
* of the original template that was contained in a higher-order section.
* If the template doesn't use higher-order sections, this argument may
* be omitted.
*/
Writer
.
prototype
.
renderTokens
=
function
(
tokens
,
context
,
partials
,
originalTemplate
)
{
var
buffer
=
''
;
// This function is used to render an arbitrary template
// in the current context by higher-order sections.
var
self
=
this
;
function
subRender
(
template
)
{
return
self
.
render
(
template
,
context
,
partials
);
}
var
token
,
value
;
for
(
var
i
=
0
,
numTokens
=
tokens
.
length
;
i
<
numTokens
;
++
i
)
{
token
=
tokens
[
i
];
switch
(
token
[
0
])
{
case
'#'
:
value
=
context
.
lookup
(
token
[
1
]);
if
(
!
value
)
continue
;
if
(
isArray
(
value
))
{
for
(
var
j
=
0
,
valueLength
=
value
.
length
;
j
<
valueLength
;
++
j
)
{
buffer
+=
this
.
renderTokens
(
token
[
4
],
context
.
push
(
value
[
j
]),
partials
,
originalTemplate
);
}
}
else
if
(
typeof
value
===
'object'
||
typeof
value
===
'string'
)
{
buffer
+=
this
.
renderTokens
(
token
[
4
],
context
.
push
(
value
),
partials
,
originalTemplate
);
}
else
if
(
isFunction
(
value
))
{
if
(
typeof
originalTemplate
!==
'string'
)
throw
new
Error
(
'Cannot use higher-order sections without the original template'
);
// Extract the portion of the original template that the section contains.
value
=
value
.
call
(
context
.
view
,
originalTemplate
.
slice
(
token
[
3
],
token
[
5
]),
subRender
);
if
(
value
!=
null
)
buffer
+=
value
;
}
else
{
buffer
+=
this
.
renderTokens
(
token
[
4
],
context
,
partials
,
originalTemplate
);
}
break
;
case
'^'
:
value
=
context
.
lookup
(
token
[
1
]);
// Use JavaScript's definition of falsy. Include empty arrays.
// See https://github.com/janl/mustache.js/issues/186
if
(
!
value
||
(
isArray
(
value
)
&&
value
.
length
===
0
))
buffer
+=
this
.
renderTokens
(
token
[
4
],
context
,
partials
,
originalTemplate
);
break
;
case
'>'
:
if
(
!
partials
)
continue
;
value
=
isFunction
(
partials
)
?
partials
(
token
[
1
])
:
partials
[
token
[
1
]];
if
(
value
!=
null
)
buffer
+=
this
.
renderTokens
(
this
.
parse
(
value
),
context
,
partials
,
value
);
break
;
case
'&'
:
value
=
context
.
lookup
(
token
[
1
]);
if
(
value
!=
null
)
buffer
+=
value
;
break
;
case
'name'
:
value
=
context
.
lookup
(
token
[
1
]);
if
(
value
!=
null
)
buffer
+=
mustache
.
escape
(
value
);
break
;
case
'text'
:
buffer
+=
token
[
1
];
break
;
}
}
return
buffer
;
};
mustache
.
name
=
"mustache.js"
;
mustache
.
version
=
"0.8.1"
;
mustache
.
tags
=
[
"{{"
,
"}}"
];
// All high-level mustache.* functions use this writer.
var
defaultWriter
=
new
Writer
();
/**
* Clears all cached templates in the default writer.
*/
mustache
.
clearCache
=
function
()
{
return
defaultWriter
.
clearCache
();
};
/**
* Parses and caches the given template in the default writer and returns the
* array of tokens it contains. Doing this ahead of time avoids the need to
* parse templates on the fly as they are rendered.
*/
mustache
.
parse
=
function
(
template
,
tags
)
{
return
defaultWriter
.
parse
(
template
,
tags
);
};
/**
* Renders the `template` with the given `view` and `partials` using the
* default writer.
*/
mustache
.
render
=
function
(
template
,
view
,
partials
)
{
return
defaultWriter
.
render
(
template
,
view
,
partials
);
};
// This is here for backwards compatibility with 0.4.x.
mustache
.
to_html
=
function
(
template
,
view
,
partials
,
send
)
{
var
result
=
mustache
.
render
(
template
,
view
,
partials
);
if
(
isFunction
(
send
))
{
send
(
result
);
}
else
{
return
result
;
}
};
// Export the escaping function so that the user may override it.
// See https://github.com/janl/mustache.js/issues/244
mustache
.
escape
=
escapeHtml
;
// Export these mainly for testing, but also for advanced usage.
mustache
.
Scanner
=
Scanner
;
mustache
.
Context
=
Context
;
mustache
.
Writer
=
Writer
;
}));
crowdsourcehinter/static/html/crowdsourcehinter.html
View file @
4a2ace3a
<script
type=
"x-tmpl-mustache"
id=
"show_hint_feedback"
>
<script
type=
"x-tmpl-mustache"
id=
"show_hint_feedback"
>
<
div
class
=
"hint_value"
value
=
{{
hint
}}
>
<
div
class
=
"hint_value"
value
=
{{
hint
value
}}
>
<
div
role
=
"button"
class
=
"rate_hint"
data
-
rate
=
"upvote"
data
-
icon
=
"arrow-u"
aria
-
label
=
"upvote"
>
<
div
role
=
"button"
class
=
"rate_hint"
data
-
rate
=
"upvote"
data
-
icon
=
"arrow-u"
aria
-
label
=
"upvote"
>
<
b
>
↑
<
/b
>
<
b
>
↑
<
/b
>
<
/div
>
<
/div
>
...
@@ -13,6 +13,13 @@
...
@@ -13,6 +13,13 @@
<
/div
>
<
/div
>
<
/div
>
<
/div
>
</script>
</script>
<script
type=
"text/template"
id=
"testing"
>
<
div
>
{{
testone
}}
{{
testtwo
}}
<
/div
>
</script>
<div
class=
"crowdsourcehinter_block"
>
<!--most stuff just for testing purposes-->
<div
class=
"crowdsourcehinter_block"
>
<!--most stuff just for testing purposes-->
<p>
<span
class=
'HintsToUse'
></span>
<p>
<span
class=
'HintsToUse'
></span>
...
@@ -28,7 +35,21 @@
...
@@ -28,7 +35,21 @@
<div
class=
"feedback"
>
<div
class=
"feedback"
>
<script
type=
"x-tmpl-mustache"
id=
"show_hint_feedback"
>
<
div
class
=
"hint_value"
value
=
{{
hintvalue
}}
>
<
div
role
=
"button"
class
=
"rate_hint"
data
-
rate
=
"upvote"
data
-
icon
=
"arrow-u"
aria
-
label
=
"upvote"
>
<
b
>
↑
<
/b
>
<
/div
>
<
div
role
=
"button"
class
=
"rate_hint"
data
-
rate
=
"flag"
data
-
icon
=
"flag"
aria
-
label
=
"flag"
>
<
b
>!<
/b
>
<
/div
>
<
div
class
=
"rating"
>
{{
rating
}}
<
/div
>
<
div
class
=
"hint"
>
{{
hint
}}
<
/div
>
<
div
role
=
"button"
class
=
"rate_hint"
data
-
rate
=
"downvote"
aria
-
label
=
"downvote"
>
<
b
>
↓
<
/b
>
<
/div
>
<
/div
>
</script>
</div>
</div>
<p>
<p>
...
...
crowdsourcehinter/static/js/src/crowdsourcehinter.js
View file @
4a2ace3a
...
@@ -17,6 +17,7 @@ function CrowdsourceHinter(runtime, element){
...
@@ -17,6 +17,7 @@ function CrowdsourceHinter(runtime, element){
//read the data from the problem_graded event here
//read the data from the problem_graded event here
function
get_event_data
(
event_type
,
data
,
element
){
function
get_event_data
(
event_type
,
data
,
element
){
console
.
log
(
"is this still changing"
);
onStudentSubmission
(
data
);
onStudentSubmission
(
data
);
}
}
Logger
.
listen
(
'problem_graded'
,
null
,
get_event_data
);
Logger
.
listen
(
'problem_graded'
,
null
,
get_event_data
);
...
@@ -72,12 +73,18 @@ function CrowdsourceHinter(runtime, element){
...
@@ -72,12 +73,18 @@ function CrowdsourceHinter(runtime, element){
//This appended div includes upvote/downvote/flagging buttons, the hint, and the hint's rating
//This appended div includes upvote/downvote/flagging buttons, the hint, and the hint's rating
$
(
".student_answer"
,
element
).
each
(
function
(){
$
(
".student_answer"
,
element
).
each
(
function
(){
if
(
$
(
this
).
find
(
"span"
).
text
()
==
result
.
student_answer
){
if
(
$
(
this
).
find
(
"span"
).
text
()
==
result
.
student_answer
){
var
template
=
$
(
'#show_hint_feedback'
).
html
();
/*var template = $('#show_hint_feedback').html();
Mustache.parse(template);
var data = {
var data = {
"hint"
:
result
.
hint
,
hintvalue: "result.hint",
"rating"
:
result
.
rating
hint: "result.hint",
rating: "result.rating"
};
};
$
(
this
).
append
(
Mustache
.
to_html
(
template
,
data
));
$(this).append(Mustache.render(template, data)); */
var
template
=
$
(
'#testing'
).
html
();
var
data
=
{
testone
:
"testing"
,
testtwo
:
"TESTING"
};
var
html
=
Mustache
.
to_html
(
template
,
data
);
$
(
this
).
html
(
html
);
/**$(this).append(unescape("<div class=\"hint_value\" value = \"" + result.hint + "\">" +
/**$(this).append(unescape("<div class=\"hint_value\" value = \"" + result.hint + "\">" +
"<div role=\"button\"class=\"rate_hint\"data-rate=\"upvote\" data-icon=\"arrow-u\" aria-label=\"upvote\"><b>↑</b></div>" +
"<div role=\"button\"class=\"rate_hint\"data-rate=\"upvote\" data-icon=\"arrow-u\" aria-label=\"upvote\"><b>↑</b></div>" +
"<div role=\"button\" class=\"rate_hint\" data-rate=\"flag\" data-icon=\"flag\" aria-label=\"flag\"><b>!</b></div>"+
"<div role=\"button\" class=\"rate_hint\" data-rate=\"flag\" data-icon=\"flag\" aria-label=\"flag\"><b>!</b></div>"+
...
...
crowdsourcehinter_xblock.egg-info/SOURCES.txt
View file @
4a2ace3a
...
@@ -3,23 +3,13 @@ crowdsourcehinter/__init__.py
...
@@ -3,23 +3,13 @@ crowdsourcehinter/__init__.py
crowdsourcehinter/crowdsourcehinter.py
crowdsourcehinter/crowdsourcehinter.py
crowdsourcehinter/static/README.txt
crowdsourcehinter/static/README.txt
crowdsourcehinter/static/css/crowdsourcehinter.css
crowdsourcehinter/static/css/crowdsourcehinter.css
crowdsourcehinter/static/css/crowdsourcehinter.css~
crowdsourcehinter/static/css/crowdxblock.css~
crowdsourcehinter/static/html/crowdsourcehinter.html
crowdsourcehinter/static/html/crowdsourcehinter.html
crowdsourcehinter/static/html/crowdsourcehinter.html~
crowdsourcehinter/static/html/crowdsourcehinterstudio.html
crowdsourcehinter/static/html/crowdsourcehinterstudio.html
crowdsourcehinter/static/html/crowdsourcehinterstudio.html~
crowdsourcehinter/static/html/crowdxblock.html~
crowdsourcehinter/static/js/src/crowdsourcehinter.js
crowdsourcehinter/static/js/src/crowdsourcehinter.js
crowdsourcehinter/static/js/src/crowdsourcehinter.js~
crowdsourcehinter/static/js/src/crowdsourcehinter.js~
crowdsourcehinter/static/js/src/crowdxblock.js~
crowdsourcehinter_xblock.egg-info/PKG-INFO
crowdsourcehinter_xblock.egg-info/PKG-INFO
crowdsourcehinter_xblock.egg-info/PKG-INFO~
crowdsourcehinter_xblock.egg-info/SOURCES.txt
crowdsourcehinter_xblock.egg-info/SOURCES.txt
crowdsourcehinter_xblock.egg-info/SOURCES.txt~
crowdsourcehinter_xblock.egg-info/dependency_links.txt
crowdsourcehinter_xblock.egg-info/dependency_links.txt
crowdsourcehinter_xblock.egg-info/entry_points.txt
crowdsourcehinter_xblock.egg-info/entry_points.txt
crowdsourcehinter_xblock.egg-info/entry_points.txt~
crowdsourcehinter_xblock.egg-info/requires.txt
crowdsourcehinter_xblock.egg-info/requires.txt
crowdsourcehinter_xblock.egg-info/top_level.txt
crowdsourcehinter_xblock.egg-info/top_level.txt
\ No newline at end of file
crowdsourcehinter_xblock.egg-info/top_level.txt~
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment