Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix pylint warnings of generate_how_to_cite.py #8264

Merged
merged 2 commits into from
Jun 12, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
315 changes: 209 additions & 106 deletions Documentation/doc/scripts/generate_how_to_cite.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

### Constants ###

result_bib=r"""@book{ cgal:eb-${CGAL_RELEASE_YEAR_ID}
RESULT_BIB = r"""@book{ cgal:eb-${CGAL_RELEASE_YEAR_ID}
, title = "{CGAL} User and Reference Manual"
, author = "{The CGAL Project}"
, publisher = "{CGAL Editorial Board}"
Expand All @@ -18,7 +18,7 @@
, url = "https://doc.cgal.org/${CGAL_CREATED_VERSION_NUM}/Manual/packages.html"
}"""

result_txt=r"""// This file was generated by generate_how_to_cite.py. You shouldn't modify it directly.
RESULT_TXT = r"""// This file was generated by generate_how_to_cite.py. You shouldn't modify it directly.

/*!
\page how_to_cite_cgal Acknowledging %CGAL
Expand Down Expand Up @@ -73,13 +73,13 @@


"""
result_txt_footer=r"""</td>
RESULT_TXT_FOOTER = r"""</td>
</tr>
</table><hr>
*/
"""

pre_html=r"""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
PRE_HTML = r"""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="icon" type="image/png" href="../Manual/g-196x196-doc.png"/>
Expand All @@ -90,11 +90,11 @@
</head>
<body>
"""
post_html=r"""</body>
POST_HTML = r"""</body>
</html>
"""

result_html=r"""<h1>how_to_cite_cgal.bib</h1><a name="cgal:eb-${CGAL_RELEASE_YEAR_ID}"></a><pre>
RESULT_HTML = r"""<h1>how_to_cite_cgal.bib</h1><a name="cgal:eb-${CGAL_RELEASE_YEAR_ID}"></a><pre>
@book{<a href="how_to_cite_cgal.html#cgal:eb-${CGAL_RELEASE_YEAR_ID}">cgal:eb-${CGAL_RELEASE_YEAR_ID}</a>,
title = {{CGAL} User and Reference Manual},
author = {{The CGAL Project}},
Expand All @@ -109,122 +109,225 @@

### Functions ###


def gen_bib_entry(title, authors, bib, anchor):
res="\n\
@incollection{"+bib+"-${CGAL_RELEASE_YEAR_ID}\n\
, author = \""+authors+"\"\n\
, title = \""+title+"\"\n\
, publisher = \"{CGAL Editorial Board}\"\n\
, edition = \"{${CGAL_CREATED_VERSION_NUM}}\"\n\
, booktitle = \"{CGAL} User and Reference Manual\"\n\
, url = \"https://doc.cgal.org/${CGAL_CREATED_VERSION_NUM}/Manual/packages.html#"+anchor+"\"\n\
res = (
"\n\
@incollection{"
+ bib
+ '-${CGAL_RELEASE_YEAR_ID}\n\
, author = "'
+ authors
+ '"\n\
, title = "'
+ title
+ '"\n\
, publisher = "{CGAL Editorial Board}"\n\
, edition = "{${CGAL_CREATED_VERSION_NUM}}"\n\
, booktitle = "{CGAL} User and Reference Manual"\n\
, url = "https://doc.cgal.org/${CGAL_CREATED_VERSION_NUM}/Manual/packages.html#'
+ anchor
+ '"\n\
, year = ${CGAL_BUILD_YEAR4}\n\
}\n"
return res

def gen_txt_entry(title, authors, bib, anchor,k):
title_r=title.replace("Kernel","%Kernel").replace("Interval","%Interval").replace("Matrix","%Matrix").replace("Kinetic","%Kinetic").replace("CGAL","\cgal").replace("Range","%Range")
authors=authors.replace("CGAL","\cgal")
res="<tr valign=\"top\">\n\
<td align=\"right\" class=\"bibtexnumber\">\n\
[<a name=\""+bib+"-${CGAL_RELEASE_YEAR_ID}\">"+str(k)+"</a>]\n\
}\n'
)
return res


def gen_txt_entry(title, authors, bib, anchor, k):
title_r = (
title.replace("Kernel", "%Kernel")
.replace("Interval", "%Interval")
.replace("Matrix", "%Matrix")
.replace("Kinetic", "%Kinetic")
.replace("CGAL", r"\cgal")
.replace("Range", "%Range")
)
authors = authors.replace("CGAL", r"\cgal")
res = (
'<tr valign="top">\n\
<td align="right" class="bibtexnumber">\n\
[<a name="'
+ bib
+ '-${CGAL_RELEASE_YEAR_ID}">'
+ str(k)
+ '</a>]\n\
</td>\n\
<td class=\"bibtexitem\">\n "+authors+".\n "+title_r+".\n\
In <em>\cgal User and Reference Manual</em>. \cgal Editorial Board,\n\
<td class="bibtexitem">\n '
+ authors
+ ".\n "
+ title_r
+ '.\n\
In <em>\\cgal User and Reference Manual</em>. \\cgal Editorial Board,\n\
${CGAL_CREATED_VERSION_NUM} edition, ${CGAL_BUILD_YEAR4}.\n\
[&nbsp;<a href=\"how_to_cite.html#"+bib+"-${CGAL_RELEASE_YEAR_ID}\">bib</a>&nbsp;| \n\
<a href=\"packages.html#"+anchor+"\">http</a>&nbsp;]\n\
[&nbsp;<a href="how_to_cite.html#'
+ bib
+ '-${CGAL_RELEASE_YEAR_ID}">bib</a>&nbsp;| \n\
<a href="packages.html#'
+ anchor
+ '">http</a>&nbsp;]\n\
\n\
</td>\n\
</tr>\n\n\n"
return res
</tr>\n\n\n'
)
return res


def gen_html_entry(title, authors, bib, anchor):
res="<a name=\""+bib+"-${CGAL_RELEASE_YEAR_ID}\"></a><pre>\n\
@incollection{<a href=\"how_to_cite_cgal.html#"+bib+"-${CGAL_RELEASE_YEAR_ID}\">"+bib+"-${CGAL_RELEASE_YEAR_ID}</a>,\n\
author = {"+authors+"},\n\
title = {"+title+"},\n\
res = (
'<a name="'
+ bib
+ '-${CGAL_RELEASE_YEAR_ID}"></a><pre>\n\
@incollection{<a href="how_to_cite_cgal.html#'
+ bib
+ '-${CGAL_RELEASE_YEAR_ID}">'
+ bib
+ "-${CGAL_RELEASE_YEAR_ID}</a>,\n\
author = {"
+ authors
+ "},\n\
title = {"
+ title
+ '},\n\
publisher = {{CGAL Editorial Board}},\n\
edition = {{${CGAL_CREATED_VERSION_NUM}}},\n\
booktitle = {{CGAL} User and Reference Manual},\n\
url = {<a href=\"https://doc.cgal.org/${CGAL_CREATED_VERSION_NUM}/Manual/packages.html#"+anchor+"\">https://doc.cgal.org/${CGAL_CREATED_VERSION_NUM}/Manual/packages.html#"+anchor+"</a>},\n\
url = {<a href="https://doc.cgal.org/${CGAL_CREATED_VERSION_NUM}/Manual/packages.html#'
+ anchor
+ '">https://doc.cgal.org/${CGAL_CREATED_VERSION_NUM}/Manual/packages.html#'
+ anchor
+ "</a>},\n\
year = ${CGAL_BUILD_YEAR4}\n\
}\n\
</pre>\n\n"
return res
)
return res


def protect_upper_case(title):
return title.replace("dD","{dD}").replace("2D","{2D}").replace("3D","{3D}").replace("CGAL","{CGAL}").replace("Qt","{Qt}").replace("Boost","{Boost}")
return (
title.replace("dD", "{dD}")
.replace("2D", "{2D}")
.replace("3D", "{3D}")
.replace("CGAL", "{CGAL}")
.replace("Qt", "{Qt}")
.replace("Boost", "{Boost}")
)


def protect_accentuated_letters(authors):
res=authors.replace("é",r"{\'e}").replace("è",r"{\`e}").replace("É",r"{\'E}").replace("ä",r"{\"a}").replace("ö",r"{\"o}").replace("ñ",r"{\~n}").replace("ã",r"{\~a}").replace("ë",r"{\"e}").replace("ı",r"{\i}").replace("Ş",r"{\c{S}}").replace("ş",r"{\c{s}}").replace("%","").replace("đ",r"{\-d}")
try:
res.encode('ascii')
except UnicodeEncodeError:
stderr.write("WARNING: a non-ASCII character has been found in author string for bibtex (probably a non-handled accentuated letter)."
"Check the new package added and update the function protect_accentuated_letters in Documentation/scripts/generate_how_to_cite.py\n\n")
return res

def make_doc_path(pkg, arg):
if BRANCH_BUILD:
return os.path.join(SOURCE_DIR, pkg, "doc", pkg, arg)
else:
return os.path.join(SOURCE_DIR, "doc", pkg, arg)

### Start of the main function ###

assert len(argv) == 4, "require exactly three arguments: source_dir, build_dir, branch_build"

SOURCE_DIR = argv[1]
BUILD_DIR = argv[2]
BRANCH_BUILD = argv[3]

pattern = re.compile(r"\\package_listing{([^}]*)}")

pattern_title_and_anchor = re.compile(r"\\cgalPkgDescriptionBegin{([^}]*),\s?([^}]*)}")
pattern_author = re.compile(r"\\cgalPkgAuthors?{([^}]*)}")
pattern_bib = re.compile(r"\\cgalPkgBib{([^}]*)}")

f = codecs.open(make_doc_path("Documentation", "packages.txt"), 'r', encoding='utf-8')
k=2
for line in f:
match = pattern.match(line)
if(match):
pkg = match.group(1)
filename = make_doc_path(pkg, "PackageDescription.txt")
pkgdesc = codecs.open(filename, 'r', encoding='utf-8')
authors=""
bib=""
anchor=""
for pkg_line in pkgdesc:
match = pattern_title_and_anchor.match(pkg_line)
if match:
title=match.group(1).replace("\,",",")
anchor=match.group(2)
continue
match = pattern_author.match(pkg_line)
if match:
authors=match.group(1).replace(", and"," and").replace(","," and")
continue
match = pattern_bib.match(pkg_line)
res = (
authors.replace("é", r"{\'e}")
.replace("è", r"{\`e}")
.replace("É", r"{\'E}")
.replace("ä", r"{\"a}")
.replace("ö", r"{\"o}")
.replace("ñ", r"{\~n}")
.replace("ã", r"{\~a}")
.replace("ë", r"{\"e}")
.replace("ı", r"{\i}")
.replace("Ş", r"{\c{S}}")
.replace("ş", r"{\c{s}}")
.replace("%", "")
.replace("đ", r"{\-d}")
)
try:
res.encode("ascii")
except UnicodeEncodeError:
stderr.write(
"WARNING: a non-ASCII character has been found in author string for bibtex (probably a non-handled accentuated letter)."
"Check the new package added and update the function protect_accentuated_letters in Documentation/scripts/generate_how_to_cite.py\n\n"
)
return res


def make_doc_path(pkg, arg, source_dir, branch_build):
if branch_build:
return os.path.join(source_dir, pkg, "doc", pkg, arg)
else:
return os.path.join(source_dir, "doc", pkg, arg)

### Start of the main function ###


def main():
assert (
len(argv) == 4
), "require exactly three arguments: source_dir, build_dir, branch_build"

source_dir = argv[1]
build_dir = argv[2]
branch_build = argv[3]

result_txt = RESULT_TXT
result_bib = RESULT_BIB
result_html = RESULT_HTML

pattern = re.compile(r"\\package_listing{([^}]*)}")

pattern_title_and_anchor = re.compile(
r"\\cgalPkgDescriptionBegin{([^}]*),\s?([^}]*)}"
)
pattern_author = re.compile(r"\\cgalPkgAuthors?{([^}]*)}")
pattern_bib = re.compile(r"\\cgalPkgBib{([^}]*)}")

f = codecs.open(
make_doc_path("Documentation", "packages.txt", source_dir, branch_build),
"r",
encoding="utf-8",
)
k = 2
for line in f:
match = pattern.match(line)
if match:
bib=match.group(1)
continue
assert len(bib)>0, "Did you forget a \cgalPkgBib{} in %r?" % filename
assert len(authors)>0, "Did you forget a \cgalPkgAuthors{} in %r?" % filename
assert len(anchor)>0, "Did you forget the anchor in \cgalPkgDescriptionBegin{} in %r?" % filename
result_txt+=gen_txt_entry(title, authors, bib, anchor,k)
# convert title and author to bibtex format
title=protect_upper_case(title)
authors=protect_accentuated_letters(authors)
result_bib+=gen_bib_entry(title, authors, bib, anchor)
result_html+=gen_html_entry(title, authors, bib, anchor)
k+=1

f = codecs.open(BUILD_DIR+"/how_to_cite_cgal.bib.in", 'w', encoding='utf-8')
f.write(result_bib)
result_txt+=result_txt_footer
f = codecs.open(BUILD_DIR+"/how_to_cite_cgal.txt.in", 'w', encoding='utf-8')
f.write(result_txt)
f = codecs.open(BUILD_DIR+"/how_to_cite.html.in", 'w', encoding='utf-8')
f.write(pre_html + result_html + post_html)
pkg = match.group(1)
filename = make_doc_path(
pkg, "PackageDescription.txt", source_dir, branch_build
)
pkgdesc = codecs.open(filename, "r", encoding="utf-8")
authors = ""
bib = ""
anchor = ""
for pkg_line in pkgdesc:
match = pattern_title_and_anchor.match(pkg_line)
if match:
title = match.group(1).replace(r"\,", ",")
anchor = match.group(2)
continue
match = pattern_author.match(pkg_line)
if match:
authors = (
match.group(1).replace(", and", " and").replace(",", " and")
)
continue
match = pattern_bib.match(pkg_line)
if match:
bib = match.group(1)
continue
assert len(bib) > 0, "Did you forget a \\cgalPkgBib{} in %r?" % filename
assert len(authors) > 0, (
"Did you forget a \\cgalPkgAuthors{} in %r?" % filename
)
assert len(anchor) > 0, (
"Did you forget the anchor in \\cgalPkgDescriptionBegin{} in %r?"
% filename
)
result_txt += gen_txt_entry(title, authors, bib, anchor, k)
# convert title and author to bibtex format
title = protect_upper_case(title)
authors = protect_accentuated_letters(authors)
result_bib += gen_bib_entry(title, authors, bib, anchor)
result_html += gen_html_entry(title, authors, bib, anchor)
k += 1

f = codecs.open(build_dir + "/how_to_cite_cgal.bib.in", "w", encoding="utf-8")
f.write(result_bib)
result_txt += RESULT_TXT_FOOTER
f = codecs.open(build_dir + "/how_to_cite_cgal.txt.in", "w", encoding="utf-8")
f.write(result_txt)
f = codecs.open(build_dir + "/how_to_cite.html.in", "w", encoding="utf-8")
f.write(PRE_HTML + result_html + POST_HTML)


if __name__ == "__main__":
main()