"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sync = exports.syncYAML = exports.updateTopic = exports.createTopic = void 0; const path = require("path"); const exists_1 = require("@plastichub/fs/exists"); const dir_1 = require("@plastichub/fs/dir"); const write_1 = require("@plastichub/fs/write"); const read_1 = require("@plastichub/fs/read"); const fs_1 = require("@plastichub/osr-commons"); const bluebird_1 = require("bluebird"); const YAML = require('json-to-pretty-yaml'); const cheerio = require('cheerio'); const download_1 = require("./download"); const markdown_1 = require("../markdown"); const constants_1 = require("../discourse/constants"); const cache_1 = require("../discourse/cache"); const discourse_1 = require("../discourse"); const index_1 = require("../../index"); const md5 = require("md5"); const frontMatter = require('front-matter'); const fromYAML = (content, options) => { if (frontMatter.test(content)) { const fm = frontMatter(content); return { attributes: fm.attributes, body: fm.body }; } else { return { attributes: {}, body: content }; } }; const adjustUrls = (content, options) => { let ret = new markdown_1.RMark({ images: (match, capture, arg1, arg2) => `![${capture}](${arg1})`, //links: (match, capture, arg1, arg2) => `[${capture}](${arg1})` }).render(content); return ret; }; const createTopic = async (discourse, options, content) => { let data; try { data = await discourse.createPost(options.title, content, options.cat); } catch (e) { debugger; } if (data) { index_1.logger.debug('created topic : ' + options.title + ' : ' + data.id); if (data && data.id) { try { options.post_id = data.id; options.topic_id = data.topic_id; await discourse.changeOwner(options.post_id, options.topic_id, options.user_name); } catch (e) { index_1.logger.error('changing owner ' + options.title + ' failed!', e); } } else { index_1.logger.debug('creating ' + options.title + ' failed!', data.errors); if (data.errors) { if (data.errors[0] && data.errors[0] === 'Title has already been used') { index_1.logger.error('title already used : ' + options.title); } } } } }; exports.createTopic = createTopic; const updateTopic = async (discourse, options, topic_id, content) => { let data; try { data = await discourse.updatePost(topic_id, content); } catch (e) { } if (data) { index_1.logger.debug('created topic : ' + options.title + ' : ' + data.id); if (data && data.id) { try { index_1.logger.debug('change user to ', options.owner); options.post_id = data.id; options.topic_id = data.topic_id; await discourse.changeOwner(topic_id, topic_id, options.user_name); } catch (e) { index_1.logger.debug('changing owner ' + options.title + ' failed!'); } } else { index_1.logger.debug('creating ' + options.title + ' failed!', data.errors); if (data.errors) { if (data.errors[0] && data.errors[0] === 'Title has already been used') { index_1.logger.error('title already used : ' + options.title); } } } } }; exports.updateTopic = updateTopic; const images_urls = (content) => { const html = (0, markdown_1.toHTML)(content); const $ = cheerio.load(html, { xmlMode: true }); const images = []; const links = []; $('img').each(function () { images.push($(this).attr('src')); }); return images; }; const uploadImages = async (content, discourse, options) => { const root = path.resolve((0, fs_1.resolve)(options.root)); if (!(0, exists_1.sync)(root)) { return false; } const track_path = path.join(root, constants_1.SYNC_TRACK_FILENAME); const track = (0, read_1.sync)(track_path, 'json') || {}; const html = (0, markdown_1.toHTML)(content); const $ = cheerio.load(html, { xmlMode: true }); const images = images_urls(content); $('img').each(function () { images.push($(this).attr('src')); }); for await (const image of Object.entries(images)) { const url = image[1]; if (url.startsWith('upload:')) { continue; } if (options.uploadRemote && url.startsWith('http')) { const contentHash = md5(content).substring(0, 5); const cache_path = path.resolve((0, fs_1.resolve)('${OSR_CACHE}/discourse-downloads/' + contentHash)); if (!(0, exists_1.sync)(cache_path)) { (0, dir_1.sync)(cache_path); } const image_name = (0, download_1.imageName)(url); const image_local = path.join(cache_path, image_name); if (!(0, exists_1.sync)(image_local)) { await (0, download_1.downloadFile)(url, cache_path); } if ((0, exists_1.sync)(image_local)) { const upped = await discourse.uploadFile(options.owner, image_local); const data = upped.data; if (data && data.id) { track[url] = data; (0, write_1.sync)(track_path, track); } else { console.error('error uploading image'); } } continue; } if (options.uploadLocal) { const image_path = path.join(root, url); if ((0, exists_1.sync)(image_path) && !track[url]) { const upped = await discourse.uploadFile(options.owner, image_path); const data = upped.data; if (data && data.id) { track[url] = data; (0, write_1.sync)(track_path, track); } else { console.error('error uploading image'); } } } } return track; }; const syncFile = async (file, options) => { const discourse = (0, discourse_1.Instance)(null, options.config); let content = (0, read_1.sync)(file); const fm = fromYAML(content, options) || {}; let body = "" + fm.body; let images_track; if (options.uploadLocal || options.uploadRemote) { images_track = await uploadImages(body, discourse, options); const image_urls = images_urls(body); image_urls.forEach((i) => { if (images_track[i]) body = body.replace(i, images_track[i].short_url); }); } (0, write_1.sync)('./out/md.md', body); let dOpts = options.yaml ? fm.attributes : { cat: options.cat, id: options.id, owner: options.owner, tags: options.tags, title: options.title }; options = { ...options, ...dOpts }; const cats = await (0, cache_1.cacheCategories)(options, discourse); const tags = await (0, cache_1.cacheTags)(options, discourse); const users = await (0, cache_1.cacheUsers)(options, discourse); const search = await discourse.search(dOpts.title); let post_id, topic_id; if (options.yaml) { post_id = dOpts.post_id; topic_id = dOpts.topic_id; } let dTopic; let dPost; if (search.posts && search.topics && search.posts[0] && search.topics[0] && search.topics[0].title === dOpts.title) { dPost = search.posts[0]; dTopic = search.topics[0]; topic_id = dTopic.id; post_id = dPost.id; } else if (post_id && topic_id) { } const user = users.find((u) => { return u.id === dOpts.owner; }); if (!user) { index_1.logger.error('Invalid user : ', dOpts.owner); return false; } options.user_name = user.username; let topic = null; if (post_id) { topic = await (0, exports.updateTopic)(discourse, options, post_id, body); if (topic_id) { topic = await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []); } } else { await (0, exports.createTopic)(discourse, options, body); topic_id = options.topic_id; post_id = options.post_id; await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []); } if (dTopic) { options.topic_id = dTopic.id; } if (dPost) { options.post_id = dPost.id; } if (options.yaml) { let contentOut = `---\n`; contentOut += YAML.stringify({ ...fm.attributes, topic_id: topic_id, post_id: post_id }); contentOut += `---\n`; contentOut += fm.body; (0, write_1.sync)(file, contentOut); } return content; }; const syncYAML = async (options) => { await bluebird_1.Promise.resolve(options.srcInfo.FILES).map((f) => { return syncFile(f, options); }, { concurrency: 1 }); }; exports.syncYAML = syncYAML; const sync = async (options) => { return (0, exports.syncYAML)(options); }; exports.sync = sync; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3N5bmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTRCO0FBQzVCLGtEQUFzRDtBQUV0RCw0Q0FBZ0Q7QUFDaEQsZ0RBQW9EO0FBQ3BELDhDQUFrRDtBQUVsRCx1REFBd0Q7QUFFeEQsdUNBQThDO0FBSzlDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0FBQzNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUduQyx5Q0FBb0Q7QUFFcEQsMENBQTJDO0FBRTNDLHNEQUUrQjtBQUUvQiw4Q0FLMkI7QUFHM0IsNENBR3FCO0FBSXJCLHVDQUErRDtBQUUvRCwyQkFBMEI7QUFFMUIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBRTNDLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBZSxFQUFFLE9BQXFCLEVBQUUsRUFBRTtJQUN4RCxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDM0IsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQy9CLE9BQU87WUFDSCxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVU7WUFDekIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO1NBQ2hCLENBQUE7S0FDSjtTQUFNO1FBQ0gsT0FBTztZQUNILFVBQVUsRUFBRSxFQUFFO1lBQ2QsSUFBSSxFQUFFLE9BQU87U0FDaEIsQ0FBQTtLQUNKO0FBQ0wsQ0FBQyxDQUFBO0FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFlLEVBQUUsT0FBcUIsRUFBRSxFQUFFO0lBQzFELElBQUksR0FBRyxHQUFHLElBQUksZ0JBQUssQ0FDZjtRQUNJLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFF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