Конвертировать комментарии Google в текстовом файле в сноски rmarkdown - PullRequest
0 голосов
/ 02 марта 2019

Я работаю с текстовыми файлами, которые были извлечены из документов Google.В версиях документации Google есть комментарии, которые включаются в файл при преобразовании в формат .txt.Я хотел бы программно преобразовать каждый комментарий в сноску со вкусом rmarkdown.

В настоящее время они выглядят так:

*Background:*[a] Lorem ipsum dolor sit amet, consectetur adipiscing elit.  
Nulla[b] a accumsan enim. Aenean sed elit a nunc efficitur pharetra. 

*Method:* [c]Praesent dapibus turpis in dictum aliquam. 

[a]This should be bolded
[b]What happens to a multiple


line


comment?
[c]How about we make this italics?

Желаемый результат:

*Background:*^[This should be bolded] Lorem ipsum dolor sit amet, consectetur adipiscing elit.  
Nulla^[What happens to a multiple


line


comment?] a accumsan enim. Aenean sed elit a nunc efficitur pharetra. 

*Method:* ^[How about we make this italics?]Praesent dapibus turpis in dictum aliquam. 

Тамнеизвестное количество комментариев в каждом файле (в некоторых файлах нет комментариев).Как показано, комментарии могут занимать несколько строк, но текст комментария всегда находится в самом конце файла.Стоит отметить, что в тексте могут быть квадратные скобки, отличные от комментариев, поэтому в идеале будут обрабатываться только те значения, которые имеют маркер комментария (например, [a]) и соответствующий комментарий в конце файла (например, [a]This should be bolded)..

1 Ответ

0 голосов
/ 03 марта 2019

Благодаря (к сожалению, теперь удаленной) отправной точке от @OganM мне теперь удалось найти рабочее решение.

library(dplyr)
library(stringr)

comment_to_footnote <- function(text) {
  pairs <- stringr::str_extract_all(text, '\\[[a-z]\\]') %>% {.[[1]]}

  comments <-
    stringr::str_extract_all(text, "(?s)\\n\\[[a-z]\\].*?($)") %>% {.[[1]]} %>%
    str_split("\\[") %>% {.[[1]]}

  comments <-
    as.data.frame(cbind(
      tag = sapply(str_split(comments, "\\]"), function(x) x[1]),
      comment = sapply(str_split(comments, "\\]"), function(x) x[2])
    )) %>% 
    mutate(
      pattern = paste0("\\[", tag, "\\]"),
      tag = paste0("[", tag, "]"),
      comment_clean = str_replace_all(comment, pattern = "\\n", " ")
    ) %>% 
    right_join(as.data.frame(x = pairs[duplicated(pairs)]), by = c("tag" = "pairs[duplicated(pairs)]"))


  for (i in 1:nrow(comments)) {
    # replace the initial occurence of the label with the
    # markdown style footer
    text = str_replace(
      string = text,
      pattern = as.character(comments[i, 3]),
      replacement = paste0('^[', comments[i, 4], '] ')
    )

    # get rid of the second occurence of the label that used
    # to have the text in it
    text = str_remove(string = text,
                      pattern = paste0("(?s)\\n", comments[i, 3], comments[i, 2], ".*?($)"))

  }
  return(text)
}

При этом игнорируется текст в квадратных скобках, в котором нет соответствующего комментария приконец файла.

text <- "*Background:*[a][b] Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis maximus urna ac erat tincidunt fermentum. Nulla[c] a accumsan enim. Aenean [d]sed elit a nunc efficitur pharetra. Vivamus ultricies pretium lobortis. Nam bibendum mi vel eros congue, ac ultrices lorem dictum. Orci varius [p < .001] natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed vitae feugiat orci. Integer hendrerit enim nec odio condimentum ornare. Vestibulum nisl quam, porttitor in semper et, porta ac enim. Phasellus a nisl vulputate, [This is handwritten and has no matching comment tag - should not be extracted]luctus mi sit amet, tincidunt enim. Sed ac est pellentesque, aliquam lacus non, rutrum neque. Sed vestibulum magna sit amet ipsum vehicula mollis. Suspendisse orci magna, vulputate ut neque et, consequat aliquam dui.


*Method:* [e]Praesent dapibus turpis in dictum aliquam. Maecenas ac molestie nunc. Nulla varius ultrices purus at blandit. Nulla dolor nisi, lacinia a ante eu, dictum semper nulla. Donec volutpat ultrices tempus. Proin non tristique metus, et tristique ante. Duis malesuada orci sit amet laoreet commodo. Donec faucibus vel erat tempus hendrerit. Vestibulum sit amet massa sit amet velit tempus dignissim. Etiam sed elit lacinia, euismod dui vitae, sagittis enim. Vestibulum ut eleifend orci, a semper massa. Quisque eu fringilla massa, at viverra nulla.[f]


*Results:* In laoreet, eros sed sagittis placerat, erat ex lobortis sem, ut pellentesque velit nisl ac est. Nulla mauris sapien, posuere hendrerit pulvinar a, molestie a orci. Suspendisse vitae risus augue. Nulla vel odio eget tellus sagittis pretium vitae nec enim. Fusce imperdiet, elit [g]maximus pellentesque tincidunt, mauris lacus ultrices massa, eget malesuada elit est et libero. Mauris vehicula urna augue, commodo varius sapien eleifend nec. Aenean ac lacinia nibh, faucibus scelerisque ligula. Sed tortor nisi, dictum ac augue et, auctor posuere ipsum. Curabitur condimentum urna [h]ut mi interdum porttitor. Fusce mi felis, hendrerit quis diam id, facilisis placerat nibh. Aliquam tempor lacus eget orci faucibus, id suscipit libero scelerisque. Nunc ultricies diam vitae vulputate mollis. Pellentesque ullamcorper placerat dui. Praesent lobortis vehicula augue ultricies interdum.


*Conclusion:* Curabitur eleifend ligula felis, ut condimentum lacus egestas nec. Suspendisse faucibus tempus maximus. Sed finibus facilisis ornare. Proin molestie interdum sapien at laoreet. Aenean sagittis dolor non volutpat fringilla. Etiam vulputate justo at orci pharetra condimentum. Mauris condimentum neque libero, in auctor lectus volutpat at. Pellentesque eros lacus, scelerisque eget dictum sed, porttitor sed elit. Morbi tristique nunc vel nunc consectetur, ut tincidunt tellus fermentum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus venenatis quis leo quis bibendum. Suspendisse efficitur quam sit amet nisi dignissim sodales. Nullam ex nulla, sagittis a diam non, dapibus scelerisque libero. Fusce ac ante ac dolor congue eleifend eu quis sem. Donec molestie finibus tortor at ullamcorper.[z]


[a]This should be bolded
[b]Comment reply. Good idea!
[c]What happens to a multiple


line


comment?
[d]I don't think this spelling is correct
[e]How about we make this italics?
[f]Gratuitous comments
[g]More here
[h]Add some comments"

cleaned_text <- comment_to_comment(text)

print(cleaned_text)

[1] "*Background:*^[This should be bolded ] ^[Comment reply. Good idea! ]  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis maximus urna ac erat tincidunt fermentum. Nulla^[What happens to a multiple   line   comment? ]  a accumsan enim. Aenean ^[I don't think this spelling is correct ] sed elit a nunc efficitur pharetra. Vivamus ultricies pretium lobortis. Nam bibendum mi vel eros congue, ac ultrices lorem dictum. Orci varius [p < .001] natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed vitae feugiat orci. Integer hendrerit enim nec odio condimentum ornare. Vestibulum nisl quam, porttitor in semper et, porta ac enim. Phasellus a nisl vulputate, [This is handwritten and has no matching comment tag - should not be extracted]luctus mi sit amet, tincidunt enim. Sed ac est pellentesque, aliquam lacus non, rutrum neque. Sed vestibulum magna sit amet ipsum vehicula mollis. Suspendisse orci magna, vulputate ut neque et, consequat aliquam dui.\n\n\n*Method:* ^[How about we make this italics? ] Praesent dapibus turpis in dictum aliquam. Maecenas ac molestie nunc. Nulla varius ultrices purus at blandit. Nulla dolor nisi, lacinia a ante eu, dictum semper nulla. Donec volutpat ultrices tempus. Proin non tristique metus, et tristique ante. Duis malesuada orci sit amet laoreet commodo. Donec faucibus vel erat tempus hendrerit. Vestibulum sit amet massa sit amet velit tempus dignissim. Etiam sed elit lacinia, euismod dui vitae, sagittis enim. Vestibulum ut eleifend orci, a semper massa. Quisque eu fringilla massa, at viverra nulla.^[Gratuitous comments ] \n\n\n*Results:* In laoreet, eros sed sagittis placerat, erat ex lobortis sem, ut pellentesque velit nisl ac est. Nulla mauris sapien, posuere hendrerit pulvinar a, molestie a orci. Suspendisse vitae risus augue. Nulla vel odio eget tellus sagittis pretium vitae nec enim. Fusce imperdiet, elit ^[More here ] maximus pellentesque tincidunt, mauris lacus ultrices massa, eget malesuada elit est et libero. Mauris vehicula urna augue, commodo varius sapien eleifend nec. Aenean ac lacinia nibh, faucibus scelerisque ligula. Sed tortor nisi, dictum ac augue et, auctor posuere ipsum. Curabitur condimentum urna ^[Add some comments] ut mi interdum porttitor. Fusce mi felis, hendrerit quis diam id, facilisis placerat nibh. Aliquam tempor lacus eget orci faucibus, id suscipit libero scelerisque. Nunc ultricies diam vitae vulputate mollis. Pellentesque ullamcorper placerat dui. Praesent lobortis vehicula augue ultricies interdum.\n\n\n*Conclusion:* Curabitur eleifend ligula felis, ut condimentum lacus egestas nec. Suspendisse faucibus tempus maximus. Sed finibus facilisis ornare. Proin molestie interdum sapien at laoreet. Aenean sagittis dolor non volutpat fringilla. Etiam vulputate justo at orci pharetra condimentum. Mauris condimentum neque libero, in auctor lectus volutpat at. Pellentesque eros lacus, scelerisque eget dictum sed, porttitor sed elit. Morbi tristique nunc vel nunc consectetur, ut tincidunt tellus fermentum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus venenatis quis leo quis bibendum. Suspendisse efficitur quam sit amet nisi dignissim sodales. Nullam ex nulla, sagittis a diam non, dapibus scelerisque libero. Fusce ac ante ac dolor congue eleifend eu quis sem. Donec molestie finibus tortor at ullamcorper.[z]\n\n"

Кажется, это работает, но я уверен, что есть более элегантные решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...