Skip to content

Commit 1c8e993

Browse files
authored
Merge pull request #597 from DocHubTeam/md-in-manifest
v3.14.0
2 parents ea7b2fb + d63247a commit 1c8e993

File tree

9 files changed

+67
-13
lines changed

9 files changed

+67
-13
lines changed
Binary file not shown.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
docs:
3+
dochub.example.markdown.metadata:
4+
title: Пример Markdown с включенным архитектурным манифестом
5+
location: /test
6+
type: markdown
7+
source: .
8+
dochub.example.markdown.metadata2:
9+
title: Пример Markdown с включенным архитектурным манифестом
10+
location: /test2
11+
type: markdown
12+
source: .
13+
---
14+
# Hello world!

public/documentation/docs/manual/docs/markdown.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,29 @@
2727

2828
![Кот](examples/cat.jpg)
2929

30+
### Архитектурный манифест в теле документа
31+
32+
Рекомендуется использовать данную функциональность с осторожностью, так как стандарт Markdown не предусматривает включение метаданных в документ.
33+
Тем не менее, многие инструменты поддерживают такую возможность. DocHub добавил поддержку метаданных в Markdown, начиная с версии v3.14.0.
34+
35+
Блок метаданных в теле документа начинается с трех тире "---" и заканчивается также ими "---". Пример документа:
36+
37+
```
38+
---
39+
docs:
40+
dochub.example.markdown.metadata:
41+
title: Пример Markdown с включенным архитектурным манифестом
42+
type: markdown
43+
source: .
44+
---
45+
# Hello world!
46+
```
47+
48+
Пример демонстрирует встраивание архитектурного манифеста в тело Markdown-документа. В данном случае манифест включает описание документа
49+
и ссылку на его содержимое в том же файле. Путь к текущему документу обозначается как точка ".".
50+
51+
Метаданные документ могут включать любой контент допустимый для архитектурного манифеста.
52+
3053
### Ссылки на объекты DocHub
3154
Добавляет ссылку на архитектурный объект. Пример для ссылки на документ:
3255
```

src/backend/controllers/storage.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Contributors:
3131
import logger from '../utils/logger.mjs';
3232
import request from '../helpers/request.mjs';
3333
import {getRoles} from '../helpers/jwt.mjs';
34-
import {getCurrentRuleId, getCurrentRules} from "../utils/rules.mjs";
34+
import {getCurrentRuleId, getCurrentRules} from '../utils/rules.mjs';
3535

3636
const LOG_TAG = 'controller-storage';
3737

@@ -47,8 +47,8 @@ export default (app) => {
4747
const hash = req.params.hash || '$unknown$';
4848
const url = req.originalUrl.slice(`/core/storage/${hash}/`.length).replace(/\%E2\%86\%90/g, '..');
4949
//const url = decodeURIComponent(req.params.url);
50-
const uri = url.split('?')[0];
5150
const baseURL = app.storage?.md5Map[hash];
51+
const uri = url.split('?')[0] || baseURL;
5252
logger.log(`Request to storage ${req.originalUrl}`, LOG_TAG);
5353
if (!baseURL || !uri) {
5454
res.status(403).json({
@@ -62,4 +62,4 @@ export default (app) => {
6262
}));
6363
}
6464
});
65-
};
65+
};

src/backend/storage/manager.mjs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import '../helpers/env.mjs';
4141

4242
import jsonataDriver from '../../global/jsonata/driver.mjs';
4343
import jsonataFunctions from '../../global/jsonata/functions.mjs';
44-
import {newManifest, loader, isRolesMode, DEFAULT_ROLE} from "../utils/rules.mjs";
44+
import {newManifest, loader, isRolesMode, DEFAULT_ROLE} from '../utils/rules.mjs';
4545

4646
const LOG_TAG = 'storage-manager';
4747

@@ -96,7 +96,7 @@ export default {
9696
for(let nRule in manifest?.roles) {
9797
if(app.new_rules[rule] === nRule) {
9898
mergeRules = mergeRules.concat(manifest?.roles[nRule]);
99-
ids.push(nRule)
99+
ids.push(nRule);
100100
}
101101
}
102102
}
@@ -113,7 +113,7 @@ export default {
113113
// Загрузку начинаем с виртуального манифеста
114114
cache.errorClear();
115115
let storageManifest = {};
116-
let createManifest = async function() {
116+
let createManifest = async() => {
117117
await manifestParser.clean();
118118
await manifestParser.startLoad();
119119
await manifestParser.import('file:///$root$');
@@ -122,7 +122,7 @@ export default {
122122
await manifestParser.stopLoad();
123123
};
124124

125-
let createRoleManifest = async function () {
125+
let createRoleManifest = async() => {
126126
try {
127127
// загружаю основной файл с ролями
128128
const {URI} = global.$roles;
@@ -139,9 +139,9 @@ export default {
139139
storageManifest.manifests[role] = newManifest(storageManifest.manifests.origin, exclude, filters);
140140
}
141141
} catch (e) {
142-
this.registerError(e, e.uri || uri);
142+
this.registerError(e, e.uri);
143143
}
144-
}
144+
};
145145

146146
await createManifest();
147147

src/frontend/components/Docs/DocMarkdown.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,10 @@
213213
content = mustache.render(data, this.source.dataset);
214214
} else
215215
content = data;
216+
// Извлекаем документ отделяя от метаданных если они есть
217+
const parts = content.split('---');
218+
if (parts.length === 3 && !parts[0])
219+
content = content.split('---').pop();
216220
this.markdown = this.prepareMarkdown(content);
217221
}).catch((e) => {
218222
this.error = e;

src/frontend/components/Docs/DocMixin.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ export default {
168168
},
169169
url() {
170170
let uri = this.profile.template || this.profile.source;
171+
if (uri === '.') uri = this.contentBasePath;
171172
uri?.startsWith('res://') && (uri = requests.expandResourceURI(uri));
172173
let result = this.profile ? uriTool.makeURIByBaseURI(uri, this.contentBasePath).toString() : null;
173174
if (!result) return null;

src/global/manifest/parser.mjs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import * as semver from 'semver';
3333
import cache from './services/cache.mjs';
3434
import prototype from './prototype.mjs';
35-
35+
import yaml from 'yaml';
3636

3737
class PackageError extends Error {
3838
constructor(uri, message) {
@@ -374,12 +374,18 @@ const parser = {
374374
},
375375

376376
async import(uri) {
377-
console.log('import.uri',uri);
377+
console.log('import.uri', uri);
378378
try {
379379
const response = this.onPullSource
380380
? await this.onPullSource(uri, '/', this)
381381
: await parser.cache.request(uri, '/');
382-
const manifest = response && (typeof response.data === 'object'
382+
let manifest;
383+
if (uri.toLowerCase().endsWith('.md')) {
384+
const parts = response.data.split('---');
385+
if (parts.length === 1) manifest = {};
386+
else if (parts.length !== 3) throw new Error('Incorrect metadata of markdown file');
387+
else manifest = yaml.parse(parts[1]);
388+
} else manifest = response && (typeof response.data === 'object'
383389
? response.data
384390
: JSON.parse(response.data));
385391

src/global/manifest/parser2.mjs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import cache from './services/cache.mjs'; // Сервис управления кэшем
3535
import * as semver from 'semver'; // Управление версиями
3636
import prototype from './prototype.mjs';
37+
import yaml from 'yaml';
3738

3839
// Кладовка
3940
// https://github.com/douglascrockford/JSON-js
@@ -458,7 +459,12 @@ parser.pushRequest = function(uri, owner) {
458459
request.then((response) => {
459460
// Удаляем из загрузок ресурс
460461
delete parser.sourceLoading[uri];
461-
success(response && (typeof response.data === 'object'
462+
if (response.headers?.['content-type'].match(/^.*\/markdown($|;.*$)/)) {
463+
const parts = response.data.split('---');
464+
if (parts.length === 1) success({});
465+
else if (parts.length !== 3) reject(new Error('Incorrect metadata of markdown file'));
466+
else success(yaml.parse(parts[1]));
467+
} else success(response && (typeof response.data === 'object'
462468
? response.data
463469
: JSON.parse(response.data))
464470
);

0 commit comments

Comments
 (0)