CrowiTemplate.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import dateFnsFormat from 'date-fns/format';
  2. export default class CrowiTemplate {
  3. constructor(crowi) {
  4. this.templatePattern = {
  5. 'year': this.getYear,
  6. 'month': this.getMonth,
  7. 'date': this.getDate,
  8. 'user': this.getUser,
  9. };
  10. }
  11. process(markdown) {
  12. // see: https://regex101.com/r/WR6IvX/3
  13. return markdown.replace(/:::\s*(\S+)[\r\n]((.|[\r\n])*?)[\r\n]:::/gm, (all, group1, group2) => {
  14. const lang = group1;
  15. let code = group2;
  16. if (!lang.match(/^template/)) {
  17. return all;
  18. }
  19. const templateId = new Date().getTime().toString(16) + Math.floor(1000 * Math.random()).toString(16);
  20. let pageName = lang;
  21. if (lang.match(':')) {
  22. pageName = this.parseTemplateString(lang.split(':')[1]);
  23. }
  24. code = this.parseTemplateString(code);
  25. return (
  26. /* eslint-disable quotes */
  27. `<div class="page-template-builder">` +
  28. `<button class="template-create-button btn btn-default" data-template="${templateId}" data-path="${pageName}">` +
  29. `<i class="fa fa-pencil"></i> ${pageName}` +
  30. `</button>` +
  31. `<pre><code id="${templateId}" class="lang-${lang}">${code}\n</code></pre>` +
  32. `</div>`
  33. /* eslint-enable */
  34. );
  35. });
  36. }
  37. getYear() {
  38. return dateFnsFormat(new Date(), 'YYYY');
  39. }
  40. getMonth() {
  41. return dateFnsFormat(new Date(), 'YYYY/MM');
  42. }
  43. getDate() {
  44. return dateFnsFormat(new Date(), 'YYYY/MM/DD');
  45. }
  46. getUser() {
  47. // FIXME
  48. const username = window.crowi.me || null;
  49. if (!username) {
  50. return '';
  51. }
  52. return `/user/${username}`;
  53. }
  54. parseTemplateString(templateString) {
  55. let parsed = templateString;
  56. Object.keys(this.templatePattern).forEach(key => {
  57. const k = key .replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  58. const matcher = new RegExp(`{${k}}`, 'g');
  59. if (parsed.match(matcher)) {
  60. const replacer = this.templatePattern[key]();
  61. parsed = parsed.replace(matcher, replacer);
  62. }
  63. });
  64. return parsed;
  65. }
  66. }