Skip to content

Commit 5ca2f70

Browse files
committed
feat: replace static URLs in course details information
1 parent 626c671 commit 5ca2f70

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

src/learningpath/CourseDetails.jsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
Close,
2222
} from '@openedx/paragon/icons';
2323
import { useCourseDetail } from './data/queries';
24-
import { buildAssetUrl } from '../util/assetUrl';
24+
import { buildAssetUrl, replaceStaticAssetReferences } from '../util/assetUrl';
2525
import { buildCourseHomeUrl } from './utils';
2626

2727
const CourseDetailContent = ({ course, isModalView = false, onClose }) => {
@@ -159,7 +159,10 @@ const CourseDetailContent = ({ course, isModalView = false, onClose }) => {
159159
<div className="p-4">
160160
<section id="about" className="mb-6">
161161
{/* eslint-disable-next-line react/no-danger */}
162-
<div dangerouslySetInnerHTML={{ __html: description || shortDescription || 'No description available.' }} />
162+
<div dangerouslySetInnerHTML={{
163+
__html: replaceStaticAssetReferences(description || shortDescription || 'No description available.', course.id),
164+
}}
165+
/>
163166
</section>
164167
</div>
165168
</>

src/util/assetUrl.js

+37
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,43 @@
11
import { getConfig } from '@edx/frontend-platform';
22

3+
/**
4+
* Build a complete URL for an asset by combining the LMS base URL with the asset path.
5+
* Handle path normalization to ensure exactly one slash is between base URL and asset path.
6+
*
7+
* @param {string} assetPath - The relative path to the asset.
8+
* @returns {string} Complete URL to the asset.
9+
*/
310
export function buildAssetUrl(assetPath) {
411
const base = getConfig().LMS_BASE_URL || '';
512
return `${base.replace(/\/+$/, '')}/${assetPath.replace(/^\/+/, '')}`;
613
}
14+
15+
/**
16+
* Replace static asset references in HTML content with absolute URLs.
17+
*
18+
* @param {string} htmlContent - The HTML content to process.
19+
* @param {string} [courseId] - Optional course ID for asset URLs.
20+
* @returns {string} Processed HTML with static asset references converted to absolute URLs.
21+
*/
22+
export function replaceStaticAssetReferences(htmlContent, courseId) {
23+
if (!htmlContent) {
24+
return '';
25+
}
26+
27+
return htmlContent.replace(
28+
/((?:src|href|data-src|poster)=)(["'])\/static\/([^"']+)\2/gi,
29+
(match, attrName, quote, fileName) => {
30+
const lmsBaseUrl = getConfig().LMS_BASE_URL || '';
31+
let assetUrl;
32+
33+
if (courseId) {
34+
const assetCourseId = courseId.replace('course-v1:', 'asset-v1:');
35+
assetUrl = `${lmsBaseUrl}/${assetCourseId}+type@asset+block@${fileName}`;
36+
} else {
37+
assetUrl = `${lmsBaseUrl}/static/${fileName}`;
38+
}
39+
40+
return `${attrName}${quote}${assetUrl}${quote}`;
41+
},
42+
);
43+
}

0 commit comments

Comments
 (0)