Skip to content

Commit

Permalink
local convert_html : img要素の変換方法を修正 (#29)
Browse files Browse the repository at this point in the history
* roff format

* pylint 'E0606'による対応

* poetry update

* body要素がないときの結果が間違っていたのを修正

* ac:imageのすべての属性に対応する

* print文を削除

* update doc

* format
  • Loading branch information
yuji38kwmt authored May 15, 2024
1 parent 4bec127 commit 25b4611
Show file tree
Hide file tree
Showing 6 changed files with 232 additions and 215 deletions.
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
},
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces,type=bind,consistency=cached",
"workspaceFolder": "/workspaces",
"postStartCommand": ".devcontainer/post-start.sh",
"postStartCommand": "poetry install",
"customizations": {
"vscode": {
"extensions": [
Expand Down
6 changes: 5 additions & 1 deletion confluence/attachment/create_attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,11 @@ def add_arguments_to_parser(parser: argparse.ArgumentParser): # noqa: ANN201

parser.add_argument("--mime_type", type=str, help="ファイル名からMIMEタイプが判別できないときに、この値を添付ファイルのMIMEタイプとします。")

parser.add_argument("--allow_duplicated", action="store_true", help="指定した場合は、アップロード先にすでに同じファイルが存在している場合に上書きます。指定しない場合は、400 Errorが発生します。")
parser.add_argument(
"--allow_duplicated",
action="store_true",
help="指定した場合は、アップロード先にすでに同じファイルが存在している場合に上書きます。指定しない場合は、400 Errorが発生します。",
)

parser.add_argument("--filename_pattern", help="glob形式のパターンに一致するファイル名だけアップロードします。(ex) '*.png'")
parser.set_defaults(subcommand_func=main)
Expand Down
1 change: 1 addition & 0 deletions confluence/attachment/delete_attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def main(args: argparse.Namespace) -> None:
success_count = 0

all_yes = False
yes = False
for index, attachment in enumerate(results):
attachment_id = attachment["id"]
attachment_title = attachment["title"]
Expand Down
39 changes: 22 additions & 17 deletions confluence/local/convert_html_to_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,11 @@ def convert_img_elm(img_elm: HtmlElement) -> None:
`<img src="foo.png">`を以下のXMLに変換する
```
<ac:image ac:alt="aaaa" ac:border="true" ac:height="207" ac:title="aaaa" ac:width="240">
<ri:attachment ri:filename="image2023-2-16_11-24-17.png"/>
<ac:image>
<ri:attachment ri:filename="foo.png"/>
</ac:image>
```
```
<ac:image><ri:url ri:value="http://confluence.atlassian.com/images/logo/confluence_48_trans.png" /></ac:image>
```
Args:
trim_dirname_for_src_value: src属性値からディレクトリ名を削除する。Confluenceにアップロードしたファイル名にスラッシュは含められないため。
"""
Expand All @@ -39,6 +34,10 @@ def convert_img_elm(img_elm: HtmlElement) -> None:
url_elm.tag = "ri:url"
url_elm.attrib["ri:value"] = src_value
img_elm.append(url_elm)
elif src_value.startswith("data:"):
# Data URIには対応していないので、スキップする
logger.warning(f"img要素のsrc属性値はData URIが含まれていました。Confluence用のXMLはData URIに対応していません。 :: {img_elm}'")
return
else:
attachment_elm = fromstring("<ri:attachment/>")
# コロン付きのタグが生成できないので、改めて置換した
Expand All @@ -49,17 +48,21 @@ def convert_img_elm(img_elm: HtmlElement) -> None:
attachment_elm.attrib["ri:filename"] = tmp[-1]

img_elm.append(attachment_elm)

del img_elm.attrib["src"]

# img要素のいくつかの属性を、`ac:image`タグの属性に変換する。
# https://ja.confluence.atlassian.com/doc/confluence-storage-format-790796544.html
# bool値を指定する以下の属性は変換しない
# ac:border, ac:thumbnail
for html_attribute_name in ("align", "class", "title", "style", "alt", "height", "width", "vspace", "hspace"):
attribute_value = img_elm.attrib.get(html_attribute_name)
if attribute_value is not None and attribute_value != "":
img_elm.attrib[f"ac:{html_attribute_name}"] = attribute_value
del img_elm.attrib[html_attribute_name]

# サムネイル画像として設定する(画像をクリックすると拡大表示される)
img_elm.attrib["ac:thumbnail"] = "true"

alt_value: str = img_elm.attrib.get("alt")
if alt_value != "":
img_elm.attrib["ac:alt"] = alt_value

title_value: str = img_elm.attrib.get("title")
if title_value != "":
img_elm.attrib["ac:title"] = title_value


def convert(input_html_file: Path, output_xml_file: Path) -> None:
with input_html_file.open(encoding="utf-8") as f:
Expand All @@ -73,9 +76,11 @@ def convert(input_html_file: Path, output_xml_file: Path) -> None:

# body要素があればその中身、なければhtmlファイルの中身をアップロードする
if len(pq_html("body")) > 0:
# body要素以下のHTMLを取得する
html_data = pq_html("body").html()
else:
html_data = pq_html.html()
# 要素自身のHTMLを取得する
html_data = str(pq_html)

output_xml_file.parent.mkdir(exist_ok=True, parents=True)
output_xml_file.write_text(html_data, encoding="utf-8")
Expand Down
43 changes: 31 additions & 12 deletions docs/command_reference/local/convert_html.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,30 +18,28 @@ Examples
$ confluence local convert_html input.html output.xml
.. code-block::
:caption: input.xml
.. code-block:: html
:caption: input.html

<html>
<body>
<img alt="" src="foo.png" title="foo-title" alt="foo-alt">
<img alt="" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png">
<img src="foo.png" title="foo-title" alt="foo-alt">
<img src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png">
</body>
</html>


.. code-block::
.. code-block:: xml
:caption: output.xml
<ac:image alt="" src="foo.png" title="foo-title" ac:thumbnail="true" ac:title="foo-title">
<ri:attachment ri:filename="foo.png" />
<ac:image ac:title="foo-title" ac:alt="foo-alt" ac:thumbnail="true">
<ri:attachment ri:filename="foo.png"/>
</ac:image>
<ac:image alt="" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"
ac:thumbnail="true" ac:title="">
<ri:url ri:value="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png" />
<ac:image ac:thumbnail="true">
<ri:url ri:value="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"/>
</ac:image>
source editorにXMLを入力する前に、 ``<ri:attachment ri:filename="foo.png" />`` で参照されているファイルを添付ファイルとして作成する必要があります。

Expand All @@ -53,6 +51,27 @@ https://github.com/kurusugawa-computer/confluence-cli/wiki/Google-Docs%E3%82%92C



img要素の変換
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``img`` 要素の ``src`` 属性に指定されているディレクトリは無視されます。

.. code-block:: html
:caption: 変換前のHTML

<img src="images/bar.png">


.. code-block:: html
:caption: 変換後のXML

<ac:image ac:thumbnail="true" >
<ri:attachment ri:filename="bar.png"/>
</ac:image>


Data URLが含まれた画像(Base64形式)は、Confluence用のXMLには対応していません。
別の手段で、直接画像を参照する形式に変換してから、 ``local convert_html`` を実行してください。



Expand Down
Loading

0 comments on commit 25b4611

Please sign in to comment.