Translit slug
-
Are there any possibility to use transliteration slug during the creation of categories and posts? I do not know what with other languages, but with Russian is not very good search engines work.
-
@julian
/forum/category/134/вероятно-нехорошо-для-поисковиков
-
@julian It Could Be
-
@sergej-saveljev said:
/forum/category/134/вероятно-нехорошо-для-поисковиков`
You can still read this.
/forum/category/134/probably-not-good-for-search-enginesDo you want to remove /forum/category/134/ from the URL?
-
@nhl.pl no.
-
@julian need, when create a categories and posts, translit
вероятно-нехорошо-для-поисковиков
toverojatno-nexorosho-dlja-poiskovikov
-
It can be done with iconv-lite.
https://www.npmjs.com/package/iconv-lite
https://github.com/ashtuchkin/iconv-lite -
In the near future it's going to be used in nodebb-plugin-import.
-
Oh I see... to use Latin transliteration for the url slug.
A plugin can conceivably be written for this, expressly for Russian languages (and possibly any other languages that could benefit from this kind of service), listening for the topic creation hook, and changing the slug afterwards.
-
@julian Made, thank you!
-
But i not find topic edit method, where is he?
-
@julian you misunderstood me.
I added new fireHook in file ./src/topics/create.js:
Topics.create = function(data, callback) { plugins.fireHook('filter:topic.create', data, function(err, data){ if (err) { return callback(err); } var uid = data.uid, title = data.title, cid = data.cid, tags = data.tags, slugw = data.slug ? data.slug : title; db.incrObjectField('global', 'nextTid', function(err, tid) { if (err) { return callback(err); } var slug = utils.slugify(slugw), timestamp = Date.now(); if (!slug.length) { return callback(new Error('[[error:invalid-title]]')); } slug = tid + '/' + slug; var topicData = { 'tid': tid, 'uid': uid, 'cid': cid, 'mainPid': 0, 'title': title, 'slug': slug, 'timestamp': timestamp, 'lastposttime': 0, 'postcount': 0, 'viewcount': 0, 'locked': 0, 'deleted': 0, 'pinned': 0 }; if (data.thumb) { topicData.thumb = data.thumb; } db.setObject('topic:' + tid, topicData, function(err) { if (err) { return callback(err); } async.parallel([ function(next) { db.sortedSetsAdd([ 'topics:tid', 'cid:' + cid + ':tids', 'cid:' + cid + ':uid:' + uid + ':tids' ], timestamp, tid, next); }, function(next) { user.addTopicIdToUser(uid, tid, timestamp, next); }, function(next) { db.incrObjectField('category:' + cid, 'topic_count', next); }, function(next) { db.incrObjectField('global', 'topicCount', next); }, function(next) { Topics.createTags(tags, tid, timestamp, next); } ], function(err) { if (err) { return callback(err); } plugins.fireHook('action:topic.save', topicData); callback(null, tid); }); }); }); }); };
And in plugin used:
(function(module) { "use strict"; var mod = {}, translit = require('translitit-cyrillic-russian-to-latin'); mod.topicCreate = function(data, callback) { data.slug = translit(data.title); callback(null, data); }; module.exports = mod; }(module));
translitit-cyrillic-russian-to-latin my fork on github.
-
And I can not find a method of editing a topic in topics folder, to add the appropriate fireHook.
-
@julian yes, it PostTools.edit
-
In file ./src/postTools.js:
PostTools.edit = function(data, callback) { var options = data.options || {}, title = data.title.trim(); async.waterfall([ function (next) { privileges.posts.canEdit(data.pid, data.uid, next); }, function(canEdit, next) { if (!canEdit) { return next(new Error('[[error:no-privileges]]')); } posts.getPostData(data.pid, next); }, function(postData, next) { postData.content = data.content; plugins.fireHook('filter:post.edit', {post: postData, uid: data.uid}, next); } ], function(err, result) { if (err) { return callback(err); } var postData = result.post; async.parallel({ post: function(next) { var d = { edited: Date.now(), editor: data.uid, content: postData.content }; if (data.handle) { d.handle = data.handle; } posts.setPostFields(data.pid, d, next); }, topic: function(next) { var tid = postData.tid; async.parallel({ cid: function(next) { topics.getTopicField(tid, 'cid', next); }, isMain: function(next) { posts.isMain(data.pid, next); } }, function(err, results) { plugins.fireHook('filter:topic.edit', {post: postData, topic: results, title: title}, function(err, res) { if (err) { return next(err); } var postData = res.post, results = res.topic, slug = res.slug || title; options.tags = options.tags || []; if (!results.isMain) { return next(null, { tid: tid, cid: results.cid, isMainPost: false }); } var topicData = { tid: tid, cid: results.cid, uid: postData.uid, mainPid: data.pid, title: title, slug: tid + '/' + utils.slugify(slug) }; if (options.topic_thumb) { topicData.thumb = options.topic_thumb; } db.setObject('topic:' + tid, topicData, function(err) { plugins.fireHook('action:topic.edit', topicData); }); topics.updateTags(tid, options.tags, function(err) { if (err) { return next(err); } topics.getTopicTagsObjects(tid, function(err, tags) { next(err, { tid: tid, cid: results.cid, uid: postData.uid, title: validator.escape(title), isMainPost: results.isMain, tags: tags }); }); }); }); }); }, postData: function(next) { cache.del(postData.pid); PostTools.parsePost(postData, next); } }, function(err, results) { if (err) { return callback(err); } postData.cid = results.topic.cid; results.content = results.postData.content; plugins.fireHook('action:post.edit', postData); callback(null, results); }); }); };
The same method as for the creation of topics and everything is super!