--- layout: post title: "Cập nhật jekyll_it()" published: yes --- Từ bài đăng [này](../r-markdown-kramdown-jekyll/). Cải tiến hàm `jekyll_it()`: - Quét danh sách tệp `.Rmd` đã chuyển đổi trước khi đọc tệp, đỡ mất thời gian đọc thuộc tính `published:`. Chỉ những bài đăng có thuộc tính `published: draft` và `published: no` mới được quét. Và chỉ thực hiện chuyển đổi những bài đăng có thuộc tính `published: no`. - Tạo thư mục riêng cho từng bài đăng. Không bỏ tất cả vào *figures* nữa để tránh thao tác ghi đè nếu có "chunk" trùng tên ở các bài đăng khác nhau. Mã nguồn như sau: ```{r eval=FALSE} jekyll_it <- function(dir=getwd(), images.dir=dir, images.url='../', out_ext='.md', in_ext='.rmd', recursive=FALSE) { require(knitr, quietly=TRUE, warn.conflicts=TRUE) # Scan folder for .Rmd files files <- list.files(path=dir, pattern=in_ext, ignore.case=TRUE, recursive=FALSE) # Check if files converted then not scan if (file.exists("knitr.F")) { files2 <- readLines("knitr.F") for (fil in files2) message(paste("Not scan ", fil, sep='')) files <- setdiff(files, files2) } # Scanning files not converted for (fil in files) { message(paste("Scanning ", fil, sep='')) content <- readLines(fil) frontMatter <- which(substr(content, 1, 3) == '---') if(length(frontMatter) >= 2 & 1 %in% frontMatter) { statusLine <- which(substr(content, 1, 10) == 'published:') if(statusLine > frontMatter[1] & statusLine < frontMatter[2]) { status <- unlist(strsplit(content[statusLine], ':'))[2] status <- sub('[[:space:]]+$', '', status) status <- sub('^[[:space:]]+', '', status) if (tolower(status) == 'yes') files2 <- c(files2, fil) else if (tolower(status) == 'no') { files2 <- c(files2, fil) message(paste('Processing ', fil, sep='')) # Write 'published: yes' to original files # to prevent processing next time content[statusLine] <- 'published: yes' writeLines( content, fil) # Generate content to new files content[nchar(content) == 0] <- ' ' content[statusLine] <- 'converted: yes' outFile <- paste0("../_posts/", substr(fil, 1, (nchar(fil)-(nchar(in_ext)))), out_ext, sep='') outFig <- paste0("../figures/", substr(fil, 12, (nchar(fil)-(nchar(in_ext)))), "/", sep='') render_markdown(strict=TRUE) render_jekyll(highlight='pygments') opts_knit$set(out.format='markdown') opts_knit$set(base.dir=images.dir) opts_knit$set(base.url=images.url) opts_chunk$set(fig.path=outFig) try(knit(text=content, output=outFile), silent=FALSE) } } } } # Write converted files to knitr.F if (!is.null(setdiff(files, files2))) writeLines(files2, "knitr.F") invisible() } jekyll_it() ``` Để chạy hàm: ```r source("knitr.R") ```