mono/packages/discourse/lib/sync/fs.js

275 lines
22 KiB
JavaScript

"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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