{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import { JsPsych, JsPsychPlugin, ParameterType, TrialType } from \"jspsych\";\n\nconst info = <const>{\n  name: \"self-paced-reading\",\n  parameters: {\n    sentence: {\n      type: ParameterType.STRING,\n      pretty_name: \"Sentence\",\n      default: undefined,\n    },\n    font_family: {\n      type: ParameterType.STRING,\n      pretty_name: \"Font family\",\n      default: \"monospace\",\n    },\n    font_size: {\n      type: ParameterType.STRING,\n      pretty_name: \"Font size\",\n      default: \"24px\",\n    },\n    font_weight: {\n      type: ParameterType.STRING,\n      pretty_name: \"Font weight\",\n      default: \"normal\",\n    },\n    font_colour: {\n      type: ParameterType.STRING,\n      pretty_name: \"Font colour\",\n      default: \"black\",\n    },\n    mask_type: {\n      type: ParameterType.INT,\n      pretty_name: \"Mask type\",\n      default: 1,\n    },\n    mask_character: {\n      type: ParameterType.STRING,\n      pretty_name: \"Mask character\",\n      default: \"_\",\n    },\n    mask_on_word: {\n      type: ParameterType.BOOL,\n      pretty_name: \"Mask word\",\n      default: true,\n    },\n    mask_gap_character: {\n      type: ParameterType.STRING,\n      pretty_name: \"Mask gap character.\",\n      default: \" \",\n    },\n    mask_offset: {\n      type: ParameterType.INT,\n      pretty_name: \"Mask offset\",\n      default: 0,\n    },\n    mask_weight: {\n      type: ParameterType.STRING,\n      pretty_name: \"Mask weight\",\n      default: \"normal\",\n    },\n    mask_colour: {\n      type: ParameterType.STRING,\n      pretty_name: \"Mask colour\",\n      default: \"black\",\n    },\n    line_height: {\n      type: ParameterType.INT,\n      pretty_name: \"Line height\",\n      default: 80,\n    },\n    canvas_colour: {\n      type: ParameterType.STRING,\n      pretty_name: \"Canvas colour\",\n      default: \"white\",\n    },\n    canvas_size: {\n      type: ParameterType.INT,\n      array: true,\n      pretty_name: \"Canvas size\",\n      default: [1280, 960],\n    },\n    canvas_border: {\n      type: ParameterType.STRING,\n      pretty_name: \"Canvas border\",\n      default: \"0px solid black\",\n    },\n    canvas_clear_border: {\n      type: ParameterType.BOOL,\n      pretty_name: \"Clear canvas border\",\n      default: false,\n    },\n    translate_origin: {\n      type: ParameterType.BOOL,\n      pretty_name: \"Translate origin\",\n      default: true,\n    },\n    choices: {\n      type: ParameterType.KEYS,\n      pretty_name: \"Keys\",\n      default: [\" \"],\n    },\n    xy_position: {\n      type: ParameterType.INT,\n      array: true,\n      pretty_name: \"XY position\",\n      default: [0, 0],\n    },\n    x_align: {\n      type: ParameterType.STRING,\n      pretty_name: \"X alignment\",\n      default: \"center\",\n    },\n    y_align: {\n      type: ParameterType.STRING,\n      pretty_name: \"Y alignment\",\n      default: \"top\",\n    },\n    inter_word_interval: {\n      type: ParameterType.INT,\n      pretty_name: \"inter-word-interval\",\n      default: 0,\n    },\n  },\n};\n\nfunction text_mask(txt: string, mask_character: string) {\n  return mask_character.repeat(txt.length);\n}\n\n// deal with mask type 1 and 2\nlet mask_operator = {\n  1: (a: number, b: number) => a !== b,\n  2: (a: number, b: number) => a > b,\n};\n\nfunction display_word(mask_type: number) {\n  return (words: string[], word_number: number) =>\n    words\n      .map((word, idx) =>\n        mask_operator[mask_type](idx, word_number) ? text_mask(word, \" \") : word\n      )\n      .join(\" \");\n}\n\nfunction display_mask(\n  mask_type: number,\n  mask_on_word: boolean,\n  mask_character: string,\n  mask_gap_character: string\n) {\n  return (words: string[], word_number: number) =>\n    words\n      .map((word: string, idx: number) =>\n        mask_operator[mask_type](idx, word_number)\n          ? text_mask(word, mask_character)\n          : text_mask(word, mask_on_word ? mask_character : \" \")\n      )\n      .join(mask_gap_character);\n}\n\nfunction set_canvas(\n  canvas: HTMLCanvasElement,\n  ctx: CanvasRenderingContext2D,\n  colour: string | CanvasGradient | CanvasPattern,\n  translate_origin: Boolean\n) {\n  let canvas_rect: number[];\n  if (translate_origin) {\n    ctx.translate(canvas.width / 2, canvas.height / 2); // make center (0, 0)\n    canvas_rect = [-canvas.width / 2, -canvas.height / 2, canvas.width, canvas.height];\n  } else {\n    canvas_rect = [0, 0, canvas.width, canvas.height];\n  }\n  ctx.fillStyle = colour;\n  ctx.fillRect(canvas_rect[0], canvas_rect[1], canvas_rect[2], canvas_rect[3]);\n  return canvas_rect;\n}\n\ntype Info = typeof info;\n\n/**\n * **self-paced-reading**\n *\n * jsPsych plugin for self paced reading paradigms.\n *\n * @author igmmgi\n * @see {@link https://www.jspsych.org/plugins/jspsych-self-paced-reading/ self-paced-reading plugin documentation on jspsych.org}\n */\nclass SelfPacedReadingPlugin implements JsPsychPlugin<Info> {\n  static info = info;\n\n  constructor(private jsPsych: JsPsych) {}\n\n  trial(display_element: HTMLElement, trial: TrialType<Info>) {\n    display_element.innerHTML =\n      \"<div>\" +\n      '<canvas id=\"canvas\" width=\"' +\n      trial.canvas_size[0] +\n      '\" height=\"' +\n      trial.canvas_size[1] +\n      '\" style=\"border: ' +\n      trial.canvas_border +\n      ';\"></canvas>' +\n      \"</div>\";\n\n    let canvas = document.getElementById(\"canvas\") as HTMLCanvasElement;\n    let ctx = canvas.getContext(\"2d\");\n    let canvas_rect = set_canvas(canvas, ctx, trial.canvas_colour, trial.translate_origin);\n\n    // basic font style\n    ctx.textAlign = trial.x_align as CanvasTextAlign;\n    ctx.textBaseline = \"middle\";\n\n    // text properties\n    let words = [];\n    let line_length = [];\n    let sentence_length = 0;\n    let word_number = -1; // initialized to -1 because trial begins with no words displayed\n    let word_number_line = -1;\n    let line_number = 0;\n    let sentence = trial.sentence.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\n    let sentence_split: string[];\n    let words_concat = sentence.split(\" \");\n    let sentence_font = trial.font_weight + \" \" + trial.font_size + \" \" + trial.font_family;\n    let mask_font = trial.mask_weight + \" \" + trial.font_size + \" \" + trial.font_family;\n\n    let rts: number[] = [0];\n\n    // if mask type = 3, repeat mask character x number of letters in first word\n    let mask_character =\n      trial.mask_type !== 3\n        ? trial.mask_character\n        : trial.mask_character.repeat(words_concat[0].length);\n\n    // deal with potential multi-line sentences with user defined splits\n    if (trial.mask_type !== 3) {\n      sentence_split = trial.sentence.split(\"\\n\").map((s) => s.trim());\n      for (let i = 0; i < sentence_split.length; i++) {\n        words[i] = sentence_split[i].split(\" \");\n        sentence_length += words[i].length;\n        line_length.push(words[i].length);\n      }\n      // center multi-line text on original y position\n      if (words.length > 1 && trial.y_align === \"center\") {\n        trial.xy_position[1] -= words.length * 0.5 * trial.line_height;\n      }\n    } else {\n      words = trial.sentence.split(\" \");\n      sentence_length = words.length;\n    }\n\n    const word = display_word(trial.mask_type);\n    const mask = display_mask(\n      trial.mask_type,\n      trial.mask_on_word,\n      mask_character,\n      trial.mask_gap_character\n    );\n\n    function clear_canvas() {\n      ctx.fillStyle = trial.canvas_colour;\n      ctx.font = trial.canvas_colour;\n      ctx.fillRect(canvas_rect[0], canvas_rect[1], canvas_rect[2], canvas_rect[3]);\n    }\n\n    function draw_mask() {\n      ctx.font = mask_font;\n      ctx.fillStyle = trial.mask_colour;\n      if (trial.mask_type !== 3) {\n        for (let i = 0; i < words.length; i++) {\n          let mw = i === line_number ? word_number_line : -1;\n          ctx.fillText(\n            mask(words[i], mw),\n            trial.xy_position[0],\n            trial.xy_position[1] + i * trial.line_height + trial.mask_offset\n          );\n        }\n      } else if (trial.mask_type === 3 && word_number === -1) {\n        ctx.fillText(\n          mask_character,\n          trial.xy_position[0],\n          trial.xy_position[1] + trial.mask_offset\n        );\n      }\n    }\n\n    function draw_word() {\n      ctx.font = sentence_font;\n      ctx.fillStyle = trial.font_colour;\n      if (trial.mask_type !== 3) {\n        // previous lines in multi-line\n        for (let i = 0; i < line_number; i++) {\n          ctx.fillText(\n            word(words[i], words[i].length),\n            trial.xy_position[0],\n            trial.xy_position[1] + i * trial.line_height\n          );\n        }\n\n        // current line\n        ctx.fillText(\n          word(words[line_number], word_number_line),\n          trial.xy_position[0],\n          trial.xy_position[1] + line_number * trial.line_height\n        );\n      } else if (trial.mask_type === 3 && word_number > -1) {\n        ctx.fillText(words[word_number], trial.xy_position[0], trial.xy_position[1]);\n      }\n\n      // set line/word numbers\n      if (word_number_line + 1 < line_length[line_number]) {\n        word_number_line++;\n      } else if (line_number < words.length - 1) {\n        line_number++;\n        word_number_line = 0;\n      }\n    }\n\n    // store responses\n    // must be an object, as this is what jsPsych.finishTrial() expects\n    let trial_data = {\n      word: [],\n      rt: [],\n      rt_total: [],\n      sentence: sentence,\n    };\n\n    // initial draw\n    draw_mask();\n    draw_word();\n\n    // function to end trial when it is time\n    const end_trial = () => {\n      if (trial.canvas_clear_border) {\n        display_element.innerHTML = \" \";\n      } else {\n        ctx.fillStyle = trial.canvas_colour;\n        ctx.fillRect(canvas_rect[0], canvas_rect[1], canvas_rect[2], canvas_rect[3]);\n      }\n\n      // kill any remaining setTimeout handlers + kill keyboard listeners\n      this.jsPsych.pluginAPI.clearAllTimeouts();\n      this.jsPsych.pluginAPI.cancelKeyboardResponse(keyboardListener);\n\n      // move on to the next trial\n      this.jsPsych.finishTrial(trial_data);\n    };\n\n    // function to handle responses by the subject\n    const after_response = (info: { rt: any }) => {\n      // gather/store data\n      rts.push(info.rt);\n\n      // trial.inter_word_interval not relevant for initial rt\n      let iwi = word_number === -1 ? 0 : trial.inter_word_interval;\n      // rts[rts.length - 1] is the cumulative rt for the trial\n      let current_rt = rts[rts.length - 1] - rts[rts.length - 2] - iwi;\n      // no words displayed at the start of trial\n      let current_word = word_number === -1 ? null : words_concat[word_number];\n\n      if (current_rt > 0) {\n        // valid rts\n        trial_data.rt.push(current_rt);\n        trial_data.rt_total.push(rts[rts.length - 1]);\n        trial_data.word.push(current_word);\n        // keep drawing until words in sentence complete\n        word_number++;\n        this.jsPsych.pluginAPI.setTimeout(function () {\n          // word_number will equal sentence_length after (valid) keypress on last word\n          if (word_number < sentence_length) {\n            clear_canvas();\n            draw_mask();\n            draw_word();\n          } else {\n            end_trial();\n          }\n        }, trial.inter_word_interval);\n      } else {\n        // invalid (i.e. negative) rts possible when trial.inter_word_interval is > 0\n        rts.pop(); // throw out invalid rt\n      }\n    };\n\n    let keyboardListener = this.jsPsych.pluginAPI.getKeyboardResponse({\n      callback_function: after_response,\n      valid_responses: trial.choices,\n      rt_method: \"performance\",\n      persist: true,\n      allow_held_key: false,\n    });\n  }\n}\n\nexport default SelfPacedReadingPlugin;\n"],"names":["ParameterType"],"mappings":"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"}