Skip to content

Commit a180195

Browse files
committed
add option to custom href in oast-to-hast
1 parent 2b242de commit a180195

File tree

10 files changed

+50
-101
lines changed

10 files changed

+50
-101
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,6 @@ dist
105105
*.d.ts.map
106106
!packages/reorg-parse/index.d.ts
107107
!packages/loader/index.d.ts
108+
109+
.meta.json
110+
.orga-build

packages/oast-to-hast/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* @typedef {import('./lib/state.js').Options} Options
2+
* @typedef {import('./lib/index.js').Options} Options
33
*/
44

55
export { handlers as defaultHandlers } from './lib/handlers/index.js'

packages/oast-to-hast/lib/handlers/link.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export function link(state, node) {
6161
type: 'element',
6262
tagName: 'a',
6363
properties: {
64-
href: node.path.value,
64+
href: state.options.linkHref(node),
6565
target: state.options.linkTarget
6666
},
6767
children: state.all(node)

packages/oast-to-hast/lib/handlers/section.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export function section(state, node) {
3333
}
3434

3535
/**
36-
* @param {import('../state.js').Options} options
36+
* @param {import('../state.js').Config} config
3737
* @param {string[]} tags
3838
* @returns {boolean}
3939
*/

packages/oast-to-hast/lib/index.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
/**
22
* @typedef {import('hast').Nodes} HastNodes
33
* @typedef {import('orga').Nodes} OastNodes
4+
* @typedef {Partial<import('./state.js').Config> | null | undefined} Options
45
*/
56

67
import { createState } from './state.js'
78

89
/**
910
* @param {OastNodes} tree
1011
* oast tree.
11-
* @param {import('./state.js').Options | null | undefined} [options]
12+
* @param {Options} [options]
1213
* Configuration (optional).
1314
* @returns {HastNodes}
1415
* hast tree.

packages/oast-to-hast/lib/state.js

+14-7
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
*/
77

88
/**
9-
* @typedef {Object} Options
10-
* @property {Handlers} [handlers]
11-
* @property {string} [linkTarget='_self']
12-
* @property {string[]} [selectTags=[]]
13-
* @property {string[]} [excludeTags=['noexport']]
9+
* @typedef {Object} Config
10+
* @property {Handlers} handlers
11+
* @property {string} linkTarget
12+
* @property {(link: import('orga').Link) => string} linkHref
13+
* @property {string[]} selectTags=[]
14+
* @property {string[]} excludeTags=['noexport']
1415
*/
1516

1617
/**
@@ -32,22 +33,28 @@ import { handlers as defaultHandlers } from './handlers/index.js'
3233

3334
/**
3435
* @param {OastNodes} tree
35-
* @param {Options | null | undefined} [options = {}]
36+
* @param {Partial<Config> | null | undefined} [options = {}]
3637
*/
3738
export function createState(tree, options = {}) {
3839
/** @type {Handlers} */
39-
const handlers = { ...defaultHandlers, ...options?.handlers }
40+
let handlers = { ...defaultHandlers }
41+
if (options?.handlers) {
42+
handlers = { ...handlers, ...options.handlers }
43+
}
4044

4145
const state = {
4246
one,
4347
all,
4448
handlers,
4549
getAttrHtml,
4650
patch,
51+
/** @type {Config} */
4752
options: {
53+
handlers,
4854
linkTarget: '_self',
4955
selectTags: [],
5056
excludeTags: ['noexport'],
57+
linkHref: (link) => link.path.value,
5158
...options
5259
}
5360
}

packages/orga-build/cli.js

-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import { argv } from 'node:process'
44
import { parseArgs } from 'node:util'
55
import { watch } from './lib/watch.js'
6-
// import { loadConfig, clean } from './lib/build.js'
76
import { build } from './lib/esbuild/build.js'
87
import { loadConfig } from './lib/config.js'
98
import { serve } from './lib/serve.js'
@@ -24,8 +23,6 @@ const config = await loadConfig(
2423
'orga.config.ts'
2524
)
2625

27-
console.log('config', config)
28-
2926
await build(config)
3027

3128
if (positionals.includes('dev')) {

packages/orga-build/lib/esbuild/build.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,21 @@ export async function build({ outDir = 'dir', preBuild = [], postBuild = [] }) {
6363
outdir: '.orga-build/js',
6464
// splitting: true,
6565
metafile: true,
66-
plugins: [esbuildOrga(), rawLoader, resolveReact],
66+
plugins: [
67+
esbuildOrga({
68+
reorgRehypeOptions: {
69+
linkHref: (link) => {
70+
if (link.path.protocol === 'file') {
71+
return link.path.value.replace(/\.org$/, '.html')
72+
}
73+
return link.path.value
74+
}
75+
}
76+
// reorgPlugins: [reorgLinks]
77+
}),
78+
rawLoader,
79+
resolveReact
80+
],
6781
// external: ['react/jsx-runtime'],
6882
loader: {
6983
'.jsx': 'jsx',

packages/orga-build/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"author": "Xiaoxing Hu <[email protected]>",
1414
"license": "MIT",
1515
"dependencies": {
16-
"@orgajs/esbuild": "^1.1.1",
16+
"@orgajs/esbuild": "workspace:^",
1717
"@orgajs/node-loader": "workspace:^",
1818
"esbuild": "^0.24.2",
1919
"globby": "^14.0.2",
@@ -27,6 +27,7 @@
2727
"@types/node": "^22.13.1",
2828
"@types/react": "^19.0.8",
2929
"@types/react-dom": "^19.0.3",
30-
"@types/serve-handler": "^6.1.4"
30+
"@types/serve-handler": "^6.1.4",
31+
"orga": "workspace:^"
3132
}
3233
}

pnpm-lock.yaml

+10-84
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)