Doxygen 自定义 CSS 用于私有、受保护和 public 项目 [已解决]
Doxygen custom CSS for private, protected and public items [SOLVED]
背景
我正在使用 Doxygen v1.8.14 为开发人员记录一些嵌入式 C++ 项目。已记录的 class 成员函数的访问修饰符标记为私有、受保护或 public 在项目标题的最右侧带有一个小标签。浏览文档时,必须在远离函数名的地方寻找这个标签。
预期结果
我想将项目的 header 背景更改为蓝色(私有)、黄色(受保护)和绿色(public)以便于识别它们。
问题
我浏览了 customdoxygen.css 文件,但找不到任何与 C++ 访问修饰符 (私有、受保护和 public)相关的标签。我还检查了 Firefox 中的 HTML 和 CSS,但似乎 Doxygen 没有区分访问修饰符(它们都是相同的 CSS class)。访问修饰符是标记中的纯文本(除了没有标记的 public)。
<span class="mlabel">private</span>
在早期的项目中,我使用 ALIAS 重新定义代码示例的显示方式,但这需要使用新的 Doxygen 标记命令(别名)。
关于如何做到这一点或什至可能的任何想法?
编辑
这已得到解决,并在我自己的答案中提供了 step-by-step 描述。
坏消息 – 我认为 Doxygen 没有特定的 command/config 来支持对生成的 HTML 输出进行这种级别的自定义。
好消息 – 您可以利用现有的支持来真正发挥创意来注入自定义 HTML,例如 HTML_HEADER tag。例如,您可以包含一个 JavaScript 来检查标签并更新背景颜色 onload()。
这是一个伪代码(警告 - 我还没有测试过)显示建议的方法:
<script type="text/javascript">
// Go over all labels in the file
var labels = document.getElementsByClassName("mlabel");
for (var i = 0; i < labels.length; i++) {
// Set all private labels to red
if(labels.item(i).textContent == “private”) {
labels.item(i).style.backgroundColor = "red";
}
}
</script>
这很微不足道,我过去做过类似的事情(我已经忘记了)。 @albert 和@diogoslima 让我想起了 HTML_HEADER 配置设置,然后我想起了我的旧项目。我看了一下,然后就很简单了。
这里的关键是不要触摸任何原始文件,或者至少尽可能少。
首先,您需要生成用于自定义的模板文件。
doxygen -w html header.html footer.html memberaccess.css
为此你可以删除footer.html
,这里不会用到。
打开 header.html
并在 <head>
部分添加以下行(就在 $treeview
之前是一个不错的位置):
<script type="text/javascript" src="$relpath^memberaccess.js"></script>
...然后将 onload
事件添加到 <body>
标签。
<body onload="DoAccessModifiers()">
就是这样,保存 header.html
文件。
打开 memberaccess.css
文件并将其所有内容替换为:
/* fix empty documents */
.empty {
border-bottom: 1px solid;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
}
/* default access colors */
.memtitle {
padding: 8px;
border-color: #a8b8d9
border-top: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
border-top-right-radius: 4px;
border-top-left-radius: 4px;
margin-bottom: -1px;
background-image: none;
background-color: #e2e8f2;
color: #253555;
line-height: 1.25;
font-weight: 300;
float:left;
}
/* private access colors */
.private {
border-top: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
border-color: #7e96c7;
/*color: #253555;*/
background-color: #dfe5f1;
}
/* protected access colors */
.protected {
border-top: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
border-color: #ffba3b;
/*color: #253555;*/
background-color: #ffe9c0;
}
/* public access colors */
.public {
border-top: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
border-color: #93c77e;
/*color: #253555;*/
background-color: #e4f1df;
}
/* default label colors */
span.mlabel {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
text-shadow: none;
color: white;
margin-right: 4px;
padding: 2px 3px;
border-radius: 3px;
font-size: 7pt;
white-space: nowrap;
vertical-align: middle;
}
/* private label colors */
span.private {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* ptotected label colors */
span.protected {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* inherited label colors */
span.inherited {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* strong label colors */
span.strong {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* static label colors */
span.static {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* inline label colors */
span.inline {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* virtual label colors */
span.virtual {
background-color: #bbbbbb;
border-top:1px solid #606060;
border-left:1px solid #505050;
border-right:1px solid #c0c0c0;
border-bottom:1px solid #c0c0c0;
color: #404040;
}
/* pure virtual label colors */
span.purevirtual {
background-color: #ffffff;
border-top:1px solid #606060;
border-left:1px solid #505050;
border-right:1px solid #c0c0c0;
border-bottom:1px solid #c0c0c0;
color: #000000;
}
/* delete label colors */
span.delete {
background-color: #ca3939;
border-top:1px solid #902626;
border-left:1px solid #902626;
border-right:1px solid #eab0b0;
border-bottom:1px solid #eab0b0;
/*color: white;*/
}
然后创建 memberaccess.js
文件:
function GetAccessModifier(item) {
access = 'public';
Array.prototype.slice.call(item.getElementsByClassName('mlabel')).forEach(function(label) {
if (label.innerText == 'private' || label.innerText == 'protected') { access = label.innerText; }
label.className += ' '+label.innerText.replace(/ /g, '');
});
return access;
}
function DoAccessModifiers() {
Array.prototype.slice.call(document.getElementsByClassName('memitem')).forEach(function(item) {
var title = item.previousElementSibling;
doc = item.getElementsByClassName('memdoc')[0];
item = item.getElementsByClassName('memproto')[0];
modifier = " "+GetAccessModifier(item);
title.className += modifier;
item.className += modifier;
if(doc.childElementCount == 0) { item.className += ' empty'; doc.parentNode.removeChild(doc); }
});
}
现在当所有文件都准备好后,我们只需要告诉 doxygen 配置使用它们。我很懒,更喜欢 DoxyWizard
来创建配置,但如果你愿意,你可以使用文本编辑器破解你最喜欢的配置文件。
HTML_HEADER = header.html
HTML_EXTRA_STYLESHEET = memberaccess.css
HTML_EXTRA_FILES = memberaccess.js
完成!
要更改颜色,请编辑 memberaccess.css
文件:
.private
.protected
.public
这些 类 定义标题和项目背景和边框。
span.xxxx
这些 类 控制每个项目右侧的小标签。 xxxx
与标签的文本相同(删除了空格)。
我希望这对登陆这里的任何人都有用。
背景
我正在使用 Doxygen v1.8.14 为开发人员记录一些嵌入式 C++ 项目。已记录的 class 成员函数的访问修饰符标记为私有、受保护或 public 在项目标题的最右侧带有一个小标签。浏览文档时,必须在远离函数名的地方寻找这个标签。
预期结果
我想将项目的 header 背景更改为蓝色(私有)、黄色(受保护)和绿色(public)以便于识别它们。
问题
我浏览了 customdoxygen.css 文件,但找不到任何与 C++ 访问修饰符 (私有、受保护和 public)相关的标签。我还检查了 Firefox 中的 HTML 和 CSS,但似乎 Doxygen 没有区分访问修饰符(它们都是相同的 CSS class)。访问修饰符是标记中的纯文本(除了没有标记的 public)。
<span class="mlabel">private</span>
在早期的项目中,我使用 ALIAS 重新定义代码示例的显示方式,但这需要使用新的 Doxygen 标记命令(别名)。
关于如何做到这一点或什至可能的任何想法?
编辑
这已得到解决,并在我自己的答案中提供了 step-by-step 描述。
坏消息 – 我认为 Doxygen 没有特定的 command/config 来支持对生成的 HTML 输出进行这种级别的自定义。
好消息 – 您可以利用现有的支持来真正发挥创意来注入自定义 HTML,例如 HTML_HEADER tag。例如,您可以包含一个 JavaScript 来检查标签并更新背景颜色 onload()。 这是一个伪代码(警告 - 我还没有测试过)显示建议的方法:
<script type="text/javascript">
// Go over all labels in the file
var labels = document.getElementsByClassName("mlabel");
for (var i = 0; i < labels.length; i++) {
// Set all private labels to red
if(labels.item(i).textContent == “private”) {
labels.item(i).style.backgroundColor = "red";
}
}
</script>
这很微不足道,我过去做过类似的事情(我已经忘记了)。 @albert 和@diogoslima 让我想起了 HTML_HEADER 配置设置,然后我想起了我的旧项目。我看了一下,然后就很简单了。
这里的关键是不要触摸任何原始文件,或者至少尽可能少。 首先,您需要生成用于自定义的模板文件。
doxygen -w html header.html footer.html memberaccess.css
为此你可以删除footer.html
,这里不会用到。
打开 header.html
并在 <head>
部分添加以下行(就在 $treeview
之前是一个不错的位置):
<script type="text/javascript" src="$relpath^memberaccess.js"></script>
...然后将 onload
事件添加到 <body>
标签。
<body onload="DoAccessModifiers()">
就是这样,保存 header.html
文件。
打开 memberaccess.css
文件并将其所有内容替换为:
/* fix empty documents */
.empty {
border-bottom: 1px solid;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
}
/* default access colors */
.memtitle {
padding: 8px;
border-color: #a8b8d9
border-top: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
border-top-right-radius: 4px;
border-top-left-radius: 4px;
margin-bottom: -1px;
background-image: none;
background-color: #e2e8f2;
color: #253555;
line-height: 1.25;
font-weight: 300;
float:left;
}
/* private access colors */
.private {
border-top: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
border-color: #7e96c7;
/*color: #253555;*/
background-color: #dfe5f1;
}
/* protected access colors */
.protected {
border-top: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
border-color: #ffba3b;
/*color: #253555;*/
background-color: #ffe9c0;
}
/* public access colors */
.public {
border-top: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
border-color: #93c77e;
/*color: #253555;*/
background-color: #e4f1df;
}
/* default label colors */
span.mlabel {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
text-shadow: none;
color: white;
margin-right: 4px;
padding: 2px 3px;
border-radius: 3px;
font-size: 7pt;
white-space: nowrap;
vertical-align: middle;
}
/* private label colors */
span.private {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* ptotected label colors */
span.protected {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* inherited label colors */
span.inherited {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* strong label colors */
span.strong {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* static label colors */
span.static {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* inline label colors */
span.inline {
background-color: #728dc1;
border-top:1px solid #5373b4;
border-left:1px solid #5373b4;
border-right:1px solid #c4cfe5;
border-bottom:1px solid #c4cfe5;
/*color: white;*/
}
/* virtual label colors */
span.virtual {
background-color: #bbbbbb;
border-top:1px solid #606060;
border-left:1px solid #505050;
border-right:1px solid #c0c0c0;
border-bottom:1px solid #c0c0c0;
color: #404040;
}
/* pure virtual label colors */
span.purevirtual {
background-color: #ffffff;
border-top:1px solid #606060;
border-left:1px solid #505050;
border-right:1px solid #c0c0c0;
border-bottom:1px solid #c0c0c0;
color: #000000;
}
/* delete label colors */
span.delete {
background-color: #ca3939;
border-top:1px solid #902626;
border-left:1px solid #902626;
border-right:1px solid #eab0b0;
border-bottom:1px solid #eab0b0;
/*color: white;*/
}
然后创建 memberaccess.js
文件:
function GetAccessModifier(item) {
access = 'public';
Array.prototype.slice.call(item.getElementsByClassName('mlabel')).forEach(function(label) {
if (label.innerText == 'private' || label.innerText == 'protected') { access = label.innerText; }
label.className += ' '+label.innerText.replace(/ /g, '');
});
return access;
}
function DoAccessModifiers() {
Array.prototype.slice.call(document.getElementsByClassName('memitem')).forEach(function(item) {
var title = item.previousElementSibling;
doc = item.getElementsByClassName('memdoc')[0];
item = item.getElementsByClassName('memproto')[0];
modifier = " "+GetAccessModifier(item);
title.className += modifier;
item.className += modifier;
if(doc.childElementCount == 0) { item.className += ' empty'; doc.parentNode.removeChild(doc); }
});
}
现在当所有文件都准备好后,我们只需要告诉 doxygen 配置使用它们。我很懒,更喜欢 DoxyWizard
来创建配置,但如果你愿意,你可以使用文本编辑器破解你最喜欢的配置文件。
HTML_HEADER = header.html
HTML_EXTRA_STYLESHEET = memberaccess.css
HTML_EXTRA_FILES = memberaccess.js
完成!
要更改颜色,请编辑 memberaccess.css
文件:
.private
.protected
.public
这些 类 定义标题和项目背景和边框。
span.xxxx
这些 类 控制每个项目右侧的小标签。 xxxx
与标签的文本相同(删除了空格)。
我希望这对登陆这里的任何人都有用。