* Creates a challenge from a markdown file * @param {object} options - Options object * @param {string} options.filename - Name of the challenge file * @param {string} options.block - Name of the block * @param {object} options.meta - Meta information for the block * @param {boolean}
(
{
filename,
block,
meta,
isAudited
}: { filename: string; block: string; meta: Meta; isAudited: boolean },
parser = parseMD
)
| 312 | * @returns {Promise<object>} The finalized challenge object |
| 313 | */ |
| 314 | async createChallenge( |
| 315 | { |
| 316 | filename, |
| 317 | block, |
| 318 | meta, |
| 319 | isAudited |
| 320 | }: { filename: string; block: string; meta: Meta; isAudited: boolean }, |
| 321 | parser = parseMD |
| 322 | ) { |
| 323 | log( |
| 324 | `Creating challenge from file: ${filename} in block: ${block}, using lang: ${this.lang}` |
| 325 | ); |
| 326 | |
| 327 | const englishPath = resolve(this.blockContentDir, block, filename); |
| 328 | const i18nPath = resolve(this.i18nBlockContentDir, block, filename); |
| 329 | |
| 330 | const langUsed = isAudited && existsSync(i18nPath) ? this.lang : 'english'; |
| 331 | |
| 332 | const challengePath = langUsed === 'english' ? englishPath : i18nPath; |
| 333 | |
| 334 | const challenge = translateCommentsInChallenge( |
| 335 | await parser(challengePath), |
| 336 | langUsed, |
| 337 | this.commentTranslations |
| 338 | ); |
| 339 | |
| 340 | challenge.translationPending = this.lang !== 'english' && !isAudited; |
| 341 | |
| 342 | return finalizeChallenge(challenge, meta); |
| 343 | } |
| 344 | |
| 345 | /** |
| 346 | * Reads and builds all challenges from a block directory |
no test coverage detected