vault backup: 2025-09-09 16:43:52

This commit is contained in:
CrazyJasonwell committed 2025-09-09 16:43:52 +08:00
1 parent 4f64808a52
commit 5a302d7abc
12 files changed
+599 -58

No files matched your search

+3 -1
View File
@@ -69,5 +69,7 @@
"docxer",
"marp-slides",
"vscode-editor",
"open-vscode"
"open-vscode",
"obsidian-file-link",
"slides-extended"
]
+1 -1
View File
@@ -34,7 +34,7 @@
"contentTemplate": "# {{{title}}}\n\n{{{description}}}\n\n{{{article_title}}} //文章内容标题\n{{{content}}} //文章正文\n\n\n[Read in Cubox]({{{cubox_url}}}) \n[Read Original]({{{url}}}) \n\n---\n\n{{#highlights.length}}\n## Annotations \n\n{{#highlights}}\n> {{{text}}} \n\n{{#note}}\n{{{note}}}\n{{/note}}\n[Link️]({{{cubox_url}}}) \n\n{{/highlights}}\n{{/highlights.length}}",
"highlightInContent": true,
"dateFormat": "yyyy-MM-dd",
"lastSyncTime": 1757401682422,
"lastSyncTime": 1757406134322,
"lastSyncCardId": "7362485231795834846",
"lastCardUpdateTime": "2025-09-02T17:21:26.574+0800",
"syncing": false
+6
View File
@@ -0,0 +1,6 @@
{
"linkPrefix": "",
"showFileEnding": true,
"linkFolder": true,
"embedFile": true
}
+514
View File
@@ -0,0 +1,514 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
if you want to view the source visit the plugins github repository
*/
'use strict';
var obsidian = require('obsidian');
var fs = require('fs');
var path = require('path');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
var path__namespace = /*#__PURE__*/_interopNamespace(path);
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
}
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
var e = new Error(message);
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};
var DEFAULT_SETTINGS = {
linkPrefix: "",
showFileEnding: false,
linkFolder: false,
embedFile: false
};
var SUPPORTED_EMBED_FILE_TYPES = [
".md",
".png",
".jpg",
".jpeg",
".gif",
".bmp",
".svg",
".mp3",
".webm",
".wav",
".m4a",
".ogg",
".3gp",
".flac",
".mp4",
".webm",
".ogv",
".pdf",
];
var FileLinkSettingTab = /** @class */ (function (_super) {
__extends(FileLinkSettingTab, _super);
function FileLinkSettingTab(app, plugin) {
var _this = _super.call(this, app, plugin) || this;
_this.plugin = plugin;
return _this;
}
FileLinkSettingTab.prototype.display = function () {
var _this = this;
var containerEl = this.containerEl;
containerEl.empty();
containerEl.createEl("h2", { text: "Better File Link Settings" });
new obsidian.Setting(containerEl)
.setName("List style for multiple files")
.setDesc("Specify the characters shown before every file link.")
.addText(function (text) {
return text
.setPlaceholder("-")
.setValue(_this.plugin.settings.linkPrefix)
.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
this.plugin.settings.linkPrefix = value;
return [4 /*yield*/, this.plugin.saveSettings()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); });
});
new obsidian.Setting(containerEl)
.setName("Show file extension")
.setDesc("Will show file endings when activated.")
.addToggle(function (toggle) {
return toggle
.setValue(_this.plugin.settings.showFileEnding)
.onChange(function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
this.plugin.settings.showFileEnding = toggle.getValue();
return [4 /*yield*/, this.plugin.saveSettings()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); });
});
new obsidian.Setting(containerEl)
.setName("Embed file")
.setDesc("Will copy the file to Obsidian and embed it in the note.")
.addToggle(function (toggle) {
return toggle.setValue(_this.plugin.settings.embedFile).onChange(function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
this.plugin.settings.embedFile = toggle.getValue();
return [4 /*yield*/, this.plugin.saveSettings()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); });
});
new obsidian.Setting(containerEl)
.setName("Link folder instead of file")
.setDesc("Link will open the folder where the file is located instead of opening the file itself.")
.addToggle(function (toggle) {
return toggle.setValue(_this.plugin.settings.linkFolder).onChange(function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
this.plugin.settings.linkFolder = toggle.getValue();
return [4 /*yield*/, this.plugin.saveSettings()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); });
});
};
return FileLinkSettingTab;
}(obsidian.PluginSettingTab));
var FileEmbeder = /** @class */ (function () {
function FileEmbeder(settings) {
this.settings = settings;
}
FileEmbeder.prototype.getEmbedMarkdownLink = function (filePath) {
var ext = this.getPathInformation(filePath).ext;
if (!SUPPORTED_EMBED_FILE_TYPES.includes(ext)) {
new obsidian.Notice("Files of this type are not supported for embedding in Obsidian.");
}
return "!" + this.getMarkdownLink(filePath, false);
};
FileEmbeder.prototype.copyFile = function (sourcePath, targetDir) {
try {
fs__namespace.mkdirSync(targetDir, { recursive: true });
var filename = path__namespace.basename(sourcePath);
var destPath = path__namespace.join(targetDir, filename);
fs__namespace.copyFileSync(sourcePath, destPath);
return destPath;
}
catch (err) {
console.error("Copy failed:", err);
throw new Error("File copy failed: ".concat(err.message));
}
};
FileEmbeder.prototype.getPathInformation = function (filePath) {
var normalizedPath = path__namespace.normalize(filePath);
var parsedPath = path__namespace.parse(normalizedPath);
return {
fullPath: normalizedPath,
dir: parsedPath.dir,
filename: parsedPath.base,
name: parsedPath.name,
ext: parsedPath.ext
};
};
FileEmbeder.prototype.getMarkdownLink = function (filePath, printPrefix) {
var pathInfo = this.getPathInformation(filePath);
var prefix = printPrefix ? this.settings.linkPrefix : "";
var linkText = pathInfo.name;
if (this.settings.linkFolder) {
linkText = pathInfo.dir;
}
if (this.settings.showFileEnding) {
linkText = pathInfo.filename;
}
var linkPath = this.settings.linkFolder
? pathInfo.dir
: pathInfo.fullPath;
return this.formatMarkdownLink(prefix, linkText, linkPath);
};
FileEmbeder.prototype.formatMarkdownLink = function (prefix, text, path) {
var space = prefix && prefix !== "!" ? " " : "";
return "".concat(prefix).concat(space, "[").concat(text, "](<file:///").concat(path, ">)\n");
};
return FileEmbeder;
}());
var FileLinkModal = /** @class */ (function (_super) {
__extends(FileLinkModal, _super);
function FileLinkModal(app, plugin) {
var _this = _super.call(this, app) || this;
_this.filePaths = [];
_this.plugin = plugin;
return _this;
}
FileLinkModal.prototype.onOpen = function () {
return __awaiter(this, void 0, void 0, function () {
var contentEl, mainContainer, fileSelectionSection, fileButton, checkboxContainer, createCheckboxGroup, checkboxEmbed, checkboxFileFolder, checkboxFileEnding, buttonContainer, submitButton;
var _this = this;
return __generator(this, function (_a) {
contentEl = this.contentEl;
mainContainer = contentEl.createEl("div", {
cls: "bfl-container"
});
fileSelectionSection = mainContainer.createEl("div", {
cls: "bfl-selection-section"
});
fileButton = fileSelectionSection.createEl("button", {
text: "Select files",
cls: "mod-cta"
});
this.selectedFilesDiv = fileSelectionSection.createEl("div", {
cls: "bfl-selected-files"
});
this.displaySelectedFiles([]);
checkboxContainer = mainContainer.createEl("div", {
cls: "bfl-checkbox-container"
});
createCheckboxGroup = function (id, label, initialValue) {
var wrapper = checkboxContainer.createEl("div", {
cls: "bfl-checkbox-group"
});
var checkbox = wrapper.createEl("input", {
type: "checkbox",
attr: {
id: id,
style: "margin: 0;"
}
});
wrapper.createEl("label", {
text: label,
attr: {
"for": id,
style: "margin: 0; user-select: none;"
}
});
checkbox.checked = initialValue;
return checkbox;
};
checkboxEmbed = createCheckboxGroup("embed", "Embed file", this.plugin.settings.embedFile);
checkboxFileFolder = createCheckboxGroup("file-folder", "Link folder", this.plugin.settings.linkFolder);
checkboxFileEnding = createCheckboxGroup("file-ending", "Show file extension", this.plugin.settings.showFileEnding);
buttonContainer = mainContainer.createEl("div", {
cls: "button-container",
attr: {
style: "margin-top: 5px;"
}
});
submitButton = buttonContainer.createEl("button", {
text: "Add file link",
cls: "mod-cta"
});
fileButton.addEventListener("click", function () { return __awaiter(_this, void 0, void 0, function () {
var d, result, error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
d = require("electron").remote.dialog;
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, d.showOpenDialog({
properties: ["openFile", "multiSelections"],
filters: [{ name: "All Files", extensions: ["*"] }]
})];
case 2:
result = _a.sent();
if (!result.canceled && result.filePaths.length > 0) {
this.filePaths = result.filePaths;
this.displaySelectedFiles(this.filePaths);
}
return [3 /*break*/, 4];
case 3:
error_1 = _a.sent();
new obsidian.Notice("Error selecting files: " + error_1.message);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
}); });
submitButton.addEventListener("click", function () {
if (_this.filePaths.length > 0) {
// Update settings
_this.plugin.settings.linkFolder = checkboxFileFolder.checked;
_this.plugin.settings.showFileEnding = checkboxFileEnding.checked;
_this.plugin.settings.embedFile = checkboxEmbed.checked;
var fe_1 = new FileEmbeder(_this.plugin.settings);
if (checkboxEmbed.checked) {
_this.filePaths.forEach(function (file) {
var embedMarkdownLink = fe_1.getEmbedMarkdownLink(file);
_this.addAtCursor(embedMarkdownLink);
});
}
else {
var linkString_1 = "";
_this.filePaths.forEach(function (file) {
linkString_1 += fe_1.getMarkdownLink(file, _this.filePaths.length > 1);
});
_this.addAtCursor(linkString_1);
}
_this.close();
new obsidian.Notice("Added ".concat(_this.filePaths.length, " file link(s)"));
}
else {
new obsidian.Notice("No files selected");
}
});
return [2 /*return*/];
});
});
};
FileLinkModal.prototype.displaySelectedFiles = function (files) {
this.selectedFilesDiv.empty();
if (files.length === 0) {
this.selectedFilesDiv.createEl("p", {
text: "No files selected",
cls: "no-files-message",
attr: {
style: "color: var(--text-muted); font-style: italic; margin: 0; padding: 8px;"
}
});
return;
}
var fileList = this.selectedFilesDiv.createEl("ul", {
cls: "selected-files-list",
attr: {
style: "list-style: none; padding: 0; margin: 0;"
}
});
files.forEach(function (filePath) {
var fileName = filePath.split(/[\\/]/).pop() || filePath;
fileList.createEl("li", {
text: fileName,
cls: "selected-file-item",
attr: {
style: "padding: 4px 8px; border-bottom: 1px solid var(--background-modifier-border);"
}
});
});
};
FileLinkModal.prototype.addAtCursor = function (s) {
var markdownView = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
if (markdownView) {
var editor = markdownView.editor;
var currentLine = editor.getCursor();
editor.replaceRange(s, currentLine, currentLine);
}
};
FileLinkModal.prototype.onClose = function () {
var contentEl = this.contentEl;
contentEl.empty();
};
return FileLinkModal;
}(obsidian.Modal));
var FileLink = /** @class */ (function (_super) {
__extends(FileLink, _super);
function FileLink() {
return _super !== null && _super.apply(this, arguments) || this;
}
FileLink.prototype.onload = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log("loading plugin file-link");
return [4 /*yield*/, this.loadSettings()];
case 1:
_a.sent();
this.addSettingTab(new FileLinkSettingTab(this.app, this));
this.addCommand({
id: "add-file-link",
name: "Add File Link",
editorCallback: function () {
new FileLinkModal(_this.app, _this).open();
}
});
return [2 /*return*/];
}
});
});
};
FileLink.prototype.onunload = function () {
console.log("unloading plugin file-link");
};
FileLink.prototype.loadSettings = function () {
return __awaiter(this, void 0, void 0, function () {
var _a, _b, _c, _d;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_a = this;
_c = (_b = Object).assign;
_d = [{}, DEFAULT_SETTINGS];
return [4 /*yield*/, this.loadData()];
case 1:
_a.settings = _c.apply(_b, _d.concat([_e.sent()]));
return [2 /*return*/];
}
});
});
};
FileLink.prototype.saveSettings = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.saveData(this.settings)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
return FileLink;
}(obsidian.Plugin));
module.exports = FileLink;
/* nosourcemap */
+10
View File
@@ -0,0 +1,10 @@
{
"id": "obsidian-file-link",
"name": "Better File Link",
"version": "1.2.1",
"minAppVersion": "1.7.7",
"description": "A plugin to add better external file links to notes.",
"author": "Marc Julian Schwarz",
"authorUrl": "https://www.marc-julian.de",
"isDesktopOnly": true
}
+29
View File
@@ -0,0 +1,29 @@
.bfl-container {
display: flex;
flex-direction: column;
gap: 15px;
}
.bfl-selection-section {
}
.bfl-selected-files {
margin-top: 10px;
max-height: 200px;
overflow-y: auto;
}
.bfl-checkbox-container {
display: flex;
flex-direction: column;
gap: 8px;
}
.bfl-checkbox-group {
display: flex;
align-items: center;
gap: 8px;
}
+8 -8
View File
@@ -1,9 +1,5 @@
{
"recentFiles": [
{
"basename": "marp-ppt-test",
"path": "08-Inbox/marp-ppt-test.md"
},
{
"basename": "2025-09-09",
"path": "01-工作日记/2025-09-09.md"
@@ -12,6 +8,14 @@
"basename": "2025-09-08",
"path": "01-工作日记/2025-09-08.md"
},
{
"basename": "2025年8月工作与技术实践总结",
"path": "08-Inbox/2025年8月工作与技术实践总结.md"
},
{
"basename": "marp-ppt-test",
"path": "08-Inbox/marp-ppt-test.md"
},
{
"basename": "关于面试+AI模拟-PPT",
"path": "07-个人事务/关于面试+AI模拟-PPT.md"
@@ -195,10 +199,6 @@
{
"basename": "2025-07-04",
"path": "08-Inbox/2025-07-04.md"
},
{
"basename": "2025年8月工作与技术实践总结",
"path": "08-Inbox/2025年8月工作与技术实践总结.md"
}
],
"omittedPaths": [],
-22
View File
@@ -3587,28 +3587,6 @@
"hash": "4c7ceef36fc19b180fc4279ebaaa5859",
"highlights": []
},
{
"title": "012WORLD - China backs Africa&#39;s path to progress",
"description": "<div></div><img src=\"https://mobile.chinadaily.com.cn/cn/resfile/2025-09-09/012/20250909_012_01_47625.png\" /><p>A doctor of the 27th batch of the Chinese medical team to Benin examines a patient at the Mono and Couffo Departmental Hospital Center in Lokossa, Benin, on Monday.</p>\n<p> When Antoine Roger Lokongo returned to the Democratic Republic of Congo after nearly 20 years in Europe and China, he brought back not only academic credentials but also a conviction that Africa could learn from China&#39;s resilience in advancing human rights through development.</p>\n<p> &quot;My journey has been shaped by two worlds,&quot; said Lokongo, director of the department of international relations at Joseph Kasa-Vubu University in DR Congo.</p>\n<p> After spending 18 years in England, he moved to China to pursue a doctorate at Peking University. There, he first studied the Chinese language, completed his research and graduated in 2015 before heading home with a determination to contribute to his country&#39;s growth.</p>\n<p> Speaking at the first China-Africa Human Rights Seminar in Addis Ababa, Ethiopia, late last month, Lokongo reflected on the contradictions of history. He recalled how former United States president Joe Biden once visited an Angolan museum, where Africans were baptized before being forced onto slave ships.</p>\n<p> &quot;Baptism means liberation, yet those newly baptized were put into bondage,&quot; he said. &quot;That contradiction is symbolic of today, where Western powers preach human rights while perpetuating new forms of control.&quot;</p>\n<p> For Lokongo, the memory of that contradiction &mdash; liberation preached, yet bondage imposed &mdash; illustrates why many Africans remain skeptical of Western narratives on human rights.</p>\n<p> By contrast, he said, China presents Africa with a different model. &quot;China has never colonized any African country,&quot; he said. &quot;It offers partnership grounded in solidarity, experience-sharing and win-win cooperation.&quot;</p>\n<p> Lokongo was among dozens of African voices gathered for the seminar, where officials and experts discussed how the continent could redefine human rights in ways that reflect its own priorities. For them, the debate was not about whether Africa needs human rights &mdash; but how human rights are achieved.</p>\n<p> Crispin Kugiza Kaheru, a member of the Uganda Human Rights Commission, said Africa had long been subjected to one-sided interpretations.</p>\n<p> &quot;For too many years, human rights have been weaponized,&quot; he said. &quot;They&#39;ve been used to justify sanctions, embargoes and interference in sovereign matters.&quot;</p>\n<p> Kaheru said China offered a different lens, one that ties rights to dignity through development.</p>\n<p> &quot;You can talk about modernization and still keep your identity, your culture, your norms. You don&#39;t have to import cultures to thrive,&quot; he said. He praised China&#39;s people-centered approach, which emphasizes subsistence and livelihoods rather than abstract ideals.</p>\n<p> This was echoed by Mohamed El Hacen Lebatt, former foreign minister of Mauritania, who said Africa&#39;s most urgent rights are tied to daily needs, development, food, healthcare, education and access to technology. &quot;The right to development is the human right Africa cannot ignore,&quot; he said.</p>\n<p> While comparing partners, he pointed to China&#39;s record of development, for instance, building of airports, hospitals and universities across the continent. &quot;We compare the deeds, and China has delivered. While Africa remains open to all partnerships, China is the most helpful, most decisive and most efficient in supporting Africa.&quot;</p>\n<p> History, several speakers said, continues to shape today&#39;s choices. Boniface Lezona, deputy director of the National Human Rights Commission of the Republic of Congo, said China, like Africa, had endured colonization and emerged stronger.</p>\n<p> &quot;With China, we are trying to share the same destiny on the right of development,&quot; he said. &quot;We take China as a leader because we have a common history and we want to share our common future together.&quot;</p>\n<p> <b>Mutual respect</b></p>\n<p> Fredrick Mutesa, secretary-general of the Zambia-China Friendship Association, warned of a &quot;heightened campaign to discredit and undermine&quot; China-Africa ties by Western governments. Yet, he said, China&#39;s engagement through infrastructure, mining and green development is &quot;unlocking the potential of the African continent&quot;, giving it a rare chance to renegotiate its place in the international order on the basis of mutual respect and noninterference.</p>\n<p> &quot;The right to development is the most critical human right for Africa today, and China is at the forefront of helping us realize it,&quot; Mutesa said.</p>\n<p> Jeddi Mowbray Armah, deputy ministerLine truncated
"content": "<div></div><img src=\"https://mobile.chinadaily.com.cn/cn/resfile/2025-09-09/012/20250909_012_01_47625.png\" /><p>A doctor of the 27th batch of the Chinese medical team to Benin examines a patient at the Mono and Couffo Departmental Hospital Center in Lokossa, Benin, on Monday.</p>\n<p> When Antoine Roger Lokongo returned to the Democratic Republic of Congo after nearly 20 years in Europe and China, he brought back not only academic credentials but also a conviction that Africa could learn from China&#39;s resilience in advancing human rights through development.</p>\n<p> &quot;My journey has been shaped by two worlds,&quot; said Lokongo, director of the department of international relations at Joseph Kasa-Vubu University in DR Congo.</p>\n<p> After spending 18 years in England, he moved to China to pursue a doctorate at Peking University. There, he first studied the Chinese language, completed his research and graduated in 2015 before heading home with a determination to contribute to his country&#39;s growth.</p>\n<p> Speaking at the first China-Africa Human Rights Seminar in Addis Ababa, Ethiopia, late last month, Lokongo reflected on the contradictions of history. He recalled how former United States president Joe Biden once visited an Angolan museum, where Africans were baptized before being forced onto slave ships.</p>\n<p> &quot;Baptism means liberation, yet those newly baptized were put into bondage,&quot; he said. &quot;That contradiction is symbolic of today, where Western powers preach human rights while perpetuating new forms of control.&quot;</p>\n<p> For Lokongo, the memory of that contradiction &mdash; liberation preached, yet bondage imposed &mdash; illustrates why many Africans remain skeptical of Western narratives on human rights.</p>\n<p> By contrast, he said, China presents Africa with a different model. &quot;China has never colonized any African country,&quot; he said. &quot;It offers partnership grounded in solidarity, experience-sharing and win-win cooperation.&quot;</p>\n<p> Lokongo was among dozens of African voices gathered for the seminar, where officials and experts discussed how the continent could redefine human rights in ways that reflect its own priorities. For them, the debate was not about whether Africa needs human rights &mdash; but how human rights are achieved.</p>\n<p> Crispin Kugiza Kaheru, a member of the Uganda Human Rights Commission, said Africa had long been subjected to one-sided interpretations.</p>\n<p> &quot;For too many years, human rights have been weaponized,&quot; he said. &quot;They&#39;ve been used to justify sanctions, embargoes and interference in sovereign matters.&quot;</p>\n<p> Kaheru said China offered a different lens, one that ties rights to dignity through development.</p>\n<p> &quot;You can talk about modernization and still keep your identity, your culture, your norms. You don&#39;t have to import cultures to thrive,&quot; he said. He praised China&#39;s people-centered approach, which emphasizes subsistence and livelihoods rather than abstract ideals.</p>\n<p> This was echoed by Mohamed El Hacen Lebatt, former foreign minister of Mauritania, who said Africa&#39;s most urgent rights are tied to daily needs, development, food, healthcare, education and access to technology. &quot;The right to development is the human right Africa cannot ignore,&quot; he said.</p>\n<p> While comparing partners, he pointed to China&#39;s record of development, for instance, building of airports, hospitals and universities across the continent. &quot;We compare the deeds, and China has delivered. While Africa remains open to all partnerships, China is the most helpful, most decisive and most efficient in supporting Africa.&quot;</p>\n<p> History, several speakers said, continues to shape today&#39;s choices. Boniface Lezona, deputy director of the National Human Rights Commission of the Republic of Congo, said China, like Africa, had endured colonization and emerged stronger.</p>\n<p> &quot;With China, we are trying to share the same destiny on the right of development,&quot; he said. &quot;We take China as a leader because we have a common history and we want to share our common future together.&quot;</p>\n<p> <b>Mutual respect</b></p>\n<p> Fredrick Mutesa, secretary-general of the Zambia-China Friendship Association, warned of a &quot;heightened campaign to discredit and undermine&quot; China-Africa ties by Western governments. Yet, he said, China&#39;s engagement through infrastructure, mining and green development is &quot;unlocking the potential of the African continent&quot;, giving it a rare chance to renegotiate its place in the international order on the basis of mutual respect and noninterference.</p>\n<p> &quot;The right to development is the most critical human right for Africa today, and China is at the forefront of helping us realize it,&quot; Mutesa said.</p>\n<p> Jeddi Mowbray Armah, deputy minister forLine truncated
"category": "",
"link": "https://mobile.chinadaily.com.cn/cn/html5/2025-09/09/content_012_68bf41e4ed50ccabe1519137.htm#012WORLD",
"creator": "",
"pubDate": "Tue, 09 Sep 2025 00:21:04 +0000",
"enclosure": "",
"enclosureType": "",
"image": "",
"id": "",
"language": "",
"folder": "双语",
"feed": "ChinaDaily",
"read": false,
"favorite": false,
"created": false,
"tags": [],
"hash": "d8af0297932abc7dd6508c7c971c6b52",
"highlights": []
},
{
"title": "001FRONT - Japan PM Ishiba announces resignation",
"description": "<div></div><img src=\"https://mobile.chinadaily.com.cn/cn/resfile/2025-09-08/001/20250908_001_05_127186.png\" /><p>Japanese Prime Minister Shigeru Ishiba addresses a press conference where he announced his decision to resign, on Sunday in Tokyo, Japan.</p>\n<p> Japanese Prime Minister Shigeru Ishiba announced on Sunday that he will step down as the head of the Liberal Democratic Party, amid growing calls for him to take responsibility for the party-led ruling coalition&#39;s election setback in both houses of parliament.</p>\n<p> Addressing a news conference at the prime minister&#39;s office in Tokyo, Ishiba said he has &quot;made the painful decision to resign despite still having unfinished tasks&quot;, emphasizing that the LDP must undergo genuine renewal and remain a tolerant and inclusive force.</p>\n<p> He added that he would not stand as a candidate in the expected LDP leadership election triggered by his resignation.</p>\n<p> Ishiba&#39;s announcement came a day before the LDP was scheduled to decide whether to hold an early party leadership election, which would essentially be demanding his resignation, according to Japanese media platform Nikkei Asia.</p>\n<p> It also followed a formal agreement reached on Thursday with the administration of United States President Donald Trump on 15 percent reciprocal tariffs on Japanese exports to the US.</p>\n<p> At Sunday&#39;s news conference, Ishiba said he had long considered tariff negotiations with the US a responsibility of his administration. With the signing of a memorandum of understanding last week, Ishiba said the negotiations reached a milestone, which made him decide to make way for his successor.</p>\n<p> In September 2024, Ishiba was elected president of the LDP for a term of three years. In October last year, the LDP and its junior coalition partner, the Komeito, lost their majority in the House of Representatives, the lower house of the National Diet of Japan. In July this year, the ruling coalition also lost its majority in the House of Councillors, or the upper house.</p>\n<p> In postwar Japan, the head of the LDP &mdash; the country&#39;s dominant political force since the party&#39;s founding in 1955 &mdash; has almost always become the prime minister, because the party commands the largest share of seats in the Diet. When an LDP president resigns or is replaced, the post of prime minister typically changes hands as well.</p>\n<p> According to the LDP&#39;s rules, a new leadership election can be held before the incumbent president&#39;s term expires. A majority of LDP members in the Diet and a majority of representatives in the LDP&#39;s prefectural branches can jointly request an election for a new president.</p>\n<p> Following Ishiba&#39;s formal resignation announcement, the LDP is expected to hold an extraordinary executive meeting on Monday morning, at which it will likely decide to cancel the submission of documents for an early party leadership election, according to TBS News, a commercial broadcasting company based in Tokyo.</p>\n<p> The Associated Press reported that the LDP is expected to set a date for a party leadership election, likely to be held in early October.</p>\n<p> Xinhua contributed to this story.</p>\n<p> <span>houjunjie@chinadaily.com.cn</span></p>\n<p></p><br><hr><div>获取更多RSS:<br><a href=\"https://feedx.net\" style=\"color:orange\" target=\"_blank\">https://feedx.net</a> <br><a href=\"https://feedx.site\" style=\"color:orange\" target=\"_blank\">https://feedx.site</a><br></div>",
+2 -2
View File
@@ -74,7 +74,7 @@
"01-工作日记/2025-09-08.md": "0bffaa1ebd7d0b00483e9335d38442ce1e33753ba7870c1b65c9e65ef1ad0ca6",
"60-Imports/63-WuCai/2025/09/RPA技术揭秘:如何无需API接口实现电商数据自动化抓取.md": "aafe92c24e16b7fa7b86b01d676d11e54823f0d374b89a9b2102bd1b1abc1571",
"07-个人事务/关于面试+AI模拟-PPT.md": "ef6c4d4c09befe054e5ebfe4226e71e048ec25e8a9226c82e9e6912f7b712ff0",
"08-Inbox/marp-ppt-test.md": "b8343739504dd2e8f6e151e62f1ac87240ff6ac61e8d60bbf78a39800c683177",
"01-工作日记/2025-09-09.md": "c1dc6a8a28b0e3594723001aa5699265a9d8643279664e2df3357f9dacfacc6d"
"08-Inbox/marp-ppt-test.md": "9f4096311b8c736b4f40f779b47db8299b8331b846033fef878032dddacccd1e",
"01-工作日记/2025-09-09.md": "964009433ff88915bf7cc4b4423e0421f27f9966deea109b1b5699f77da08877"
}
}
+20 -21
View File
@@ -27,29 +27,26 @@
"state": {
"type": "markdown",
"state": {
"file": "08-Inbox/marp-ppt-test.md",
"file": "08-Inbox/2025年8月工作与技术实践总结.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "marp-ppt-test"
"title": "2025年8月工作与技术实践总结"
}
}
],
"currentTab": 1
},
{
"id": "59da47b0240687b6",
"type": "tabs",
"children": [
},
{
"id": "4206e7505f139f8d",
"id": "d9dfe53707c72f69",
"type": "leaf",
"state": {
"type": "marp-preview-view",
"state": {},
"type": "markdown",
"state": {
"file": "01-工作日记/2025-09-08.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Deck Preview"
"title": "2025-09-08"
}
}
]
@@ -208,13 +205,13 @@
"state": {
"type": "outline",
"state": {
"file": "08-Inbox/marp-ppt-test.md",
"file": "01-工作日记/2025-09-09.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "marp-ppt-test 的大纲"
"title": "2025-09-09 的大纲"
}
},
{
@@ -337,14 +334,17 @@
"pdf-plus:PDF++: Toggle auto-paste": false,
"marp-slides:Show Slide Preview": false,
"vscode-editor:新建代码文件": false,
"open-vscode:VSCode": false
"open-vscode:VSCode": false,
"periodic-notes:Open today": false,
"slides-extended:Show slide preview": false
}
},
"active": "139c2bc265271235",
"active": "060db359203da6a5",
"lastOpenFiles": [
"01-工作日记/2025-09-09.md",
"08-Inbox/marp-ppt-test.md",
"01-工作日记/2025-09-08.md",
"01-工作日记/2025-09-09.md",
"08-Inbox/2025年8月工作与技术实践总结.md",
"08-Inbox/marp-ppt-test.md",
"07-个人事务/关于面试+AI模拟-PPT.md",
"07-个人事务/关于面试+AI模拟.md",
"07-个人事务/关于面试+AI模拟.html",
@@ -377,7 +377,6 @@
"90-学习教程/99-黑曜石玩家指南/3-obsidian做课题/撰写论文草稿.md",
"90-学习教程/99-黑曜石玩家指南/3-obsidian做课题/整理实验方法.md",
"90-学习教程/99-黑曜石玩家指南/3-obsidian做课题/工作小结与周汇报.md",
"90-学习教程/99-黑曜石玩家指南/3-obsidian做课题/完整导出项目.md",
"50-Memos/2025/09/resources/KgMsqdCWKza8RqiuZqhTom_A04DCEF9-62B9-46E0-9E1D-CA66A8FE1E3C.jpg",
"50-Memos/2025/09/resources/LHoWCMs5gZDm4C4TBxd8Xn_0A8C3B70-0E79-44B3-B5E1-54264E6348C6.jpg",
"50-Memos/2025/09/resources/nUCNhFmpcdpSaYQtnj5uja_F0A154EC-F2B1-426F-9B51-27657F3F1AF3.jpg",