jspsych 6.2.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/README.md +43 -29
  2. package/css/jspsych.css +39 -39
  3. package/dist/JsPsych.d.ts +112 -0
  4. package/dist/TimelineNode.d.ts +34 -0
  5. package/dist/index.browser.js +3164 -0
  6. package/dist/index.browser.js.map +1 -0
  7. package/dist/index.browser.min.js +2 -0
  8. package/dist/index.browser.min.js.map +1 -0
  9. package/dist/index.cjs +3158 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.ts +11 -0
  12. package/dist/index.js +3152 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/migration.d.ts +3 -0
  15. package/dist/modules/data/DataCollection.d.ts +45 -0
  16. package/dist/modules/data/DataColumn.d.ts +15 -0
  17. package/dist/modules/data/index.d.ts +25 -0
  18. package/dist/modules/data/utils.d.ts +3 -0
  19. package/dist/modules/extensions.d.ts +22 -0
  20. package/dist/modules/plugin-api/HardwareAPI.d.ts +15 -0
  21. package/dist/modules/plugin-api/KeyboardListenerAPI.d.ts +34 -0
  22. package/dist/modules/plugin-api/MediaAPI.d.ts +27 -0
  23. package/dist/modules/plugin-api/SimulationAPI.d.ts +41 -0
  24. package/dist/modules/plugin-api/TimeoutAPI.d.ts +5 -0
  25. package/dist/modules/plugin-api/index.d.ts +8 -0
  26. package/dist/modules/plugins.d.ts +129 -0
  27. package/dist/modules/randomization.d.ts +35 -0
  28. package/dist/modules/turk.d.ts +40 -0
  29. package/dist/modules/utils.d.ts +7 -0
  30. package/package.json +32 -15
  31. package/src/JsPsych.ts +884 -0
  32. package/src/TimelineNode.ts +536 -0
  33. package/src/index.ts +71 -0
  34. package/src/migration.ts +37 -0
  35. package/src/modules/data/DataCollection.ts +198 -0
  36. package/src/modules/data/DataColumn.ts +86 -0
  37. package/src/modules/data/index.ts +174 -0
  38. package/src/modules/data/utils.ts +75 -0
  39. package/src/modules/extensions.ts +23 -0
  40. package/src/modules/plugin-api/HardwareAPI.ts +32 -0
  41. package/src/modules/plugin-api/KeyboardListenerAPI.ts +165 -0
  42. package/src/modules/plugin-api/MediaAPI.ts +337 -0
  43. package/src/modules/plugin-api/SimulationAPI.ts +181 -0
  44. package/src/modules/plugin-api/TimeoutAPI.ts +16 -0
  45. package/src/modules/plugin-api/index.ts +28 -0
  46. package/src/modules/plugins.ts +158 -0
  47. package/src/modules/randomization.ts +327 -0
  48. package/src/modules/turk.ts +99 -0
  49. package/src/modules/utils.ts +30 -0
  50. package/.github/workflows/jest.yml +0 -20
  51. package/code-of-conduct.md +0 -56
  52. package/contributors.md +0 -61
  53. package/docs/CNAME +0 -1
  54. package/docs/about/about.md +0 -18
  55. package/docs/about/contributing.md +0 -43
  56. package/docs/about/license.md +0 -25
  57. package/docs/about/support.md +0 -7
  58. package/docs/core_library/jspsych-core.md +0 -661
  59. package/docs/core_library/jspsych-data.md +0 -589
  60. package/docs/core_library/jspsych-pluginAPI.md +0 -510
  61. package/docs/core_library/jspsych-randomization.md +0 -397
  62. package/docs/core_library/jspsych-turk.md +0 -102
  63. package/docs/img/blue.png +0 -0
  64. package/docs/img/folder-setup.png +0 -0
  65. package/docs/img/folder-with-html.png +0 -0
  66. package/docs/img/githubreleases.jpg +0 -0
  67. package/docs/img/jspsych-favicon.png +0 -0
  68. package/docs/img/jspsych-logo-no-text-mono.svg +0 -493
  69. package/docs/img/jspsych-logo.jpg +0 -0
  70. package/docs/img/orange.png +0 -0
  71. package/docs/img/palmer_stim.png +0 -0
  72. package/docs/img/progress_bar.png +0 -0
  73. package/docs/img/visual_search_example.jpg +0 -0
  74. package/docs/index.md +0 -9
  75. package/docs/overview/browser-device-support.md +0 -35
  76. package/docs/overview/callbacks.md +0 -140
  77. package/docs/overview/data.md +0 -281
  78. package/docs/overview/exclude-browser.md +0 -32
  79. package/docs/overview/experiment-options.md +0 -121
  80. package/docs/overview/fullscreen.md +0 -36
  81. package/docs/overview/media-preloading.md +0 -91
  82. package/docs/overview/mturk.md +0 -77
  83. package/docs/overview/progress-bar.md +0 -110
  84. package/docs/overview/record-browser-interactions.md +0 -23
  85. package/docs/overview/running-experiments.md +0 -95
  86. package/docs/overview/timeline.md +0 -387
  87. package/docs/overview/trial.md +0 -142
  88. package/docs/plugins/creating-a-plugin.md +0 -79
  89. package/docs/plugins/jspsych-animation.md +0 -40
  90. package/docs/plugins/jspsych-audio-button-response.md +0 -60
  91. package/docs/plugins/jspsych-audio-keyboard-response.md +0 -58
  92. package/docs/plugins/jspsych-audio-slider-response.md +0 -53
  93. package/docs/plugins/jspsych-call-function.md +0 -81
  94. package/docs/plugins/jspsych-canvas-button-response.md +0 -66
  95. package/docs/plugins/jspsych-canvas-keyboard-response.md +0 -68
  96. package/docs/plugins/jspsych-canvas-slider-response.md +0 -89
  97. package/docs/plugins/jspsych-categorize-animation.md +0 -60
  98. package/docs/plugins/jspsych-categorize-html.md +0 -52
  99. package/docs/plugins/jspsych-categorize-image.md +0 -53
  100. package/docs/plugins/jspsych-cloze.md +0 -45
  101. package/docs/plugins/jspsych-external-html.md +0 -70
  102. package/docs/plugins/jspsych-free-sort.md +0 -55
  103. package/docs/plugins/jspsych-fullscreen.md +0 -57
  104. package/docs/plugins/jspsych-html-button-response.md +0 -42
  105. package/docs/plugins/jspsych-html-keyboard-response.md +0 -51
  106. package/docs/plugins/jspsych-html-slider-response.md +0 -45
  107. package/docs/plugins/jspsych-iat-html.md +0 -64
  108. package/docs/plugins/jspsych-iat-image.md +0 -64
  109. package/docs/plugins/jspsych-image-button-response.md +0 -46
  110. package/docs/plugins/jspsych-image-keyboard-response.md +0 -57
  111. package/docs/plugins/jspsych-image-slider-response.md +0 -52
  112. package/docs/plugins/jspsych-instructions.md +0 -58
  113. package/docs/plugins/jspsych-maxdiff.md +0 -42
  114. package/docs/plugins/jspsych-rdk.md +0 -119
  115. package/docs/plugins/jspsych-reconstruction.md +0 -48
  116. package/docs/plugins/jspsych-resize.md +0 -39
  117. package/docs/plugins/jspsych-same-different-html.md +0 -53
  118. package/docs/plugins/jspsych-same-different-image.md +0 -66
  119. package/docs/plugins/jspsych-serial-reaction-time-mouse.md +0 -50
  120. package/docs/plugins/jspsych-serial-reaction-time.md +0 -57
  121. package/docs/plugins/jspsych-survey-html-form.md +0 -50
  122. package/docs/plugins/jspsych-survey-likert.md +0 -70
  123. package/docs/plugins/jspsych-survey-multi-choice.md +0 -48
  124. package/docs/plugins/jspsych-survey-multi-select.md +0 -53
  125. package/docs/plugins/jspsych-survey-text.md +0 -63
  126. package/docs/plugins/jspsych-video-button-response.md +0 -52
  127. package/docs/plugins/jspsych-video-keyboard-response.md +0 -48
  128. package/docs/plugins/jspsych-video-slider-response.md +0 -58
  129. package/docs/plugins/jspsych-visual-search-circle.md +0 -52
  130. package/docs/plugins/jspsych-vsl-animate-occlusion.md +0 -55
  131. package/docs/plugins/jspsych-vsl-grid-scene.md +0 -62
  132. package/docs/plugins/overview.md +0 -111
  133. package/docs/tutorials/hello-world.md +0 -144
  134. package/docs/tutorials/rt-task.md +0 -1107
  135. package/examples/add-to-end-of-timeline.html +0 -32
  136. package/examples/conditional-and-loop-functions.html +0 -63
  137. package/examples/css/jquery-ui.css +0 -1225
  138. package/examples/data-add-properties.html +0 -40
  139. package/examples/data-as-function.html +0 -36
  140. package/examples/data-from-timeline.html +0 -45
  141. package/examples/data-from-url.html +0 -21
  142. package/examples/demo-flanker.html +0 -108
  143. package/examples/demo-simple-rt-task.html +0 -104
  144. package/examples/demos/demo_1.html +0 -29
  145. package/examples/demos/demo_2.html +0 -43
  146. package/examples/demos/demo_3.html +0 -58
  147. package/examples/display-element-to-embed-experiment.html +0 -73
  148. package/examples/end-active-node.html +0 -52
  149. package/examples/end-experiment.html +0 -43
  150. package/examples/exclusions.html +0 -32
  151. package/examples/external_html/simple_consent.html +0 -4
  152. package/examples/img/1.gif +0 -0
  153. package/examples/img/10.gif +0 -0
  154. package/examples/img/11.gif +0 -0
  155. package/examples/img/12.gif +0 -0
  156. package/examples/img/2.gif +0 -0
  157. package/examples/img/3.gif +0 -0
  158. package/examples/img/4.gif +0 -0
  159. package/examples/img/5.gif +0 -0
  160. package/examples/img/6.gif +0 -0
  161. package/examples/img/7.gif +0 -0
  162. package/examples/img/8.gif +0 -0
  163. package/examples/img/9.gif +0 -0
  164. package/examples/img/age/of1.jpg +0 -0
  165. package/examples/img/age/of2.jpg +0 -0
  166. package/examples/img/age/of3.jpg +0 -0
  167. package/examples/img/age/om1.jpg +0 -0
  168. package/examples/img/age/om2.jpg +0 -0
  169. package/examples/img/age/om3.jpg +0 -0
  170. package/examples/img/age/yf1.jpg +0 -0
  171. package/examples/img/age/yf4.jpg +0 -0
  172. package/examples/img/age/yf5.jpg +0 -0
  173. package/examples/img/age/ym2.jpg +0 -0
  174. package/examples/img/age/ym3.jpg +0 -0
  175. package/examples/img/age/ym5.jpg +0 -0
  176. package/examples/img/backwardN.gif +0 -0
  177. package/examples/img/blue.png +0 -0
  178. package/examples/img/con1.png +0 -0
  179. package/examples/img/con2.png +0 -0
  180. package/examples/img/fixation.gif +0 -0
  181. package/examples/img/happy_face_1.jpg +0 -0
  182. package/examples/img/happy_face_2.jpg +0 -0
  183. package/examples/img/happy_face_3.jpg +0 -0
  184. package/examples/img/happy_face_4.jpg +0 -0
  185. package/examples/img/inc1.png +0 -0
  186. package/examples/img/inc2.png +0 -0
  187. package/examples/img/normalN.gif +0 -0
  188. package/examples/img/orange.png +0 -0
  189. package/examples/img/redX.png +0 -0
  190. package/examples/img/ribbon.jpg +0 -0
  191. package/examples/img/sad_face_1.jpg +0 -0
  192. package/examples/img/sad_face_2.jpg +0 -0
  193. package/examples/img/sad_face_3.jpg +0 -0
  194. package/examples/img/sad_face_4.jpg +0 -0
  195. package/examples/js/snap.svg-min.js +0 -21
  196. package/examples/jspsych-RDK.html +0 -58
  197. package/examples/jspsych-animation.html +0 -33
  198. package/examples/jspsych-audio-button-response.html +0 -52
  199. package/examples/jspsych-audio-keyboard-response.html +0 -62
  200. package/examples/jspsych-audio-slider-response.html +0 -55
  201. package/examples/jspsych-call-function.html +0 -32
  202. package/examples/jspsych-canvas-button-response.html +0 -95
  203. package/examples/jspsych-canvas-keyboard-response.html +0 -78
  204. package/examples/jspsych-canvas-slider-response.html +0 -67
  205. package/examples/jspsych-categorize-animation.html +0 -46
  206. package/examples/jspsych-categorize-html.html +0 -38
  207. package/examples/jspsych-categorize-image.html +0 -38
  208. package/examples/jspsych-cloze.html +0 -42
  209. package/examples/jspsych-free-sort.html +0 -97
  210. package/examples/jspsych-fullscreen.html +0 -44
  211. package/examples/jspsych-html-button-response.html +0 -46
  212. package/examples/jspsych-html-keyboard-response.html +0 -42
  213. package/examples/jspsych-html-slider-response.html +0 -53
  214. package/examples/jspsych-iat.html +0 -510
  215. package/examples/jspsych-image-button-response.html +0 -84
  216. package/examples/jspsych-image-keyboard-response.html +0 -78
  217. package/examples/jspsych-image-slider-response.html +0 -76
  218. package/examples/jspsych-instructions.html +0 -37
  219. package/examples/jspsych-maxdiff.html +0 -33
  220. package/examples/jspsych-reconstruction.html +0 -43
  221. package/examples/jspsych-resize.html +0 -34
  222. package/examples/jspsych-same-different-html.html +0 -28
  223. package/examples/jspsych-same-different-image.html +0 -33
  224. package/examples/jspsych-serial-reaction-time-mouse.html +0 -98
  225. package/examples/jspsych-serial-reaction-time.html +0 -54
  226. package/examples/jspsych-survey-html-form.html +0 -33
  227. package/examples/jspsych-survey-likert.html +0 -42
  228. package/examples/jspsych-survey-multi-choice.html +0 -40
  229. package/examples/jspsych-survey-multi-select.html +0 -42
  230. package/examples/jspsych-survey-text.html +0 -34
  231. package/examples/jspsych-video-button-response.html +0 -57
  232. package/examples/jspsych-video-keyboard-response.html +0 -53
  233. package/examples/jspsych-video-slider-response.html +0 -55
  234. package/examples/jspsych-visual-search-circle.html +0 -58
  235. package/examples/jspsych-vsl-animate-occlusion.html +0 -29
  236. package/examples/jspsych-vsl-grid-scene.html +0 -41
  237. package/examples/lexical-decision.html +0 -132
  238. package/examples/manual-preloading.html +0 -53
  239. package/examples/pause-unpause.html +0 -33
  240. package/examples/progress-bar.html +0 -62
  241. package/examples/sound/hammer.mp3 +0 -0
  242. package/examples/sound/sound.mp3 +0 -0
  243. package/examples/sound/speech_blue.mp3 +0 -0
  244. package/examples/sound/speech_green.mp3 +0 -0
  245. package/examples/sound/speech_joke.mp3 +0 -0
  246. package/examples/sound/speech_red.mp3 +0 -0
  247. package/examples/sound/tone.mp3 +0 -0
  248. package/examples/timeline-variables-sampling.html +0 -50
  249. package/examples/timeline-variables.html +0 -55
  250. package/examples/video/sample_video.mp4 +0 -0
  251. package/jspsych.js +0 -2796
  252. package/license.txt +0 -21
  253. package/mkdocs.yml +0 -104
  254. package/plugins/jspsych-animation.js +0 -189
  255. package/plugins/jspsych-audio-button-response.js +0 -247
  256. package/plugins/jspsych-audio-keyboard-response.js +0 -204
  257. package/plugins/jspsych-audio-slider-response.js +0 -262
  258. package/plugins/jspsych-call-function.js +0 -58
  259. package/plugins/jspsych-canvas-button-response.js +0 -199
  260. package/plugins/jspsych-canvas-keyboard-response.js +0 -155
  261. package/plugins/jspsych-canvas-slider-response.js +0 -207
  262. package/plugins/jspsych-categorize-animation.js +0 -266
  263. package/plugins/jspsych-categorize-html.js +0 -220
  264. package/plugins/jspsych-categorize-image.js +0 -222
  265. package/plugins/jspsych-cloze.js +0 -112
  266. package/plugins/jspsych-external-html.js +0 -112
  267. package/plugins/jspsych-free-sort.js +0 -444
  268. package/plugins/jspsych-fullscreen.js +0 -104
  269. package/plugins/jspsych-html-button-response.js +0 -188
  270. package/plugins/jspsych-html-keyboard-response.js +0 -149
  271. package/plugins/jspsych-html-slider-response.js +0 -202
  272. package/plugins/jspsych-iat-html.js +0 -284
  273. package/plugins/jspsych-iat-image.js +0 -286
  274. package/plugins/jspsych-image-button-response.js +0 -311
  275. package/plugins/jspsych-image-keyboard-response.js +0 -247
  276. package/plugins/jspsych-image-slider-response.js +0 -353
  277. package/plugins/jspsych-instructions.js +0 -237
  278. package/plugins/jspsych-maxdiff.js +0 -174
  279. package/plugins/jspsych-rdk.js +0 -1373
  280. package/plugins/jspsych-reconstruction.js +0 -134
  281. package/plugins/jspsych-resize.js +0 -166
  282. package/plugins/jspsych-same-different-html.js +0 -168
  283. package/plugins/jspsych-same-different-image.js +0 -169
  284. package/plugins/jspsych-serial-reaction-time-mouse.js +0 -213
  285. package/plugins/jspsych-serial-reaction-time.js +0 -247
  286. package/plugins/jspsych-survey-html-form.js +0 -171
  287. package/plugins/jspsych-survey-likert.js +0 -195
  288. package/plugins/jspsych-survey-multi-choice.js +0 -208
  289. package/plugins/jspsych-survey-multi-select.js +0 -232
  290. package/plugins/jspsych-survey-text.js +0 -185
  291. package/plugins/jspsych-video-button-response.js +0 -320
  292. package/plugins/jspsych-video-keyboard-response.js +0 -279
  293. package/plugins/jspsych-video-slider-response.js +0 -351
  294. package/plugins/jspsych-visual-search-circle.js +0 -259
  295. package/plugins/jspsych-vsl-animate-occlusion.js +0 -196
  296. package/plugins/jspsych-vsl-grid-scene.js +0 -103
  297. package/plugins/template/jspsych-plugin-template.js +0 -35
  298. package/tests/README.md +0 -7
  299. package/tests/jsPsych/default-iti.test.js +0 -51
  300. package/tests/jsPsych/default-parameters.test.js +0 -58
  301. package/tests/jsPsych/endexperiment.test.js +0 -49
  302. package/tests/jsPsych/events.test.js +0 -369
  303. package/tests/jsPsych/init.test.js +0 -48
  304. package/tests/jsPsych/loads.test.js +0 -7
  305. package/tests/jsPsych/min-rt.test.js +0 -58
  306. package/tests/jsPsych/progressbar.test.js +0 -202
  307. package/tests/jsPsych/timeline-variables.test.js +0 -254
  308. package/tests/jsPsych/timelines.test.js +0 -498
  309. package/tests/jsPsych.data/datacollection.test.js +0 -116
  310. package/tests/jsPsych.data/datacolumn.test.js +0 -50
  311. package/tests/jsPsych.data/datamodule.test.js +0 -152
  312. package/tests/jsPsych.data/dataparameter.test.js +0 -251
  313. package/tests/jsPsych.data/interactions.test.js +0 -109
  314. package/tests/jsPsych.pluginAPI/pluginapi.test.js +0 -144
  315. package/tests/jsPsych.randomization/randomziation.test.js +0 -27
  316. package/tests/jsPsych.utils/utils.test.js +0 -58
  317. package/tests/media/blue.png +0 -0
  318. package/tests/media/orange.png +0 -0
  319. package/tests/media/sample_video.mp4 +0 -0
  320. package/tests/media/sound.mp3 +0 -0
  321. package/tests/plugins/plugin-animation.test.js +0 -35
  322. package/tests/plugins/plugin-audio-button-response.test.js +0 -15
  323. package/tests/plugins/plugin-audio-keyboard-response.test.js +0 -15
  324. package/tests/plugins/plugin-audio-slider-response.test.js +0 -15
  325. package/tests/plugins/plugin-call-function.test.js +0 -49
  326. package/tests/plugins/plugin-categorize-animation.test.js +0 -274
  327. package/tests/plugins/plugin-categorize-html.test.js +0 -17
  328. package/tests/plugins/plugin-categorize-image.test.js +0 -17
  329. package/tests/plugins/plugin-cloze.test.js +0 -140
  330. package/tests/plugins/plugin-free-sort.test.js +0 -112
  331. package/tests/plugins/plugin-fullscreen.test.js +0 -41
  332. package/tests/plugins/plugin-html-button-response.test.js +0 -161
  333. package/tests/plugins/plugin-html-keyboard-response.test.js +0 -139
  334. package/tests/plugins/plugin-html-slider-response.test.js +0 -155
  335. package/tests/plugins/plugin-iat-html.test.js +0 -328
  336. package/tests/plugins/plugin-iat-image.test.js +0 -308
  337. package/tests/plugins/plugin-image-button-response.test.js +0 -183
  338. package/tests/plugins/plugin-image-keyboard-response.test.js +0 -154
  339. package/tests/plugins/plugin-image-slider-response.test.js +0 -183
  340. package/tests/plugins/plugin-instructions.test.js +0 -66
  341. package/tests/plugins/plugin-maxdiff.test.js +0 -39
  342. package/tests/plugins/plugin-rdk.test.js +0 -17
  343. package/tests/plugins/plugin-reconstruction.test.js +0 -16
  344. package/tests/plugins/plugin-resize.test.js +0 -16
  345. package/tests/plugins/plugin-same-different-html.test.js +0 -17
  346. package/tests/plugins/plugin-same-different-image.test.js +0 -17
  347. package/tests/plugins/plugin-serial-reaction-time-mouse.test.js +0 -42
  348. package/tests/plugins/plugin-serial-reaction-time.test.js +0 -69
  349. package/tests/plugins/plugin-survey-html-form.test.js +0 -44
  350. package/tests/plugins/plugin-survey-likert.test.js +0 -48
  351. package/tests/plugins/plugin-survey-multi-choice.test.js +0 -48
  352. package/tests/plugins/plugin-survey-multi-select.test.js +0 -72
  353. package/tests/plugins/plugin-survey-text.test.js +0 -115
  354. package/tests/plugins/plugin-video-button-response.test.js +0 -35
  355. package/tests/plugins/plugin-video-keyboard-response.test.js +0 -35
  356. package/tests/plugins/plugin-video-slider-response.test.js +0 -34
  357. package/tests/plugins/plugin-visual-search-circle.test.js +0 -16
  358. package/tests/plugins/plugin-vsl-animate-occlusion.test.js +0 -16
  359. package/tests/plugins/plugin-vsl-grid-scene.test.js +0 -16
  360. package/tests/testing-utils.js +0 -13
@@ -1,112 +0,0 @@
1
- /**
2
- * jspsych-cloze
3
- * Philipp Sprengholz
4
- *
5
- * Plugin for displaying a cloze test and checking participants answers against a correct solution.
6
- *
7
- * documentation: docs.jspsych.org
8
- **/
9
-
10
- jsPsych.plugins['cloze'] = (function () {
11
-
12
- var plugin = {};
13
-
14
- plugin.info = {
15
- name: 'cloze',
16
- description: '',
17
- parameters: {
18
- text: {
19
- type: jsPsych.plugins.parameterType.STRING,
20
- pretty_name: 'Cloze text',
21
- default: undefined,
22
- description: 'The cloze text to be displayed. Blanks are indicated by %% signs and automatically replaced by input fields. If there is a correct answer you want the system to check against, it must be typed between the two percentage signs (i.e. %solution%).'
23
- },
24
- button_text: {
25
- type: jsPsych.plugins.parameterType.STRING,
26
- pretty_name: 'Button text',
27
- default: 'OK',
28
- description: 'Text of the button participants have to press for finishing the cloze test.'
29
- },
30
- check_answers: {
31
- type: jsPsych.plugins.parameterType.BOOL,
32
- pretty_name: 'Check answers',
33
- default: false,
34
- description: 'Boolean value indicating if the answers given by participants should be compared against a correct solution given in the text (between % signs) after the button was clicked.'
35
- },
36
- mistake_fn: {
37
- type: jsPsych.plugins.parameterType.FUNCTION,
38
- pretty_name: 'Mistake function',
39
- default: function () {},
40
- description: 'Function called if check_answers is set to TRUE and there is a difference between the participants answers and the correct solution provided in the text.'
41
- }
42
- }
43
- };
44
-
45
- plugin.trial = function (display_element, trial) {
46
-
47
- var html = '<div class="cloze">';
48
- var elements = trial.text.split('%');
49
- var solutions = [];
50
-
51
- for (var i=0; i<elements.length; i++)
52
- {
53
- if (i%2 === 0)
54
- {
55
- html += elements[i];
56
- }
57
- else
58
- {
59
- solutions.push(elements[i].trim());
60
- html += '<input type="text" id="input'+(solutions.length-1)+'" value="">';
61
- }
62
- }
63
- html += '</div>';
64
-
65
- display_element.innerHTML = html;
66
-
67
- var check = function() {
68
-
69
- var answers = [];
70
- var answers_correct = true;
71
-
72
- for (var i=0; i<solutions.length; i++)
73
- {
74
- var field = document.getElementById('input'+i);
75
- answers.push(field.value.trim());
76
-
77
- if (trial.check_answers)
78
- {
79
- if (answers[i] !== solutions[i])
80
- {
81
- field.style.color = 'red';
82
- answers_correct = false;
83
- }
84
- else
85
- {
86
- field.style.color = 'black';
87
- }
88
- }
89
- }
90
-
91
- if (!trial.check_answers || (trial.check_answers && answers_correct))
92
- {
93
- var trial_data = {
94
- 'answers' : answers
95
- };
96
-
97
- display_element.innerHTML = '';
98
- jsPsych.finishTrial(trial_data);
99
- }
100
- else
101
- {
102
- trial.mistake_fn();
103
- }
104
-
105
- };
106
-
107
- display_element.innerHTML += '<br><button class="jspsych-html-button-response-button" type="button" id="finish_cloze_button">'+trial.button_text+'</button>';
108
- display_element.querySelector('#finish_cloze_button').addEventListener('click', check);
109
- };
110
-
111
- return plugin;
112
- })();
@@ -1,112 +0,0 @@
1
- /** (July 2012, Erik Weitnauer)
2
- The html-plugin will load and display an external html pages. To proceed to the next, the
3
- user might either press a button on the page or a specific key. Afterwards, the page get hidden and
4
- the plugin will wait of a specified time before it proceeds.
5
-
6
- documentation: docs.jspsych.org
7
- */
8
-
9
- jsPsych.plugins['external-html'] = (function() {
10
-
11
- var plugin = {};
12
-
13
- plugin.info = {
14
- name: 'external-html',
15
- description: '',
16
- parameters: {
17
- url: {
18
- type: jsPsych.plugins.parameterType.STRING,
19
- pretty_name: 'URL',
20
- default: undefined,
21
- description: 'The url of the external html page'
22
- },
23
- cont_key: {
24
- type: jsPsych.plugins.parameterType.KEYCODE,
25
- pretty_name: 'Continue key',
26
- default: null,
27
- description: 'The key to continue to the next page.'
28
- },
29
- cont_btn: {
30
- type: jsPsych.plugins.parameterType.STRING,
31
- pretty_name: 'Continue button',
32
- default: null,
33
- description: 'The button to continue to the next page.'
34
- },
35
- check_fn: {
36
- type: jsPsych.plugins.parameterType.FUNCTION,
37
- pretty_name: 'Check function',
38
- default: function() { return true; },
39
- description: ''
40
- },
41
- force_refresh: {
42
- type: jsPsych.plugins.parameterType.BOOL,
43
- pretty_name: 'Force refresh',
44
- default: false,
45
- description: 'Refresh page.'
46
- },
47
- // if execute_Script == true, then all javascript code on the external page
48
- // will be executed in the plugin site within your jsPsych test
49
- execute_script: {
50
- type: jsPsych.plugins.parameterType.BOOL,
51
- pretty_name: 'Execute scripts',
52
- default: false,
53
- description: 'If true, JS scripts on the external html file will be executed.'
54
- }
55
- }
56
- }
57
-
58
- plugin.trial = function(display_element, trial) {
59
-
60
- var url = trial.url;
61
- if (trial.force_refresh) {
62
- url = trial.url + "?t=" + performance.now();
63
- }
64
-
65
- load(display_element, url, function() {
66
- var t0 = performance.now();
67
- var finish = function() {
68
- if (trial.check_fn && !trial.check_fn(display_element)) { return };
69
- if (trial.cont_key) { display_element.removeEventListener('keydown', key_listener); }
70
- var trial_data = {
71
- rt: performance.now() - t0,
72
- url: trial.url
73
- };
74
- display_element.innerHTML = '';
75
- jsPsych.finishTrial(trial_data);
76
- };
77
-
78
- // by default, scripts on the external page are not executed with XMLHttpRequest().
79
- // To activate their content through DOM manipulation, we need to relocate all script tags
80
- if (trial.execute_script) {
81
- for (const scriptElement of display_element.getElementsByTagName("script")) {
82
- const relocatedScript = document.createElement("script");
83
- relocatedScript.text = scriptElement.text;
84
- scriptElement.parentNode.replaceChild(relocatedScript, scriptElement);
85
- };
86
- }
87
-
88
- if (trial.cont_btn) { display_element.querySelector('#'+trial.cont_btn).addEventListener('click', finish); }
89
- if (trial.cont_key) {
90
- var key_listener = function(e) {
91
- if (e.which == trial.cont_key) finish();
92
- };
93
- display_element.addEventListener('keydown', key_listener);
94
- }
95
- });
96
- };
97
-
98
- // helper to load via XMLHttpRequest
99
- function load(element, file, callback){
100
- var xmlhttp = new XMLHttpRequest();
101
- xmlhttp.open("GET", file, true);
102
- xmlhttp.onload = function(){
103
- if(xmlhttp.status == 200 || xmlhttp.status == 0){ //Check if loaded
104
- element.innerHTML = xmlhttp.responseText;
105
- callback();
106
- }
107
- }
108
- xmlhttp.send();
109
- }
110
-
111
- return plugin;
112
- })();
@@ -1,444 +0,0 @@
1
- /**
2
- * jspsych-free-sort
3
- * plugin for drag-and-drop sorting of a collection of images
4
- * Josh de Leeuw
5
- *
6
- * documentation: docs.jspsych.org
7
- */
8
-
9
-
10
- jsPsych.plugins['free-sort'] = (function() {
11
-
12
- var plugin = {};
13
-
14
- jsPsych.pluginAPI.registerPreload('free-sort', 'stimuli', 'image');
15
-
16
- plugin.info = {
17
- name: 'free-sort',
18
- description: '',
19
- parameters: {
20
- stimuli: {
21
- type: jsPsych.plugins.parameterType.STRING,
22
- pretty_name: 'Stimuli',
23
- default: undefined,
24
- array: true,
25
- description: 'items to be displayed.'
26
- },
27
- stim_height: {
28
- type: jsPsych.plugins.parameterType.INT,
29
- pretty_name: 'Stimulus height',
30
- default: 100,
31
- description: 'Height of items in pixels.'
32
- },
33
- stim_width: {
34
- type: jsPsych.plugins.parameterType.INT,
35
- pretty_name: 'Stimulus width',
36
- default: 100,
37
- description: 'Width of items in pixels'
38
- },
39
- scale_factor: {
40
- type: jsPsych.plugins.parameterType.FLOAT,
41
- pretty_name: 'Stimulus scaling factor',
42
- default: 1.5,
43
- description: 'How much larger to make the stimulus while moving (1 = no scaling)'
44
- },
45
- sort_area_height: {
46
- type: jsPsych.plugins.parameterType.INT,
47
- pretty_name: 'Sort area height',
48
- default: 700,
49
- description: 'The height in pixels of the container that subjects can move the stimuli in.'
50
- },
51
- sort_area_width: {
52
- type: jsPsych.plugins.parameterType.INT,
53
- pretty_name: 'Sort area width',
54
- default: 700,
55
- description: 'The width in pixels of the container that subjects can move the stimuli in.'
56
- },
57
- sort_area_shape: {
58
- type: jsPsych.plugins.parameterType.STRING,
59
- pretty_name: 'Sort area shape',
60
- options: ['square','ellipse'],
61
- default: 'ellipse',
62
- description: 'The shape of the sorting area'
63
- },
64
- prompt: {
65
- type: jsPsych.plugins.parameterType.STRING,
66
- pretty_name: 'Prompt',
67
- default: '',
68
- description: 'It can be used to provide a reminder about the action the subject is supposed to take.'
69
- },
70
- prompt_location: {
71
- type: jsPsych.plugins.parameterType.SELECT,
72
- pretty_name: 'Prompt location',
73
- options: ['above','below'],
74
- default: 'above',
75
- description: 'Indicates whether to show prompt "above" or "below" the sorting area.'
76
- },
77
- button_label: {
78
- type: jsPsych.plugins.parameterType.STRING,
79
- pretty_name: 'Button label',
80
- default: 'Continue',
81
- description: 'The text that appears on the button to continue to the next trial.'
82
- },
83
- change_border_background_color: {
84
- type: jsPsych.plugins.parameterType.BOOL,
85
- pretty_name: 'Change border background color',
86
- default: true,
87
- description: 'If true, the sort area border color will change while items are being moved in and out of '+
88
- 'the sort area, and the background color will change once all items have been moved into the '+
89
- 'sort area. If false, the border will remain black and the background will remain white throughout the trial.'
90
- },
91
- border_color_in: {
92
- type: jsPsych.plugins.parameterType.STRING,
93
- pretty_name: 'Border color - in',
94
- default: '#a1d99b',
95
- description: 'If change_border_background_color is true, the sort area border will change to this color '+
96
- 'when an item is being moved into the sort area, and the background will change to this color '+
97
- 'when all of the items have been moved into the sort area.'
98
- },
99
- border_color_out: {
100
- type: jsPsych.plugins.parameterType.STRING,
101
- pretty_name: 'Border color - out',
102
- default: '#fc9272',
103
- description: 'If change_border_background_color is true, this will be the color of the sort area border '+
104
- 'when there are one or more items that still need to be moved into the sort area.'
105
- },
106
- border_width: {
107
- type: jsPsych.plugins.parameterType.INT,
108
- pretty_name: 'Border width',
109
- default: null,
110
- description: 'The width in pixels of the border around the sort area. If null, the border width '+
111
- 'defaults to 3% of the sort area height.'
112
- },
113
- counter_text_unfinished: {
114
- type: jsPsych.plugins.parameterType.STRING,
115
- pretty_name: 'Counter text unfinished',
116
- default: 'You still need to place %n% item%s% inside the sort area.',
117
- description: 'Text to display when there are one or more items that still need to be placed in the sort area. '+
118
- 'If "%n%" is included in the string, it will be replaced with the number of items that still need to be moved inside. '+
119
- 'If "%s%" is included in the string, a "s" will be included when the number of items remaining is greater than one.'
120
- },
121
- counter_text_finished: {
122
- type: jsPsych.plugins.parameterType.STRING,
123
- pretty_name: 'Counter text finished',
124
- default: 'All items placed. Feel free to reposition items if necessary.',
125
- description: 'Text that will take the place of the counter_text_unfinished text when all items have been moved inside the sort area.'
126
- },
127
- stim_starts_inside: {
128
- type: jsPsych.plugins.parameterType.BOOL,
129
- pretty_name: 'Stim starts inside',
130
- default: false,
131
- description: 'If false, the images will be positioned to the left and right of the sort area when the trial loads. '+
132
- 'If true, the images will be positioned at random locations inside the sort area when the trial loads.'
133
- }
134
- }
135
- }
136
-
137
- plugin.trial = function(display_element, trial) {
138
-
139
- var start_time = performance.now();
140
-
141
- if (trial.change_border_background_color == false) {
142
- trial.border_color_out = "#000000";
143
- }
144
-
145
- if (trial.border_width == null) {
146
- trial.border_width = trial.sort_area_height*.03;
147
- }
148
-
149
- let html =
150
- '<div '+
151
- 'id="jspsych-free-sort-arena" '+
152
- 'class="jspsych-free-sort-arena" '+
153
- 'style="position: relative; width:'+trial.sort_area_width+'px; height:'+trial.sort_area_height+'px; margin: auto;"</div>';
154
-
155
- // another div for border
156
- html += '<div '+
157
- 'id="jspsych-free-sort-border" '+
158
- 'class="jspsych-free-sort-border" '+
159
- 'style="position: relative; width:'+trial.sort_area_width*.94+'px; height:'+trial.sort_area_height*.94+'px; '+
160
- 'border:'+trial.border_width+'px solid '+trial.border_color_out+'; margin: auto; line-height: 0em; ';
161
-
162
- if ( trial.sort_area_shape == "ellipse") {
163
- html += 'webkit-border-radius: 50%; moz-border-radius: 50%; border-radius: 50%"></div>'
164
- } else {
165
- html += 'webkit-border-radius: 0%; moz-border-radius: 0%; border-radius: 0%"></div>'
166
- }
167
-
168
- // variable that has the prompt text and counter
169
- const html_text = '<div style="line-height: 1.0em;">' + trial.prompt +
170
- '<p id="jspsych-free-sort-counter" style="display: inline-block;">'+get_counter_text(trial.stimuli.length)+'</p></div>';
171
-
172
- // position prompt above or below
173
- if (trial.prompt_location == "below") {
174
- html += html_text
175
- } else {
176
- html = html_text + html
177
- }
178
- // add button
179
- html += '<div><button id="jspsych-free-sort-done-btn" class="jspsych-btn" '+
180
- 'style="margin-top: 5px; visibility: hidden;">' +
181
- trial.button_label+'</button></div>';
182
-
183
- display_element.innerHTML = html;
184
-
185
- // store initial location data
186
- let init_locations = [];
187
-
188
- if (!trial.stim_starts_inside) {
189
- // determine number of rows and colums, must be a even number
190
- let num_rows = Math.ceil(Math.sqrt(trial.stimuli.length))
191
- if ( num_rows % 2 != 0) {
192
- num_rows = num_rows + 1
193
- }
194
-
195
- // compute coords for left and right side of arena
196
- var r_coords = [];
197
- var l_coords = [];
198
- for (const x of make_arr(0, trial.sort_area_width - trial.stim_width, num_rows) ) {
199
- for (const y of make_arr(0, trial.sort_area_height - trial.stim_height, num_rows) ) {
200
- if ( x > ( (trial.sort_area_width - trial.stim_width) * .5 ) ) {
201
- //r_coords.push({ x:x, y:y } )
202
- r_coords.push({ x:x + (trial.sort_area_width) * .5 , y:y });
203
- } else {
204
- l_coords.push({ x:x - (trial.sort_area_width) * .5 , y:y });
205
- //l_coords.push({ x:x, y:y } )
206
- }
207
- }
208
- }
209
-
210
- // repeat coordinates until you have enough coords (may be obsolete)
211
- while ( ( r_coords.length + l_coords.length ) < trial.stimuli.length ) {
212
- r_coords = r_coords.concat(r_coords)
213
- l_coords = l_coords.concat(l_coords)
214
- }
215
- // reverse left coords, so that coords closest to arena is used first
216
- l_coords = l_coords.reverse()
217
-
218
- // shuffle stimuli, so that starting positions are random
219
- trial.stimuli = shuffle(trial.stimuli);
220
- }
221
-
222
- let inside = []
223
- for (let i = 0; i < trial.stimuli.length; i++) {
224
- var coords;
225
- if (trial.stim_starts_inside) {
226
- coords = random_coordinate(trial.sort_area_width - trial.stim_width, trial.sort_area_height - trial.stim_height);
227
- } else {
228
- if ( (i % 2) == 0 ) {
229
- coords = r_coords[Math.floor(i * .5)];
230
- } else {
231
- coords = l_coords[Math.floor(i * .5)];
232
- }
233
- }
234
-
235
- display_element.querySelector("#jspsych-free-sort-arena").innerHTML += '<img '+
236
- 'src="'+trial.stimuli[i]+'" '+
237
- 'data-src="'+trial.stimuli[i]+'" '+
238
- 'class="jspsych-free-sort-draggable" '+
239
- 'draggable="false" '+
240
- 'id="jspsych-free-sort-draggable-'+i+'" '+
241
- 'style="position: absolute; cursor: move; width:'+trial.stim_width+'px; height:'+trial.stim_height+'px; top:'+coords.y+'px; left:'+coords.x+'px;">'+
242
- '</img>';
243
-
244
- init_locations.push({
245
- "src": trial.stimuli[i],
246
- "x": coords.x,
247
- "y": coords.y
248
- });
249
- if (trial.stim_starts_inside) {
250
- inside.push(true);
251
- } else {
252
- inside.push(false);
253
- }
254
- }
255
-
256
- // moves within a trial
257
- let moves = [];
258
-
259
- // are objects currently inside
260
- let cur_in = false
261
-
262
- // draggable items
263
- const draggables = display_element.querySelectorAll('.jspsych-free-sort-draggable');
264
-
265
- // button (will show when all items are inside) and border (will change color)
266
- const border = display_element.querySelector("#jspsych-free-sort-border")
267
- const button = display_element.querySelector('#jspsych-free-sort-done-btn')
268
-
269
- // when trial starts, modify text and border/background if all items are inside (stim_starts_inside: true)
270
- if (inside.some(Boolean) && trial.change_border_background_color) {
271
- border.style.borderColor = trial.border_color_in;
272
- }
273
- if (inside.every(Boolean)) {
274
- if (trial.change_border_background_color) {
275
- border.style.background = trial.border_color_in;
276
- }
277
- button.style.visibility = "visible";
278
- display_element.querySelector("#jspsych-free-sort-counter").innerHTML = trial.counter_text_finished;
279
- }
280
-
281
- for(let i=0; i<draggables.length; i++){
282
- draggables[i].addEventListener('mousedown', function(event){
283
- let x = event.pageX - event.currentTarget.offsetLeft;
284
- let y = event.pageY - event.currentTarget.offsetTop - window.scrollY;
285
- let elem = event.currentTarget;
286
- elem.style.transform = "scale(" + trial.scale_factor + "," + trial.scale_factor + ")";
287
- let mousemoveevent = function(e){
288
- cur_in = inside_ellipse(e.clientX - x, e.clientY - y,
289
- trial.sort_area_width*.5 - trial.stim_width*.5, trial.sort_area_height*.5 - trial.stim_height*.5,
290
- trial.sort_area_width*.5, trial.sort_area_height*.5,
291
- trial.sort_area_shape == "square");
292
- elem.style.top = Math.min(trial.sort_area_height - trial.stim_height*.5, Math.max(- trial.stim_height*.5, (e.clientY - y))) + 'px';
293
- elem.style.left = Math.min(trial.sort_area_width*1.5 - trial.stim_width, Math.max(-trial.sort_area_width*.5, (e.clientX - x)))+ 'px';
294
-
295
- // modify border while items is being moved
296
- if (trial.change_border_background_color) {
297
- if (cur_in) {
298
- border.style.borderColor = trial.border_color_in;
299
- border.style.background = "None";
300
- } else {
301
- border.style.borderColor = trial.border_color_out;
302
- border.style.background = "None";
303
- }
304
- }
305
-
306
- // replace in overall array, grab index from item id
307
- var elem_number = elem.id.split("jspsych-free-sort-draggable-")[1];
308
- inside.splice(elem_number, true, cur_in)
309
-
310
- // modify text and background if all items are inside
311
- if (inside.every(Boolean)) {
312
- if (trial.change_border_background_color) {
313
- border.style.background = trial.border_color_in;
314
- }
315
- button.style.visibility = "visible";
316
- display_element.querySelector("#jspsych-free-sort-counter").innerHTML = trial.counter_text_finished;
317
- } else {
318
- border.style.background = "none";
319
- button.style.visibility = "hidden";
320
- display_element.querySelector("#jspsych-free-sort-counter").innerHTML = get_counter_text(inside.length - inside.filter(Boolean).length);
321
- }
322
- }
323
- document.addEventListener('mousemove', mousemoveevent);
324
-
325
- var mouseupevent = function(e){
326
- document.removeEventListener('mousemove', mousemoveevent);
327
- elem.style.transform = "scale(1, 1)";
328
- if (trial.change_border_background_color) {
329
- if (inside.every(Boolean)) {
330
- border.style.background = trial.border_color_in;
331
- border.style.borderColor = trial.border_color_in;
332
- } else {
333
- border.style.background = "none";
334
- border.style.borderColor = trial.border_color_out;
335
- }
336
- }
337
- moves.push({
338
- "src": elem.dataset.src,
339
- "x": elem.offsetLeft,
340
- "y": elem.offsetTop
341
- });
342
- document.removeEventListener('mouseup', mouseupevent);
343
- }
344
- document.addEventListener('mouseup', mouseupevent);
345
- });
346
- }
347
-
348
- display_element.querySelector('#jspsych-free-sort-done-btn').addEventListener('click', function(){
349
- if (inside.every(Boolean)) {
350
- const end_time = performance.now();
351
- const rt = end_time - start_time;
352
- // gather data
353
- const items = display_element.querySelectorAll('.jspsych-free-sort-draggable');
354
- // get final position of all items
355
- let final_locations = [];
356
- for(let i=0; i<items.length; i++){
357
- final_locations.push({
358
- "src": items[i].dataset.src,
359
- "x": parseInt(items[i].style.left),
360
- "y": parseInt(items[i].style.top)
361
- });
362
- }
363
-
364
- const trial_data = {
365
- "init_locations": JSON.stringify(init_locations),
366
- "moves": JSON.stringify(moves),
367
- "final_locations": JSON.stringify(final_locations),
368
- "rt": rt
369
- };
370
-
371
- // advance to next part
372
- display_element.innerHTML = '';
373
- jsPsych.finishTrial(trial_data);
374
- }
375
- });
376
-
377
- function get_counter_text(n) {
378
- var text_out = '';
379
- var text_bits = trial.counter_text_unfinished.split("%");
380
- for (var i=0; i<text_bits.length; i++) {
381
- if (i%2 === 0) {
382
- text_out += text_bits[i];
383
- } else {
384
- if (text_bits[i] == "n") {
385
- text_out += n.toString();
386
- } else if (text_bits[i] == "s" && n > 1) {
387
- text_out += "s";
388
- }
389
- }
390
- }
391
- return text_out;
392
- }
393
- };
394
-
395
- // helper functions
396
-
397
- function shuffle(array) {
398
- // define three variables
399
- let cur_idx = array.length, tmp_val, rand_idx;
400
-
401
- // While there remain elements to shuffle...
402
- while (0 !== cur_idx) {
403
- // Pick a remaining element...
404
- rand_idx = Math.floor(Math.random() * cur_idx);
405
- cur_idx -= 1;
406
-
407
- // And swap it with the current element.
408
- tmp_val = array[cur_idx];
409
- array[cur_idx] = array[rand_idx];
410
- array[rand_idx] = tmp_val;
411
- }
412
- return array;
413
- }
414
-
415
- function make_arr(startValue, stopValue, cardinality) {
416
- const step = (stopValue - startValue) / (cardinality - 1);
417
- let arr = [];
418
- for (let i = 0; i < cardinality; i++) {
419
- arr.push(startValue + (step * i));
420
- }
421
- return arr;
422
- }
423
-
424
- function inside_ellipse(x, y, x0, y0, rx, ry, square=false) {
425
- const results = [];
426
- if (square) {
427
- result = ( Math.abs(x - x0) <= rx ) && ( Math.abs(y - y0) <= ry )
428
- } else {
429
- result = (( x - x0 ) * ( x - x0 )) * (ry * ry) + ((y - y0) * ( y - y0 )) * ( rx * rx ) <= ( (rx * rx) * (ry * ry) )
430
- }
431
- return result
432
- }
433
-
434
- function random_coordinate(max_width, max_height) {
435
- const rnd_x = Math.floor(Math.random() * (max_width - 1));
436
- const rnd_y = Math.floor(Math.random() * (max_height - 1));
437
- return {
438
- x: rnd_x,
439
- y: rnd_y
440
- };
441
- }
442
-
443
- return plugin;
444
- })();