Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
import sys, re, os.path, errno, fnmatch
|
||||
import json
|
||||
import logging
|
||||
import codecs
|
||||
from shutil import copyfile
|
||||
from pprint import pformat
|
||||
from string import Template
|
||||
@@ -10,7 +11,12 @@ from string import Template
|
||||
if sys.version_info[0] >= 3:
|
||||
from io import StringIO
|
||||
else:
|
||||
from cStringIO import StringIO
|
||||
import io
|
||||
class StringIO(io.StringIO):
|
||||
def write(self, s):
|
||||
if isinstance(s, str):
|
||||
s = unicode(s) # noqa: F821
|
||||
return super(StringIO, self).write(s)
|
||||
|
||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
@@ -114,14 +120,19 @@ class GeneralInfo():
|
||||
self.params={}
|
||||
self.annotation=[]
|
||||
if type == "class":
|
||||
docstring="// C++: class " + self.name + "\n//javadoc: " + self.name
|
||||
docstring="// C++: class " + self.name + "\n"
|
||||
else:
|
||||
docstring=""
|
||||
|
||||
if len(decl)>5 and decl[5]:
|
||||
#logging.info('docstring: %s', decl[5])
|
||||
if re.search("(@|\\\\)deprecated", decl[5]):
|
||||
doc = decl[5]
|
||||
|
||||
#logging.info('docstring: %s', doc)
|
||||
if re.search("(@|\\\\)deprecated", doc):
|
||||
self.annotation.append("@Deprecated")
|
||||
|
||||
docstring += sanitize_java_documentation_string(doc, type)
|
||||
|
||||
self.docstring = docstring
|
||||
|
||||
def parseName(self, name, namespaces):
|
||||
@@ -272,7 +283,7 @@ class ClassInfo(GeneralInfo):
|
||||
def initCodeStreams(self, Module):
|
||||
self.j_code = StringIO()
|
||||
self.jn_code = StringIO()
|
||||
self.cpp_code = StringIO();
|
||||
self.cpp_code = StringIO()
|
||||
if self.base:
|
||||
self.j_code.write(T_JAVA_START_INHERITED)
|
||||
else:
|
||||
@@ -302,7 +313,7 @@ class ClassInfo(GeneralInfo):
|
||||
jname = self.jname,
|
||||
imports = "\n".join(self.getAllImports(M)),
|
||||
docs = self.docstring,
|
||||
annotation = "\n".join(self.annotation),
|
||||
annotation = "\n" + "\n".join(self.annotation) if self.annotation else "",
|
||||
base = self.base)
|
||||
|
||||
def generateCppCode(self):
|
||||
@@ -490,7 +501,7 @@ class JavaWrapperGenerator(object):
|
||||
content = f.read()
|
||||
if content == buf:
|
||||
return
|
||||
with open(path, "wt") as f:
|
||||
with codecs.open(path, "w", "utf-8") as f:
|
||||
f.write(buf)
|
||||
updated_files += 1
|
||||
|
||||
@@ -504,7 +515,7 @@ class JavaWrapperGenerator(object):
|
||||
self.add_class( ['class ' + self.Module, '', [], []] ) # [ 'class/struct cname', ':bases', [modlist] [props] ]
|
||||
|
||||
# scan the headers and build more descriptive maps of classes, consts, functions
|
||||
includes = [];
|
||||
includes = []
|
||||
for hdr in common_headers:
|
||||
logging.info("\n===== Common header : %s =====", hdr)
|
||||
includes.append('#include "' + hdr + '"')
|
||||
@@ -723,7 +734,7 @@ class JavaWrapperGenerator(object):
|
||||
fi.jname + "(" + ", ".join(j_args) + ")"
|
||||
logging.info("java: " + j_signature)
|
||||
|
||||
if(j_signature in j_signatures):
|
||||
if j_signature in j_signatures:
|
||||
if args:
|
||||
args.pop()
|
||||
continue
|
||||
@@ -739,20 +750,51 @@ class JavaWrapperGenerator(object):
|
||||
type = type_dict[fi.ctype].get("jn_type", "double[]"),
|
||||
name = fi.jname + '_' + str(suffix_counter),
|
||||
args = ", ".join(["%s %s" % (type_dict[a.ctype]["jn_type"], normalize_field_name(a.name)) for a in jn_args])
|
||||
) );
|
||||
) )
|
||||
|
||||
# java part:
|
||||
|
||||
#java doc comment
|
||||
f_name = fi.jname
|
||||
if fi.classname:
|
||||
f_name = fi.classname + "::" + fi.jname
|
||||
java_doc = "//javadoc: " + f_name + "(%s)" % ", ".join([a.name for a in args if a.ctype])
|
||||
j_code.write(" "*4 + java_doc + "\n")
|
||||
|
||||
if fi.docstring:
|
||||
lines = StringIO(fi.docstring)
|
||||
for line in lines:
|
||||
lines = fi.docstring.splitlines()
|
||||
returnTag = False
|
||||
javadocParams = []
|
||||
toWrite = []
|
||||
inCode = False
|
||||
for index, line in enumerate(lines):
|
||||
p0 = line.find("@param")
|
||||
if p0 != -1:
|
||||
p0 += 7
|
||||
p1 = line.find(' ', p0)
|
||||
p1 = len(line) if p1 == -1 else p1
|
||||
name = line[p0:p1]
|
||||
javadocParams.append(name)
|
||||
for arg in j_args:
|
||||
if arg.endswith(" " + name):
|
||||
toWrite.append(line);
|
||||
break
|
||||
else:
|
||||
if "<code>" in line:
|
||||
inCode = True
|
||||
if "</code>" in line:
|
||||
inCode = False
|
||||
if "@return " in line:
|
||||
returnTag = True
|
||||
|
||||
if (not inCode and toWrite and not toWrite[-1] and
|
||||
line and not line.startswith("\\") and not line.startswith("<ul>") and not line.startswith("@param")):
|
||||
toWrite.append("<p>");
|
||||
|
||||
if index == len(lines) - 1:
|
||||
for arg in j_args:
|
||||
name = arg[arg.rfind(' ') + 1:]
|
||||
if not name in javadocParams:
|
||||
toWrite.append(" * @param " + name + " automatically generated");
|
||||
if type_dict[fi.ctype]["j_type"] and not returnTag and fi.ctype != "void":
|
||||
toWrite.append(" * @return automatically generated");
|
||||
toWrite.append(line);
|
||||
|
||||
for line in toWrite:
|
||||
j_code.write(" "*4 + line + "\n")
|
||||
if fi.annotation:
|
||||
j_code.write(" "*4 + "\n".join(fi.annotation) + "\n")
|
||||
@@ -779,7 +821,7 @@ class JavaWrapperGenerator(object):
|
||||
j_epilogue.append('Converters.Mat_to_' + ret_type + '(retValMat, retVal);')
|
||||
ret = "return retVal;"
|
||||
elif ret_type.startswith("Ptr_"):
|
||||
constructor = type_dict[ret_type]["j_type"] + ".__fromPtr__(";
|
||||
constructor = type_dict[ret_type]["j_type"] + ".__fromPtr__("
|
||||
if j_epilogue:
|
||||
ret_val = type_dict[fi.ctype]["j_type"] + " retVal = " + constructor
|
||||
else:
|
||||
@@ -796,14 +838,14 @@ class JavaWrapperGenerator(object):
|
||||
ret_val = "nativeObj = "
|
||||
ret = ""
|
||||
elif self.isWrapped(ret_type): # wrapped class
|
||||
constructor = self.getClass(ret_type).jname + "(";
|
||||
constructor = self.getClass(ret_type).jname + "("
|
||||
if j_epilogue:
|
||||
ret_val = type_dict[ret_type]["j_type"] + " retVal = new " + constructor
|
||||
else:
|
||||
ret_val = "return new " + constructor
|
||||
tail = ")"
|
||||
elif "jn_type" not in type_dict[ret_type]:
|
||||
constructor = type_dict[ret_type]["j_type"] + "(";
|
||||
constructor = type_dict[ret_type]["j_type"] + "("
|
||||
if j_epilogue:
|
||||
ret_val = type_dict[fi.ctype]["j_type"] + " retVal = new " + constructor
|
||||
else:
|
||||
@@ -815,7 +857,7 @@ class JavaWrapperGenerator(object):
|
||||
static = fi.static
|
||||
|
||||
j_code.write( Template(
|
||||
""" public $static$j_type $j_name($j_args) {$prologue
|
||||
""" public $static$j_type$j_name($j_args) {$prologue
|
||||
$ret_val$jn_name($jn_args_call)$tail;$epilogue$ret
|
||||
}
|
||||
|
||||
@@ -827,7 +869,7 @@ class JavaWrapperGenerator(object):
|
||||
prologue = "\n " + "\n ".join(j_prologue) if j_prologue else "",
|
||||
epilogue = "\n " + "\n ".join(j_epilogue) if j_epilogue else "",
|
||||
static = static + " " if static else "",
|
||||
j_type=type_dict[fi.ctype]["j_type"],
|
||||
j_type=type_dict[fi.ctype]["j_type"] + " " if type_dict[fi.ctype]["j_type"] else "",
|
||||
j_name=fi.jname,
|
||||
j_args=", ".join(j_args),
|
||||
jn_name=fi.jname + '_' + str(suffix_counter),
|
||||
@@ -1140,6 +1182,122 @@ def copy_java_files(java_files_dir, java_base_path, default_package_path='org/op
|
||||
copyfile(src, dest)
|
||||
updated_files += 1
|
||||
|
||||
def sanitize_java_documentation_string(doc, type):
|
||||
if type == "class":
|
||||
doc = doc.replace("@param ", "")
|
||||
|
||||
doc = re.sub(re.compile('\\\\f\\$(.*?)\\\\f\\$', re.DOTALL), '\\(' + r'\1' + '\\)', doc)
|
||||
doc = re.sub(re.compile('\\\\f\\[(.*?)\\\\f\\]', re.DOTALL), '\\(' + r'\1' + '\\)', doc)
|
||||
doc = re.sub(re.compile('\\\\f\\{(.*?)\\\\f\\}', re.DOTALL), '\\(' + r'\1' + '\\)', doc)
|
||||
|
||||
doc = doc.replace("&", "&") \
|
||||
.replace("\\<", "<") \
|
||||
.replace("\\>", ">") \
|
||||
.replace("<", "<") \
|
||||
.replace(">", ">") \
|
||||
.replace("$", "$$") \
|
||||
.replace("@anchor", "") \
|
||||
.replace("@brief ", "").replace("\\brief ", "") \
|
||||
.replace("@cite", "CITE:") \
|
||||
.replace("@code{.cpp}", "<code>") \
|
||||
.replace("@code{.txt}", "<code>") \
|
||||
.replace("@code", "<code>") \
|
||||
.replace("@copydoc", "") \
|
||||
.replace("@copybrief", "") \
|
||||
.replace("@date", "") \
|
||||
.replace("@defgroup", "") \
|
||||
.replace("@details ", "") \
|
||||
.replace("@endcode", "</code>") \
|
||||
.replace("@endinternal", "") \
|
||||
.replace("@file", "") \
|
||||
.replace("@include", "INCLUDE:") \
|
||||
.replace("@ingroup", "") \
|
||||
.replace("@internal", "") \
|
||||
.replace("@overload", "") \
|
||||
.replace("@param[in]", "@param") \
|
||||
.replace("@param[out]", "@param") \
|
||||
.replace("@ref", "REF:") \
|
||||
.replace("@returns", "@return") \
|
||||
.replace("@sa", "SEE:") \
|
||||
.replace("@see", "SEE:") \
|
||||
.replace("@snippet", "SNIPPET:") \
|
||||
.replace("@todo", "TODO:") \
|
||||
.replace("@warning ", "WARNING: ")
|
||||
|
||||
doc = re.sub(re.compile('\\*\\*([^\\*]+?)\\*\\*', re.DOTALL), '<b>' + r'\1' + '</b>', doc)
|
||||
|
||||
lines = doc.splitlines()
|
||||
|
||||
lines = list(map(lambda x: x[x.find('*'):].strip() if x.lstrip().startswith("*") else x, lines))
|
||||
|
||||
listInd = [];
|
||||
indexDiff = 0;
|
||||
for index, line in enumerate(lines[:]):
|
||||
if line.strip().startswith("-"):
|
||||
i = line.find("-")
|
||||
if not listInd or i > listInd[-1]:
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "<ul>")
|
||||
indexDiff += 1
|
||||
listInd.append(i);
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "<li>")
|
||||
indexDiff += 1
|
||||
elif i == listInd[-1]:
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "</li>")
|
||||
indexDiff += 1
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "<li>")
|
||||
indexDiff += 1
|
||||
elif len(listInd) > 1 and i == listInd[-2]:
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "</li>")
|
||||
indexDiff += 1
|
||||
del listInd[-1]
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "</ul>")
|
||||
indexDiff += 1
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "<li>")
|
||||
indexDiff += 1
|
||||
else:
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "</li>")
|
||||
indexDiff += 1
|
||||
del listInd[-1]
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "</ul>")
|
||||
indexDiff += 1
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "<ul>")
|
||||
indexDiff += 1
|
||||
listInd.append(i);
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "<li>")
|
||||
indexDiff += 1
|
||||
lines[index + indexDiff] = lines[index + indexDiff][0:i] + lines[index + indexDiff][i + 1:]
|
||||
else:
|
||||
if listInd and (not line or line == "*" or line.startswith("@note")):
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "</li>")
|
||||
indexDiff += 1
|
||||
del listInd[-1]
|
||||
lines.insert(index + indexDiff, " "*len(listInd) + "</ul>")
|
||||
indexDiff += 1
|
||||
|
||||
i = len(listInd) - 1
|
||||
for value in enumerate(listInd):
|
||||
lines.append(" "*i + " </li>")
|
||||
lines.append(" "*i + "</ul>")
|
||||
i -= 1;
|
||||
|
||||
lines = list(map(lambda x: "* " + x[1:].strip() if x.startswith("*") and x != "*" else x, lines))
|
||||
lines = list(map(lambda x: x if x.startswith("*") else "* " + x if x and x != "*" else "*", lines))
|
||||
|
||||
lines = list(map(lambda x: x
|
||||
.replace("@note", "<b>Note:</b>")
|
||||
, lines))
|
||||
|
||||
lines = list(map(lambda x: re.sub('@b ([\\w:]+?)\\b', '<b>' + r'\1' + '</b>', x), lines))
|
||||
lines = list(map(lambda x: re.sub('@c ([\\w:]+?)\\b', '<tt>' + r'\1' + '</tt>', x), lines))
|
||||
lines = list(map(lambda x: re.sub('`(.*?)`', "{@code " + r'\1' + '}', x), lines))
|
||||
lines = list(map(lambda x: re.sub('@p ([\\w:]+?)\\b', '{@code ' + r'\1' + '}', x), lines))
|
||||
|
||||
hasValues = False
|
||||
for line in lines:
|
||||
if line != "*":
|
||||
hasValues = True
|
||||
break
|
||||
return "/**\n " + "\n ".join(lines) + "\n */" if hasValues else ""
|
||||
|
||||
if __name__ == "__main__":
|
||||
# initialize logger
|
||||
|
||||
@@ -5,8 +5,7 @@ package org.opencv.$module;
|
||||
|
||||
$imports
|
||||
|
||||
$docs
|
||||
$annotation
|
||||
$docs$annotation
|
||||
public class $jname {
|
||||
|
||||
protected final long nativeObj;
|
||||
|
||||
@@ -5,8 +5,7 @@ package org.opencv.$module;
|
||||
|
||||
$imports
|
||||
|
||||
$docs
|
||||
$annotation
|
||||
$docs$annotation
|
||||
public class $jname extends $base {
|
||||
|
||||
protected $jname(long addr) { super(addr); }
|
||||
|
||||
@@ -5,6 +5,5 @@ package org.opencv.$module;
|
||||
|
||||
$imports
|
||||
|
||||
$docs
|
||||
$annotation
|
||||
$docs$annotation
|
||||
public class $jname {
|
||||
|
||||
@@ -25,6 +25,8 @@ if(OPENCV_JAVA_TARGET_VERSION)
|
||||
set(OPENCV_ANT_JAVAC_EXTRA_ATTRS "${OPENCV_ANT_JAVAC_EXTRA_ATTRS} target=\"${OPENCV_JAVA_TARGET_VERSION}\"")
|
||||
endif()
|
||||
|
||||
set(OPENCV_JAVADOC_DESTINATION "${OpenCV_BINARY_DIR}/doc/doxygen/html/javadoc" CACHE STRING "")
|
||||
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build.xml.in" "${OPENCV_JAVA_DIR}/build.xml" @ONLY)
|
||||
list(APPEND depends "${OPENCV_JAVA_DIR}/build.xml")
|
||||
|
||||
|
||||
@@ -29,14 +29,35 @@
|
||||
</target>
|
||||
|
||||
<target name="javadoc">
|
||||
<copy file="@OpenCV_SOURCE_DIR@/doc/mymath.js"
|
||||
todir="@OPENCV_JAVADOC_DESTINATION@" />
|
||||
|
||||
<!-- synchronize with platforms\android\build_sdk.py -->
|
||||
<javadoc
|
||||
packagenames="org.opencv.*"
|
||||
sourcepath="java"
|
||||
destdir="@OpenCV_BINARY_DIR@/doc/doxygen/html/javadoc"
|
||||
destdir="@OPENCV_JAVADOC_DESTINATION@"
|
||||
Windowtitle="OpenCV @OPENCV_VERSION_PLAIN@ Java documentation"
|
||||
Doctitle="OpenCV Java documentation (@OPENCV_VERSION@)"
|
||||
bottom="Generated on ${timestamp} / OpenCV @OPENCV_VCSVERSION@"
|
||||
/>
|
||||
failonerror="true"
|
||||
encoding="UTF-8" charset="UTF-8" docencoding="UTF-8"
|
||||
link="https://docs.oracle.com/javase/6/docs/api/"
|
||||
additionalparam="--allow-script-in-comments"
|
||||
>
|
||||
<Header>
|
||||
<![CDATA[
|
||||
<script>
|
||||
var url = window.location.href;
|
||||
var pos = url.lastIndexOf('/javadoc/');
|
||||
url = pos >= 0 ? (url.substring(0, pos) + '/javadoc/mymath.js') : (window.location.origin + '/mymath.js');
|
||||
var script = document.createElement('script');
|
||||
script.src = '@OPENCV_MATHJAX_RELPATH@/MathJax.js?config=TeX-AMS-MML_HTMLorMML,' + url;
|
||||
document.getElementsByTagName('head')[0].appendChild(script);
|
||||
</script>
|
||||
]]>
|
||||
</Header>
|
||||
</javadoc>
|
||||
</target>
|
||||
|
||||
</project>
|
||||
|
||||
Reference in New Issue
Block a user