// http://stackoverflow.com/questions/14480345/how-to-get-the-nth-occurrence-in-a-string functiongetPosition(str, m, i) { return str.split(m, i).join(m).length; }
var version = String(hexo.version).split('.'); hexo.extend.filter.register('after_post_render', function(data){ var config = hexo.config; if(config.post_asset_folder){ var link = data.permalink; if(version.length > 0 && Number(version[0]) == 3) var beginPos = getPosition(link, '/', 1) + 1; else var beginPos = getPosition(link, '/', 3) + 1; // In hexo 3.1.1, the permalink of "about" page is like ".../about/index.html". var endPos = link.lastIndexOf('/') + 1; link = link.substring(beginPos, endPos);
var toprocess = ['excerpt', 'more', 'content']; for(var i = 0; i < toprocess.length; i++){ var key = toprocess[i]; var $ = cheerio.load(data[key], { ignoreWhitespace: false, xmlMode: false, lowerCaseTags: false, decodeEntities: false });
$('img').each(function(){ if ($(this).attr('src')){ // For windows style path, we replace '\' to '/'. var src = $(this).attr('src').replace('\\', '/'); if(!/http[s]*.*|\/\/.*/.test(src) && !/^\s*\//.test(src)) { // For "about" page, the first part of "src" can't be removed. // In addition, to support multi-level local directory. var linkArray = link.split('/').filter(function(elem){ return elem != ''; }); var srcArray = src.split('/').filter(function(elem){ return elem != '' && elem != '.'; }); if(srcArray.length > 1) srcArray.shift(); src = srcArray.join('/'); $(this).attr('src', config.root + link + src); console.info&&console.info("update link as:-->"+config.root + link + src); } }else{ console.info&&console.info("no src attr, skipped..."); console.info&&console.info($(this)); } }); data[key] = $.html(); } } });
第四步:复制图片到对应文件夹
hexo new image-atrical之后在source/_posts生成image-atrical.md文件和image-atrical文件夹,把要插入的图片复制到image-atrical文件夹内,然后在md中即可正常引入图片并显示了!
#include<Windows.h> #include<iostream> #include<string> usingnamespace std; longlong sum = 0; int maxn = 100000; CRITICAL_SECTION cs; DWORD WINAPI thread1(PVOID pvParam){ //进入临界区后进行屏幕输出,防止两个线程同时输出导致输出混乱 EnterCriticalSection(&cs); cout << "Threat1 is running!" << endl; LeaveCriticalSection(&cs); //打开event1事件 HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, TRUE, TEXT("event1")); for (int i = 0; i <= maxn; i += 2) { //等待event1为受信状态后向下执行 WaitForSingleObject(hEvent, INFINITE); //cout << "hevent1 is true" << endl; //设置event1 为未受信状态,防止其他线程操作 //ResetEvent(hEvent); sum += i; //操作结束后更改event1为受信状态,允许其他子线程访问 SetEvent(hEvent); } return0; } DWORD WINAPI thread2(PVOID pvParam){ EnterCriticalSection(&cs); cout << "Threat2 is running!" << endl; LeaveCriticalSection(&cs); HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, TRUE, TEXT("event1")); for (int i = 1; i <= maxn; i += 2) { WaitForSingleObject(hEvent, INFINITE); //ResetEvent(hEvent); sum += i; SetEvent(hEvent); } return0; } longlongres(){ longlong s = 0; for (int i = 1; i <= maxn; i++) { s += i; } return s; } intmain(){ InitializeCriticalSection(&cs); //创建事件event1 HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("event1")); //CreateEvent()参数分别表示安全属性、人工重置选项、初始受信状态、对象名,第二个False表示不使用人工重置即自动重置,在event被获取到后(WaitForSingleObject)自动变为未受信状态,不需要使用ResetEvent进行状态变更 //text()作用是实现对字符处理的透明化,不论是否使用 unicode 字符集,使用 TEXT 宏都可以使程序正常使用, //如果程序中有 unicode 宏的,那么就使用宽字符,否则使用单字节字符,保证程序的可移植性 cout << "event1 was created and fIinitialState is False \n"; //设置event1事件为受信状态 SetEvent(hEvent); //创建子进程threat1和threat2 HANDLE hThreat1 = CreateThread(NULL, 0, thread1, NULL, 0, NULL); HANDLE hThreat2 = CreateThread(NULL, 0, thread2, NULL, 0, NULL); EnterCriticalSection(&cs); cout << "threat1 and threat2 were created!\n"; LeaveCriticalSection(&cs);
//ResumeThread(hThreat1); //ResumeThread(hThreat1); HANDLE hThreats[2] = { hThreat1,hThreat2 }; WaitForMultipleObjects(2, hThreats, TRUE, INFINITE); cout << "Mutil threats result of the sum from 1 to "<<maxn<<" is " << sum << endl; cout << "Right result of the sum from 1 to " << maxn << " is " << res() << endl; return0; }