@alveole/storybook 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/components/SearchField.js +3 -3
- package/dist/components/StoryCard.d.ts.map +1 -1
- package/dist/components/StoryCard.js +3 -2
- package/dist/screens/StoryDetailScreen.d.ts.map +1 -1
- package/dist/screens/StoryDetailScreen.js +12 -6
- package/dist/screens/ThemeCSSVariablesScreen.d.ts.map +1 -1
- package/dist/screens/ThemeCSSVariablesScreen.js +1 -6
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +11 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -69,6 +69,16 @@ export const BoxPadded = () => (
|
|
|
69
69
|
|
|
70
70
|
Le `default` porte les metadonnees de la story. Les autres exports sont les variantes affichees par `StoryDetailScreen`.
|
|
71
71
|
|
|
72
|
+
### Champ `shortDescription`
|
|
73
|
+
|
|
74
|
+
Optionnel. A renseigner quand `description` contient du Markdown ou depasse 160 caracteres.
|
|
75
|
+
|
|
76
|
+
- Max 160 caracteres
|
|
77
|
+
- Texte brut uniquement (pas de Markdown)
|
|
78
|
+
- Utilise pour `<meta name="description">` sur la page de detail du composant
|
|
79
|
+
|
|
80
|
+
Si absent, la meta description est calculee automatiquement en retirant le Markdown de `description`.
|
|
81
|
+
|
|
72
82
|
Concretement, `@alveole/storybook` n'introduit pas un nouveau format de story. Il reutilise celui que tu ecris deja dans `packages/components/src/**/*.stories.tsx`.
|
|
73
83
|
|
|
74
84
|
## Structure attendue par le package
|
|
@@ -4,7 +4,7 @@ import { useTheme } from '@alveole/theme';
|
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import { Platform, TextInput } from 'react-native';
|
|
6
6
|
export const SearchField = ({ label, placeholder, value, onChangeText, size = 'md' }) => {
|
|
7
|
-
const { text, color, radius,
|
|
7
|
+
const { text, color, radius, spacingValue } = useTheme();
|
|
8
8
|
const inputRef = React.useRef(null);
|
|
9
9
|
React.useEffect(() => {
|
|
10
10
|
if (Platform.OS !== 'web')
|
|
@@ -22,8 +22,8 @@ export const SearchField = ({ label, placeholder, value, onChangeText, size = 'm
|
|
|
22
22
|
borderWidth: 1,
|
|
23
23
|
borderColor: color.light.border['default-grey'],
|
|
24
24
|
borderRadius: radius('md'),
|
|
25
|
-
paddingVertical: size === 'sm' ?
|
|
26
|
-
paddingHorizontal:
|
|
25
|
+
paddingVertical: size === 'sm' ? spacingValue('1,5V') : spacingValue('1W'),
|
|
26
|
+
paddingHorizontal: spacingValue('2W'),
|
|
27
27
|
backgroundColor: color.light.background['default-grey'],
|
|
28
28
|
color: color.light.text['default-grey'],
|
|
29
29
|
...(size === 'sm' ? text['Corps de texte'].SM.Regular : text['Corps de texte'].MD.Regular),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoryCard.d.ts","sourceRoot":"","sources":["../../src/components/StoryCard.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,oBAAoB,cAAc,
|
|
1
|
+
{"version":3,"file":"StoryCard.d.ts","sourceRoot":"","sources":["../../src/components/StoryCard.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,oBAAoB,cAAc,gCAgC3D,CAAC"}
|
|
@@ -2,10 +2,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Badge, Box, Card, Typography } from '@alveole/components';
|
|
3
3
|
import { useTheme } from '@alveole/theme';
|
|
4
4
|
import { Pressable } from 'react-native';
|
|
5
|
-
import { getStoryFlags } from '../utils';
|
|
5
|
+
import { getStoryFlags, stripMarkdown } from '../utils';
|
|
6
6
|
export const StoryCard = ({ story, onPress }) => {
|
|
7
7
|
const { text, isVariant } = useTheme();
|
|
8
8
|
const meta = story.default;
|
|
9
9
|
const flags = getStoryFlags(meta);
|
|
10
|
-
|
|
10
|
+
const description = meta.shortDescription ?? stripMarkdown(meta.description);
|
|
11
|
+
return (_jsx(Pressable, { onPress: onPress ? () => onPress(story) : undefined, style: { height: isVariant('mobile') ? undefined : '100%' }, children: _jsx(Card, { height: isVariant('mobile') ? undefined : '100%', children: _jsxs(Box, { display: "flex", gap: 12, p: '100', style: { height: isVariant('mobile') ? undefined : '100%' }, children: [_jsxs(Box, { display: "flex", flexDirection: "row", flexWrap: "wrap", gap: 8, children: [meta.tags.map(tag => (_jsx(Badge, { variant: "info", size: "sm", style: { marginRight: 0 }, children: tag }, tag))), flags.map(flag => (_jsx(Badge, { variant: "default", size: "sm", style: { marginRight: 0 }, children: flag.label }, flag.key)))] }), _jsx(Typography, { style: text.Titres['H5 - XS'], children: meta.title }), _jsx(Typography, { style: text['Corps de texte'].SM.Regular, children: description })] }) }) }));
|
|
11
12
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoryDetailScreen.d.ts","sourceRoot":"","sources":["../../src/screens/StoryDetailScreen.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StoryDetailScreen.d.ts","sourceRoot":"","sources":["../../src/screens/StoryDetailScreen.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACjC,CAAC;AA0IF,eAAO,MAAM,iBAAiB,GAAI,2DAK/B,sBAAsB,sBAyKxB,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { AnchorHeading, Box, Button, Divider, Page, PageHeader, Section, Typography } from '@alveole/components';
|
|
2
|
+
import { AnchorHeading, Box, Button, Divider, MarkdownDescription, Page, PageHeader, Section, Typography, } from '@alveole/components';
|
|
3
3
|
import { useTheme } from '@alveole/theme';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import { Linking, ScrollView } from 'react-native';
|
|
6
6
|
import { JsonBlock } from '../components/JsonBlock';
|
|
7
7
|
import { screenContent } from '../styles';
|
|
8
|
-
import { getStoryExamples, getStoryFlags } from '../utils';
|
|
8
|
+
import { getStoryExamples, getStoryFlags, stripMarkdown } from '../utils';
|
|
9
9
|
const DetailPill = ({ label, tone = 'info' }) => {
|
|
10
10
|
const { color, radius, text, spacing } = useTheme();
|
|
11
11
|
return (_jsx(Box, { borderColor: tone === 'tag' ? color.light.border['action-low-primary'] : color.light.border['default-grey'], borderRadius: radius('full'), borderWidth: 1, style: {
|
|
@@ -25,8 +25,9 @@ const MetaCard = ({ label, value }) => {
|
|
|
25
25
|
const { color, radius, text } = useTheme();
|
|
26
26
|
return (_jsxs(Box, { borderColor: color.light.border['default-grey'], borderRadius: radius('md'), borderWidth: 1, display: "flex", gap: 4, p: '100', style: { backgroundColor: color.light.background['alt-grey'], minWidth: 160 }, children: [_jsx(Typography, { style: text['Corps de texte'].XS.CapsBold, children: label }), _jsx(Typography, { style: text['Corps de texte'].SM.SemiBold, children: value })] }));
|
|
27
27
|
};
|
|
28
|
+
const getSources = (story) => story.Sources;
|
|
28
29
|
const getStoryExampleSource = (story, exampleName) => {
|
|
29
|
-
const sources = story
|
|
30
|
+
const sources = getSources(story);
|
|
30
31
|
const source = sources?.storySources?.[exampleName] ?? sources?.[exampleName];
|
|
31
32
|
if (typeof source === 'string')
|
|
32
33
|
return source;
|
|
@@ -36,6 +37,10 @@ const getStoryExampleSource = (story, exampleName) => {
|
|
|
36
37
|
}
|
|
37
38
|
return null;
|
|
38
39
|
};
|
|
40
|
+
const getStoryExampleDescription = (story, exampleName) => {
|
|
41
|
+
const description = getSources(story)?.storyDescriptions?.[exampleName];
|
|
42
|
+
return typeof description === 'string' ? description : null;
|
|
43
|
+
};
|
|
39
44
|
const DetailTabs = ({ tabs, defaultValue }) => {
|
|
40
45
|
const initialValue = defaultValue || tabs[0]?.value || '';
|
|
41
46
|
const [activeValue, setActiveValue] = React.useState(initialValue);
|
|
@@ -53,16 +58,17 @@ export const StoryDetailScreen = ({ story, notFoundMessage = 'Story not found.',
|
|
|
53
58
|
const isTemplate = meta.tags.includes('Template');
|
|
54
59
|
const examplesContent = (_jsx(Box, { display: "flex", gap: 24, mt: '1,5V', children: examples.map(([key, Example]) => {
|
|
55
60
|
const source = getStoryExampleSource(story, key);
|
|
56
|
-
|
|
61
|
+
const description = getStoryExampleDescription(story, key);
|
|
62
|
+
return (_jsxs(Box, { borderColor: color.light.border['default-grey'], borderRadius: radius('lg'), borderWidth: 1, display: "flex", gap: 16, p: '150', style: { backgroundColor: color.light.background['alt-grey'] }, children: [!isTemplate ? (_jsxs(Box, { display: "flex", gap: 6, children: [_jsx(AnchorHeading, { style: text.Titres['H5 - XS'], children: key }), description ? _jsx(MarkdownDescription, { children: description }) : null] })) : null, _jsx(Box, { borderColor: color.light.border['default-grey'], borderWidth: 1, borderRadius: radius('md'), p: '100', style: {
|
|
57
63
|
backgroundColor: color.light.background['default-grey'],
|
|
58
64
|
minHeight: isTemplate ? 420 : undefined,
|
|
59
65
|
}, children: _jsx(Example, {}) }), _jsx(Divider, { mt: "1W", mb: "1,5V" }), source ? _jsx(JsonBlock, { language: "tsx", value: source }) : null] }, key));
|
|
60
66
|
}) }));
|
|
61
|
-
return (_jsx(Page, { scrollable: true, title: meta.title, description: meta.description, beforeContent: beforeContent, footerContent: footerContent, children: _jsxs(Box, { ...screenContent, children: [_jsx(Section, { withPaddingY: false, children: _jsx(PageHeader, { title: meta.title }) }), _jsx(Section, { withPaddingY: false, children: _jsxs(Box, { display: "flex", gap: 20, children: [_jsxs(Box, { borderColor: color.light.border['default-grey'], borderRadius: radius('lg'), borderWidth: 1, display: "flex", gap: 16, p: '150', style: { backgroundColor: color.light.background['alt-grey'] }, children: [_jsxs(Box, { display: "flex", gap: 12, style: {
|
|
67
|
+
return (_jsx(Page, { scrollable: true, title: meta.title, description: meta.shortDescription ?? stripMarkdown(meta.description), beforeContent: beforeContent, footerContent: footerContent, children: _jsxs(Box, { ...screenContent, children: [_jsx(Section, { withPaddingY: false, children: _jsx(PageHeader, { title: meta.title }) }), _jsx(Section, { withPaddingY: false, children: _jsxs(Box, { display: "flex", gap: 20, children: [_jsxs(Box, { borderColor: color.light.border['default-grey'], borderRadius: radius('lg'), borderWidth: 1, display: "flex", gap: 16, p: '150', style: { backgroundColor: color.light.background['alt-grey'] }, children: [_jsxs(Box, { display: "flex", gap: 12, style: {
|
|
62
68
|
alignItems: 'flex-start',
|
|
63
69
|
flexDirection: 'row',
|
|
64
70
|
justifyContent: 'space-between',
|
|
65
|
-
}, children: [
|
|
71
|
+
}, children: [_jsx(Box, { display: "flex", gap: 6, style: { flex: 1 }, children: _jsx(MarkdownDescription, { children: meta.description }) }), meta.figmaURL ? (_jsx(Button, { title: "Ouvrir Figma", variant: "primary", onPress: () => Linking.openURL(meta.figmaURL) })) : null] }), _jsxs(Box, { display: "flex", gap: 10, children: [_jsx(Typography, { style: text['Corps de texte'].XS.CapsBold, children: "Tags" }), _jsx(Box, { display: "flex", flexDirection: "row", flexWrap: "wrap", gap: 8, children: meta.tags.map(tag => (_jsx(DetailPill, { label: tag, tone: "tag" }, tag))) })] }), flags.length > 0 ? (_jsxs(Box, { display: "flex", gap: 10, children: [_jsx(Typography, { style: text['Corps de texte'].XS.CapsBold, children: "Informations" }), _jsx(Box, { display: "flex", flexDirection: "row", flexWrap: "wrap", gap: 8, children: flags.map(flag => (_jsx(DetailPill, { label: flag.label }, flag.key))) })] })) : null, _jsxs(Box, { display: "flex", flexDirection: "row", flexWrap: "wrap", gap: 12, children: [_jsx(MetaCard, { label: "Exemples", value: String(examples.length) }), _jsx(MetaCard, { label: "Styles", value: "Disponibles" }), meta.props != null ? _jsx(MetaCard, { label: "Props", value: "Document\u00E9es" }) : null] })] }), _jsx(DetailTabs, { defaultValue: "examples", tabs: [
|
|
66
72
|
{
|
|
67
73
|
value: 'examples',
|
|
68
74
|
label: 'Examples',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeCSSVariablesScreen.d.ts","sourceRoot":"","sources":["../../src/screens/ThemeCSSVariablesScreen.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ThemeCSSVariablesScreen.d.ts","sourceRoot":"","sources":["../../src/screens/ThemeCSSVariablesScreen.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,OAAO,CAAC;AA0P1B,MAAM,MAAM,4BAA4B,GAAG;IACzC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACjC,CAAC;AAIF,eAAO,MAAM,uBAAuB,GAAI,kCAAkC,4BAA4B,sBA+DrG,CAAC"}
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Accordion, Box, Page, PageHeader, Section, Typography, useToast } from '@alveole/components';
|
|
3
|
-
import { Colors, CustomPalette, Spacings, useTheme } from '@alveole/theme';
|
|
4
|
-
import { Elevations } from '@alveole/theme/src/constants/Elevation';
|
|
5
|
-
import { FontWeightMap } from '@alveole/theme/src/constants/Font';
|
|
6
|
-
import { RadiusList } from '@alveole/theme/src/constants/Radius';
|
|
7
|
-
import { CustomTypography } from '@alveole/theme/src/constants/Typography';
|
|
8
|
-
import { sanitizeCSSKey } from '@alveole/theme/src/helpers/sanitizeCSSKey';
|
|
3
|
+
import { Colors, CustomPalette, CustomTypography, Elevations, FontWeightMap, RadiusList, Spacings, sanitizeCSSKey, useTheme, } from '@alveole/theme';
|
|
9
4
|
import React from 'react';
|
|
10
5
|
import { Platform, Pressable } from 'react-native';
|
|
11
6
|
import { screenContent } from '../styles';
|
package/dist/utils.d.ts
CHANGED
|
@@ -14,4 +14,5 @@ export declare const getStoryExamples: (story: StorybookModule) => [string, Excl
|
|
|
14
14
|
export declare const toStoryModules: (stories: Record<string, unknown>) => StorybookModule[];
|
|
15
15
|
export declare const findStoryByTitle: (stories: StorybookModule[], title: string | undefined | null) => StorybookModule | null;
|
|
16
16
|
export declare const findConstantByName: (constants: Record<string, unknown>, name: string | undefined | null) => [string, unknown] | null;
|
|
17
|
+
export declare const stripMarkdown: (markdown: string) => string;
|
|
17
18
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAUxE,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,WAIP,CAAC;AAErC,eAAO,MAAM,aAAa,GAAI,MAAM,aAAa,KAAG,aAAa,EAC+B,CAAC;AAEjG,eAAO,MAAM,eAAe,GAAI,SAAS,eAAe,EAAE,KAAG,MAAM,EAOlE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ;IACpC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;CAC3C,sBAoBA,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,eAAe,EAAE,sBAC8B,CAAC;AAE5F,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,EAAE,EAAE,MAAM,MAAM,EAAE,6CAGd,CAAC;AAE/D,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe,KAC+C,CAClG,MAAM,EACN,OAAO,CAAC,eAAe,CAAC,MAAM,eAAe,CAAC,EAAE,aAAa,CAAC,CAC/D,EAAE,CAAC;AAEN,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAA+B,eAAe,EAAE,CAAC;AAEhH,eAAO,MAAM,gBAAgB,GAAI,SAAS,eAAe,EAAE,EAAE,OAAO,MAAM,GAAG,SAAS,GAAG,IAAI,2BAC/B,CAAC;AAE/D,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,6BACrC,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAUxE,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,WAIP,CAAC;AAErC,eAAO,MAAM,aAAa,GAAI,MAAM,aAAa,KAAG,aAAa,EAC+B,CAAC;AAEjG,eAAO,MAAM,eAAe,GAAI,SAAS,eAAe,EAAE,KAAG,MAAM,EAOlE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ;IACpC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;CAC3C,sBAoBA,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,eAAe,EAAE,sBAC8B,CAAC;AAE5F,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,EAAE,EAAE,MAAM,MAAM,EAAE,6CAGd,CAAC;AAE/D,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe,KAC+C,CAClG,MAAM,EACN,OAAO,CAAC,eAAe,CAAC,MAAM,eAAe,CAAC,EAAE,aAAa,CAAC,CAC/D,EAAE,CAAC;AAEN,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAA+B,eAAe,EAAE,CAAC;AAEhH,eAAO,MAAM,gBAAgB,GAAI,SAAS,eAAe,EAAE,EAAE,OAAO,MAAM,GAAG,SAAS,GAAG,IAAI,2BAC/B,CAAC;AAE/D,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,6BACrC,CAAC;AAElE,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,KAAG,MAWtC,CAAC"}
|
package/dist/utils.js
CHANGED
|
@@ -46,3 +46,14 @@ export const getStoryExamples = (story) => Object.entries(story).filter(([key, v
|
|
|
46
46
|
export const toStoryModules = (stories) => Object.values(stories);
|
|
47
47
|
export const findStoryByTitle = (stories, title) => stories.find(story => story.default.title === title) ?? null;
|
|
48
48
|
export const findConstantByName = (constants, name) => Object.entries(constants).find(([key]) => key === name) ?? null;
|
|
49
|
+
export const stripMarkdown = (markdown) => markdown
|
|
50
|
+
.replace(/#{1,6}\s*/g, '')
|
|
51
|
+
.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
52
|
+
.replace(/__([^_]+)__/g, '$1')
|
|
53
|
+
.replace(/\*([^*]+)\*/g, '$1')
|
|
54
|
+
.replace(/_([^_]+)_/g, '$1')
|
|
55
|
+
.replace(/`([^`]+)`/g, '$1')
|
|
56
|
+
.replace(/^\s*[-*+]\s+/gm, '')
|
|
57
|
+
.replace(/^\s*\d+\.\s+/gm, '')
|
|
58
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
|
|
59
|
+
.trim();
|