Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(tag): use url_for #5385

Merged
merged 5 commits into from
Apr 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/box/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,10 @@ class Box extends EventEmitter {
if (!params) return count;

const file = new File({
// source is used for filesystem path, keep backslashes on Windows
source: join(base, path),
path,
// path is used for URL path, replace backslashes on Windows
path: escapeBackslash(path),
params,
type
});
Expand Down
5 changes: 3 additions & 2 deletions lib/models/post_asset.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import warehouse from 'warehouse';
import { join } from 'path';
import { join, posix } from 'path';
import type Hexo from '../hexo';

export = (ctx: Hexo) => {
Expand All @@ -19,7 +19,8 @@ export = (ctx: Hexo) => {
// PostAsset.path is file path relative to `public_dir`
// no need to urlescape, #1562
// strip /\.html?$/ extensions on permalink, #2134
return join(post.path.replace(/\.html?$/, ''), this.slug);
// Use path.posix.join to avoid path.join introducing unwanted backslashes on Windows.
return posix.join(post.path.replace(/\.html?$/, ''), this.slug);
});

PostAsset.virtual('source').get(function() {
Expand Down
1 change: 1 addition & 0 deletions lib/plugins/tag/asset_img.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export = (ctx: Hexo) => {
for (let i = 0; i < len; i++) {
const asset = PostAsset.findOne({post: this._id, slug: args[i]});
if (asset) {
// img tag will call url_for so no need to call it here
args[i] = encodeURL(new URL(asset.path, ctx.config.url).pathname);
return img(ctx)(args);
}
Expand Down
4 changes: 2 additions & 2 deletions lib/plugins/tag/asset_link.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { encodeURL, escapeHTML } from 'hexo-util';
import { url_for, escapeHTML } from 'hexo-util';
import type Hexo from '../../hexo';

/**
Expand Down Expand Up @@ -28,7 +28,7 @@ export = (ctx: Hexo) => {
const attrTitle = escapeHTML(title);
if (escape === 'true') title = attrTitle;

const link = encodeURL(new URL(asset.path, ctx.config.url).pathname);
const link = url_for.call(ctx, asset.path);

return `<a href="${link}" title="${attrTitle}">${title}</a>`;
};
Expand Down
4 changes: 2 additions & 2 deletions lib/plugins/tag/asset_path.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { encodeURL } from 'hexo-util';
import { url_for } from 'hexo-util';
import type Hexo from '../../hexo';

/**
Expand All @@ -17,7 +17,7 @@ export = (ctx: Hexo) => {
const asset = PostAsset.findOne({post: this._id, slug});
if (!asset) return;

const path = encodeURL(new URL(asset.path, ctx.config.url).pathname);
const path = url_for.call(ctx, asset.path);

return path;
};
Expand Down
11 changes: 2 additions & 9 deletions lib/plugins/tag/post_link.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { encodeURL, escapeHTML } from 'hexo-util';
import { url_for, escapeHTML } from 'hexo-util';
import { postFindOneFactory } from './';
import type Hexo from '../../hexo';

Expand Down Expand Up @@ -41,14 +41,7 @@ export = (ctx: Hexo) => {
const attrTitle = escapeHTML(post.title || post.slug);
if (escape === 'true') title = escapeHTML(title);

// guarantee the base url ends with a slash. (case of using a subdirectory in the url of the site)
let baseUrl = ctx.config.url;
if (!baseUrl.endsWith('/')) {
baseUrl += '/';
}

const url = new URL(post.path, baseUrl).pathname + (hash ? `#${hash}` : '');
const link = encodeURL(url);
const link = url_for.call(ctx, post.path + (hash ? `#${hash}` : ''));

return `<a href="${link}" title="${attrTitle}">${title}</a>`;
};
Expand Down
4 changes: 2 additions & 2 deletions lib/plugins/tag/post_path.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { encodeURL } from 'hexo-util';
import { url_for } from 'hexo-util';
import { postFindOneFactory } from './';
import type Hexo from '../../hexo';

Expand All @@ -17,7 +17,7 @@ export = (ctx: Hexo) => {
const post = factory({ slug }) || factory({ title: slug });
if (!post) return;

const link = encodeURL(new URL(post.path, ctx.config.url).pathname);
const link = url_for.call(ctx, post.path);

return link;
};
Expand Down
10 changes: 5 additions & 5 deletions test/scripts/models/post_asset.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { join } from 'path';
import { join, posix } from 'path';
import Hexo from '../../../lib/hexo';
import defaults from '../../../lib/hexo/default_config';

Expand Down Expand Up @@ -54,7 +54,7 @@ describe('PostAsset', () => {
slug: 'foo.jpg',
post: post._id
});
data.path.should.eql(join(post.path, data.slug));
data.path.should.eql(posix.join(post.path, data.slug));

PostAsset.removeById(data._id);
});
Expand All @@ -66,7 +66,7 @@ describe('PostAsset', () => {
slug: 'foo.htm',
post: post._id
});
data.path.should.eql(join(post.path, data.slug));
data.path.should.eql(posix.join(post.path, data.slug));

PostAsset.removeById(data._id);
});
Expand All @@ -78,7 +78,7 @@ describe('PostAsset', () => {
slug: 'foo.htm',
post: post._id
});
data.path.should.eql(join(post.path, data.slug));
data.path.should.eql(posix.join(post.path, data.slug));

PostAsset.removeById(data._id);
});
Expand All @@ -90,7 +90,7 @@ describe('PostAsset', () => {
slug: 'foo.html',
post: post._id
});
data.path.should.eql(join(post.path + '.htm-foo/', data.slug));
data.path.should.eql(posix.join(post.path + '.htm-foo/', data.slug));

PostAsset.removeById(data._id);
});
Expand Down
2 changes: 1 addition & 1 deletion test/scripts/tags/post_link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ describe('post_link', () => {
});

it('should keep subdir', () => {
hexo.config.url = 'http://example.com/subdir';
hexo.config.root = '/subdir/';
postLink(['foo']).should.eql('<a href="/subdir/foo/" title="Hello world">Hello world</a>');
});
});
Loading