마이그레이션 후 모든 게시물의 HTML 태그를 정리할까요?

안녕하세요. Makeshift but working flarum import script에서 언급했듯이, 저는 Flarum에서 Discourse로 이사를 왔습니다. 제 첫 사이트인데, 여러분들의 작업을 정말 마음에 들어 하고 있으니 감사드립니다.

개발 환경에서는 처음에 아무 문제가 없어 보였던 부분이 바로 게시글의 마이그레이션 방식이었습니다. 브라우저에서는 대부분 정상적으로 보이지만, 자세히 들여다보면 이미지 로딩이나 로컬 스토리지로의 가져오기 등을 깨뜨리는 레거시 HTML 태그가 많이 남아 있습니다.

모든 게시글의 HTML 마크업을 마이그레이션 후 지능적으로 제거할 수 있는 좋은 방법이 있을까요?
또 다른 질문은, http에서 https로 변경해야 할 URL도 많다는 것입니다.

도와주셔서 감사합니다. 참고로, 제가 제공했던 임시 스크립트는 Discourse 게시글 형식에 맞게 게시글을 더 잘 처리하도록 수정되어야 할 것입니다(제 기술 수준을 벗어난 부분이지만)…

이러한 문제는 가져오기(importer) 단계에서 수정하는 것이 가장 쉽습니다. 이미 서비스가 공개되어 있어 그런 옵션이 불가능하다면, 상황이 더 복잡해집니다. 원시 텍스트를 수정하는 코드를 작성한 뒤 게시물을 다시 생성(rebake)해야 합니다. 아쉽게도 마법 같은 해결책은 없습니다.

여기서 설명된 문제에 직면하고 있는 것 같습니다: Fix broken images for posts created by the WP Discourse and RSS plugins. 해당 토픽에서 제가 첫 번째로 남긴 답변에 이 문제를 일으키는 원인에 대한 세부 정보가 있습니다. 이 문제는 HTML로 생성된 게시물의 이미지에 영향을 미칩니다. 해당 토픽의 제목을 업데이트하여, WP Discourse 플러그인이나 RSS 피드로 생성된 게시물뿐만 아니라 더 많은 경우에 해당한다는 점을 명확히 하겠습니다.

이상적으로는 Discourse 마크다운 파서가 다른 HTML 태그로 감싸인 HTML 이미지 태그를 처리할 수 있어야 합니다. 하지만 수정하기 어려운 문제라고 생각합니다.

네, 제 이미지들이 다른 HTML 태그 안에 깨져 있는 현상이 바로 이겁니다.

수동으로 수정을 시작했는데, 시간이 많이 걸리고 최신 게시물 목록에서 해당 게시물이 맨 위로 올라가버리는 문제까지 겹쳐서 더 복잡해졌습니다. 그래서 수동으로 뱀프(reset)를 다시 해야 하는 등 추가적인 작업이 필요합니다.

일단 상태가 아주 나쁜 게시물 몇 개를 살펴보고 HTML 태그를 제거하는 로직을 직접 찾아볼 생각입니다. 이후에는 데이터베이스 전체에 걸쳐 이를 자동화하는 데 도움이 필요할 것 같아, 그 부분은 dataexplorer를 이용해 알아보려고 합니다. dataexplorer가 이러한 게시물 변환 작업을 위한 IDE처럼 사용할 수 있을까요?

학습 과정을 기대하고 있습니다.

Koen

아니요, Data Explorer 플러그인은 사이트 데이터베이스에서 읽기만 할 수 있습니다. 사이트 데이터베이스에 쓸 수는 없습니다.

안녕하세요. 수동으로 정리하는 방법과 깨진 이미지 문제를 해결하는 방법을 알아냈습니다. 하지만 이번에는 자동으로 처리하고 싶습니다.

[P]와 [/P], [BR/] 같은 HTML 태그를 모두 제거하는 방법을 찾고 있습니다.

포럼을 검색해 보았지만 이와 비슷한 내용을 찾지 못했습니다. 가져오기 스크립트도 검색해 보았지만, 시작점으로 사용할 수 있는 Discourse에서 Discourse로 가져오는 도구가 포함되어 있지 않았습니다. 다음 작업을 수행하는 스크립트가 필요할 것 같습니다:

게시물 테이블에 접근
모든 게시물을 반복
각 게시물에 대해:
–> P 태그를 완전히 제거
–> BR/를 줄바꿈 문자로 대체
–> URL에 대해 적절한 처리
–> 이미지에 대해 적절한 처리
아마도 모든 게시물을 다시 베이킹(rebake)해야 할 것입니다.

Discourse에서 관련 논의가 있는 곳을 안내해 주시거나, 시작할 수 있는 스크립트나 스니펫을 가지고 계신 분이 있을까요? 숙련된 개발자는 아니지만, 작동하는 것을 수정하는 정도는 할 수 있습니다…

목표를 달성하면 커뮤니티에 결과를 공유하겠습니다.

Koen

비슷한 기능을 수행하는 코드는 다음과 같습니다:

posts=Post.where("raw like '%Sent from%using Tapatalk'")

posts.each do |post|
   post.raw.gsub!(/^Sent from my.+?using Tapatalk$/,"")
   post.save
   post.rebake!
end

이미지나 URL이 어떻게든 손상되지 않는 한, 이를 위한 “지능적인” 처리는 필요하지 않다고 생각합니다.

다음과 같은 코드가 필요할 것입니다.

   post.raw.gsub!(/\/?\[p\]/ig,"\n")

이 코드는 [p]와 [/p]를 줄바꿈으로 대체합니다(추가 줄바꿈은 해가 되지 않지만, 줄바꿈이 필요 없다고 생각되면 \n을 제거할 수 있습니다). 다만, 테스트를 해보지 않아서 아마도 잘못된 코드일 수 있습니다. https://rubular.com/ 같은 곳에서 테스트해 볼 수 있습니다.

정말 좋습니다. 덕분에 완전히 올바른 방향으로 나아갈 수 있었어요.

제 간단한 경우를 고려할 때, rake posts:remap["find","replace"]를 사용하는 것으로 충분할 것 같은데요?

한번 시도해볼게요. 정말 감사합니다!

해당 rake 작업을 통해 [를 어떻게 이스케이프 처리해야 하는지 알아내는 것은 까다로울 수 있습니다(그리고 가능할지도 모릅니다).

죄송합니다, 그 “]” 문자는 제가 "<"를 어떻게 넣어야 할지 몰라서 넣은 것입니다.

표준 HTML 태그 몇 개만 제거하면 됩니다.

remap을 사용하면 괜찮을 것 같은데, 맞나요?

아마도 그렇습니다. 백틱을 이렇게 사용하여 내용을 인용합니다

`<`p`>`

또는

`<p>`

참고로 @koen360

저희가 포럼을 마이그레이션했을 때, 거의 20년치 포럼 게시물에서 이러한 bbcode 및 태그 문제가 수없이 많이 발생했습니다.

이러한 문제에 대해 rake remap 기능을 사용하지 않았으며, 모든 경우에서 @pfaffman이 코드 스니펫에 설명한 기술을 사용했습니다:

위에서 gsub()를 사용하는 이 코드 스니펫은 마이그레이션 후(또는 더 좋게는 마이그레이션 중) 원본 게시물을 정리하는 가장 좋은 방법 중 하나를 요약해 줍니다.

실제로 데이터베이스에 적용하기 전에 정규식(REGEX) 표현식을 반드시 테스트하고, 데이터베이스에 직접 이러한 작업을 수행하기 전에 전체 백업을 확보해 두세요.

안녕하세요, 아래는 RAILS_ENV=development bundle exec ruby script/cleanup.rb 명령어로 실행하는 제 스크립트 script/cleanup.rb의 내용입니다.

파일 내용:

require_relative '../config/environment'
pm = 0
Post.find_each do |test|
	test.raw.gsub!(/<(.|\/.)>/i,"")
	test.save
	test.rebake!
	pm = pm + 1
end
puts "cycled through #{pm} posts"

rake posts:rebake를 시도해 보았는데, 이 명령어는 1,757개의 게시물을 rebake합니다. 스크립트는 HTML 태그가 포함된 가져온(imported) 게시물인 1,712개만 순회하며, 나머지는 Discourse에서 새로 생성된 게시물입니다.

해결에 근접한 것 같지만, UI에서 원본(raw) 콘텐츠를 확인하면 여전히 모든 HTML 태그가 보입니다.

환경을 재부팅하고 unicorn를 다시 시작해 보았지만 효과가 없었습니다. 정말 아깝네요… 정말 아깝네요 ;o)

정규식을 어딘가에서 테스트해 보셨나요? 원본(raw)이 변경되었는지 확인하려면 한 번에 한 개의 게시글만 처리해 보세요.

Rubular의 제안을 사용했고, 이제 regexr.com에서 아래 스크린샷과 같은 결과가 나옵니다. 당분간은 p 태그와 r 태그만 처리하고, 그걸 정리한 후에 더 복잡한 태그들을 추가할 계획입니다.

cleanup.rb에 put 문을 추가해서 원본 게시물 내용을 CLI에 출력해 보았더니, HTML 태그가 전혀 출력되지 않았습니다.

하지만 게시물을 수정하면 오른쪽에 HTML 태그가 표시되는 것을 확인할 수 있습니다. 이는 일반적인 상황이 아닌 것 같습니다. 현재 수정 중인 게시물을 다시 열어서 수정할 때 HTML 태그가 보이지 않으니까요…

어떤 이유인지 아시는 분 계신가요?

그 gsub에는 여러 태그를 일치시키기 위해 /i 뒤에 g가 필요합니다. 하지만 스크립트가 실행된 후 확인되는 결과가 puts에서 보는 것과 다르다면, 그 이유를 설명해 드릴 수 없습니다.

이상하게도 다음과 같은 오류가 발생합니다:

script/cleanup.rb:9: unknown regexp option - g

i 옵션에 g를 이렇게 추가했을 때:

require_relative ‘../config/environment’

pm = 0
Post.find_each do |test|
puts test.raw
test.raw.gsub!(/<(.|/.)>/ig,“”)
test.save
test.rebake!
pm = pm + 1
end
puts “cycled through #{pm} posts”

기억하기로는 (일반적으로 gsub를 사용하여 여러 줄을 매칭하는 방식은 다음과 같습니다 …), Ruby의 여러 줄 REGEX에는 m이 필요합니다:

/./m - 모든 문자 (m 수정자는 여러 줄 모드를 활성화합니다)

참고:

도움이 되셨길 바랍니다.

정규식 부분은 잘 해결되었습니다.

이 스크립트로 설명할 수 없는 두 가지 문제가 있습니다:

# 이렇게 호출합니다:
# RAILS_ENV=development bundle exec ruby script/cleanup.rb -> cleanup.log

require_relative '../config/environment'
pm = 0
Post.find_each do |test|
	puts test.raw
	test.raw.gsub!(/<(.|\/.)>/im,"")
	test.save
	test.rebake!
	pm = pm + 1
end
puts "cycled through #{pm} posts"
  1. 이 스크립트를 몇 번 실행한 후에도 cleanup.log에는 약 21,000줄의 원본 게시물 자료 중 10개의 <p> 태그가 여전히 남아 있습니다. 이상하게도 이 태그들은 절대 제거되지 않습니다.
  2. 더 이상한 것(제 입장에서)은, 유니콘(unicorn)을 실행하여 로컬 머신에서 사이트를 접근했을 때 에디터의 원본 보기에서 확인한 모든 게시물에 여전히 HTML 태그가 남아 있다는 점입니다.

아마도 제가 같은 환경을 보고 있지 않은 것 같습니다. d/unicorn은 로컬 프로덕션 환경을 참조하는 반면, 제 스크립트는 개발(dev) 환경에 변경 사항을 적용하는 것은 아닌가요?

실제 라이브 사이트로 넘어가기 전에, 먼저 로컬에서 Docker 가이드를 사용하여 개발 환경에서 이 문제를 해결하려고 노력하고 있습니다.

초보자가 놓치고 있는 매우 기본적인 부분이 있을 것 같습니다. :sweat_smile: