diff --git a/migrates/format-old-codes.js b/migrates/format-old-codes.js index 28b6599..fa08fd9 100755 --- a/migrates/format-old-codes.js +++ b/migrates/format-old-codes.js @@ -1,47 +1,6 @@ /* - * This script will help format all submissions' codes whose id in a interval. + * After moving to TypeORM, this script no longer works. + * If you have NOT migrated to TypeORM, please follow + * https://github.com/syzoj/syzoj/wiki/TypeORM-%E8%BF%81%E7%A7%BB%E6%8C%87%E5%8D%97 * - * Useful when upgrading from a version that doesn't support code formatting. */ - -const JudgeState = syzoj.model('judge_state'); -const FormattedCode = syzoj.model('formatted_code'); -const CodeFormatter = syzoj.lib('code_formatter'); -require('.'); - -const fn = async (begin, end) => { - for (let i = begin; i < end; i++) { - const judge_state = await JudgeState.fromID(i); - if (!judge_state) continue; - - if (!judge_state.language) continue; - - const key = syzoj.utils.getFormattedCodeKey(judge_state.code, judge_state.language); - if (!key) continue; - - let formatted_code = await FormattedCode.findOne({ where: { key: key } }); - - const code = await CodeFormatter(judge_state.code, syzoj.languages[judge_state.language].format); - if (code === null) { - console.error(`Format ${i} failed.`); - continue; - } - - if (!formatted_code) { - formatted_code = await FormattedCode.create({ - key: key, - code: code - }); - } else continue; // formatted_code.code = code; - - try { - await formatted_code.save(); - console.error(`Format and save ${i} success.`); - } catch (e) { - console.error(`Save ${i} failed:`, e); - } - } -}; - -// NOTE: Uncomment and fill arguments to run. -// fn(begin, end) // [begin, end) diff --git a/migrates/html-table-merge-cell-to-md.js b/migrates/html-table-merge-cell-to-md.js index 475fe1b..1209d02 100755 --- a/migrates/html-table-merge-cell-to-md.js +++ b/migrates/html-table-merge-cell-to-md.js @@ -1,127 +1,6 @@ /* - * This script will help migrate from the old marked-based markdown renderer - * to the new markdown-it based (syzoj-renderer). - * - * The later doesn't support inline markdown inside HTML blocks. But in - * LibreOJ that's widely used in problem's limits' cell-merged table displaying - * displaying. So TeX maths inside are broken. + * After moving to TypeORM, this script no longer works. + * If you have NOT migrated to TypeORM, please follow + * https://github.com/syzoj/syzoj/wiki/TypeORM-%E8%BF%81%E7%A7%BB%E6%8C%87%E5%8D%97 + * */ - -const cheerio = require('cheerio'); - -function processMarkdown(text) { - return text.replace(/()/gi, (match, offset, string) => { - const $ = cheerio.load(match, { decodeEntities: false }), - table = $('table'); - - let defaultAlign = '-'; - if (table.hasClass('center')) defaultAlign = ':-:'; - else if (table.hasClass('left')) defaultAlign = ':-'; - else if (table.hasClass('right')) defaultAlign = '-:'; - - let columnCount = 0; - const columnAlign = []; - table.find('th').each((i, th) => { - const count = parseInt($(th).attr('colspan')) || 1; - columnCount += count; - - const style = ($(th).attr('style') || '').split(' ').join('').toLowerCase(); - if (style.includes('text-align:center')) columnAlign.push(':-:'); - else if (style.includes('text-align:left')) columnAlign.push(':-'); - else if (style.includes('text-align:right')) columnAlign.push('-:'); - else columnAlign.push(defaultAlign); - }); - - const rowCount = table.find('tr').length; - - function escape(s) { - return ` ${s.trim().split('|').join('\\|')} `; - } - - const matrix = Array(rowCount).fill(null).map(() => []); - table.find('tr').each((i, tr) => { - const cells = $(tr).find('th, td'); - - let columnIndex = 0, resColumnIndex = 0; - cells.each((j, td) => { - while (typeof matrix[i][resColumnIndex] !== 'undefined') resColumnIndex++; - - if (columnIndex >= columnCount) return false; - if (resColumnIndex >= columnCount) return false; - - const colspan = parseInt($(td).attr('colspan')) || 1, - rowspan = parseInt($(td).attr('rowspan')) || 1, - content = $(td).html(); - - for (let cntRow = 0; cntRow < rowspan; cntRow++) { - for (let cntCol = 0; cntCol < colspan; cntCol++) { - if (i + cntRow < rowCount && resColumnIndex + cntCol < columnCount) { - matrix[i + cntRow][resColumnIndex + cntCol] = escape(content); - } - } - } - - resColumnIndex += colspan; - }); - }); - - const code = [matrix[0], columnAlign, ...matrix.slice(1)].map(row => `|${row.join('|')}|`).join('\n'); - - return `\n\n${code}\n\n\n\n`; - }); -} - -// Load syzoj. -process.chdir(__dirname + '/..'); -require('..'); - -const modelFields = { - problem: [ - 'description', - 'input_format', - 'output_format', - 'example', - 'limit_and_hint' - ], - contest: [ - 'information', - 'problems' - ], - article: [ - 'content' - ], - 'article-comment': [ - 'content' - ] -}; - -const fn = async () => { - for (const model in modelFields) { - const modelObject = syzoj.model(model); - const allData = await modelObject.all(); - - let cnt = 0, tot = allData.length; - for (const obj of allData) { - console.log(`${model}: ${++cnt}/${tot}`); - - let modified = false; - - for (field of modelFields[model]) { - const processed = processMarkdown(obj[field]); - if (processed != obj[field]) { - obj[field] = processed; - modified = true; - } - } - - if (modified) { - await obj.save(); - } - } - } - - process.exit(); -}; - -// NOTE: Uncomment to run. -// fn();