Merge branch 'master' into stable
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7eb3585..3fdf6ca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,7 +16,7 @@
###
## global definitions
###
-cmake_minimum_required(VERSION 2.8)
+cmake_minimum_required(VERSION 3.1)
project(Corinthia)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
@@ -36,7 +36,7 @@
endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
- set(CMAKE_C_FLAGS "-std=c99 -D_GNU_SOURCE -g")
+ set(CMAKE_C_FLAGS "-std=c99 -D_GNU_SOURCE -g -fPIC")
set(LIBS ${LIBS} m pthread xml2 z SDL2 SDL2_image)
endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
@@ -46,7 +46,11 @@
set(LIB_DIRS
${PROJECT_SOURCE_DIR}/external/download/lib)
set(LIBS ${LIBS} libxml2 zdll iconv SDL2 SDL2_image)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4090 /wd4996")
+ if(${CMAKE_GENERATOR_PLATFORM} MATCHES "x64")
+ set(CMAKE_C_FLAGS "/DWIN64 /D_WINDOWS /W3 /wd4090 /wd4996")
+ else(${CMAKE_GENERATOR_PLATFORM} MATCHES "x64")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4090 /wd4996")
+ endif(${CMAKE_GENERATOR_PLATFORM} MATCHES "x64")
endif(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
@@ -58,3 +62,4 @@
add_subdirectory(consumers/dftest/src)
add_subdirectory(consumers/dfconvert/src)
add_subdirectory(consumers/dfutil/src)
+#TEST add_subdirectory(consumers/corinthia/src)
diff --git a/DocFormats/CMakeLists.txt b/DocFormats/CMakeLists.txt
index c21a05f..b371c09 100644
--- a/DocFormats/CMakeLists.txt
+++ b/DocFormats/CMakeLists.txt
@@ -16,7 +16,6 @@
###
## global definitions
###
-cmake_minimum_required(VERSION 2.8)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
diff --git a/DocFormats/DocFormats.c b/DocFormats/DocFormats.c
index ecf1616..431970a 100644
--- a/DocFormats/DocFormats.c
+++ b/DocFormats/DocFormats.c
@@ -1,3 +1,20 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
void DocFormats()
{
}
diff --git a/DocFormats/api/CMakeLists.txt b/DocFormats/api/CMakeLists.txt
index e0146ef..148be77 100644
--- a/DocFormats/api/CMakeLists.txt
+++ b/DocFormats/api/CMakeLists.txt
@@ -56,6 +56,7 @@
include_directories(../core/src/xml)
include_directories(../filters/latex/src)
include_directories(../filters/odf/src)
+include_directories(../filters/odf/src/text)
include_directories(../filters/ooxml/src/common)
include_directories(../filters/ooxml/src/word)
include_directories(../filters/ooxml/src/word/formatting)
diff --git a/DocFormats/api/headers/DocFormats/DFError.h b/DocFormats/api/headers/DocFormats/DFError.h
index 2876007..fb6343f 100644
--- a/DocFormats/api/headers/DocFormats/DFError.h
+++ b/DocFormats/api/headers/DocFormats/DFError.h
@@ -1,32 +1,25 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFError_h
#define DocFormats_DFError_h
#include <stdarg.h>
-// It's really not nice having this here, but is the only way to get the compiler to typecheck the
-// DFErrorFormat arguments when such functionality is available.
-#ifndef ATTRIBUTE_FORMAT
-#ifdef _MSC_VER
-#define ATTRIBUTE_FORMAT(archetype,index,first)
-#else
-#define ATTRIBUTE_FORMAT(archetype,index,first) __attribute__((format(archetype,index,first)))
-#endif
-#endif
-
typedef struct DFError DFError;
void DFErrorSetPosix(DFError **error, int code);
diff --git a/DocFormats/api/headers/DocFormats/DFStorage.h b/DocFormats/api/headers/DocFormats/DFStorage.h
index 34bee44..2c27293 100644
--- a/DocFormats/api/headers/DocFormats/DFStorage.h
+++ b/DocFormats/api/headers/DocFormats/DFStorage.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFStorage_h
#define DocFormats_DFStorage_h
diff --git a/DocFormats/api/headers/DocFormats/DFXMLForward.h b/DocFormats/api/headers/DocFormats/DFXMLForward.h
index ddfa7f6..6a2a740 100644
--- a/DocFormats/api/headers/DocFormats/DFXMLForward.h
+++ b/DocFormats/api/headers/DocFormats/DFXMLForward.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFXMLForward_h
#define DocFormats_DFXMLForward_h
diff --git a/DocFormats/api/headers/DocFormats/DocFormats.h b/DocFormats/api/headers/DocFormats/DocFormats.h
index 6de204f..f5c3472 100644
--- a/DocFormats/api/headers/DocFormats/DocFormats.h
+++ b/DocFormats/api/headers/DocFormats/DocFormats.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include <DocFormats/Operations.h>
#include <DocFormats/Formats.h>
diff --git a/DocFormats/api/headers/DocFormats/Formats.h b/DocFormats/api/headers/DocFormats/Formats.h
index fb83f40..49c8aee 100644
--- a/DocFormats/api/headers/DocFormats/Formats.h
+++ b/DocFormats/api/headers/DocFormats/Formats.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_Formats_h
#define DocFormats_Formats_h
diff --git a/DocFormats/api/headers/DocFormats/Operations.h b/DocFormats/api/headers/DocFormats/Operations.h
index 804bebc..1bb6ee2 100644
--- a/DocFormats/api/headers/DocFormats/Operations.h
+++ b/DocFormats/api/headers/DocFormats/Operations.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_Operations_h
#define DocFormats_Operations_h
diff --git a/DocFormats/api/src/Formats.c b/DocFormats/api/src/Formats.c
index 20d77dd..289c288 100644
--- a/DocFormats/api/src/Formats.c
+++ b/DocFormats/api/src/Formats.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include <DocFormats/Formats.h>
#include "DFPlatform.h"
diff --git a/DocFormats/api/src/Operations.c b/DocFormats/api/src/Operations.c
index 18575cd..a9f9bb2 100644
--- a/DocFormats/api/src/Operations.c
+++ b/DocFormats/api/src/Operations.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include <DocFormats/Operations.h>
@@ -18,11 +21,14 @@
#include "DFString.h"
#include <DocFormats/DFStorage.h>
#include "Word.h"
+#include "ODFText.h"
#include "DFHTML.h"
#include "DFDOM.h"
#include "DFXML.h"
#include "DFZipFile.h"
#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
struct DFConcreteDocument {
size_t retainCount;
@@ -35,15 +41,66 @@
DFDocument *htmlDoc;
};
+/**
+ * Compute a hash of the set of all XML files in the archive. When the get operation is executed,
+ * this hash is stored in the HTML file, as a record of the document from which it was generated.
+ * When the put operation is executed, the hash is compared with that of the HTML file, and an error
+ * reported if a mismatch occurs.
+ *
+ * This check ensures that put can only be executed with HTML documents that were genuinely
+ * generated from this exact (version of the) document, and thus can be safely assumed to have id
+ * attributes that correctly match elements in the HTML document to elements in the original XML
+ * file(s) from which they were generated, avoiding corruption during the update process.
+ *
+ * If someone tries to call put with a HTML document that was not originally created from this exact
+ * concrete document, the operation will fail.
+ */
+static int computeXMLHash(DFStorage *storage, DFHashCode *result, DFError **error)
+{
+ int ok = 0;
+ *result = 0;
+
+ DFHashCode hash = 0;
+ DFHashBegin(hash);
+ const char **filenames = DFStorageList(storage,error);
+ if (filenames == NULL)
+ goto end;
+ for (int i = 0; filenames[i]; i++) {
+ unsigned char *buf = NULL;
+ size_t nbytes = 0;
+ if (!DFStorageRead(storage,filenames[i],(void **)&buf,&nbytes,error)) {
+ DFErrorFormat(error,"%s: %s",filenames[i],DFErrorMessage(error));
+ goto end;
+ }
+ // The hash algorithm works on 32-bit integers; add 4 NULL bytes at the end of the buffer to
+ // ensure its entire contents are taken into account when computing the hash.
+ buf = xrealloc(buf,nbytes+4);
+ memset(&buf[nbytes],0,4);
+ uint32_t *intbuf = (uint32_t *)buf;
+ for (size_t pos = 0; pos < (nbytes+3)/4; pos++)
+ DFHashUpdate(hash,intbuf[pos]);
+ free(buf);
+ }
+ DFHashEnd(hash);
+ *result = hash;
+ ok = 1;
+
+end:
+ free(filenames);
+ return ok;
+}
+
DFConcreteDocument *DFConcreteDocumentNew(DFStorage *storage)
{
- DFConcreteDocument *concrete = (DFConcreteDocument *)calloc(1,sizeof(DFConcreteDocument));
+ DFConcreteDocument *concrete =
+ (DFConcreteDocument *)xcalloc(1,sizeof(DFConcreteDocument));
concrete->retainCount = 1;
concrete->storage = DFStorageRetain(storage);
return concrete;
}
-DFConcreteDocument *DFConcreteDocumentCreateFile(const char *filename, DFError **error)
+DFConcreteDocument
+*DFConcreteDocumentCreateFile(const char *filename, DFError **error)
{
DFFileFormat format = DFFileFormatFromFilename(filename);
switch (format) {
@@ -53,20 +110,24 @@
case DFFileFormatOdt:
case DFFileFormatOds:
case DFFileFormatOdp: {
- DFStorage *storage = DFStorageCreateZip(filename,error);
+ DFStorage *storage = DFStorageCreateZip(filename, error);
if (storage == NULL)
return NULL;;
- DFConcreteDocument *concrete = DFConcreteDocumentNew(storage);
+ DFConcreteDocument *concrete =
+ DFConcreteDocumentNew(storage);
DFStorageRelease(storage);
return concrete;
}
default:
- DFErrorFormat(error,"Unsupported format for DFConcreteDocumentCreateFile");
+ DFErrorFormat(error,
+ "Unsupported format for "
+ "DFConcreteDocumentCreateFile");
return NULL;
}
}
-DFConcreteDocument *DFConcreteDocumentOpenFile(const char *filename, DFError **error)
+DFConcreteDocument
+*DFConcreteDocumentOpenFile(const char *filename, DFError **error)
{
DFFileFormat format = DFFileFormatFromFilename(filename);
switch (format) {
@@ -79,17 +140,20 @@
DFStorage *storage = DFStorageOpenZip(filename,error);
if (storage == NULL)
return NULL;;
- DFConcreteDocument *concrete = DFConcreteDocumentNew(storage);
+ DFConcreteDocument *concrete =
+ DFConcreteDocumentNew(storage);
DFStorageRelease(storage);
return concrete;
}
default:
- DFErrorFormat(error,"Unsupported format for DFConcreteDocumentCreateFile");
+ DFErrorFormat(error,"Unsupported format for"
+ "DFConcreteDocumentCreateFile");
return NULL;
}
}
-DFConcreteDocument *DFConcreteDocumentRetain(DFConcreteDocument *concrete)
+DFConcreteDocument
+*DFConcreteDocumentRetain(DFConcreteDocument *concrete)
{
if (concrete != NULL)
concrete->retainCount++;
@@ -107,13 +171,15 @@
DFAbstractDocument *DFAbstractDocumentNew(DFStorage *storage)
{
- DFAbstractDocument *abstract = (DFAbstractDocument *)calloc(1,sizeof(DFAbstractDocument));
+ DFAbstractDocument *abstract =
+ (DFAbstractDocument *)xcalloc(1,sizeof(DFAbstractDocument));
abstract->retainCount = 1;
abstract->storage = DFStorageRetain(storage);
return abstract;
}
-DFAbstractDocument *DFAbstractDocumentRetain(DFAbstractDocument *abstract)
+DFAbstractDocument
+*DFAbstractDocumentRetain(DFAbstractDocument *abstract)
{
if (abstract != NULL)
abstract->retainCount++;
@@ -135,23 +201,50 @@
return abstract->htmlDoc;
}
-void DFAbstractDocumentSetHTML(DFAbstractDocument *abstract, DFDocument *htmlDoc)
+void DFAbstractDocumentSetHTML(DFAbstractDocument *abstract,
+ DFDocument *htmlDoc)
{
DFDocumentRelease(abstract->htmlDoc);
abstract->htmlDoc = DFDocumentRetain(htmlDoc);
}
-int DFGet(DFConcreteDocument *concrete, DFAbstractDocument *abstract, DFError **error)
+int DFGet(DFConcreteDocument *concrete,
+ DFAbstractDocument *abstract,
+ DFError **error)
{
if (DFStorageFormat(abstract->storage) != DFFileFormatHTML) {
- DFErrorFormat(error,"Abstract document must be in HTML format");
+ DFErrorFormat(error,
+ "Abstract document must be in HTML format");
return 0;
}
+ DFHashCode hash = 0;
+ if (!computeXMLHash(concrete->storage,&hash,error))
+ return 0;
+ char hashstr[100];
+ snprintf(hashstr,100,"%X",hash);
+
+ char hashprefix[100];
+ snprintf(hashprefix,100,"%s-",hashstr);
+ const char *idPrefix;
+ if (DFStorageExists(abstract->storage,"test-mode"))
+ idPrefix = NULL;
+ else
+ idPrefix = hashprefix;
+
DFDocument *htmlDoc = NULL;
switch (DFStorageFormat(concrete->storage)) {
case DFFileFormatDocx:
- htmlDoc = WordGet(concrete->storage,abstract->storage,error);
+ htmlDoc = WordGet(concrete->storage,
+ abstract->storage,
+ idPrefix,
+ error);
+ break;
+ case DFFileFormatOdt:
+ htmlDoc = ODFTextGet(concrete->storage,
+ abstract->storage,
+ idPrefix,
+ error);
break;
default:
DFErrorFormat(error,"Unsupported file format");
@@ -159,24 +252,66 @@
}
if (htmlDoc == NULL)
- return 0;
+ return 0;;
+
+ // Store a hash of the concrete document in the HTML file, so we can check it in DFPut()
+ HTMLMetaSet(htmlDoc,"corinthia-document-hash",hashstr);
DFDocumentRelease(abstract->htmlDoc);
abstract->htmlDoc = htmlDoc;
return 1;
}
-int DFPut(DFConcreteDocument *concreteDoc, DFAbstractDocument *abstractDoc, DFError **error)
+int DFPut(DFConcreteDocument *concreteDoc,
+ DFAbstractDocument *abstractDoc,
+ DFError **error)
{
if (DFStorageFormat(abstractDoc->storage) != DFFileFormatHTML) {
- DFErrorFormat(error,"Abstract document must be in HTML format");
+ DFErrorFormat(error,
+ "Abstract document must be in HTML format");
return 0;
}
+ // Check that the document hash in the HTML file matches that of the concrete document. This
+ // ensures that we're using a HTML file that was generated from this exact document (see above)
+ // and can rely on the element mappings from the id attributes. This comparison is ignored
+ // for test cases, which specify the special value "ignore" in the meta tag.
+ DFHashCode expectedHash = 0;
+ if (!computeXMLHash(concreteDoc->storage,&expectedHash,error))
+ return 0;;
+ DFHashCode actualHash = 0;
+ int hashMatches = 0;
+ const char *hashstr = HTMLMetaGet(abstractDoc->htmlDoc,"corinthia-document-hash");
+ if ((hashstr != NULL) && (sscanf(hashstr,"%X",&actualHash) == 1))
+ hashMatches = (expectedHash == actualHash);
+ if (!hashMatches && !DFStringEquals(hashstr,"ignore")) {
+ DFErrorFormat(error,"HTML document was generated from a different file to the one being updated");
+ return 0;
+ }
+
+ char hashprefix[100];
+ snprintf(hashprefix,100,"%s-",hashstr);
+ const char *idPrefix;
+ if (DFStringEquals(hashstr,"ignore"))
+ idPrefix = NULL;
+ else
+ idPrefix = hashprefix;
+
int ok = 0;
switch (DFStorageFormat(concreteDoc->storage)) {
case DFFileFormatDocx:
- ok = WordPut(concreteDoc->storage,abstractDoc->storage,abstractDoc->htmlDoc,error);
+ ok = WordPut(concreteDoc->storage,
+ abstractDoc->storage,
+ abstractDoc->htmlDoc,
+ idPrefix,
+ error);
+ break;
+ case DFFileFormatOdt:
+ ok = ODFTextPut(concreteDoc->storage,
+ abstractDoc->storage,
+ abstractDoc->htmlDoc,
+ idPrefix,
+ error);
break;
default:
DFErrorFormat(error,"Unsupported file format");
@@ -185,17 +320,29 @@
return ok;
}
-int DFCreate(DFConcreteDocument *concreteDoc, DFAbstractDocument *abstractDoc, DFError **error)
+int DFCreate(DFConcreteDocument *concreteDoc,
+ DFAbstractDocument *abstractDoc,
+ DFError **error)
{
if (DFStorageFormat(abstractDoc->storage) != DFFileFormatHTML) {
- DFErrorFormat(error,"Abstract document must be in HTML format");
+ DFErrorFormat(error,
+ "Abstract document must be in HTML format");
return 0;
}
int ok = 0;
switch (DFStorageFormat(concreteDoc->storage)) {
case DFFileFormatDocx:
- ok = WordCreate(concreteDoc->storage,abstractDoc->storage,abstractDoc->htmlDoc,error);
+ ok = WordCreate(concreteDoc->storage,
+ abstractDoc->storage,
+ abstractDoc->htmlDoc,
+ error);
+ break;
+ case DFFileFormatOdt:
+ ok = ODFTextCreate(concreteDoc->storage,
+ abstractDoc->storage,
+ abstractDoc->htmlDoc,
+ error);
break;
default:
DFErrorFormat(error,"Unsupported file format");
@@ -204,34 +351,48 @@
return ok;
}
-int DFGetFile(const char *concreteFilename, const char *abstractFilename, DFError **error)
+int DFGetFile(const char *concreteFilename,
+ const char *abstractFilename,
+ DFError **error)
{
int r = 0;
char *abstractPath = DFPathDirName(abstractFilename);
- DFStorage *abstractStorage = DFStorageNewFilesystem(abstractPath,DFFileFormatHTML);
+ DFStorage *abstractStorage =
+ DFStorageNewFilesystem(abstractPath, DFFileFormatHTML);
DFConcreteDocument *concreteDoc = NULL;
DFAbstractDocument *abstractDoc = NULL;
- concreteDoc = DFConcreteDocumentOpenFile(concreteFilename,error);
+ concreteDoc = DFConcreteDocumentOpenFile(concreteFilename, error);
if (concreteDoc == NULL) {
- DFErrorFormat(error,"%s: %s",concreteFilename,DFErrorMessage(error));
+ DFErrorFormat(error, "%s: %s",
+ concreteFilename,
+ DFErrorMessage(error));
goto end;
}
abstractDoc = DFAbstractDocumentNew(abstractStorage);
- if (!DFGet(concreteDoc,abstractDoc,error) || (abstractDoc->htmlDoc == NULL)) {
- DFErrorFormat(error,"%s: %s",concreteFilename,DFErrorMessage(error));
+ if (!DFGet(concreteDoc, abstractDoc, error)
+ || (abstractDoc->htmlDoc == NULL)) {
+ DFErrorFormat(error, "%s: %s",
+ concreteFilename,
+ DFErrorMessage(error));
goto end;
}
if (DFFileExists(abstractFilename)) {
- DFErrorFormat(error,"%s: File already exists",abstractFilename);
+ DFErrorFormat(error,
+ "%s: File already exists",
+ abstractFilename);
goto end;
}
- if (!DFSerializeXMLFile(abstractDoc->htmlDoc,0,0,abstractFilename,error)) {
- DFErrorFormat(error,"%s: %s",abstractFilename,DFErrorMessage(error));
+ if (!DFSerializeXMLFile(abstractDoc->htmlDoc,
+ 0, 0,
+ abstractFilename,error)) {
+ DFErrorFormat(error, "%s: %s",
+ abstractFilename,
+ DFErrorMessage(error));
goto end;
}
@@ -245,31 +406,38 @@
return r;
}
-int DFPutFile(const char *concreteFilename, const char *abstractFilename, DFError **error)
+int DFPutFile(const char *concreteFilename,
+ const char *abstractFilename,
+ DFError **error)
{
int ok = 0;
DFDocument *htmlDoc2 = NULL;
char *abstractPath = DFPathDirName(abstractFilename);
- DFStorage *abstractStorage2 = DFStorageNewFilesystem(abstractPath,DFFileFormatHTML);
+ DFStorage *abstractStorage2 =
+ DFStorageNewFilesystem(abstractPath, DFFileFormatHTML);
DFConcreteDocument *concreteDoc = NULL;
DFAbstractDocument *abstractDoc = NULL;
- htmlDoc2 = DFParseHTMLFile(abstractFilename,0,error);
+ htmlDoc2 = DFParseHTMLFile(abstractFilename, 0, error);
if (htmlDoc2 == NULL) {
- DFErrorFormat(error,"%s: %s",abstractFilename,DFErrorMessage(error));
+ DFErrorFormat(error,"%s: %s",
+ abstractFilename,
+ DFErrorMessage(error));
goto end;
}
- concreteDoc = DFConcreteDocumentOpenFile(concreteFilename,error);
+ concreteDoc = DFConcreteDocumentOpenFile(concreteFilename, error);
if (concreteDoc == NULL) {
- DFErrorFormat(error,"%s: %s",concreteFilename,DFErrorMessage(error));
+ DFErrorFormat(error, "%s: %s",
+ concreteFilename,
+ DFErrorMessage(error));
goto end;
}
abstractDoc = DFAbstractDocumentNew(abstractStorage2);
abstractDoc->htmlDoc = DFDocumentRetain(htmlDoc2);
- ok = DFPut(concreteDoc,abstractDoc,error);
+ ok = DFPut(concreteDoc, abstractDoc, error);
end:
DFDocumentRelease(htmlDoc2);
@@ -280,31 +448,39 @@
return ok;
}
-int DFCreateFile(const char *concreteFilename, const char *abstractFilename, DFError **error)
+int DFCreateFile(const char *concreteFilename,
+ const char *abstractFilename,
+ DFError **error)
{
int ok = 0;
DFDocument *htmlDoc = NULL;
char *abstractPath = DFPathDirName(abstractFilename);
- DFStorage *abstractStorage = DFStorageNewFilesystem(abstractPath,DFFileFormatHTML);
+ DFStorage *abstractStorage =
+ DFStorageNewFilesystem(abstractPath, DFFileFormatHTML);
DFConcreteDocument *concreteDoc = NULL;
DFAbstractDocument *abstractDoc = NULL;
- htmlDoc = DFParseHTMLFile(abstractFilename,0,error);
+ htmlDoc = DFParseHTMLFile(abstractFilename, 0, error);
if (htmlDoc == NULL) {
- DFErrorFormat(error,"%s: %s",abstractFilename,DFErrorMessage(error));
+ DFErrorFormat(error,"%s: %s",
+ abstractFilename,
+ DFErrorMessage(error));
goto end;
}
- concreteDoc = DFConcreteDocumentCreateFile(concreteFilename,error);
+ concreteDoc =
+ DFConcreteDocumentCreateFile(concreteFilename, error);
if (concreteDoc == NULL) {
- DFErrorFormat(error,"%s: %s",concreteFilename,DFErrorMessage(error));
+ DFErrorFormat(error, "%s: %s",
+ concreteFilename,
+ DFErrorMessage(error));
goto end;
}
abstractDoc = DFAbstractDocumentNew(abstractStorage);
abstractDoc->htmlDoc = DFDocumentRetain(htmlDoc);
- ok = DFCreate(concreteDoc,abstractDoc,error);
+ ok = DFCreate(concreteDoc, abstractDoc, error);
end:
DFDocumentRelease(htmlDoc);
diff --git a/DocFormats/api/tests/APITests.c b/DocFormats/api/tests/APITests.c
index 57659b4..73cbe6e 100644
--- a/DocFormats/api/tests/APITests.c
+++ b/DocFormats/api/tests/APITests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFUnitTest.h"
#include <stddef.h>
diff --git a/DocFormats/core/src/common/DFBDT.c b/DocFormats/core/src/common/DFBDT.c
index 8a34599..db96e3b 100644
--- a/DocFormats/core/src/common/DFBDT.c
+++ b/DocFormats/core/src/common/DFBDT.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFBDT.h"
@@ -48,7 +51,7 @@
for (DFNode *abs = abstract->first; abs != NULL; abs = abs->next)
count++;
- DFNode **conChildren = (DFNode **)malloc(count*sizeof(DFNode*));
+ DFNode **conChildren = (DFNode **)xmalloc(count*sizeof(DFNode*));
count = 0;
for (DFNode *abs = abstract->first; abs != NULL; abs = abs->next) {
diff --git a/DocFormats/core/src/common/DFBDT.h b/DocFormats/core/src/common/DFBDT.h
index 253049a..7393dae 100644
--- a/DocFormats/core/src/common/DFBDT.h
+++ b/DocFormats/core/src/common/DFBDT.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFBDT_h
#define DocFormats_DFBDT_h
diff --git a/DocFormats/core/src/common/DFClassNames.h b/DocFormats/core/src/common/DFClassNames.h
index 914d96f..7cd07e1 100644
--- a/DocFormats/core/src/common/DFClassNames.h
+++ b/DocFormats/core/src/common/DFClassNames.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFClassNames_h
#define DocFormats_DFClassNames_h
diff --git a/DocFormats/core/src/common/DFTable.c b/DocFormats/core/src/common/DFTable.c
index c99e6e1..1038f47 100644
--- a/DocFormats/core/src/common/DFTable.c
+++ b/DocFormats/core/src/common/DFTable.c
@@ -1,20 +1,24 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFTable.h"
#include "DFDOM.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@@ -35,7 +39,7 @@
DFCell *DFCellNew(DFNode *element, unsigned int row, unsigned int col)
{
- DFCell *cell = (DFCell *)calloc(1,sizeof(DFCell));
+ DFCell *cell = (DFCell *)xcalloc(1,sizeof(DFCell));
cell->retainCount = 1;
cell->element = element;
cell->row = row;
@@ -67,16 +71,16 @@
DFTable *DFTableNew(unsigned int rows, unsigned int cols)
{
- DFTable *table = (DFTable *)calloc(1,sizeof(DFTable));
+ DFTable *table = (DFTable *)xcalloc(1,sizeof(DFTable));
table->retainCount = 1;
table->rows = rows;
table->cols = cols;
- table->rowElements = (DFNode **)calloc(table->rows,sizeof(DFNode *));
- table->colWidths = (double *)calloc(table->cols,sizeof(double));
+ table->rowElements = (DFNode **)xcalloc(table->rows,sizeof(DFNode *));
+ table->colWidths = (double *)xcalloc(table->cols,sizeof(double));
- table->cells = (DFCell ***)calloc(rows,sizeof(DFCell **));
+ table->cells = (DFCell ***)xcalloc(rows,sizeof(DFCell **));
for (unsigned int r = 0; r < table->rows; r++)
- table->cells[r] = (DFCell **)calloc(cols,sizeof(DFCell *));
+ table->cells[r] = (DFCell **)xcalloc(cols,sizeof(DFCell *));
return table;
}
diff --git a/DocFormats/core/src/common/DFTable.h b/DocFormats/core/src/common/DFTable.h
index f34a7b2..fff4f06 100644
--- a/DocFormats/core/src/common/DFTable.h
+++ b/DocFormats/core/src/common/DFTable.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFTable_h
#define DocFormats_DFTable_h
diff --git a/DocFormats/core/src/css/CSS.c b/DocFormats/core/src/css/CSS.c
index f86b496..7f2bbf2 100644
--- a/DocFormats/core/src/css/CSS.c
+++ b/DocFormats/core/src/css/CSS.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "CSS.h"
#include "CSSParser.h"
@@ -21,6 +24,7 @@
#include "DFString.h"
#include "DFCharacterSet.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
@@ -81,7 +85,7 @@
ContentPart *ContentPartNew(ContentPartType type, const char *value, const char *arg)
{
- ContentPart *part = (ContentPart *)calloc(1,sizeof(ContentPart));
+ ContentPart *part = (ContentPart *)xcalloc(1,sizeof(ContentPart));
part->retainCount = 1;
part->type = type;
part->value = DFStrDup(value);
@@ -161,7 +165,7 @@
DFHashTable *properties = CSSParserProperties(parser);
CSSParserFree(parser);
if (properties == NULL)
- return DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ return DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
else
return properties;
}
@@ -186,7 +190,7 @@
count++;
}
free(allKeys);
- char *result = strdup(output->data);
+ char *result = xstrdup(output->data);
DFBufferRelease(output);
return result;
}
@@ -220,31 +224,31 @@
count++;
switch (count) {
case 1:
- sides->top = strdup(tokens[0]);
- sides->bottom = strdup(tokens[0]);
- sides->left = strdup(tokens[0]);
- sides->right = strdup(tokens[0]);
+ sides->top = xstrdup(tokens[0]);
+ sides->bottom = xstrdup(tokens[0]);
+ sides->left = xstrdup(tokens[0]);
+ sides->right = xstrdup(tokens[0]);
ok = 1;
break;
case 2:
- sides->top = strdup(tokens[0]);
- sides->bottom = strdup(tokens[0]);
- sides->left = strdup(tokens[1]);
- sides->right = strdup(tokens[1]);
+ sides->top = xstrdup(tokens[0]);
+ sides->bottom = xstrdup(tokens[0]);
+ sides->left = xstrdup(tokens[1]);
+ sides->right = xstrdup(tokens[1]);
ok = 1;
break;
case 3:
- sides->top = strdup(tokens[0]);
- sides->left = strdup(tokens[1]);
- sides->right = strdup(tokens[1]);
- sides->bottom = strdup(tokens[2]);
+ sides->top = xstrdup(tokens[0]);
+ sides->left = xstrdup(tokens[1]);
+ sides->right = xstrdup(tokens[1]);
+ sides->bottom = xstrdup(tokens[2]);
ok = 1;
break;
case 4:
- sides->top = strdup(tokens[0]);
- sides->right = strdup(tokens[1]);
- sides->bottom = strdup(tokens[2]);
- sides->left = strdup(tokens[3]);
+ sides->top = xstrdup(tokens[0]);
+ sides->right = xstrdup(tokens[1]);
+ sides->bottom = xstrdup(tokens[2]);
+ sides->left = xstrdup(tokens[3]);
ok = 1;
break;
}
@@ -575,7 +579,7 @@
static DFHashTable *builtTextRules(DFHashTable *input)
{
- DFHashTable *result = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFHashTable *result = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
const char **allSelectors = DFHashTableCopyKeys(input);
for (int selIndex = 0; allSelectors[selIndex]; selIndex++) {
@@ -620,7 +624,7 @@
DFArray *array = DFHashTableLookup(reverse,text);
if (array == NULL) {
- array = DFArrayNew((DFCopyFunction)strdup,free);
+ array = DFArrayNew((DFCopyFunction)xstrdup,free);
DFHashTableAdd(reverse,text,array);
DFArrayRelease(array);
}
@@ -628,7 +632,7 @@
}
free(separateKeys);
- DFHashTable *combined = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFHashTable *combined = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
const char **reverseKeys = DFHashTableCopyKeys(reverse);
for (int keyIndex = 0; reverseKeys[keyIndex]; keyIndex++) {
const char *text = reverseKeys[keyIndex];
@@ -670,7 +674,7 @@
free(allSelectors);
DFHashTableRelease(separate);
DFHashTableRelease(textRules);
- char *result = strdup(output->data);
+ char *result = xstrdup(output->data);
DFBufferRelease(output);
return result;
}
@@ -781,7 +785,7 @@
}
if (!includeHash && (result != NULL)) {
- char *nohash = strdup(&result[1]);
+ char *nohash = xstrdup(&result[1]);
free(result);
result = nohash;
}
@@ -796,7 +800,7 @@
if (DFStringContainsWhitespace(input))
return DFQuote(input);
else
- return strdup(input);
+ return xstrdup(input);
}
char *CSSDecodeFontFamily(const char *input)
@@ -1071,12 +1075,12 @@
free(className);
}
else {
- *result = strdup(elementName);
+ *result = xstrdup(elementName);
}
// Parse suffix
// FIXME: ignore spaces at start?
- *suffix = strdup(&cinput[pos]);
+ *suffix = xstrdup(&cinput[pos]);
free(elementName);
}
diff --git a/DocFormats/core/src/css/CSS.h b/DocFormats/core/src/css/CSS.h
index 2ff787e..ccd64e1 100644
--- a/DocFormats/core/src/css/CSS.h
+++ b/DocFormats/core/src/css/CSS.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSS_h
#define DocFormats_CSS_h
diff --git a/DocFormats/core/src/css/CSSLength.c b/DocFormats/core/src/css/CSSLength.c
index 97e6824..71ebb90 100644
--- a/DocFormats/core/src/css/CSSLength.c
+++ b/DocFormats/core/src/css/CSSLength.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "CSSLength.h"
#include "DFCommon.h"
diff --git a/DocFormats/core/src/css/CSSLength.h b/DocFormats/core/src/css/CSSLength.h
index d73d000..fb4eb50 100644
--- a/DocFormats/core/src/css/CSSLength.h
+++ b/DocFormats/core/src/css/CSSLength.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSSLength_h
#define DocFormats_CSSLength_h
diff --git a/DocFormats/core/src/css/CSSParser.c b/DocFormats/core/src/css/CSSParser.c
index 5f6c546..b6fadfc 100644
--- a/DocFormats/core/src/css/CSSParser.c
+++ b/DocFormats/core/src/css/CSSParser.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "CSSParser.h"
#include "CSS.h"
@@ -18,6 +21,7 @@
#include "DFString.h"
#include "DFCharacterSet.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
@@ -43,11 +47,11 @@
CSSParser *CSSParserNew(const char *cinput)
{
- CSSParser *p = (CSSParser *)calloc(1,sizeof(CSSParser));
+ CSSParser *p = (CSSParser *)xcalloc(1,sizeof(CSSParser));
if (cinput == NULL)
cinput = "";
- p->chars = strdup(cinput);
+ p->chars = xstrdup(cinput);
p->length = strlen(cinput);
return p;
@@ -206,7 +210,7 @@
DFHashTable *CSSParserRules(CSSParser *p)
{
- DFHashTable *result = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *result = DFHashTableNew((DFCopyFunction)xstrdup,free);
while (p->pos < p->length) {
size_t start = p->pos;
int invalid = 0;
@@ -241,7 +245,7 @@
DFArray *CSSParserSelectors(CSSParser *p)
{
- DFArray *result = DFArrayNew((DFCopyFunction)strdup,free);
+ DFArray *result = DFArrayNew((DFCopyFunction)xstrdup,free);
while (p->pos < p->length) {
size_t start = p->pos;
int invalid = 0;
@@ -261,7 +265,7 @@
DFHashTable *CSSParserProperties(CSSParser *p)
{
- DFHashTable *result = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFHashTable *result = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
while (p->pos < p->length) {
size_t start = p->pos;
int invalid = 0;
diff --git a/DocFormats/core/src/css/CSSParser.h b/DocFormats/core/src/css/CSSParser.h
index 1491cf0..d1adf5c 100644
--- a/DocFormats/core/src/css/CSSParser.h
+++ b/DocFormats/core/src/css/CSSParser.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSSParser_h
#define DocFormats_CSSParser_h
diff --git a/DocFormats/core/src/css/CSSProperties.c b/DocFormats/core/src/css/CSSProperties.c
index e3f4973..5d96459 100644
--- a/DocFormats/core/src/css/CSSProperties.c
+++ b/DocFormats/core/src/css/CSSProperties.c
@@ -1,22 +1,26 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "CSSProperties.h"
#include "CSS.h"
#include "DFString.h"
#include "DFHashTable.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@@ -149,9 +153,9 @@
DFHashTable *extra = CSSParseProperties(string);
CSSExpandProperties(extra);
- CSSProperties *result = (CSSProperties *)calloc(1,sizeof(CSSProperties));
+ CSSProperties *result = (CSSProperties *)xcalloc(1,sizeof(CSSProperties));
result->retainCount = 1;
- result->hashTable = DFHashTableNew((DFCopyFunction)strdup,free);
+ result->hashTable = DFHashTableNew((DFCopyFunction)xstrdup,free);
const char **names = DFHashTableCopyKeys(orig->hashTable);
for (int i = 0; names[i]; i++) {
const char *value = DFHashTableLookup(orig->hashTable,names[i]);
@@ -173,10 +177,10 @@
CSSProperties *CSSPropertiesNewWithRaw(DFHashTable *raw)
{
- CSSProperties *result = (CSSProperties *)calloc(1,sizeof(CSSProperties));
+ CSSProperties *result = (CSSProperties *)xcalloc(1,sizeof(CSSProperties));
result->retainCount = 1;
- result->hashTable = DFHashTableNew((DFCopyFunction)strdup,free);
+ result->hashTable = DFHashTableNew((DFCopyFunction)xstrdup,free);
if (raw != NULL)
CSSPropertiesUpdateFromRaw(result,raw);
diff --git a/DocFormats/core/src/css/CSSProperties.h b/DocFormats/core/src/css/CSSProperties.h
index 22de4fd..0ea4eab 100644
--- a/DocFormats/core/src/css/CSSProperties.h
+++ b/DocFormats/core/src/css/CSSProperties.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSSProperties_h
#define DocFormats_CSSProperties_h
diff --git a/DocFormats/core/src/css/CSSSelector.c b/DocFormats/core/src/css/CSSSelector.c
index 52220be..ec17e3e 100644
--- a/DocFormats/core/src/css/CSSSelector.c
+++ b/DocFormats/core/src/css/CSSSelector.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "CSSSelector.h"
@@ -62,7 +65,7 @@
if (className != NULL)
return DFFormatString("%s.%s",elementName,className);
else
- return strdup(elementName);
+ return xstrdup(elementName);
}
char *CSSMakeTagSelector(Tag tag, const char *className)
@@ -111,9 +114,9 @@
return NULL;
int dotPos = findDotPos(selector);
if (dotPos < 0)
- return strdup(selector);
+ return xstrdup(selector);
- char *result = (char *)malloc(dotPos+1);
+ char *result = (char *)xmalloc(dotPos+1);
memcpy(result,selector,dotPos);
result[dotPos] = '\0';
return result;
@@ -128,7 +131,7 @@
return NULL;
int start = dotPos + 1;
int len = (int)strlen(selector) - start;
- char *result = (char *)malloc(len+1);
+ char *result = (char *)xmalloc(len+1);
memcpy(result,&selector[start],len);
result[len] = '\0';
return result;
diff --git a/DocFormats/core/src/css/CSSSelector.h b/DocFormats/core/src/css/CSSSelector.h
index 6e9c283..4151c41 100644
--- a/DocFormats/core/src/css/CSSSelector.h
+++ b/DocFormats/core/src/css/CSSSelector.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSSSelector_h
#define DocFormats_CSSSelector_h
diff --git a/DocFormats/core/src/css/CSSSheet.c b/DocFormats/core/src/css/CSSSheet.c
index 151201f..8f8cdcf 100644
--- a/DocFormats/core/src/css/CSSSheet.c
+++ b/DocFormats/core/src/css/CSSSheet.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "CSSSheet.h"
#include "CSS.h"
@@ -22,6 +25,7 @@
#include "DFHashTable.h"
#include "DFBuffer.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
@@ -40,7 +44,7 @@
CSSSheet *CSSSheetNew(void)
{
- CSSSheet *sheet = (CSSSheet *)calloc(1,sizeof(CSSSheet));
+ CSSSheet *sheet = (CSSSheet *)xcalloc(1,sizeof(CSSSheet));
sheet->retainCount = 1;
sheet->_styles = DFHashTableNew((DFCopyFunction)CSSStyleRetain,(DFFreeFunction)CSSStyleRelease);
sheet->_defaultStyles = DFHashTableNew((DFCopyFunction)CSSStyleRetain,(DFFreeFunction)CSSStyleRelease);
@@ -107,7 +111,7 @@
// FIXME: Need tests for parent cycles
CSSStyle *ancestor = orig;
CSSStyle *result = CSSStyleNew("temp");
- DFHashTable *visited = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFHashTable *visited = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
const char **allSuffixes = NULL;
while (1) {
free(allSuffixes);
@@ -157,7 +161,7 @@
free(escapedClassName);
}
else {
- baseSelector = strdup(elementName);
+ baseSelector = xstrdup(elementName);
}
CSSStyle *flattenedStyle = CSSSheetFlattenedStyle(sheet,origStyle);
@@ -221,7 +225,7 @@
free(sortedSuffixes);
}
free(allSelectors);
- char *str = strdup(result->data);
+ char *str = xstrdup(result->data);
DFBufferRelease(result);
return str;
}
@@ -233,7 +237,7 @@
for (int i = 0; allSelectors[i]; i++) {
const char *selector = allSelectors[i];
CSSStyle *style = CSSSheetLookupSelector(sheet,selector,0,0);
- DFHashTable *visited = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFHashTable *visited = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
int depth = 0;
while (style != NULL) {
@@ -264,7 +268,7 @@
depth++;
while (DFArrayCount(selectorsByDepth) < depth+1) {
- DFArray *array = DFArrayNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFArray *array = DFArrayNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
DFArrayAppend(selectorsByDepth,array);
DFArrayRelease(array);
}
@@ -274,7 +278,7 @@
}
free(allSelectors);
- DFArray *sortedSelectors = DFArrayNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFArray *sortedSelectors = DFArrayNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
for (size_t i = DFArrayCount(selectorsByDepth); i > 0; i--) {
DFArray *atDepth = DFArrayItemAt(selectorsByDepth,i-1);
for (size_t j = 0; j < DFArrayCount(atDepth); j++)
@@ -349,7 +353,7 @@
if (!strncmp(constSelector,".",1))
selector = DFFormatString("p%s",constSelector); // FIXME: Not covered by tests
else
- selector = strdup(constSelector);
+ selector = xstrdup(constSelector);
DFHashTable *raw = DFHashTableLookup(rules,constSelector);
char *baseId = NULL;
@@ -491,7 +495,7 @@
CSSStyle *style = CSSSheetLookupSelector(sheet,allSelectors[i],0,0);
if (style->headingLevel > 0) {
int headingLevel = style->headingLevel;
- StyleList *item = (StyleList *)calloc(1,sizeof(StyleList));
+ StyleList *item = (StyleList *)xcalloc(1,sizeof(StyleList));
item->style = CSSStyleRetain(style);
item->next = DFHashTableLookupInt(stylesByHeadingLevel,headingLevel);
DFHashTableAddInt(stylesByHeadingLevel,headingLevel,item);
diff --git a/DocFormats/core/src/css/CSSSheet.h b/DocFormats/core/src/css/CSSSheet.h
index 2d71a91..1ff03e8 100644
--- a/DocFormats/core/src/css/CSSSheet.h
+++ b/DocFormats/core/src/css/CSSSheet.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSSSheet_h
#define DocFormats_CSSSheet_h
diff --git a/DocFormats/core/src/css/CSSStyle.c b/DocFormats/core/src/css/CSSStyle.c
index 73c9445..8b9b8a4 100644
--- a/DocFormats/core/src/css/CSSStyle.c
+++ b/DocFormats/core/src/css/CSSStyle.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "CSSStyle.h"
#include "CSSSheet.h"
@@ -21,6 +24,7 @@
#include "DFHashTable.h"
#include "DFString.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@@ -54,7 +58,7 @@
CSSStyle *CSSStyleNew(const char *selector)
{
- CSSStyle *style = (CSSStyle *)calloc(1,sizeof(CSSStyle));
+ CSSStyle *style = (CSSStyle *)xcalloc(1,sizeof(CSSStyle));
style->retainCount = 1;
CSSStyleSetSelector(style,selector);
style->rules = DFHashTableNew((DFCopyFunction)CSSPropertiesRetain,(DFFreeFunction)CSSPropertiesRelease);
@@ -92,7 +96,7 @@
void CSSStyleSetSelector(CSSStyle *style, const char *newSelector)
{
// Take a copy of newSelector first, just in case it's one of the values we're about to free
- char *selector = strdup(newSelector);
+ char *selector = xstrdup(newSelector);
free(style->selector);
free(style->elementName);
diff --git a/DocFormats/core/src/css/CSSStyle.h b/DocFormats/core/src/css/CSSStyle.h
index 8059ec4..ae1ff4e 100644
--- a/DocFormats/core/src/css/CSSStyle.h
+++ b/DocFormats/core/src/css/CSSStyle.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSSStyle_h
#define DocFormats_CSSStyle_h
diff --git a/DocFormats/core/src/css/CSSSyntax.c b/DocFormats/core/src/css/CSSSyntax.c
index 9147d44..dfab238 100644
--- a/DocFormats/core/src/css/CSSSyntax.c
+++ b/DocFormats/core/src/css/CSSSyntax.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "CSSSyntax.h"
#include "DFCommon.h"
diff --git a/DocFormats/core/src/css/CSSSyntax.h b/DocFormats/core/src/css/CSSSyntax.h
index 09e8fd1..945f118 100644
--- a/DocFormats/core/src/css/CSSSyntax.h
+++ b/DocFormats/core/src/css/CSSSyntax.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSSSyntax_h
#define DocFormats_CSSSyntax_h
diff --git a/DocFormats/core/src/html/DFHTDocument.c b/DocFormats/core/src/html/DFHTDocument.c
index 6d6c3f0..70aad45 100644
--- a/DocFormats/core/src/html/DFHTDocument.c
+++ b/DocFormats/core/src/html/DFHTDocument.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFHTDocument.h"
@@ -103,7 +106,7 @@
DFHTDocument *DFHTDocumentNew()
{
- DFHTDocument *htd = (DFHTDocument *)calloc(1,sizeof(DFHTDocument));
+ DFHTDocument *htd = (DFHTDocument *)xcalloc(1,sizeof(DFHTDocument));
htd->doc = tidyCreate();
tidyBufInit(&htd->errbuf);
tidySetErrorBuffer(htd->doc,&htd->errbuf);
diff --git a/DocFormats/core/src/html/DFHTDocument.h b/DocFormats/core/src/html/DFHTDocument.h
index 6b5860d..c5aac49 100644
--- a/DocFormats/core/src/html/DFHTDocument.h
+++ b/DocFormats/core/src/html/DFHTDocument.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFHTDocument_h
#define DocFormats_DFHTDocument_h
diff --git a/DocFormats/core/src/html/DFHTML.c b/DocFormats/core/src/html/DFHTML.c
index 0f2a348..b6538ee 100644
--- a/DocFormats/core/src/html/DFHTML.c
+++ b/DocFormats/core/src/html/DFHTML.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFHTML.h"
@@ -68,10 +71,10 @@
{
DFNode *head = DFChildWithTag(doc->root,HTML_HEAD);
if (head == NULL)
- return strdup("");;
+ return xstrdup("");;
DFNode *style = DFChildWithTag(head,HTML_STYLE);
if (style == NULL)
- return strdup("");
+ return xstrdup("");
return DFNodeTextToString(style);
}
@@ -193,7 +196,7 @@
static char *indentString(int depth)
{
- char *str = (char *)malloc(1+depth*2+1);
+ char *str = (char *)xmalloc(1+depth*2+1);
str[0] = '\n';
memset(&str[1],' ',depth*2);
str[1+depth*2] = '\0';
@@ -359,6 +362,56 @@
return (strlen(str) == 7) && (str[0] == '#') && isRRGGBB(&str[1]);
}
+const char *HTMLMetaGet(DFDocument *htmlDoc, const char *name)
+{
+ assert(htmlDoc->root != NULL);
+ assert(htmlDoc->root->tag == HTML_HTML);
+ DFNode *head = DFChildWithTag(htmlDoc->root,HTML_HEAD);
+ if (head == NULL)
+ return NULL;
+ for (DFNode *meta = head->first; meta != NULL; meta = meta->next) {
+ if ((meta->tag == HTML_META) && DFStringEquals(DFGetAttribute(meta,HTML_NAME),name))
+ return DFGetAttribute(meta,HTML_CONTENT);
+ }
+ return NULL;
+}
+
+void HTMLMetaSet(DFDocument *htmlDoc, const char *name, const char *content)
+{
+ assert(htmlDoc->root != NULL);
+ assert(htmlDoc->root->tag == HTML_HTML);
+ DFNode *head = DFChildWithTag(htmlDoc->root,HTML_HEAD);
+ if (head == NULL) {
+ head = DFCreateElement(htmlDoc,HTML_HEAD);
+ DFNode *body = DFChildWithTag(htmlDoc->root,HTML_BODY);
+ DFInsertBefore(htmlDoc->root,head,body);
+ }
+ for (DFNode *meta = head->first; meta != NULL; meta = meta->next) {
+ if ((meta->tag == HTML_META) && DFStringEquals(DFGetAttribute(meta,HTML_NAME),name)) {
+ DFSetAttribute(meta,HTML_CONTENT,content);
+ return;
+ }
+ }
+ DFNode *meta = DFCreateChildElement(head,HTML_META);
+ DFSetAttribute(meta,HTML_NAME,name);
+ DFSetAttribute(meta,HTML_CONTENT,content);
+}
+
+void HTMLMetaRemove(DFDocument *htmlDoc, const char *name)
+{
+ assert(htmlDoc->root != NULL);
+ assert(htmlDoc->root->tag == HTML_HTML);
+ DFNode *head = DFChildWithTag(htmlDoc->root,HTML_HEAD);
+ if (head == NULL)
+ return;;
+ DFNode *next;
+ for (DFNode *meta = head->first; meta != NULL; meta = next) {
+ next = meta->next;
+ if ((meta->tag == HTML_META) && DFStringEquals(DFGetAttribute(meta,HTML_NAME),name))
+ DFRemoveNode(meta);
+ }
+}
+
DFDocument *DFParseHTMLString(const char *str, int removeSpecial, DFError **error)
{
DFHTDocument *htdoc = DFHTDocumentNew();
diff --git a/DocFormats/core/src/html/DFHTML.h b/DocFormats/core/src/html/DFHTML.h
index a4a5bab..81c9592 100644
--- a/DocFormats/core/src/html/DFHTML.h
+++ b/DocFormats/core/src/html/DFHTML.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFHTML_h
#define DocFormats_DFHTML_h
@@ -47,6 +50,10 @@
int isRRGGBB(const char *str);
int isHashRRGGBB(const char *str);
+const char *HTMLMetaGet(DFDocument *htmlDoc, const char *name);
+void HTMLMetaSet(DFDocument *htmlDoc, const char *name, const char *content);
+void HTMLMetaRemove(DFDocument *htmlDoc, const char *name);
+
DFDocument *DFParseHTMLString(const char *str, int removeSpecial, DFError **error);
DFDocument *DFParseHTMLFile(const char *filename, int removeSpecial, DFError **error);
const char **DFHTMLGetImages(DFDocument *htmlDoc);
diff --git a/DocFormats/core/src/html/DFHTMLNormalization.c b/DocFormats/core/src/html/DFHTMLNormalization.c
index 36404a5..5455611 100644
--- a/DocFormats/core/src/html/DFHTMLNormalization.c
+++ b/DocFormats/core/src/html/DFHTMLNormalization.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFHTMLNormalization.h"
@@ -120,7 +123,7 @@
static void findLeafNodes(DFNode *node, int depth, DFArray *leafEntries)
{
if (node->first == NULL) {
- LeafEntry *entry = (LeafEntry *)calloc(1,sizeof(LeafEntry));
+ LeafEntry *entry = (LeafEntry *)xcalloc(1,sizeof(LeafEntry));
entry->node = node;
entry->depth = depth;
DFArrayAppend(leafEntries,entry);
@@ -148,7 +151,7 @@
uint32_t *oldChars = DFUTF8To32(entry->node->value);
size_t oldLen = DFUTF32Length(oldChars);
- uint32_t *newChars = (uint32_t *)malloc((oldLen+1)*sizeof(uint32_t));
+ uint32_t *newChars = (uint32_t *)xmalloc((oldLen+1)*sizeof(uint32_t));
size_t newLen = 0;
int haveSpace = 0;
@@ -610,7 +613,7 @@
static DFHashTable *extractInlineProperties(DFNode *paragraph)
{
- DFHashTable *inlineProperties = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *inlineProperties = DFHashTableNew((DFCopyFunction)xstrdup,free);
const char *paraCSSText = DFGetAttribute(paragraph,HTML_STYLE);
CSSProperties *paraProperties = CSSPropertiesNewWithString(paraCSSText);
const char **allNames = CSSPropertiesCopyNames(paraProperties);
diff --git a/DocFormats/core/src/html/DFHTMLNormalization.h b/DocFormats/core/src/html/DFHTMLNormalization.h
index b899903..2565fa4 100644
--- a/DocFormats/core/src/html/DFHTMLNormalization.h
+++ b/DocFormats/core/src/html/DFHTMLNormalization.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFHTMLNormalization_h
#define DocFormats_DFHTMLNormalization_h
diff --git a/DocFormats/core/src/html/DFHTMLTables.c b/DocFormats/core/src/html/DFHTMLTables.c
index fa58b2a..5863676 100644
--- a/DocFormats/core/src/html/DFHTMLTables.c
+++ b/DocFormats/core/src/html/DFHTMLTables.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFHTMLTables.h"
#include "DFTable.h"
@@ -18,6 +21,7 @@
#include "DFString.h"
#include "CSSLength.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdlib.h>
@@ -55,7 +59,7 @@
for (DFNode *tableChild = table->first; tableChild != NULL; tableChild = tableChild->next) {
switch (tableChild->tag) {
case HTML_TR: {
- RowList *item = (RowList *)calloc(1,sizeof(RowList));
+ RowList *item = (RowList *)xcalloc(1,sizeof(RowList));
item->rowNode = tableChild;
*listPtr = item;
listPtr = &item->next;
@@ -66,7 +70,7 @@
case HTML_TFOOT: {
for (DFNode *partChild = tableChild->first; partChild != NULL; partChild = partChild->next) {
if (partChild->tag == HTML_TR) {
- RowList *item = (RowList *)calloc(1,sizeof(RowList));
+ RowList *item = (RowList *)xcalloc(1,sizeof(RowList));
item->rowNode = partChild;
*listPtr = item;
listPtr = &item->next;
diff --git a/DocFormats/core/src/html/DFHTMLTables.h b/DocFormats/core/src/html/DFHTMLTables.h
index 9291de7..18bfda3 100644
--- a/DocFormats/core/src/html/DFHTMLTables.h
+++ b/DocFormats/core/src/html/DFHTMLTables.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFHTMLTables_h
#define DocFormats_DFHTMLTables_h
diff --git a/DocFormats/core/src/html/DFTidyHelper.c b/DocFormats/core/src/html/DFTidyHelper.c
index f2f2303..af9689b 100644
--- a/DocFormats/core/src/html/DFTidyHelper.c
+++ b/DocFormats/core/src/html/DFTidyHelper.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFTidyHelper.h"
@@ -25,7 +28,7 @@
tidyBufInit(&buf);
tidyNodeGetValue(tdoc,tnode,&buf);
- char *str = (char *)malloc(buf.size+1);
+ char *str = (char *)xmalloc(buf.size+1);
memcpy(str,buf.bp,buf.size);
str[buf.size] = '\0';
diff --git a/DocFormats/core/src/html/DFTidyHelper.h b/DocFormats/core/src/html/DFTidyHelper.h
index 6ed6c81..df5075c 100644
--- a/DocFormats/core/src/html/DFTidyHelper.h
+++ b/DocFormats/core/src/html/DFTidyHelper.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFTidyHelper_h
#define DocFormats_DFTidyHelper_h
diff --git a/DocFormats/core/src/html/DFTidyWrapper.c b/DocFormats/core/src/html/DFTidyWrapper.c
index 72fe583..7b81ed6 100644
--- a/DocFormats/core/src/html/DFTidyWrapper.c
+++ b/DocFormats/core/src/html/DFTidyWrapper.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFTidyWrapper.h"
diff --git a/DocFormats/core/src/html/DFTidyWrapper.h b/DocFormats/core/src/html/DFTidyWrapper.h
index 12ac589..4cb6cfb 100644
--- a/DocFormats/core/src/html/DFTidyWrapper.h
+++ b/DocFormats/core/src/html/DFTidyWrapper.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFTidyWrapper_h
#define DocFormats_DFTidyWrapper_h
diff --git a/DocFormats/core/src/lib/DFAllocator.c b/DocFormats/core/src/lib/DFAllocator.c
index 722fe0a..f12a72d 100644
--- a/DocFormats/core/src/lib/DFAllocator.c
+++ b/DocFormats/core/src/lib/DFAllocator.c
@@ -1,17 +1,21 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+#include "DFPlatform.h"
#include "DFAllocator.h"
#include "DFCommon.h"
#include <assert.h>
@@ -34,8 +38,8 @@
DFAllocator *DFAllocatorNew(void)
{
size_t initialSize = 1;
- DFAllocator *alc = (DFAllocator *)malloc(sizeof(DFAllocator));
- alc->blocks = (DFAllocatorBlock *)malloc(sizeof(DFAllocatorBlock)+initialSize);
+ DFAllocator *alc = (DFAllocator *)xmalloc(sizeof(DFAllocator));
+ alc->blocks = (DFAllocatorBlock *)xmalloc(sizeof(DFAllocatorBlock)+initialSize);
alc->blocks->next = NULL;
alc->blocks->used = 0;
alc->blocks->size = initialSize;
@@ -63,7 +67,7 @@
size_t newSize = block->size*2;
while (size > newSize)
newSize *= 2;
- block = (DFAllocatorBlock *)malloc(sizeof(DFAllocatorBlock)+newSize);
+ block = (DFAllocatorBlock *)xmalloc(sizeof(DFAllocatorBlock)+newSize);
block->used = 0;
block->size = newSize;
block->next = alc->blocks;
@@ -73,6 +77,6 @@
char *mem = block->mem + block->used;
block->used += size;
assert(block->used <= block->size);
- assert((((unsigned long long)mem) % 8) == 0);
+ assert((((unsigned long)mem) % 8) == 0);
return mem;
}
diff --git a/DocFormats/core/src/lib/DFAllocator.h b/DocFormats/core/src/lib/DFAllocator.h
index 94f40eb..d95cf5d 100644
--- a/DocFormats/core/src/lib/DFAllocator.h
+++ b/DocFormats/core/src/lib/DFAllocator.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFAllocator_h
#define DocFormats_DFAllocator_h
diff --git a/DocFormats/core/src/lib/DFArray.c b/DocFormats/core/src/lib/DFArray.c
index 28e1317..053a754 100644
--- a/DocFormats/core/src/lib/DFArray.c
+++ b/DocFormats/core/src/lib/DFArray.c
@@ -1,17 +1,21 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+#include "DFPlatform.h"
#include "DFArray.h"
#include "DFCommon.h"
#include <assert.h>
@@ -29,7 +33,7 @@
DFArray *DFArrayNew(DFCopyFunction copy, DFFreeFunction free)
{
- DFArray *array = (DFArray *)calloc(1,sizeof(DFArray));
+ DFArray *array = (DFArray *)xcalloc(1,sizeof(DFArray));
array->retainCount = 1;
array->copyFun = copy;
array->freeFun = free;
@@ -86,7 +90,7 @@
array->alloc = 1;
else
array->alloc *= 2;
- array->items = (void **)realloc(array->items,array->alloc*sizeof(void *));
+ array->items = (void **)xrealloc(array->items,array->alloc*sizeof(void *));
}
array->items[array->count++] = item;
}
@@ -127,7 +131,7 @@
void DFSort(void *base, size_t nel, size_t width, void *thunk, int (*compar)(void *, const void *, const void *))
{
- void *work = malloc(nel*width);
+ void *work = xmalloc(nel*width);
DFSortInternal(base,nel,width,thunk,compar,work);
free(work);
}
diff --git a/DocFormats/core/src/lib/DFArray.h b/DocFormats/core/src/lib/DFArray.h
index 18f09f9..7996c5e 100644
--- a/DocFormats/core/src/lib/DFArray.h
+++ b/DocFormats/core/src/lib/DFArray.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFArray_h
#define DocFormats_DFArray_h
diff --git a/DocFormats/core/src/lib/DFBuffer.c b/DocFormats/core/src/lib/DFBuffer.c
index 92c7a02..e79929f 100644
--- a/DocFormats/core/src/lib/DFBuffer.c
+++ b/DocFormats/core/src/lib/DFBuffer.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFBuffer.h"
@@ -30,11 +33,11 @@
DFBuffer *DFBufferNew(void)
{
- DFBuffer *buf = (DFBuffer *)calloc(1,sizeof(DFBuffer));
+ DFBuffer *buf = (DFBuffer *)xcalloc(1,sizeof(DFBuffer));
buf->retainCount = 1;
buf->alloc = 1;
buf->len = 0;
- buf->data = (char *)malloc(buf->alloc*sizeof(char));
+ buf->data = (char *)xmalloc(buf->alloc*sizeof(char));
buf->data[0] = '\0';
return buf;
}
@@ -65,7 +68,7 @@
if (buf->alloc < want) {
while (buf->alloc < want)
buf->alloc *= 2;
- buf->data = (char *)realloc(buf->data,buf->alloc);
+ buf->data = (char *)xrealloc(buf->data,buf->alloc);
}
}
@@ -191,7 +194,7 @@
}
if ((input->len % 40) != 0)
DFBufferAppendChar(charBuf,'\n');
- char *result = strdup(charBuf->data);
+ char *result = xstrdup(charBuf->data);
DFBufferRelease(charBuf);
return result;
diff --git a/DocFormats/core/src/lib/DFBuffer.h b/DocFormats/core/src/lib/DFBuffer.h
index 5103003..08aa204 100644
--- a/DocFormats/core/src/lib/DFBuffer.h
+++ b/DocFormats/core/src/lib/DFBuffer.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFBuffer_h
#define DocFormats_DFBuffer_h
diff --git a/DocFormats/core/src/lib/DFCallback.c b/DocFormats/core/src/lib/DFCallback.c
index 5d5ab4f..d48e24d 100644
--- a/DocFormats/core/src/lib/DFCallback.c
+++ b/DocFormats/core/src/lib/DFCallback.c
@@ -1,25 +1,29 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFCallback.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdlib.h>
void DFCallbackAdd(DFCallback **list, DFCallbackFunction fun, void *ctx)
{
- DFCallback *item = (DFCallback *)calloc(1,sizeof(DFCallback));
+ DFCallback *item = (DFCallback *)xcalloc(1,sizeof(DFCallback));
item->fun = fun;
item->ctx = ctx;
item->next = *list;
diff --git a/DocFormats/core/src/lib/DFCallback.h b/DocFormats/core/src/lib/DFCallback.h
index 58db7fe..bf72a31 100644
--- a/DocFormats/core/src/lib/DFCallback.h
+++ b/DocFormats/core/src/lib/DFCallback.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFCallback_h
#define DocFormats_DFCallback_h
diff --git a/DocFormats/core/src/lib/DFCharacterSet.c b/DocFormats/core/src/lib/DFCharacterSet.c
index b9e72dc..bf19476 100644
--- a/DocFormats/core/src/lib/DFCharacterSet.c
+++ b/DocFormats/core/src/lib/DFCharacterSet.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFCharacterSet.h"
#include "DFCommon.h"
diff --git a/DocFormats/core/src/lib/DFCharacterSet.h b/DocFormats/core/src/lib/DFCharacterSet.h
index 534b850..a0e92f5 100644
--- a/DocFormats/core/src/lib/DFCharacterSet.h
+++ b/DocFormats/core/src/lib/DFCharacterSet.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFCharacterSet_h
#define DocFormats_DFCharacterSet_h
diff --git a/DocFormats/core/src/lib/DFError.c b/DocFormats/core/src/lib/DFError.c
index 4eb19dd..4a716e3 100644
--- a/DocFormats/core/src/lib/DFError.c
+++ b/DocFormats/core/src/lib/DFError.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include <DocFormats/DFError.h>
@@ -41,7 +44,7 @@
size_t nchars = vsnprintf(NULL,0,format,ap2);
va_end(ap2);
- char *message = (char *)malloc(nchars+1);
+ char *message = (char *)xmalloc(nchars+1);
va_copy(ap2,ap);
vsnprintf(message,nchars+1,format,ap2);
@@ -54,7 +57,7 @@
}
else {
// Error object does not exist; create a new one
- (*error) = (DFError *)calloc(1,sizeof(DFError));
+ (*error) = (DFError *)xcalloc(1,sizeof(DFError));
(*error)->retainCount = 1;
(*error)->message = message;
}
diff --git a/DocFormats/core/src/lib/DFFilesystem.c b/DocFormats/core/src/lib/DFFilesystem.c
index 66c8a79..6c1a1bc 100644
--- a/DocFormats/core/src/lib/DFFilesystem.c
+++ b/DocFormats/core/src/lib/DFFilesystem.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFFilesystem.h"
@@ -19,7 +22,6 @@
#include "DFBuffer.h"
#include <DocFormats/DFError.h>
#include "DFCharacterSet.h"
-#include "DFPlatform.h"
#include "DFCommon.h"
#include <assert.h>
#include <errno.h>
@@ -174,7 +176,7 @@
static DFArray *arrayFromDirEntryList(DFDirEntryList *list)
{
- DFArray *array = DFArrayNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFArray *array = DFArrayNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
for (DFDirEntryList *l = list; l != NULL; l = l->next)
DFArrayAppend(array,l->name);
return array;
@@ -221,10 +223,10 @@
size_t pos = len;
while (1) {
if (pos == 0)
- return strdup("");
+ return xstrdup("");
if (path[pos-1] == '/') {
if (pos == 1)
- return strdup("/");
+ return xstrdup("/");
else
return DFSubstring(path,0,pos-1);
}
@@ -261,9 +263,9 @@
size_t pos = len;
while (1) {
if (pos == 0)
- return strdup("");
+ return xstrdup("");
if (path[pos-1] == '/')
- return strdup("");
+ return xstrdup("");
if (path[pos-1] == '.')
return DFSubstring(path,pos,len);
pos--;
@@ -277,7 +279,7 @@
len--;
if (!strcmp(path,"/"))
- return strdup("/");;
+ return xstrdup("/");;
size_t pos = len;
while (1) {
@@ -294,7 +296,7 @@
char *DFPathNormalize(const char *path)
{
size_t len = strlen(path);
- char *result = (char *)malloc(len+1);
+ char *result = (char *)xmalloc(len+1);
size_t outpos = 0;
for (size_t pos = 0; pos < len; pos++) {
if ((path[pos] != '/') || (pos == 0) || (path[pos-1] != '/'))
@@ -307,11 +309,11 @@
char *DFPathResolveAbsolute(const char *rawBase, const char *relative)
{
if (relative[0] == '/')
- return strdup(relative);
+ return xstrdup(relative);
char *base;
if (rawBase[0] == '/') {
- base = strdup(rawBase);
+ base = xstrdup(rawBase);
}
else {
char cwd[4096];
@@ -319,7 +321,7 @@
base = DFFormatString("%s/%s",cwd,rawBase);
}
- char *baseDirectory = DFStringHasSuffix(base,"/") ? strdup(base) : DFPathDirName(base);
+ char *baseDirectory = DFStringHasSuffix(base,"/") ? xstrdup(base) : DFPathDirName(base);
DFBuffer *path = DFBufferNew();
DFBufferAppendString(path,baseDirectory);
@@ -371,7 +373,7 @@
char *DFRemovePercentEncoding(const char *encoded)
{
size_t inlen = strlen(encoded);
- char *output = (char *)malloc(inlen+1);
+ char *output = (char *)xmalloc(inlen+1);
size_t outpos = 0;
for (size_t inpos = 0; inpos < inlen; inpos++) {
char ch = encoded[inpos];
diff --git a/DocFormats/core/src/lib/DFFilesystem.h b/DocFormats/core/src/lib/DFFilesystem.h
index e3e2869..3754dd7 100644
--- a/DocFormats/core/src/lib/DFFilesystem.h
+++ b/DocFormats/core/src/lib/DFFilesystem.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFUtil_h
#define DocFormats_DFUtil_h
diff --git a/DocFormats/core/src/lib/DFHashTable.c b/DocFormats/core/src/lib/DFHashTable.c
index 6a1cfe8..5385c3e 100644
--- a/DocFormats/core/src/lib/DFHashTable.c
+++ b/DocFormats/core/src/lib/DFHashTable.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFHashTable.h"
@@ -44,10 +47,10 @@
DFHashTable *DFHashTableNew2(DFCopyFunction copy, DFFreeFunction free, int binsCount)
{
- DFHashTable *table = (DFHashTable *)calloc(1,sizeof(DFHashTable));
+ DFHashTable *table = (DFHashTable *)xcalloc(1,sizeof(DFHashTable));
table->retainCount = 1;
table->binsCount = binsCount;
- table->bins = (DFHashEntry **)calloc(1,table->binsCount*sizeof(DFHashEntry *));
+ table->bins = (DFHashEntry **)xcalloc(1,table->binsCount*sizeof(DFHashEntry *));
table->copy = copy;
table->free = free;
return table;
@@ -130,7 +133,7 @@
numBytes += strlen(entry->key)+1;
}
- void *mem = malloc(numBytes);
+ void *mem = xmalloc(numBytes);
char **pointers = mem;
char *storage = (char *)mem + (count+1)*sizeof(char *);
@@ -205,7 +208,7 @@
}
else {
size_t len = strlen(key);
- DFHashEntry *entry = (DFHashEntry *)malloc(sizeof(DFHashEntry)+len*sizeof(char)+1);
+ DFHashEntry *entry = (DFHashEntry *)xmalloc(sizeof(DFHashEntry)+len*sizeof(char)+1);
entry->value = value;
entry->hash = hash;
memcpy(&entry->key[0],key,len);
diff --git a/DocFormats/core/src/lib/DFHashTable.h b/DocFormats/core/src/lib/DFHashTable.h
index 7eaad43..89c8403 100644
--- a/DocFormats/core/src/lib/DFHashTable.h
+++ b/DocFormats/core/src/lib/DFHashTable.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFHashTable_h
#define DocFormats_DFHashTable_h
diff --git a/DocFormats/core/src/lib/DFStorage.c b/DocFormats/core/src/lib/DFStorage.c
index 04521aa..d6e404f 100644
--- a/DocFormats/core/src/lib/DFStorage.c
+++ b/DocFormats/core/src/lib/DFStorage.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include <DocFormats/DFStorage.h>
@@ -70,13 +73,13 @@
size_t balloc = 4096;
size_t blen = 0;
- char *mem = (char *)malloc(balloc);
+ char *mem = (char *)xmalloc(balloc);
size_t r;
while (0 < (r = fread(&mem[blen],1,4096,file))) {
balloc += r;
blen += r;
- mem = (char *)realloc(mem,balloc);
+ mem = (char *)xrealloc(mem,balloc);
}
ok = 1;
@@ -142,7 +145,7 @@
if (allPaths == NULL)
return NULL;;
- DFArray *filesOnly = DFArrayNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFArray *filesOnly = DFArrayNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
for (int i = 0; allPaths[i]; i++) {
const char *relPath = allPaths[i];
char *absPath = DFAppendPathComponent(storage->rootPath,relPath);
@@ -187,7 +190,7 @@
return 0;
}
- *buf = malloc(buffer->len);
+ *buf = xmalloc(buffer->len);
memcpy(*buf,buffer->data,buffer->len);
*nbytes = buffer->len;
@@ -255,7 +258,7 @@
return 0;
}
- *buf = malloc(buffer->len);
+ *buf = xmalloc(buffer->len);
memcpy(*buf,buffer->data,buffer->len);
*nbytes = buffer->len;
@@ -312,16 +315,16 @@
char *normalized = DFPathNormalize(input);
char *result;
if (normalized[0] == '/')
- result = strdup(&normalized[1]);
+ result = xstrdup(&normalized[1]);
else
- result = strdup(normalized);
+ result = xstrdup(normalized);
free(normalized);
return result;
}
static DFStorage *DFStorageNew(DFFileFormat format, const DFStorageOps *ops)
{
- DFStorage *storage = (DFStorage *)calloc(1,sizeof(DFStorage));
+ DFStorage *storage = (DFStorage *)xcalloc(1,sizeof(DFStorage));
storage->retainCount = 1;
storage->format = format;
storage->ops = ops;
@@ -333,7 +336,7 @@
if ((rootPath == NULL) || (strlen(rootPath) == 0))
rootPath = ".";;
DFStorage *storage = DFStorageNew(format,&fsOps);
- storage->rootPath = strdup(rootPath);
+ storage->rootPath = xstrdup(rootPath);
return storage;
}
@@ -354,7 +357,7 @@
DFStorage *storage = DFStorageNew(DFFileFormatFromFilename(filename),&zipOps);
storage->files = DFHashTableNew((DFCopyFunction)DFBufferRetain,(DFFreeFunction)DFBufferRelease);
- storage->zipFilename = strdup(filename);
+ storage->zipFilename = xstrdup(filename);
return storage;
}
@@ -367,7 +370,7 @@
DFStorage *storage = DFStorageNew(DFFileFormatFromFilename(filename),&zipOps);
storage->files = DFHashTableNew((DFCopyFunction)DFBufferRetain,(DFFreeFunction)DFBufferRelease);
- storage->zipFilename = strdup(filename);
+ storage->zipFilename = xstrdup(filename);
if (!DFUnzip(filename,storage,error)) {
DFStorageRelease(storage);
diff --git a/DocFormats/core/src/lib/DFString.c b/DocFormats/core/src/lib/DFString.c
index b768ef4..243439a 100644
--- a/DocFormats/core/src/lib/DFString.c
+++ b/DocFormats/core/src/lib/DFString.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFString.h"
@@ -50,13 +53,13 @@
}
builder->pointerIndex += 1;
- builder->storageIndex += toklen + 1;
+ builder->storageIndex += (int)(toklen + 1);
}
static void DFArrayBuilderAllocate(DFArrayBuilder *builder)
{
int pointerBytes = (builder->pointerIndex + 1)*sizeof(char *);
- void *mem = malloc(pointerBytes + builder->storageIndex);
+ void *mem = xmalloc(pointerBytes + builder->storageIndex);
builder->pointers = mem;
builder->storage = (char *)mem + pointerBytes;
}
@@ -253,7 +256,7 @@
ch = DFNextChar(str,&pos);
} while ((ch != 0) && DFCharIsWhitespaceOrNewline(ch));
- return strdup(&str[startpos]);
+ return xstrdup(&str[startpos]);
}
char *DFStringNormalizeWhitespace(const char *input)
@@ -265,7 +268,7 @@
size_t inputLen = strlen(input);
size_t outputLen = 0;
- char *output = (char *)malloc(inputLen+1);
+ char *output = (char *)xmalloc(inputLen+1);
size_t start = 0;
while ((start < inputLen) && isspace(input[start]))
@@ -310,7 +313,7 @@
if (end < start)
end = start;
- char *substring = (char *)malloc(end-start+1);
+ char *substring = (char *)xmalloc(end-start+1);
memcpy(substring,&str[start],end-start);
substring[end-start] = '\0';
return substring;
@@ -319,7 +322,7 @@
char *DFStrDup(const char *str)
{
if (str != NULL)
- return strdup(str);
+ return xstrdup(str);
else
return NULL;
}
@@ -331,7 +334,7 @@
}
size_t len = strlen(input);
- char *result = strdup(input);
+ char *result = xstrdup(input);
for (size_t i = 0; i < len; i++) {
// Avoid calling toupper with chars from UTF-8 multibyte sequences
if ((result[i] >= 'a') && result[i] <= 'z')
@@ -347,7 +350,7 @@
}
size_t len = strlen(input);
- char *result = strdup(input);
+ char *result = xstrdup(input);
for (size_t i = 0; i < len; i++) {
// Avoid calling tolower with chars from UTF-8 multibyte sequences
if ((result[i] >= 'A') && result[i] <= 'Z')
@@ -364,7 +367,7 @@
size_t nchars = vsnprintf(NULL,0,format,ap2);
va_end(ap2);
- char *result = (char *)malloc(nchars+1);
+ char *result = (char *)xmalloc(nchars+1);
va_copy(ap2,ap);
vsnprintf(result,nchars+1,format,ap2);
@@ -486,7 +489,7 @@
{
char *unnormalized;
if (strlen(path1) == 0)
- unnormalized = strdup(path2);
+ unnormalized = xstrdup(path2);
else if (path1[strlen(path1)-1] == '/')
unnormalized = DFFormatString("%s%s",path1,path2);
else
@@ -509,7 +512,7 @@
size_t matchLen = strlen(match);
if (matchLen == 0)
- return strdup(input); // protect against infinite loop
+ return xstrdup(input); // protect against infinite loop
struct DFBuffer *output = DFBufferNew();
@@ -525,7 +528,7 @@
}
}
- char *result = strdup(output->data);
+ char *result = xstrdup(output->data);
DFBufferRelease(output);
return result;
}
@@ -544,7 +547,7 @@
// UTF-8 characters pass through untouched.
size_t inlen = strlen(in);
- char *out = (char*)malloc(2*inlen+3);
+ char *out = (char*)xmalloc(2*inlen+3);
size_t outlen = 0;
out[outlen++] = '"';
for (size_t i = 0; i < inlen; i++) {
@@ -595,11 +598,11 @@
return NULL;
if ((in[0] != '"') && (in[0] != '\''))
- return strdup(in);
+ return xstrdup(in);
char quote = in[0];
size_t inlen = strlen(in);
- char *out = (char *)malloc(inlen+1);
+ char *out = (char *)xmalloc(inlen+1);
size_t outlen = 0;
size_t i = 1;
for (; i < inlen; i++) {
@@ -643,7 +646,7 @@
char *DFSpacesToUnderscores(const char *input)
{
size_t len = strlen(input);
- char *output = strdup(input);
+ char *output = xstrdup(input);
for (size_t i = 0; i < len; i++) {
if (output[i] == ' ')
output[i] = '_';
@@ -654,7 +657,7 @@
char *DFUnderscoresToSpaces(const char *input)
{
size_t len = strlen(input);
- char *output = strdup(input);
+ char *output = xstrdup(input);
for (size_t i = 0; i < len; i++) {
if (output[i] == '_')
output[i] = ' ';
@@ -736,7 +739,7 @@
DFBuffer *buffer = DFBufferReadFromFile(filename,error);
if (buffer == NULL)
return NULL;
- char *result = strdup(buffer->data);
+ char *result = xstrdup(buffer->data);
DFBufferRelease(buffer);
return result;
}
@@ -770,7 +773,7 @@
while (DFNextChar(input,&inpos) != 0)
outlen++;
- uint32_t *output = (uint32_t *)malloc((outlen+1)*sizeof(uint32_t));
+ uint32_t *output = (uint32_t *)xmalloc((outlen+1)*sizeof(uint32_t));
inpos = 0;
for (size_t outpos = 0; outpos < outlen; outpos++)
output[outpos] = DFNextChar(input,&inpos);
@@ -848,7 +851,7 @@
}
size_t outlen = DFUTF32to8n(input,NULL);
- char *output = (char *)malloc(outlen+1);
+ char *output = (char *)xmalloc(outlen+1);
DFUTF32to8n(input,output);
output[outlen] = '\0';
diff --git a/DocFormats/core/src/lib/DFString.h b/DocFormats/core/src/lib/DFString.h
index 5530c61..75856c2 100644
--- a/DocFormats/core/src/lib/DFString.h
+++ b/DocFormats/core/src/lib/DFString.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFString_h
#define DocFormats_DFString_h
diff --git a/DocFormats/core/src/lib/DFZipFile.c b/DocFormats/core/src/lib/DFZipFile.c
index faec05f..ee5a648 100644
--- a/DocFormats/core/src/lib/DFZipFile.c
+++ b/DocFormats/core/src/lib/DFZipFile.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFZipFile.h"
diff --git a/DocFormats/core/src/lib/DFZipFile.h b/DocFormats/core/src/lib/DFZipFile.h
index 332cace..10fe461 100644
--- a/DocFormats/core/src/lib/DFZipFile.h
+++ b/DocFormats/core/src/lib/DFZipFile.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFZipFile_h
#define DocFormats_DFZipFile_h
diff --git a/DocFormats/core/src/lib/TextPackage.c b/DocFormats/core/src/lib/TextPackage.c
index b81a42e..feff1d6 100644
--- a/DocFormats/core/src/lib/TextPackage.c
+++ b/DocFormats/core/src/lib/TextPackage.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "TextPackage.h"
@@ -29,10 +32,10 @@
static TextPackage *TextPackageNew(void)
{
- TextPackage *package = (TextPackage *)calloc(1,sizeof(TextPackage));
+ TextPackage *package = (TextPackage *)xcalloc(1,sizeof(TextPackage));
package->retainCount = 1;
- package->items = DFHashTableNew((DFCopyFunction)strdup,free);
- package->keys = (char **)calloc(1,sizeof(char *));
+ package->items = DFHashTableNew((DFCopyFunction)xstrdup,free);
+ package->keys = (char **)xcalloc(1,sizeof(char *));
return package;
}
@@ -98,7 +101,7 @@
}
- char *currentKey = strdup("");
+ char *currentKey = xstrdup("");
DFBuffer *currentValue = DFBufferNew();
const char **lines = DFStringSplit(replaced->data,"\n",0);
for (int lineno = 0; lines[lineno]; lineno++) {
@@ -108,8 +111,8 @@
DFBufferFormat(currentValue,"%s\n",line);
}
else if (DFStringHasPrefix(line,"#item ")) {
- package->keys = (char **)realloc(package->keys,(package->nkeys+2)*sizeof(char *));
- package->keys[package->nkeys++] = strdup(currentKey);
+ package->keys = (char **)xrealloc(package->keys,(package->nkeys+2)*sizeof(char *));
+ package->keys[package->nkeys++] = xstrdup(currentKey);
package->keys[package->nkeys] = NULL;
DFHashTableAdd(package->items,currentKey,currentValue->data);
free(currentKey);
@@ -125,8 +128,8 @@
return 0;
}
}
- package->keys = (char **)realloc(package->keys,(package->nkeys+2)*sizeof(char *));
- package->keys[package->nkeys++] = strdup(currentKey);
+ package->keys = (char **)xrealloc(package->keys,(package->nkeys+2)*sizeof(char *));
+ package->keys[package->nkeys++] = xstrdup(currentKey);
package->keys[package->nkeys] = NULL;
DFHashTableAdd(package->items,currentKey,currentValue->data);
diff --git a/DocFormats/core/src/lib/TextPackage.h b/DocFormats/core/src/lib/TextPackage.h
index 077f84e..2edb3d6 100644
--- a/DocFormats/core/src/lib/TextPackage.h
+++ b/DocFormats/core/src/lib/TextPackage.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef dfutil_TextPackage_h
#define dfutil_TextPackage_h
diff --git a/DocFormats/core/src/xml/DFChanges.c b/DocFormats/core/src/xml/DFChanges.c
index 8dd44de..c67b0f0 100644
--- a/DocFormats/core/src/xml/DFChanges.c
+++ b/DocFormats/core/src/xml/DFChanges.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFChanges.h"
@@ -27,7 +30,7 @@
const TagDecl *tagDecl = DFNameMapNameForTag(doc->map,tag);
const NamespaceDecl *nsDecl = DFNameMapNamespaceForID(doc->map,tagDecl->namespaceID);
if ((nsDecl->prefix == NULL) || (tagDecl->namespaceID == NAMESPACE_HTML))
- return strdup(tagDecl->localName);
+ return xstrdup(tagDecl->localName);
else
return DFFormatString("%s:%s",nsDecl->prefix,tagDecl->localName);
}
@@ -78,7 +81,7 @@
if (strlen(quoted) >= 2)
sub = DFSubstring(quoted,1,strlen(quoted)-2);
else
- sub = strdup(quoted);
+ sub = xstrdup(quoted);
DFBufferFormat(output,"%s</%s>",quoted,elementName);
free(sub);
free(quoted);
@@ -216,7 +219,7 @@
{
DFBuffer *output = DFBufferNew();
DFChangesToStringRecursive(root,0,output);
- char *result = strdup(output->data);
+ char *result = xstrdup(output->data);
DFBufferRelease(output);
return result;
}
diff --git a/DocFormats/core/src/xml/DFChanges.h b/DocFormats/core/src/xml/DFChanges.h
index 16759e4..939c352 100644
--- a/DocFormats/core/src/xml/DFChanges.h
+++ b/DocFormats/core/src/xml/DFChanges.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef dfutil_DFChanges_h
#define dfutil_DFChanges_h
diff --git a/DocFormats/core/src/xml/DFDOM.c b/DocFormats/core/src/xml/DFDOM.c
index 413880e..a5ef758 100644
--- a/DocFormats/core/src/xml/DFDOM.c
+++ b/DocFormats/core/src/xml/DFDOM.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFDOM.h"
@@ -46,7 +49,7 @@
{
if (doc->nodesCount == doc->nodesAlloc) {
doc->nodesAlloc *= 2;
- doc->nodes = (DFNode **)realloc(doc->nodes,doc->nodesAlloc*sizeof(DFNode *));
+ doc->nodes = (DFNode **)xrealloc(doc->nodes,doc->nodesAlloc*sizeof(DFNode *));
}
// Node *node = NodeNew(tag);
@@ -60,7 +63,7 @@
DFDocument *DFDocumentNew(void)
{
- DFDocument *doc = (DFDocument *)calloc(1,sizeof(DFDocument));
+ DFDocument *doc = (DFDocument *)xcalloc(1,sizeof(DFDocument));
doc->retainCount = 1;
doc->allocator = DFAllocatorNew();
doc->map = DFNameMapNew();
@@ -68,7 +71,7 @@
doc->nodesCount = 0;
doc->nodesAlloc = 1;
- doc->nodes = (DFNode **)malloc(doc->nodesAlloc*sizeof(DFNode *));
+ doc->nodes = (DFNode **)xmalloc(doc->nodesAlloc*sizeof(DFNode *));
doc->docNode = DocumentCreateNode(doc,DOM_DOCUMENT);
return doc;
@@ -339,7 +342,7 @@
// No existing attribute with this tag - add it
if (element->attrsCount == element->attrsAlloc) {
element->attrsAlloc = (element->attrsAlloc == 0) ? 8 : (2*element->attrsAlloc);
- element->attrs = (DFAttribute *)realloc(element->attrs,element->attrsAlloc*sizeof(DFAttribute));
+ element->attrs = (DFAttribute *)xrealloc(element->attrs,element->attrsAlloc*sizeof(DFAttribute));
}
element->attrs[element->attrsCount].tag = tag;
@@ -485,7 +488,7 @@
{
DFBuffer *buf = DFBufferNew();
DFNodeTextToBuffer(node,buf);
- char *result = strdup(buf->data);
+ char *result = xstrdup(buf->data);
DFBufferRelease(buf);
return result;
}
diff --git a/DocFormats/core/src/xml/DFDOM.h b/DocFormats/core/src/xml/DFDOM.h
index 1ea863e..44e81fe 100644
--- a/DocFormats/core/src/xml/DFDOM.h
+++ b/DocFormats/core/src/xml/DFDOM.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFDOM_h
#define DocFormats_DFDOM_h
diff --git a/DocFormats/core/src/xml/DFMarkupCompatibility.c b/DocFormats/core/src/xml/DFMarkupCompatibility.c
index 33dc69d..a77a08d 100644
--- a/DocFormats/core/src/xml/DFMarkupCompatibility.c
+++ b/DocFormats/core/src/xml/DFMarkupCompatibility.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFMarkupCompatibility.h"
@@ -56,7 +59,7 @@
DFMarkupCompatibility *DFMarkupCompatibilityNew(void)
{
- DFMarkupCompatibility *mc = (DFMarkupCompatibility *)calloc(1,sizeof(DFMarkupCompatibility));
+ DFMarkupCompatibility *mc = (DFMarkupCompatibility *)xcalloc(1,sizeof(DFMarkupCompatibility));
return mc;
}
@@ -70,7 +73,7 @@
static void addDeclToRecord(MCRecord *record, NamespaceID nsId, Tag tag, MCAction action)
{
record->count++;
- record->decls = (MCDecl *)realloc(record->decls,record->count*sizeof(MCDecl));
+ record->decls = (MCDecl *)xrealloc(record->decls,record->count*sizeof(MCDecl));
record->decls[record->count-1].nsId = nsId;
record->decls[record->count-1].tag = tag;
record->decls[record->count-1].action = action;
@@ -83,7 +86,7 @@
MCRecord *record = &mc->records[mc->depth-1];
bzero(record,sizeof(MCRecord));
if (nb_namespaces > 0) {
- record->namespaces = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ record->namespaces = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
for (int i = 0; i < nb_namespaces; i++) {
const char *nsPrefix = namespaces[i*2];
const char *nsURI = namespaces[i*2+1];
@@ -152,7 +155,7 @@
localName = DFSubstring(component,colonPos+1,strlen(component));
}
else {
- prefix = strdup(component);
+ prefix = xstrdup(component);
localName = NULL;
}
diff --git a/DocFormats/core/src/xml/DFMarkupCompatibility.h b/DocFormats/core/src/xml/DFMarkupCompatibility.h
index d421d54..c8a5273 100644
--- a/DocFormats/core/src/xml/DFMarkupCompatibility.h
+++ b/DocFormats/core/src/xml/DFMarkupCompatibility.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFMarkupCompatibility_h
#define DocFormats_DFMarkupCompatibility_h
diff --git a/DocFormats/core/src/xml/DFNameMap.c b/DocFormats/core/src/xml/DFNameMap.c
index f408003..eb5d868 100644
--- a/DocFormats/core/src/xml/DFNameMap.c
+++ b/DocFormats/core/src/xml/DFNameMap.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFNameMap.h"
@@ -76,9 +79,9 @@
if (URI == NULL)
URI = "";;
uint32_t hash = DFNameHashTableHash(name,URI)%HASH_TABLE_SIZE;
- DFNameEntry *entry = (DFNameEntry *)malloc(sizeof(DFNameEntry));
- entry->name = strdup(name);
- entry->URI = strdup(URI);
+ DFNameEntry *entry = (DFNameEntry *)xmalloc(sizeof(DFNameEntry));
+ entry->name = xstrdup(name);
+ entry->URI = xstrdup(URI);
entry->tag = tag;
entry->tagDecl.namespaceID = namespaceID;
entry->tagDecl.localName = (const char *)entry->name;
@@ -88,7 +91,7 @@
static DFNameHashTable *DFNameHashTableNew()
{
- return (DFNameHashTable*)calloc(1,sizeof(DFNameHashTable));
+ return (DFNameHashTable*)xcalloc(1,sizeof(DFNameHashTable));
}
static void DFNameHashTableFree(DFNameHashTable *table)
@@ -121,11 +124,11 @@
DFNamespaceInfo *DFNamespaceInfoNew(NamespaceID nsId, const char *URI, const char *prefix)
{
- DFNamespaceInfo *info = (DFNamespaceInfo *)calloc(1,sizeof(DFNamespaceInfo));
+ DFNamespaceInfo *info = (DFNamespaceInfo *)xcalloc(1,sizeof(DFNamespaceInfo));
info->nsId = nsId;
- info->decl = (NamespaceDecl *)malloc(sizeof(NamespaceDecl));
- info->decl->namespaceURI = strdup(URI);
- info->decl->prefix = strdup(prefix);
+ info->decl = (NamespaceDecl *)xmalloc(sizeof(NamespaceDecl));
+ info->decl->namespaceURI = xstrdup(URI);
+ info->decl->prefix = xstrdup(prefix);
return info;
}
@@ -152,11 +155,11 @@
DFTagInfo *DFTagInfoNew(Tag tag, NamespaceID nsId, const char *localName)
{
- DFTagInfo *info = (DFTagInfo *)calloc(1,sizeof(DFTagInfo));
+ DFTagInfo *info = (DFTagInfo *)xcalloc(1,sizeof(DFTagInfo));
info->tag = tag;
- info->decl = (TagDecl *)malloc(sizeof(TagDecl));
+ info->decl = (TagDecl *)xmalloc(sizeof(TagDecl));
info->decl->namespaceID = nsId;
- info->decl->localName = strdup(localName);
+ info->decl->localName = xstrdup(localName);
return info;
}
@@ -192,7 +195,7 @@
DFNameMap *DFNameMapNew(void)
{
- DFNameMap *map = (DFNameMap *)calloc(1,sizeof(DFNameMap));
+ DFNameMap *map = (DFNameMap *)xcalloc(1,sizeof(DFNameMap));
map->namespacesByID = DFHashTableNew2(NULL,NULL,997);
map->namespacesByURI = DFHashTableNew2(NULL,(DFFreeFunction)DFNamespaceInfoFree,997);
map->tagsByID = DFHashTableNew2(NULL,(DFFreeFunction)DFTagInfoFree,997);
diff --git a/DocFormats/core/src/xml/DFNameMap.h b/DocFormats/core/src/xml/DFNameMap.h
index 9be2c39..1a8c76b 100644
--- a/DocFormats/core/src/xml/DFNameMap.h
+++ b/DocFormats/core/src/xml/DFNameMap.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFNameMap_h
#define DocFormats_DFNameMap_h
diff --git a/DocFormats/core/src/xml/DFXML.c b/DocFormats/core/src/xml/DFXML.c
index 2172651..449f2e1 100644
--- a/DocFormats/core/src/xml/DFXML.c
+++ b/DocFormats/core/src/xml/DFXML.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFXML.h"
@@ -70,7 +73,7 @@
DFSAXParser *DFSAXParserNew(void)
{
- DFSAXParser *parser = (DFSAXParser *)calloc(1,sizeof(DFSAXParser));
+ DFSAXParser *parser = (DFSAXParser *)xcalloc(1,sizeof(DFSAXParser));
parser->document = DFDocumentNew();
parser->parent = parser->document->docNode;
parser->warnings = DFBufferNew();
@@ -136,11 +139,11 @@
const xmlChar *attrURI = attributes[i*5+2];
const xmlChar *attrValueStart = attributes[i*5+3];
const xmlChar *attrValueEnd = attributes[i*5+4];
- unsigned long attrValueLen = attrValueEnd - attrValueStart;
+ unsigned long attrValueLen = (unsigned long)(attrValueEnd - attrValueStart);
Tag attrTag = DFNameMapTagForName(parser->document->map,(const char *)attrURI,(const char *)attrLocalName);
const TagDecl *attrTagDecl = DFNameMapNameForTag(parser->document->map,attrTag);
- char *attrValue = (char *)malloc(attrValueLen+1);
+ char *attrValue = (char *)xmalloc(attrValueLen+1);
memcpy(attrValue,attrValueStart,attrValueLen);
attrValue[attrValueLen] = '\0';
if (parser->compatibility != NULL) {
@@ -223,7 +226,7 @@
DFSAXParser *parser = (DFSAXParser *)ctx;
if (parser->ignoreDepth > 0)
return;
- char *data = (char *)malloc(len+1);
+ char *data = (char *)xmalloc(len+1);
memcpy(data,ch,len);
data[len] = '\0';
DFNode *text = DFCreateTextNode(parser->document,data);
@@ -247,7 +250,7 @@
DFSAXParser *parser = (DFSAXParser *)ctx;
if (parser->ignoreDepth > 0)
return;
- char *data = (char *)malloc(len+1);
+ char *data = (char *)xmalloc(len+1);
memcpy(data,value,len);
data[len] = '\0';
DFNode *cdata = DFCreateTextNode(parser->document,data);
@@ -357,7 +360,7 @@
static void writeNamespaceDeclarations(Serialization *serialization, DFNode *node)
{
NamespaceID count = DFNameMapNamespaceCount(serialization->doc->map);
- char *used = (char *)calloc(1,count);
+ char *used = (char *)xcalloc(1,count);
findUsedNamespaces(serialization->doc,node,used,count);
for (NamespaceID nsId = 1; nsId < count; nsId++) { // don't write null namespace
if (used[nsId]) {
@@ -389,7 +392,7 @@
{
// Sort the keys by their tag, to ensure that we always write attributes out in the same order.
// This is important for automated tests which rely on consistent output for a given XML tree.
- DFAttribute *attrs = (DFAttribute *)malloc(element->attrsCount*sizeof(DFAttribute));
+ DFAttribute *attrs = (DFAttribute *)xmalloc(element->attrsCount*sizeof(DFAttribute));
memcpy(attrs,element->attrs,element->attrsCount*sizeof(DFAttribute));
qsort(attrs,element->attrsCount,sizeof(DFAttribute),compareAttrs);
@@ -608,7 +611,7 @@
{
DFBuffer *buf = DFBufferNew();
DFSerializeXMLBuffer(doc,defaultNS,indent,buf);
- char *result = strdup(buf->data);
+ char *result = xstrdup(buf->data);
DFBufferRelease(buf);
return result;
}
diff --git a/DocFormats/core/src/xml/DFXML.h b/DocFormats/core/src/xml/DFXML.h
index 3318706..a36c638 100644
--- a/DocFormats/core/src/xml/DFXML.h
+++ b/DocFormats/core/src/xml/DFXML.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFXML_h
#define DocFormats_DFXML_h
diff --git a/DocFormats/core/tests/common/BDTTests.c b/DocFormats/core/tests/common/BDTTests.c
index df10d02..5fdb8c4 100644
--- a/DocFormats/core/tests/common/BDTTests.c
+++ b/DocFormats/core/tests/common/BDTTests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "BDTTests.h"
@@ -40,7 +43,7 @@
static ItemLens *ItemLensNew(DFDocument *abstractDoc, DFDocument *concreteDoc)
{
- ItemLens *lens = (ItemLens *)calloc(1,sizeof(ItemLens));
+ ItemLens *lens = (ItemLens *)xcalloc(1,sizeof(ItemLens));
lens->abstractDoc = DFDocumentRetain(abstractDoc);
lens->concreteDoc = DFDocumentRetain(concreteDoc);
return lens;
@@ -126,7 +129,7 @@
static TestContainerLens *TestContainerLensNew(DFDocument *abstractDoc, DFDocument *concreteDoc)
{
- TestContainerLens *lens = (TestContainerLens *)calloc(1,sizeof(TestContainerLens));
+ TestContainerLens *lens = (TestContainerLens *)xcalloc(1,sizeof(TestContainerLens));
lens->abstractDoc = DFDocumentRetain(abstractDoc);
lens->concreteDoc = DFDocumentRetain(concreteDoc);
lens->itemLens = ItemLensNew(abstractDoc,concreteDoc);
@@ -389,7 +392,7 @@
static void test_remove(void)
{
- int *indices = (int *)malloc(utgetargc()*sizeof(int));
+ int *indices = (int *)xmalloc(utgetargc()*sizeof(int));
for (int i = 0; i < utgetargc(); i++) {
int index = atoi(utgetargv()[i]);
diff --git a/DocFormats/core/tests/common/BDTTests.h b/DocFormats/core/tests/common/BDTTests.h
index f4bae09..7e1b63a 100644
--- a/DocFormats/core/tests/common/BDTTests.h
+++ b/DocFormats/core/tests/common/BDTTests.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef dfutil_BDTTest_h
#define dfutil_BDTTest_h
diff --git a/DocFormats/core/tests/css/CSSTests.c b/DocFormats/core/tests/css/CSSTests.c
index 4612588..ae18dce 100644
--- a/DocFormats/core/tests/css/CSSTests.c
+++ b/DocFormats/core/tests/css/CSSTests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFUnitTest.h"
diff --git a/DocFormats/core/tests/html/HTMLPlain.c b/DocFormats/core/tests/html/HTMLPlain.c
index d260de4..e131f43 100644
--- a/DocFormats/core/tests/html/HTMLPlain.c
+++ b/DocFormats/core/tests/html/HTMLPlain.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "HTMLPlain.h"
@@ -74,7 +77,7 @@
}
free(imageSources);
- char *str = strdup(output->data);
+ char *str = xstrdup(output->data);
DFBufferRelease(output);
return str;
}
diff --git a/DocFormats/core/tests/html/HTMLPlain.h b/DocFormats/core/tests/html/HTMLPlain.h
index 210282e..8d32917 100644
--- a/DocFormats/core/tests/html/HTMLPlain.h
+++ b/DocFormats/core/tests/html/HTMLPlain.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_HTMLPlain_h
#define DocFormats_HTMLPlain_h
diff --git a/DocFormats/core/tests/html/HTMLTests.c b/DocFormats/core/tests/html/HTMLTests.c
index 76a1424..620182d 100644
--- a/DocFormats/core/tests/html/HTMLTests.c
+++ b/DocFormats/core/tests/html/HTMLTests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFUnitTest.h"
diff --git a/DocFormats/core/tests/lib/LibTests.c b/DocFormats/core/tests/lib/LibTests.c
index cbf3bc7..b4382c9 100644
--- a/DocFormats/core/tests/lib/LibTests.c
+++ b/DocFormats/core/tests/lib/LibTests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFUnitTest.h"
#include <stddef.h>
diff --git a/DocFormats/core/tests/xml/XMLTests.c b/DocFormats/core/tests/xml/XMLTests.c
index a7ca32b..da4480d 100644
--- a/DocFormats/core/tests/xml/XMLTests.c
+++ b/DocFormats/core/tests/xml/XMLTests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFUnitTest.h"
#include <stddef.h>
diff --git a/DocFormats/filters/latex/src/HTMLToLaTeX.c b/DocFormats/filters/latex/src/HTMLToLaTeX.c
index 10be122..20589f8 100644
--- a/DocFormats/filters/latex/src/HTMLToLaTeX.c
+++ b/DocFormats/filters/latex/src/HTMLToLaTeX.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "HTMLToLaTeX.h"
@@ -40,9 +43,9 @@
LaTeXConverter *LaTeXConverterNew(DFDocument *htmlDoc)
{
- LaTeXConverter *conv = (LaTeXConverter *)calloc(1,sizeof(LaTeXConverter));
+ LaTeXConverter *conv = (LaTeXConverter *)xcalloc(1,sizeof(LaTeXConverter));
conv->htmlDoc = DFDocumentRetain(htmlDoc);
- conv->packages = DFHashTableNew((DFCopyFunction)strdup,free);
+ conv->packages = DFHashTableNew((DFCopyFunction)xstrdup,free);
return conv;
}
@@ -232,7 +235,7 @@
}
if (texWidth == NULL)
- texWidth = strdup("");;
+ texWidth = xstrdup("");;
const char *src = DFGetAttribute(node,HTML_SRC);
if (src != NULL) {
@@ -681,7 +684,7 @@
DFBufferFormat(mainOutput,"\\end{document}\n");
- char *result = strdup(mainOutput->data);
+ char *result = xstrdup(mainOutput->data);
DFBufferRelease(makeTitleOutput);
DFBufferRelease(documentOutput);
DFBufferRelease(mainOutput);
diff --git a/DocFormats/filters/latex/src/HTMLToLaTeX.h b/DocFormats/filters/latex/src/HTMLToLaTeX.h
index 6c71282..e0faa2e 100644
--- a/DocFormats/filters/latex/src/HTMLToLaTeX.h
+++ b/DocFormats/filters/latex/src/HTMLToLaTeX.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_HTMLToLaTeX_h
#define DocFormats_HTMLToLaTeX_h
diff --git a/DocFormats/filters/latex/tests/LaTeXTests.c b/DocFormats/filters/latex/tests/LaTeXTests.c
index 16a113c..65cb9f7 100644
--- a/DocFormats/filters/latex/tests/LaTeXTests.c
+++ b/DocFormats/filters/latex/tests/LaTeXTests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFUnitTest.h"
diff --git a/DocFormats/filters/odf/CMakeLists.txt b/DocFormats/filters/odf/CMakeLists.txt
index 7787ad6..b38a965 100644
--- a/DocFormats/filters/odf/CMakeLists.txt
+++ b/DocFormats/filters/odf/CMakeLists.txt
@@ -25,6 +25,10 @@
src/ODFSheet.c
src/ODFSheet.h)
+set(GroupSrcText
+ src/text/ODFText.h
+ src/text/ODFText.c)
+
set(GroupTests
tests/ODFTests.c)
@@ -62,7 +66,9 @@
###
add_library(odf OBJECT
${GroupSrc}
+ ${GroupSrcText}
${GroupTests})
-source_group(src FILES ${GroupSrc})
-source_group(tests FILES ${GroupTests})
+source_group(src FILES ${GroupSrc})
+source_group(src\\text FILES ${GroupSrcText})
+source_group(tests FILES ${GroupTests})
set_property(TARGET odf PROPERTY FOLDER DocFormats/filters)
diff --git a/DocFormats/filters/odf/src/ODF.c b/DocFormats/filters/odf/src/ODF.c
index 299fc95..f2091de 100644
--- a/DocFormats/filters/odf/src/ODF.c
+++ b/DocFormats/filters/odf/src/ODF.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "ODF.h"
diff --git a/DocFormats/filters/odf/src/ODF.h b/DocFormats/filters/odf/src/ODF.h
index 245429f..b9afb52 100644
--- a/DocFormats/filters/odf/src/ODF.h
+++ b/DocFormats/filters/odf/src/ODF.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_ODF_h
#define DocFormats_ODF_h
diff --git a/DocFormats/filters/odf/src/ODFManifest.c b/DocFormats/filters/odf/src/ODFManifest.c
index 843408b..b24c4eb 100644
--- a/DocFormats/filters/odf/src/ODFManifest.c
+++ b/DocFormats/filters/odf/src/ODFManifest.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "ODFManifest.h"
@@ -32,7 +35,7 @@
ODFManifest *ODFManifestNew(void)
{
- ODFManifest *manifest = (ODFManifest *)calloc(1,sizeof(ODFManifest));
+ ODFManifest *manifest = (ODFManifest *)xcalloc(1,sizeof(ODFManifest));
manifest->retainCount = 1;
manifest->doc = DFDocumentNewWithRoot(MF_MANIFEST);
manifest->entriesByPath = DFHashTableNew(NULL,NULL);
@@ -41,7 +44,7 @@
ODFManifest *ODFManifestNewWithDoc(DFDocument *doc)
{
- ODFManifest *manifest = (ODFManifest *)calloc(1,sizeof(ODFManifest));
+ ODFManifest *manifest = (ODFManifest *)xcalloc(1,sizeof(ODFManifest));
manifest->doc = DFDocumentRetain(doc);
manifest->entriesByPath = DFHashTableNew(NULL,NULL);
ODFManifestParse(manifest);
diff --git a/DocFormats/filters/odf/src/ODFManifest.h b/DocFormats/filters/odf/src/ODFManifest.h
index 8902f53..45eb903 100644
--- a/DocFormats/filters/odf/src/ODFManifest.h
+++ b/DocFormats/filters/odf/src/ODFManifest.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_ODFManifest_h
#define DocFormats_ODFManifest_h
diff --git a/DocFormats/filters/odf/src/ODFPackage.c b/DocFormats/filters/odf/src/ODFPackage.c
index c05c04c..3507586 100644
--- a/DocFormats/filters/odf/src/ODFPackage.c
+++ b/DocFormats/filters/odf/src/ODFPackage.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "ODFPackage.h"
@@ -22,33 +25,37 @@
#include <stdlib.h>
#include <string.h>
-static DFDocument *readOrCreateDocument(ODFPackage *package, const char *filename, Tag rootTag, Tag childTag)
+static DFDocument *createDocument(Tag rootTag, Tag childTag)
{
- char *fullPath = DFFormatString("%s/%s",package->tempPath,filename);
- DFDocument *doc = DFParseXMLFile(fullPath,NULL);
- free(fullPath);
- if (doc != NULL)
- return doc;
-
- doc = DFDocumentNewWithRoot(rootTag);
+ DFDocument *doc = DFDocumentNewWithRoot(rootTag);
DFCreateChildElement(doc->root,childTag);
return doc;
}
-static ODFManifest *readOrCreateManifest(ODFPackage *package)
+static DFDocument *readDocument(ODFPackage *package, const char *filename, DFError **error)
{
- char *fullPath = DFFormatString("%s/%s",package->tempPath,"META-INF/manifest.xml");
- DFDocument *manifestDoc = DFParseXMLFile(fullPath,NULL);
- free(fullPath);
- return (manifestDoc != NULL) ? ODFManifestNewWithDoc(manifestDoc) : ODFManifestNew();
+ DFDocument *doc = DFParseXMLStorage(package->storage,filename,error);
+ if (doc == NULL) {
+ DFErrorFormat(error,"%s: %s",filename,DFErrorMessage(error));
+ return NULL;
+ }
+ return doc;
}
-static int writeDocument(ODFPackage *package, DFDocument *doc, NamespaceID defaultNS, const char *filename, DFError **error)
+static ODFManifest *readManifest(ODFPackage *package, DFError **error)
{
- char *fullPath = DFFormatString("%s/%s",package->tempPath,filename);
- int ok = DFSerializeXMLFile(doc,defaultNS,0,fullPath,error);
- free(fullPath);
+ DFDocument *manifestDoc = DFParseXMLStorage(package->storage,"META-INF/manifest.xml",error);
+ if (manifestDoc == NULL) {
+ DFErrorFormat(error,"META-INF/manifest.xml: %s",DFErrorMessage(error));
+ return NULL;
+ }
+ return ODFManifestNewWithDoc(manifestDoc);
+}
+static int writeDocument(ODFPackage *package, DFDocument *doc, NamespaceID defaultNS,
+ const char *filename, DFError **error)
+{
+ int ok = DFSerializeXMLStorage(doc,defaultNS,0,package->storage,filename,error);
if (!ok)
DFErrorFormat(error,"%s: %s",filename,DFErrorMessage(error));
return ok;
@@ -56,38 +63,72 @@
static int writeString(ODFPackage *package, const char *str, const char *filename, DFError **error)
{
- char *fullPath = DFFormatString("%s/%s",package->tempPath,filename);
- int ok = DFStringWriteToFile(str,fullPath,error);
- free(fullPath);
+ DFBuffer *buf = DFBufferNew();
+ DFBufferAppendString(buf,str);
+ int ok = DFBufferWriteToStorage(buf,package->storage,filename,error);
+ DFBufferRelease(buf);
if (!ok)
DFErrorFormat(error,"%s: %s",filename,DFErrorMessage(error));
return ok;
}
-ODFPackage *ODFPackageNew(const char *tempPath, DFError **error)
+ODFPackage *ODFPackageOpenNew(DFStorage *storage, DFError **error)
{
- ODFPackage *package = (ODFPackage *)calloc(1,sizeof(ODFPackage));
+ ODFPackage *package = (ODFPackage *)xcalloc(1,sizeof(ODFPackage));
package->retainCount = 1;
- package->tempPath = strdup(tempPath);
+ package->storage = DFStorageRetain(storage);
- package->contentDoc = readOrCreateDocument(package,"content.xml",OFFICE_DOCUMENT_CONTENT,OFFICE_BODY);
- package->metaDoc = readOrCreateDocument(package,"meta.xml",OFFICE_DOCUMENT_META,OFFICE_META);
- package->settingsDoc = readOrCreateDocument(package,"settings.xml",OFFICE_DOCUMENT_SETTINGS,OFFICE_SETTINGS);
- package->stylesDoc = readOrCreateDocument(package,"styles.xml",OFFICE_DOCUMENT_STYLES,OFFICE_STYLES);
+ // Create XML documents
+ package->contentDoc = createDocument(OFFICE_DOCUMENT_CONTENT,OFFICE_BODY);
+ package->metaDoc = createDocument(OFFICE_DOCUMENT_META,OFFICE_META);
+ package->settingsDoc = createDocument(OFFICE_DOCUMENT_SETTINGS,OFFICE_SETTINGS);
+ package->stylesDoc = createDocument(OFFICE_DOCUMENT_STYLES,OFFICE_STYLES);
- package->manifest = readOrCreateManifest(package);
+ // Create manifst
+ package->manifest = ODFManifestNew();
ODFManifestAddEntry(package->manifest,"/","application/vnd.oasis.opendocument.text","1.2");
ODFManifestAddEntry(package->manifest,"content.xml","text/xml",NULL);
ODFManifestAddEntry(package->manifest,"meta.xml","text/xml",NULL);
ODFManifestAddEntry(package->manifest,"settings.xml","text/xml",NULL);
ODFManifestAddEntry(package->manifest,"styles.xml","text/xml",NULL);
+ // Setup ODF objects
package->sheet = ODFSheetNew(package->stylesDoc,package->contentDoc);
return package;
}
+ODFPackage *ODFPackageOpenFrom(DFStorage *storage, DFError **error)
+{
+ ODFPackage *package = (ODFPackage *)xcalloc(1,sizeof(ODFPackage));
+ package->retainCount = 1;
+ package->storage = DFStorageRetain(storage);
+
+ // Read XML documents
+ if ((package->contentDoc = readDocument(package,"content.xml",error)) == NULL)
+ goto end;
+ if ((package->metaDoc = readDocument(package,"meta.xml",error)) == NULL)
+ goto end;
+ if ((package->settingsDoc = readDocument(package,"settings.xml",error)) == NULL)
+ goto end;
+ if ((package->stylesDoc = readDocument(package,"styles.xml",error)) == NULL)
+ goto end;
+
+ // Read manifest
+ if ((package->manifest = readManifest(package,error)) == NULL)
+ goto end;
+
+ // Setup ODF objects
+ package->sheet = ODFSheetNew(package->stylesDoc,package->contentDoc);
+
+ return package;
+
+end:
+ ODFPackageRelease(package);
+ return NULL;
+}
+
ODFPackage *ODFPackageRetain(ODFPackage *package)
{
if (package != NULL)
@@ -100,7 +141,7 @@
if ((package == NULL) || (--package->retainCount > 0))
return;
- free(package->tempPath);
+ DFStorageRelease(package->storage);
ODFManifestRelease(package->manifest);
ODFSheetRelease(package->sheet);
DFDocumentRelease(package->contentDoc);
@@ -112,13 +153,6 @@
int ODFPackageSave(ODFPackage *package, DFError **error)
{
- char *metaInfPath = DFFormatString("%s/META-INF",package->tempPath);
- if (!DFFileExists(metaInfPath) && !DFCreateDirectory(metaInfPath,1,error)) {
- free(metaInfPath);
- return 0;
- }
- free(metaInfPath);
-
if (!writeDocument(package,package->contentDoc,NAMESPACE_NULL,"content.xml",error))
return 0;
if (!writeDocument(package,package->metaDoc,NAMESPACE_NULL,"meta.xml",error))
@@ -131,6 +165,8 @@
return 0;
if (!writeString(package,"application/vnd.oasis.opendocument.text","mimetype",error))
return 0;
+ if (!DFStorageSave(package->storage,error))
+ return 0;
return 1;
}
diff --git a/DocFormats/filters/odf/src/ODFPackage.h b/DocFormats/filters/odf/src/ODFPackage.h
index 834fef6..e56ebc2 100644
--- a/DocFormats/filters/odf/src/ODFPackage.h
+++ b/DocFormats/filters/odf/src/ODFPackage.h
@@ -1,22 +1,26 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_ODFPackage_h
#define DocFormats_ODFPackage_h
#include <DocFormats/DFXMLForward.h>
#include <DocFormats/DFError.h>
+#include <DocFormats/DFStorage.h>
#include "ODFManifest.h"
#include "ODFSheet.h"
@@ -24,7 +28,7 @@
struct ODFPackage {
size_t retainCount;
- char *tempPath;
+ DFStorage *storage;
DFDocument *contentDoc;
DFDocument *metaDoc;
DFDocument *settingsDoc;
@@ -33,7 +37,8 @@
ODFSheet *sheet;
};
-ODFPackage *ODFPackageNew(const char *tempPath, DFError **error);
+ODFPackage *ODFPackageOpenNew(DFStorage *storage, DFError **error);
+ODFPackage *ODFPackageOpenFrom(DFStorage *storage, DFError **error);
ODFPackage *ODFPackageRetain(ODFPackage *package);
void ODFPackageRelease(ODFPackage *package);
int ODFPackageSave(ODFPackage *package, DFError **error);
diff --git a/DocFormats/filters/odf/src/ODFSheet.c b/DocFormats/filters/odf/src/ODFSheet.c
index 384d0d0..c2ea092 100644
--- a/DocFormats/filters/odf/src/ODFSheet.c
+++ b/DocFormats/filters/odf/src/ODFSheet.c
@@ -1,21 +1,25 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "ODFSheet.h"
#include "DFDOM.h"
#include "DFHashTable.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -26,7 +30,7 @@
ODFStyle *ODFStyleNew()
{
- ODFStyle *style = (ODFStyle *)calloc(1,sizeof(ODFStyle));
+ ODFStyle *style = (ODFStyle *)xcalloc(1,sizeof(ODFStyle));
style->retainCount = 1;
return style;
}
@@ -62,7 +66,7 @@
ODFSheet *ODFSheetNew(DFDocument *stylesDoc, DFDocument *contentDoc)
{
- ODFSheet *sheet = (ODFSheet *)calloc(1,sizeof(ODFSheet));
+ ODFSheet *sheet = (ODFSheet *)xcalloc(1,sizeof(ODFSheet));
sheet->retainCount = 1;
sheet->stylesDoc = DFDocumentRetain(stylesDoc);
sheet->contentDoc = DFDocumentRetain(contentDoc);
diff --git a/DocFormats/filters/odf/src/ODFSheet.h b/DocFormats/filters/odf/src/ODFSheet.h
index 8d1fff1..eee9697 100644
--- a/DocFormats/filters/odf/src/ODFSheet.h
+++ b/DocFormats/filters/odf/src/ODFSheet.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_ODFSheet_h
#define DocFormats_ODFSheet_h
diff --git a/DocFormats/filters/odf/src/text/ODFText.c b/DocFormats/filters/odf/src/text/ODFText.c
new file mode 100644
index 0000000..0e13531
--- /dev/null
+++ b/DocFormats/filters/odf/src/text/ODFText.c
@@ -0,0 +1,37 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "DFPlatform.h"
+#include "ODFText.h"
+
+DFDocument *ODFTextGet(DFStorage *concreteStorage, DFStorage *abstractStorage, const char *idPrefix, DFError **error)
+{
+ DFErrorFormat(error,"ODFTextGet: Not yet implemented");
+ return NULL;
+}
+
+int ODFTextPut(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, const char *idPrefix, DFError **error)
+{
+ DFErrorFormat(error,"ODFTextPut: Not yet implemented");
+ return 0;
+}
+
+int ODFTextCreate(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, DFError **error)
+{
+ DFErrorFormat(error,"ODFTextCreate: Not yet implemented");
+ return 0;
+}
diff --git a/DocFormats/filters/odf/src/text/ODFText.h b/DocFormats/filters/odf/src/text/ODFText.h
new file mode 100644
index 0000000..70486ab
--- /dev/null
+++ b/DocFormats/filters/odf/src/text/ODFText.h
@@ -0,0 +1,29 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#ifndef DocFormats_ODFText_h
+#define DocFormats_ODFText_h
+
+#include <DocFormats/DFError.h>
+#include <DocFormats/DFStorage.h>
+#include <DocFormats/DFXMLForward.h>
+
+DFDocument *ODFTextGet(DFStorage *concreteStorage, DFStorage *abstractStorage, const char *idPrefix, DFError **error);
+int ODFTextPut(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, const char *idPrefix, DFError **error);
+int ODFTextCreate(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, DFError **error);
+
+#endif
diff --git a/DocFormats/filters/odf/tests/ODFTests.c b/DocFormats/filters/odf/tests/ODFTests.c
index 9af04e8..a47f611 100644
--- a/DocFormats/filters/odf/tests/ODFTests.c
+++ b/DocFormats/filters/odf/tests/ODFTests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFUnitTest.h"
#include <stddef.h>
diff --git a/DocFormats/filters/ooxml/src/common/OOXMLTypedefs.h b/DocFormats/filters/ooxml/src/common/OOXMLTypedefs.h
index bf4c2b4..61d8cbb 100644
--- a/DocFormats/filters/ooxml/src/common/OOXMLTypedefs.h
+++ b/DocFormats/filters/ooxml/src/common/OOXMLTypedefs.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_OOXMLTypedefs_h
#define DocFormats_OOXMLTypedefs_h
diff --git a/DocFormats/filters/ooxml/src/common/OPC.c b/DocFormats/filters/ooxml/src/common/OPC.c
index 724470c..9c7c1ed 100644
--- a/DocFormats/filters/ooxml/src/common/OPC.c
+++ b/DocFormats/filters/ooxml/src/common/OPC.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "OPC.h"
@@ -32,11 +35,11 @@
static OPCRelationship *OPCRelationshipNew(const char *rId, const char *type, const char *target, int external)
{
- OPCRelationship *rel = (OPCRelationship *)calloc(1,sizeof(OPCRelationship));
+ OPCRelationship *rel = (OPCRelationship *)xcalloc(1,sizeof(OPCRelationship));
rel->retainCount = 1;
- rel->rId = (rId != NULL) ? strdup(rId) : NULL;
- rel->type = (type != NULL) ? strdup(type) : NULL;
- rel->target = (target != NULL) ? strdup(target) : NULL;
+ rel->rId = (rId != NULL) ? xstrdup(rId) : NULL;
+ rel->type = (type != NULL) ? xstrdup(type) : NULL;
+ rel->target = (target != NULL) ? xstrdup(target) : NULL;
rel->external = external;
return rel;
}
@@ -73,7 +76,7 @@
OPCRelationshipSet *OPCRelationshipSetNew(void)
{
- OPCRelationshipSet *set = (OPCRelationshipSet *)calloc(1,sizeof(OPCRelationshipSet));
+ OPCRelationshipSet *set = (OPCRelationshipSet *)xcalloc(1,sizeof(OPCRelationshipSet));
set->relsById = DFHashTableNew((DFCopyFunction)OPCRelationshipRetain,(DFFreeFunction)OPCRelationshipRelease);
set->relsByType = DFHashTableNew((DFCopyFunction)OPCRelationshipRetain,(DFFreeFunction)OPCRelationshipRelease);
set->relsByDetail = DFHashTableNew((DFCopyFunction)OPCRelationshipRetain,(DFFreeFunction)OPCRelationshipRelease);
@@ -187,10 +190,10 @@
OPCPart *OPCPartNew(const char *URI, const char *contentType)
{
- OPCPart *part = (OPCPart *)calloc(1,sizeof(OPCPart));
+ OPCPart *part = (OPCPart *)xcalloc(1,sizeof(OPCPart));
part->retainCount = 1;
- part->URI = (URI != NULL) ? strdup(URI) : NULL;
- part->contentType = (contentType != NULL) ? strdup(contentType) : NULL;
+ part->URI = (URI != NULL) ? xstrdup(URI) : NULL;
+ part->contentType = (contentType != NULL) ? xstrdup(contentType) : NULL;
part->relationships = OPCRelationshipSetNew();
return part;
}
@@ -225,9 +228,9 @@
static OPCContentTypes *OPCContentTypesNew(void)
{
- OPCContentTypes *ct = (OPCContentTypes *)calloc(1,sizeof(OPCContentTypes));
- ct->defaultsByExtension = DFHashTableNew((DFCopyFunction)strdup,free);
- ct->overridesByPartName = DFHashTableNew((DFCopyFunction)strdup,free);
+ OPCContentTypes *ct = (OPCContentTypes *)xcalloc(1,sizeof(OPCContentTypes));
+ ct->defaultsByExtension = DFHashTableNew((DFCopyFunction)xstrdup,free);
+ ct->overridesByPartName = DFHashTableNew((DFCopyFunction)xstrdup,free);
return ct;
}
@@ -351,7 +354,7 @@
static OPCPackage *OPCPackageNew(DFStorage *storage)
{
- OPCPackage *pkg = (OPCPackage *)calloc(1,sizeof(OPCPackage));
+ OPCPackage *pkg = (OPCPackage *)xcalloc(1,sizeof(OPCPackage));
pkg->storage = DFStorageRetain(storage);
pkg->contentTypes = OPCContentTypesNew();
pkg->relationships = OPCRelationshipSetNew();
diff --git a/DocFormats/filters/ooxml/src/common/OPC.h b/DocFormats/filters/ooxml/src/common/OPC.h
index 76021c7..4f8d1bf 100644
--- a/DocFormats/filters/ooxml/src/common/OPC.h
+++ b/DocFormats/filters/ooxml/src/common/OPC.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_OPC_h
#define DocFormats_OPC_h
diff --git a/DocFormats/filters/ooxml/src/word/CSSClassNames.c b/DocFormats/filters/ooxml/src/word/CSSClassNames.c
index d33f214..2c47bc6 100644
--- a/DocFormats/filters/ooxml/src/word/CSSClassNames.c
+++ b/DocFormats/filters/ooxml/src/word/CSSClassNames.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "CSSClassNames.h"
#include "CSS.h"
@@ -26,6 +29,7 @@
#include "WordStyles.h"
#include "Word.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <stdlib.h>
#include <string.h>
@@ -265,10 +269,10 @@
const char *selector = allSelectors[i];
char *className = CSSSelectorCopyClassName(selector);
if (className == NULL)
- className = strdup("");;
+ className = xstrdup("");;
- SelectorList *item = (SelectorList *)calloc(1,sizeof(SelectorList));
- item->selector = strdup(selector);
+ SelectorList *item = (SelectorList *)xcalloc(1,sizeof(SelectorList));
+ item->selector = xstrdup(selector);
item->next = DFHashTableLookup(selectorsByClassName,className);
DFHashTableAdd(selectorsByClassName,className,item);
free(className);
@@ -395,7 +399,7 @@
void CSSEnsureUnique(CSSSheet *styleSheet, DFDocument *htmlDoc, int creating)
{
- DFHashTable *repls = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *repls = DFHashTableNew((DFCopyFunction)xstrdup,free);
determineReplacements(styleSheet,repls);
replaceSelectorsInSheet(repls,styleSheet);
replaceSelectorsInNode(repls,htmlDoc->root);
diff --git a/DocFormats/filters/ooxml/src/word/CSSClassNames.h b/DocFormats/filters/ooxml/src/word/CSSClassNames.h
index 2f29b62..b4a5b2b 100644
--- a/DocFormats/filters/ooxml/src/word/CSSClassNames.h
+++ b/DocFormats/filters/ooxml/src/word/CSSClassNames.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_CSSClassNames_h
#define DocFormats_CSSClassNames_h
diff --git a/DocFormats/filters/ooxml/src/word/Word.c b/DocFormats/filters/ooxml/src/word/Word.c
index 1e06448..d5db0c7 100644
--- a/DocFormats/filters/ooxml/src/word/Word.c
+++ b/DocFormats/filters/ooxml/src/word/Word.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "Word.h"
@@ -23,7 +26,7 @@
#include "DFZipFile.h"
#include <stdlib.h>
-DFDocument *WordGet(DFStorage *concreteStorage, DFStorage *abstractStorage, DFError **error)
+DFDocument *WordGet(DFStorage *concreteStorage, DFStorage *abstractStorage, const char *idPrefix, DFError **error)
{
int ok = 0;
WordPackage *wordPackage = NULL;
@@ -34,7 +37,7 @@
goto end;
htmlDoc = DFDocumentNew();
- if (!WordConverterGet(htmlDoc,abstractStorage,"word",wordPackage,error))
+ if (!WordConverterGet(htmlDoc,abstractStorage,wordPackage,idPrefix,error))
goto end;
ok = 1;
@@ -50,18 +53,16 @@
}
}
-int WordPut(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, DFError **error)
+int WordPut(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, const char *idPrefix, DFError **error)
{
int ok = 0;
WordPackage *wordPackage = NULL;
- const char *idPrefix = "word";
-
wordPackage = WordPackageOpenFrom(concreteStorage,error);
if (wordPackage == NULL)
goto end;
- if (!WordConverterPut(htmlDoc,abstractStorage,idPrefix,wordPackage,error))
+ if (!WordConverterPut(htmlDoc,abstractStorage,wordPackage,idPrefix,error))
goto end;
if (!WordPackageSave(wordPackage,error))
@@ -79,19 +80,17 @@
int ok = 0;
WordPackage *wordPackage = NULL;
- const char *idPrefix = "word";
-
wordPackage = WordPackageOpenNew(concreteStorage,error);
if (wordPackage == NULL)
goto end;
- // Change any id attributes starting with "word" or "odf" to a different prefix, so they
+ // Change any id attributes starting with "word" to a different prefix, so they
// are not treated as references to nodes in the destination document. This is necessary
- // if the HTML file was previously generated from a word or odf file, and we are creating
- // a new word or odf file from it.
- HTMLBreakBDTRefs(htmlDoc->docNode,idPrefix);
+ // if the HTML file was previously generated from a word file, and we are creating
+ // a new word file from it.
+ HTMLBreakBDTRefs(htmlDoc->docNode,"word");
- if (!WordConverterPut(htmlDoc,abstractStorage,idPrefix,wordPackage,error))
+ if (!WordConverterPut(htmlDoc,abstractStorage,wordPackage,"word",error))
goto end;
if (!WordPackageSave(wordPackage,error))
diff --git a/DocFormats/filters/ooxml/src/word/Word.h b/DocFormats/filters/ooxml/src/word/Word.h
index e871754..98d05e4 100644
--- a/DocFormats/filters/ooxml/src/word/Word.h
+++ b/DocFormats/filters/ooxml/src/word/Word.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_Word_h
#define DocFormats_Word_h
@@ -27,8 +30,8 @@
CSSStyle *WordSetupTableGridStyle(CSSSheet *styleSheet, int *changed);
-DFDocument *WordGet(DFStorage *concreteStorage, DFStorage *abstractStorage, DFError **error);
-int WordPut(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, DFError **error);
+DFDocument *WordGet(DFStorage *concreteStorage, DFStorage *abstractStorage, const char *idPrefix, DFError **error);
+int WordPut(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, const char *idPrefix, DFError **error);
int WordCreate(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument *htmlDoc, DFError **error);
int WordCollapseBookmarks(DFStorage *concreteStorage, DFError **error);
int WordExpandBookmarks(DFStorage *concreteStorage, DFError **error);
diff --git a/DocFormats/filters/ooxml/src/word/WordCaption.c b/DocFormats/filters/ooxml/src/word/WordCaption.c
index 8379c16..4ac1149 100644
--- a/DocFormats/filters/ooxml/src/word/WordCaption.c
+++ b/DocFormats/filters/ooxml/src/word/WordCaption.c
@@ -1,18 +1,22 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "WordCaption.h"
+#include "DFPlatform.h"
#include "DFCommon.h"
#include <stdlib.h>
@@ -24,7 +28,7 @@
WordCaption *WordCaptionNew(DFNode *element)
{
- WordCaption *caption = (WordCaption *)calloc(1,sizeof(WordCaption));
+ WordCaption *caption = (WordCaption *)xcalloc(1,sizeof(WordCaption));
caption->retainCount = 1;
caption->element = element;
return caption;
diff --git a/DocFormats/filters/ooxml/src/word/WordCaption.h b/DocFormats/filters/ooxml/src/word/WordCaption.h
index 2110f99..8616a85 100644
--- a/DocFormats/filters/ooxml/src/word/WordCaption.h
+++ b/DocFormats/filters/ooxml/src/word/WordCaption.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordCaption_h
#define DocFormats_WordCaption_h
diff --git a/DocFormats/filters/ooxml/src/word/WordConverter.c b/DocFormats/filters/ooxml/src/word/WordConverter.c
index 7e8f2ca..a68629e 100644
--- a/DocFormats/filters/ooxml/src/word/WordConverter.c
+++ b/DocFormats/filters/ooxml/src/word/WordConverter.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordConverter.h"
@@ -455,7 +458,7 @@
int foundSeq = 0;
int foundContent = 0;
extractPrefixRecursive(node,counterName,result,&foundSeq,&foundContent);
- char *str = strdup(result->data);
+ char *str = xstrdup(result->data);
DFBufferRelease(result);
return str;
}
@@ -557,14 +560,13 @@
// //
////////////////////////////////////////////////////////////////////////////////////////////////////
-static WordConverter *WordConverterNew(DFDocument *html, DFStorage *abstractStorage,
- const char *idPrefix, WordPackage *package)
+static WordConverter *WordConverterNew(DFDocument *html, DFStorage *abstractStorage, WordPackage *package, const char *idPrefix)
{
- WordConverter *converter = (WordConverter *)calloc(1,sizeof(WordConverter));
+ WordConverter *converter = (WordConverter *)xcalloc(1,sizeof(WordConverter));
converter->html = DFDocumentRetain(html);
converter->abstractStorage = DFStorageRetain(abstractStorage);
assert(DFStorageFormat(converter->abstractStorage) == DFFileFormatHTML);
- converter->idPrefix = DFStrDup(idPrefix);
+ converter->idPrefix = (idPrefix != NULL) ? xstrdup(idPrefix) : xstrdup("word");
converter->package = WordPackageRetain(package);
converter->styles = WordSheetNew(converter->package->styles);
converter->numbering = WordNumberingNew(converter->package);
@@ -573,7 +575,7 @@
converter->objects = WordObjectsNew(converter->package);
converter->footnotes = WordNoteGroupNewFootnotes(converter->package->footnotes);
converter->endnotes = WordNoteGroupNewEndnotes(converter->package->endnotes);
- converter->supportedContentTypes = DFHashTableNew((DFCopyFunction)strdup,free);
+ converter->supportedContentTypes = DFHashTableNew((DFCopyFunction)xstrdup,free);
DFHashTableAdd(converter->supportedContentTypes,"jpg","image/jpeg");
DFHashTableAdd(converter->supportedContentTypes,"jpeg","image/jpeg");
DFHashTableAdd(converter->supportedContentTypes,"tif","image/tiff");
@@ -674,9 +676,7 @@
return node;
}
-int WordConverterGet(DFDocument *html, DFStorage *abstractStorage,
- const char *idPrefix, WordPackage *package,
- DFError **error)
+int WordConverterGet(DFDocument *html, DFStorage *abstractStorage, WordPackage *package, const char *idPrefix, DFError **error)
{
if (package->document == NULL) {
DFErrorFormat(error,"document.xml not found");
@@ -692,7 +692,7 @@
int haveFields = Word_simplifyFields(package);
Word_mergeRuns(package);
- WordConverter *converter = WordConverterNew(html,abstractStorage,idPrefix,package);
+ WordConverter *converter = WordConverterNew(html,abstractStorage,package,idPrefix);
converter->haveFields = haveFields;
WordAddNbsps(converter->package->document);
WordFixLists(converter);
@@ -707,6 +707,7 @@
get.conv = converter;
DFNode *abstract = WordDocumentLens.get(&get,wordDocument);
DFAppendChild(converter->html->docNode,abstract);
+ converter->html->root = abstract;
Word_postProcessHTMLDoc(converter);
HTMLAddExternalStyleSheet(converter->html,"reset.css");
@@ -777,7 +778,7 @@
if (!DFStringEquals(wordType,htmlType)) {
// Make a copy of numId, as it may be freed during the first call to DFHashTableRemove
- char *numIdCopy = strdup(numId);
+ char *numIdCopy = xstrdup(numId);
DFHashTableRemove(put->numIdByHtmlId,htmlId);
DFHashTableRemove(put->htmlIdByNumId,numIdCopy);
free(numIdCopy);
@@ -810,9 +811,7 @@
}
}
-int WordConverterPut(DFDocument *html, DFStorage *abstractStorage,
- const char *idPrefix, WordPackage *package,
- DFError **error)
+int WordConverterPut(DFDocument *html, DFStorage *abstractStorage, WordPackage *package, const char *idPrefix, DFError **error)
{
if (package->document == NULL) {
DFErrorFormat(error,"document.xml not found");
@@ -828,7 +827,7 @@
HTML_normalizeDocument(html);
HTML_pushDownInlineProperties(html->docNode);
- WordConverter *converter = WordConverterNew(html,abstractStorage,idPrefix,package);
+ WordConverter *converter = WordConverterNew(html,abstractStorage,package,idPrefix);
// FIXME: Need a more reliable way of telling whether this is a new document or not - it could be that the
// document already existed (with styles set up) but did not have any content
@@ -872,8 +871,8 @@
WordPutData put;
put.conv = converter;
put.contentDoc = converter->package->document;
- put.numIdByHtmlId = DFHashTableNew((DFCopyFunction)strdup,free);
- put.htmlIdByNumId = DFHashTableNew((DFCopyFunction)strdup,free);
+ put.numIdByHtmlId = DFHashTableNew((DFCopyFunction)xstrdup,free);
+ put.htmlIdByNumId = DFHashTableNew((DFCopyFunction)xstrdup,free);
// Make sure we update styles.xml from the CSS stylesheet *before* doing any conversion of the content,
// since the latter requires a full mapping of CSS selectors to styleIds to be in place.
@@ -931,13 +930,13 @@
char *resStyleId = NULL;
if (!strcmp(selector,"table.Normal_Table"))
- return strdup("TableNormal");
+ return xstrdup("TableNormal");
if (!strcmp(selector,"table.Table_Grid"))
- return strdup("TableGrid");
+ return xstrdup("TableGrid");
if (!strcmp(selector,"span.Default_Paragraph_Font"))
- return strdup("DefaultParagraphFont");
+ return xstrdup("DefaultParagraphFont");
if (!strcmp(selector,"p.List_Paragraph"))
- return strdup("ListParagraph");
+ return xstrdup("ListParagraph");
int headingLevel = CSSSelectorHeadingLevel(selector);
if (headingLevel != 0) {
@@ -953,23 +952,23 @@
}
if (!strcmp(selector,"span.Heading1Char"))
- return strdup("Heading1Char");
+ return xstrdup("Heading1Char");
if (!strcmp(selector,"span.Heading2Char"))
- return strdup("Heading2Char");
+ return xstrdup("Heading2Char");
if (!strcmp(selector,"span.Heading3Char"))
- return strdup("Heading3Char");
+ return xstrdup("Heading3Char");
if (!strcmp(selector,"span.Heading4Char"))
- return strdup("Heading4Char");
+ return xstrdup("Heading4Char");
if (!strcmp(selector,"span.Heading5Char"))
- return strdup("Heading5Char");
+ return xstrdup("Heading5Char");
if (!strcmp(selector,"span.Heading6Char"))
- return strdup("Heading6Char");
+ return xstrdup("Heading6Char");
if (!strcmp(selector,"span.Heading7Char"))
- return strdup("Heading7Char");
+ return xstrdup("Heading7Char");
if (!strcmp(selector,"span.Heading8Char"))
- return strdup("Heading8Char");
+ return xstrdup("Heading8Char");
if (!strcmp(selector,"span.Heading9Char"))
- return strdup("Heading9Char");
+ return xstrdup("Heading9Char");
char *className = CSSSelectorCopyClassName(selector);
switch (CSSSelectorGetTag(selector)) {
@@ -1015,7 +1014,7 @@
if (resStyleId == NULL) {
// Note: selector here may start with . (i.e. applies to all elements)
// FIXME: not covered by tests
- resStyleId = strdup(selector);
+ resStyleId = xstrdup(selector);
}
return resStyleId;
diff --git a/DocFormats/filters/ooxml/src/word/WordConverter.h b/DocFormats/filters/ooxml/src/word/WordConverter.h
index c0565f2..e255ad2 100644
--- a/DocFormats/filters/ooxml/src/word/WordConverter.h
+++ b/DocFormats/filters/ooxml/src/word/WordConverter.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordConverter_h
#define DocFormats_WordConverter_h
@@ -98,12 +101,8 @@
CSSSheet *styleSheet;
};
-int WordConverterGet(DFDocument *html, DFStorage *abstractStorage,
- const char *idPrefix, WordPackage *package,
- DFError **error);
-int WordConverterPut(DFDocument *html, DFStorage *abstractStorage,
- const char *idPrefix, WordPackage *package,
- DFError **error);
+int WordConverterGet(DFDocument *html, DFStorage *abstractStorage, WordPackage *package, const char *idPrefix, DFError **error);
+int WordConverterPut(DFDocument *html, DFStorage *abstractStorage, WordPackage *package, const char *idPrefix, DFError **error);
void WordConverterWarning(WordConverter *converter, const char *format, ...) ATTRIBUTE_FORMAT(printf,2,3);
char *WordStyleIdForStyle(CSSStyle *style);
diff --git a/DocFormats/filters/ooxml/src/word/WordGC.c b/DocFormats/filters/ooxml/src/word/WordGC.c
index 2698f71..0df299a 100644
--- a/DocFormats/filters/ooxml/src/word/WordGC.c
+++ b/DocFormats/filters/ooxml/src/word/WordGC.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordGC.h"
diff --git a/DocFormats/filters/ooxml/src/word/WordGC.h b/DocFormats/filters/ooxml/src/word/WordGC.h
index 03f10e4..246c0a6 100644
--- a/DocFormats/filters/ooxml/src/word/WordGC.h
+++ b/DocFormats/filters/ooxml/src/word/WordGC.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordGC_h
#define DocFormats_WordGC_h
diff --git a/DocFormats/filters/ooxml/src/word/WordLists.c b/DocFormats/filters/ooxml/src/word/WordLists.c
index 8416fce..e9dee43 100644
--- a/DocFormats/filters/ooxml/src/word/WordLists.c
+++ b/DocFormats/filters/ooxml/src/word/WordLists.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLists.h"
@@ -54,7 +57,7 @@
ListFrame *ListFrameNew(DFNode *element, ListFrame *parent, int numId, int ilvl, ListDimensions dimensions)
{
- ListFrame *frame = (ListFrame *)calloc(1,sizeof(ListFrame));
+ ListFrame *frame = (ListFrame *)xcalloc(1,sizeof(ListFrame));
frame->element = element;
frame->parent = parent;
frame->numId = numId;
@@ -543,10 +546,10 @@
continue;
if (!createdHashTables) {
- replacementNumIds = DFHashTableNew((DFCopyFunction)strdup,free);
- itemNoByListKey = DFHashTableNew((DFCopyFunction)strdup,free);
- lastNumIdByIlvl = DFHashTableNew((DFCopyFunction)strdup,free);
- itemNoByIlvl = DFHashTableNew((DFCopyFunction)strdup,free);
+ replacementNumIds = DFHashTableNew((DFCopyFunction)xstrdup,free);
+ itemNoByListKey = DFHashTableNew((DFCopyFunction)xstrdup,free);
+ lastNumIdByIlvl = DFHashTableNew((DFCopyFunction)xstrdup,free);
+ itemNoByIlvl = DFHashTableNew((DFCopyFunction)xstrdup,free);
createdHashTables = 1;
}
@@ -572,7 +575,7 @@
char *listKey = DFFormatString("%s:%s",numId,ilvl);
char *itemNo = DFStrDup(DFHashTableLookup(itemNoByListKey,listKey));
if (itemNo == NULL) {
- itemNo = strdup("1");
+ itemNo = xstrdup("1");
if ((levelStart != NULL) && (atoi(levelStart) > 1) && (atoi(ilvl) <= maxIlvl)) {
const char *prevNumId = DFHashTableLookup(lastNumIdByIlvl,ilvl);
diff --git a/DocFormats/filters/ooxml/src/word/WordLists.h b/DocFormats/filters/ooxml/src/word/WordLists.h
index 58a5ac0..9c146c3 100644
--- a/DocFormats/filters/ooxml/src/word/WordLists.h
+++ b/DocFormats/filters/ooxml/src/word/WordLists.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordLists_h
#define DocFormats_WordLists_h
diff --git a/DocFormats/filters/ooxml/src/word/WordNotes.c b/DocFormats/filters/ooxml/src/word/WordNotes.c
index 06caa60..2e49c83 100644
--- a/DocFormats/filters/ooxml/src/word/WordNotes.c
+++ b/DocFormats/filters/ooxml/src/word/WordNotes.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordNotes.h"
@@ -264,7 +267,7 @@
WordNote *WordNoteNew(DFNode *element, int noteId)
{
- WordNote *note = (WordNote *)calloc(1,sizeof(WordNote));
+ WordNote *note = (WordNote *)xcalloc(1,sizeof(WordNote));
note->retainCount = 1;
note->element = element;
note->noteId = noteId;
@@ -313,7 +316,7 @@
assert(doc != NULL);
assert((noteTag == WORD_FOOTNOTE) || (noteTag == WORD_ENDNOTE));
- WordNoteGroup *group = (WordNoteGroup *)calloc(1,sizeof(WordNoteGroup));
+ WordNoteGroup *group = (WordNoteGroup *)xcalloc(1,sizeof(WordNoteGroup));
group->retainCount = 1;
group->notesById = DFHashTableNew((DFCopyFunction)WordNoteRetain,(DFFreeFunction)WordNoteRelease);
group->doc = DFDocumentRetain(doc);
diff --git a/DocFormats/filters/ooxml/src/word/WordNotes.h b/DocFormats/filters/ooxml/src/word/WordNotes.h
index 5e59bcc..ddeb106 100644
--- a/DocFormats/filters/ooxml/src/word/WordNotes.h
+++ b/DocFormats/filters/ooxml/src/word/WordNotes.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordNotes_h
#define DocFormats_WordNotes_h
diff --git a/DocFormats/filters/ooxml/src/word/WordNumbering.c b/DocFormats/filters/ooxml/src/word/WordNumbering.c
index 76408e5..47b85d5 100644
--- a/DocFormats/filters/ooxml/src/word/WordNumbering.c
+++ b/DocFormats/filters/ooxml/src/word/WordNumbering.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordNumbering.h"
@@ -52,11 +55,11 @@
if (ilvl == NULL)
ilvl = "0";;
- WordNumLevel *level = (WordNumLevel *)calloc(1,sizeof(WordNumLevel));
+ WordNumLevel *level = (WordNumLevel *)xcalloc(1,sizeof(WordNumLevel));
level->ilvl = atoi(ilvl);
- level->numFmt = (numFmt != NULL) ? strdup(numFmt) : NULL;
- level->lvlText = (lvlText != NULL) ? strdup(lvlText) : NULL;
+ level->numFmt = (numFmt != NULL) ? xstrdup(numFmt) : NULL;
+ level->lvlText = (lvlText != NULL) ? xstrdup(lvlText) : NULL;
level->element = element;
return level;
@@ -116,8 +119,8 @@
static WordAbstractNum *WordAbstractNumNew(const char *abstractNumId1, DFNode *element1)
{
- WordAbstractNum *abs = (WordAbstractNum *)calloc(1,sizeof(WordAbstractNum));
- abs->abstractNumId = (abstractNumId1 != NULL) ? strdup(abstractNumId1) : NULL;
+ WordAbstractNum *abs = (WordAbstractNum *)xcalloc(1,sizeof(WordAbstractNum));
+ abs->abstractNumId = (abstractNumId1 != NULL) ? xstrdup(abstractNumId1) : NULL;
abs->element = element1;
abs->levels = DFHashTableNew(NULL,(DFFreeFunction)WordNumLevelFree);
return abs;
@@ -148,8 +151,8 @@
static WordConcreteNum *WordConcreteNumNew(const char *numId, DFNode *element, WordAbstractNum *abstractNum)
{
- WordConcreteNum *con = (WordConcreteNum *)calloc(1,sizeof(WordConcreteNum));
- con->numId = (numId != NULL) ? strdup(numId) : NULL;
+ WordConcreteNum *con = (WordConcreteNum *)xcalloc(1,sizeof(WordConcreteNum));
+ con->numId = (numId != NULL) ? xstrdup(numId) : NULL;
con->element = element;
con->abstractNum = abstractNum;
return con;
@@ -192,13 +195,13 @@
WordNumbering *WordNumberingNew(WordPackage *package)
{
- WordNumbering *num = (WordNumbering *)calloc(1,sizeof(WordNumbering));
+ WordNumbering *num = (WordNumbering *)xcalloc(1,sizeof(WordNumbering));
num->_package = WordPackageRetain(package);
num->_abstractNums = DFHashTableNew(NULL,(DFFreeFunction)WordAbstractNumFree);
num->_concreteNums = DFHashTableNew(NULL,(DFFreeFunction)WordConcreteNumFree);
num->_nextAbstractId = 1;
num->_nextConcreteId = 1;
- num->_listStyleTypes = DFHashTableNew((DFCopyFunction)strdup,free);
+ num->_listStyleTypes = DFHashTableNew((DFCopyFunction)xstrdup,free);
WordNumberingRegisterType(num,ListStyleTypeDecimal,"decimal");
WordNumberingRegisterType(num,ListStyleTypeDecimalLeadingZero,"decimal-leading-zero");
diff --git a/DocFormats/filters/ooxml/src/word/WordNumbering.h b/DocFormats/filters/ooxml/src/word/WordNumbering.h
index 8d0e1cb..cc38b58 100644
--- a/DocFormats/filters/ooxml/src/word/WordNumbering.h
+++ b/DocFormats/filters/ooxml/src/word/WordNumbering.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordNumbering_h
#define DocFormats_WordNumbering_h
diff --git a/DocFormats/filters/ooxml/src/word/WordObjects.c b/DocFormats/filters/ooxml/src/word/WordObjects.c
index 085a494..d4a9877 100644
--- a/DocFormats/filters/ooxml/src/word/WordObjects.c
+++ b/DocFormats/filters/ooxml/src/word/WordObjects.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "WordObjects.h"
#include "WordPackage.h"
@@ -21,6 +24,7 @@
#include "DFString.h"
#include "DFHashTable.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdlib.h>
@@ -43,7 +47,7 @@
WordObjects *WordObjectsNew(WordPackage *package)
{
- WordObjects *objects = (WordObjects *)calloc(1,sizeof(WordObjects));
+ WordObjects *objects = (WordObjects *)xcalloc(1,sizeof(WordObjects));
objects->package = WordPackageRetain(package);
objects->drawingsById = DFHashTableNew((DFCopyFunction)WordDrawingRetain,(DFFreeFunction)WordDrawingRelease);
objects->bookmarksById = DFHashTableNew((DFCopyFunction)WordBookmarkRetain,(DFFreeFunction)WordBookmarkRelease);
diff --git a/DocFormats/filters/ooxml/src/word/WordObjects.h b/DocFormats/filters/ooxml/src/word/WordObjects.h
index 0a08525..6844bb3 100644
--- a/DocFormats/filters/ooxml/src/word/WordObjects.h
+++ b/DocFormats/filters/ooxml/src/word/WordObjects.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordObjects_h
#define DocFormats_WordObjects_h
diff --git a/DocFormats/filters/ooxml/src/word/WordPackage.c b/DocFormats/filters/ooxml/src/word/WordPackage.c
index f6159fa..7595de6 100644
--- a/DocFormats/filters/ooxml/src/word/WordPackage.c
+++ b/DocFormats/filters/ooxml/src/word/WordPackage.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordPackage.h"
@@ -190,7 +193,7 @@
return NULL;
int ok = 0;
- WordPackage *package = (WordPackage *)calloc(1,sizeof(WordPackage));
+ WordPackage *package = (WordPackage *)xcalloc(1,sizeof(WordPackage));
package->retainCount = 1;
package->opc = opc;
package->documentPart = OPCPackagePartWithURI(package->opc,"/word/document.xml");
@@ -227,7 +230,7 @@
return NULL;
int ok = 0;
- WordPackage *package = (WordPackage *)calloc(1,sizeof(WordPackage));
+ WordPackage *package = (WordPackage *)xcalloc(1,sizeof(WordPackage));
package->retainCount = 1;
package->opc = opc;
diff --git a/DocFormats/filters/ooxml/src/word/WordPackage.h b/DocFormats/filters/ooxml/src/word/WordPackage.h
index eaef4d0..df318ef 100644
--- a/DocFormats/filters/ooxml/src/word/WordPackage.h
+++ b/DocFormats/filters/ooxml/src/word/WordPackage.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordPackage_h
#define DocFormats_WordPackage_h
diff --git a/DocFormats/filters/ooxml/src/word/WordSection.c b/DocFormats/filters/ooxml/src/word/WordSection.c
index af866dc..97ca444 100644
--- a/DocFormats/filters/ooxml/src/word/WordSection.c
+++ b/DocFormats/filters/ooxml/src/word/WordSection.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "WordSection.h"
#include "WordStyles.h"
@@ -18,6 +21,7 @@
#include "CSSLength.h"
#include "DFString.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <math.h>
#include <stdlib.h>
@@ -29,7 +33,7 @@
WordSection *WordSectionNew(void)
{
- WordSection *section = (WordSection *)calloc(1,sizeof(WordSection));
+ WordSection *section = (WordSection *)xcalloc(1,sizeof(WordSection));
section->pageWidth = A4_WIDTH_TWIPS;
section->pageHeight = A4_HEIGHT_TWIPS;
section->leftMargin = 0;
diff --git a/DocFormats/filters/ooxml/src/word/WordSection.h b/DocFormats/filters/ooxml/src/word/WordSection.h
index 058ce5c..0cbffa5 100644
--- a/DocFormats/filters/ooxml/src/word/WordSection.h
+++ b/DocFormats/filters/ooxml/src/word/WordSection.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordSection_h
#define DocFormats_WordSection_h
diff --git a/DocFormats/filters/ooxml/src/word/WordSettings.c b/DocFormats/filters/ooxml/src/word/WordSettings.c
index 2c17786..6ada764 100644
--- a/DocFormats/filters/ooxml/src/word/WordSettings.c
+++ b/DocFormats/filters/ooxml/src/word/WordSettings.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordSettings.h"
diff --git a/DocFormats/filters/ooxml/src/word/WordSettings.h b/DocFormats/filters/ooxml/src/word/WordSettings.h
index bb20e01..059aa96 100644
--- a/DocFormats/filters/ooxml/src/word/WordSettings.h
+++ b/DocFormats/filters/ooxml/src/word/WordSettings.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordSettings_h
#define DocFormats_WordSettings_h
diff --git a/DocFormats/filters/ooxml/src/word/WordSheet.c b/DocFormats/filters/ooxml/src/word/WordSheet.c
index 74f9fdc..8c9231c 100644
--- a/DocFormats/filters/ooxml/src/word/WordSheet.c
+++ b/DocFormats/filters/ooxml/src/word/WordSheet.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "WordSheet.h"
#include "DFDOM.h"
@@ -18,6 +21,7 @@
#include "DFString.h"
#include "Word.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
@@ -29,7 +33,7 @@
char *WordStyleNameToClassName(const char *name)
{
- char *className = strdup(name);
+ char *className = xstrdup(name);
for (char *c = className; *c != '\0'; c++) {
if (*c == ' ')
*c = '_';
@@ -39,7 +43,7 @@
char *WordStyleNameFromClassName(const char *name)
{
- char *className = strdup(name);
+ char *className = xstrdup(name);
for (char *c = className; *c != '\0'; c++) {
if (*c == '_')
*c = ' ';
@@ -60,16 +64,16 @@
assert(styleId != NULL);
assert(element->tag == WORD_STYLE);
- WordStyle *style = (WordStyle *)calloc(1,sizeof(WordStyle));
+ WordStyle *style = (WordStyle *)xcalloc(1,sizeof(WordStyle));
style->retainCount = 1;
style->element = element;
- style->type = (type != NULL) ? strdup(type) : NULL;
- style->styleId = (styleId != NULL) ? strdup(styleId) : NULL;
+ style->type = (type != NULL) ? xstrdup(type) : NULL;
+ style->styleId = (styleId != NULL) ? xstrdup(styleId) : NULL;
style->ident = WordSheetIdentForType(style->type,style->styleId);
style->basedOn = DFStrDup(DFGetChildAttribute(style->element,WORD_BASEDON,WORD_VAL));
DFNode *pPr = DFChildWithTag(style->element,WORD_PPR);
style->outlineLvl = DFStrDup(DFGetChildAttribute(pPr,WORD_OUTLINELVL,WORD_VAL));
- style->name = strdup(name);
+ style->name = xstrdup(name);
return style;
}
@@ -121,7 +125,7 @@
WordSheet *WordSheetNew(DFDocument *doc)
{
- WordSheet *sheet = (WordSheet *)calloc(1,sizeof(WordSheet));
+ WordSheet *sheet = (WordSheet *)xcalloc(1,sizeof(WordSheet));
sheet->stylesByIdent = DFHashTableNew((DFCopyFunction)WordStyleRetain,(DFFreeFunction)WordStyleRelease);
sheet->stylesByName = DFHashTableNew((DFCopyFunction)WordStyleRetain,(DFFreeFunction)WordStyleRelease);
@@ -207,7 +211,7 @@
DFSetAttribute(nameNode,WORD_VAL,name);
WordStyle *style = WordStyleNew(element,type,styleId,name);
- style->selector = strdup(selector);
+ style->selector = xstrdup(selector);
DFHashTableAdd(sheet->stylesByIdent,style->ident,style);
DFHashTableAdd(sheet->stylesByName,style->name,style);
DFHashTableAdd(sheet->stylesBySelector,style->selector,style);
@@ -266,7 +270,7 @@
// Compute inherited properties
WordStyle *ancestor = style;
- DFHashTable *visited = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *visited = DFHashTableNew((DFCopyFunction)xstrdup,free);
while ((ancestor != NULL) && (DFHashTableLookup(visited,ancestor->ident) == NULL)) {
DFHashTableAdd(visited,ancestor->ident,"");
diff --git a/DocFormats/filters/ooxml/src/word/WordSheet.h b/DocFormats/filters/ooxml/src/word/WordSheet.h
index 0a08714..da6a8ce 100644
--- a/DocFormats/filters/ooxml/src/word/WordSheet.h
+++ b/DocFormats/filters/ooxml/src/word/WordSheet.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordSheet_h
#define DocFormats_WordSheet_h
diff --git a/DocFormats/filters/ooxml/src/word/WordStyles.c b/DocFormats/filters/ooxml/src/word/WordStyles.c
index c7e5e8a..5358d6d 100644
--- a/DocFormats/filters/ooxml/src/word/WordStyles.c
+++ b/DocFormats/filters/ooxml/src/word/WordStyles.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordStyles.h"
@@ -232,7 +235,7 @@
if ((style->tag != HTML_P) && (style->tag != HTML_SPAN) && (style->tag != HTML_TABLE)) {
CSSStyle *parentStyle = CSSSheetLookupElement(converter->styleSheet,style->elementName,NULL,0,0);
if ((parentStyle != NULL) && !parentStyle->latent)
- parentSelector = strdup(style->elementName);
+ parentSelector = xstrdup(style->elementName);
}
}
}
@@ -482,7 +485,7 @@
}
}
replaceChildrenFromArray(concrete,children,WordSectPr_Children);
- for (long i = DFArrayCount(extra)-1; i >= 0; i--) {
+ for (long i = (long)(DFArrayCount(extra)-1); i >= 0; i--) {
DFNode *child = DFArrayItemAt(extra,i);
DFInsertBefore(concrete,child,concrete->first);
}
@@ -720,13 +723,13 @@
return WordStyleNameFromClassName(style->className);
switch (style->tag) {
- case HTML_H1: return strdup("heading 1");
- case HTML_H2: return strdup("heading 2");
- case HTML_H3: return strdup("heading 3");
- case HTML_H4: return strdup("heading 4");
- case HTML_H5: return strdup("heading 5");
- case HTML_H6: return strdup("heading 6");
- case HTML_FIGURE: return strdup("Figure");
+ case HTML_H1: return xstrdup("heading 1");
+ case HTML_H2: return xstrdup("heading 2");
+ case HTML_H3: return xstrdup("heading 3");
+ case HTML_H4: return xstrdup("heading 4");
+ case HTML_H5: return xstrdup("heading 5");
+ case HTML_H6: return xstrdup("heading 6");
+ case HTML_FIGURE: return xstrdup("Figure");
}
return NULL;
@@ -814,7 +817,7 @@
char *styleId = WordStyleIdForStyle(style);
char *name = WordStyleNameForStyle(style);
if (name == NULL)
- name = strdup(styleId);;
+ name = xstrdup(styleId);;
WordStyle *wordStyle = WordSheetAddStyle(sheet,familyStr,styleId,name,selector);
DFCreateChildElement(wordStyle->element,WORD_QFORMAT);
free(styleId);
diff --git a/DocFormats/filters/ooxml/src/word/WordStyles.h b/DocFormats/filters/ooxml/src/word/WordStyles.h
index b5cbb1b..19370b7 100644
--- a/DocFormats/filters/ooxml/src/word/WordStyles.h
+++ b/DocFormats/filters/ooxml/src/word/WordStyles.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordStyles_h
#define DocFormats_WordStyles_h
diff --git a/DocFormats/filters/ooxml/src/word/WordTheme.c b/DocFormats/filters/ooxml/src/word/WordTheme.c
index dbd9cc3..d64fc8e 100644
--- a/DocFormats/filters/ooxml/src/word/WordTheme.c
+++ b/DocFormats/filters/ooxml/src/word/WordTheme.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordTheme.h"
@@ -29,7 +32,7 @@
WordTheme *WordThemeNew(WordPackage *package)
{
- WordTheme *theme = (WordTheme *)calloc(1,sizeof(WordTheme));
+ WordTheme *theme = (WordTheme *)xcalloc(1,sizeof(WordTheme));
DFDocument *doc = package->theme;
if (doc == NULL)
@@ -46,8 +49,8 @@
const char *majorFont = DFGetChildAttribute(majorFontElem,DML_MAIN_LATIN,NULL_TYPEFACE);
const char *minorFont = DFGetChildAttribute(minorFontElem,DML_MAIN_LATIN,NULL_TYPEFACE);
- theme->majorFont = (majorFont != NULL) ? strdup(majorFont) : NULL;
- theme->minorFont = (minorFont != NULL) ? strdup(minorFont) : NULL;
+ theme->majorFont = (majorFont != NULL) ? xstrdup(majorFont) : NULL;
+ theme->minorFont = (minorFont != NULL) ? xstrdup(minorFont) : NULL;
return theme;
}
diff --git a/DocFormats/filters/ooxml/src/word/WordTheme.h b/DocFormats/filters/ooxml/src/word/WordTheme.h
index 7bfc4fc..96378f7 100644
--- a/DocFormats/filters/ooxml/src/word/WordTheme.h
+++ b/DocFormats/filters/ooxml/src/word/WordTheme.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordTheme_h
#define DocFormats_WordTheme_h
diff --git a/DocFormats/filters/ooxml/src/word/WordWhitespace.c b/DocFormats/filters/ooxml/src/word/WordWhitespace.c
index 5769cf9..ade5d5c 100644
--- a/DocFormats/filters/ooxml/src/word/WordWhitespace.c
+++ b/DocFormats/filters/ooxml/src/word/WordWhitespace.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordWhitespace.h"
diff --git a/DocFormats/filters/ooxml/src/word/WordWhitespace.h b/DocFormats/filters/ooxml/src/word/WordWhitespace.h
index 5b9d1aa..97668b6 100644
--- a/DocFormats/filters/ooxml/src/word/WordWhitespace.h
+++ b/DocFormats/filters/ooxml/src/word/WordWhitespace.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordWhitespace_h
#define DocFormats_WordWhitespace_h
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordCommonPr.c b/DocFormats/filters/ooxml/src/word/formatting/WordCommonPr.c
index 0578e3b..dd50fd5 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordCommonPr.c
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordCommonPr.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordCommonPr.h"
@@ -126,7 +129,7 @@
if ((color != NULL) && isRRGGBB(color))
value = DFFormatString("#%s",color);
else
- value = strdup("black");
+ value = xstrdup("black");
CSSPut(properties,colorName,value);
free(value);
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordCommonPr.h b/DocFormats/filters/ooxml/src/word/formatting/WordCommonPr.h
index 44d6707..0b5fdba 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordCommonPr.h
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordCommonPr.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordCommonPr_h
#define DocFormats_WordCommonPr_h
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordNumPr.c b/DocFormats/filters/ooxml/src/word/formatting/WordNumPr.c
index 21d0deb..b8e431d 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordNumPr.c
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordNumPr.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordNumPr.h"
@@ -75,7 +78,7 @@
if ((result->len > 0) && !endsWithWhitespace)
DFBufferFormat(result," \" \"");
- char *str = strdup(result->data);
+ char *str = xstrdup(result->data);
DFBufferRelease(result);
return str;
}
@@ -134,7 +137,7 @@
static WordNumInfo *WordNumInfoNew(void)
{
- return (WordNumInfo *)calloc(1,sizeof(WordNumInfo));
+ return (WordNumInfo *)xcalloc(1,sizeof(WordNumInfo));
}
static void WordNumInfoFree(WordNumInfo *info)
@@ -182,9 +185,9 @@
if (DFStringEquals(part->value,elementName)) {
free(info->cssType);
if (part->arg != NULL)
- info->cssType = strdup(part->arg);
+ info->cssType = xstrdup(part->arg);
else
- info->cssType = strdup("decimal");
+ info->cssType = xstrdup("decimal");
}
if ((strlen(part->value) == 2) && (part->value[0] == 'h'))
DFBufferFormat(format,"%%%c",part->value[1]);
@@ -203,7 +206,7 @@
format->len--;
}
- info->cssLvlText = strdup(format->data);
+ info->cssLvlText = xstrdup(format->data);
free(elementName);
DFBufferRelease(format);
}
@@ -221,8 +224,8 @@
if (concreteNum != NULL) {
WordNumLevel *level = WordConcreteNumGetLevel(concreteNum,atoi(ilvl));
if (level != NULL) {
- info->wordNumId = strdup(numId);
- info->wordIlvl = strdup(ilvl);
+ info->wordNumId = xstrdup(numId);
+ info->wordIlvl = xstrdup(ilvl);
info->wordLevel = level;
int ilvlValue = atoi(ilvl);
@@ -275,8 +278,8 @@
CSSStyle *style = CSSSheetLookupSelector(cssSheet,allSelectors[i],0,0);
if ((style->headingLevel >= 1) && (style->headingLevel <= 6)) {
int level = style->headingLevel - 1;
- SelectorList *item = (SelectorList *)calloc(1,sizeof(SelectorList));
- item->selector = strdup(style->selector);
+ SelectorList *item = (SelectorList *)xcalloc(1,sizeof(SelectorList));
+ item->selector = xstrdup(style->selector);
item->next = DFHashTableLookupInt(selectorsByLevel,level);
DFHashTableAddInt(selectorsByLevel,level,item);
}
@@ -315,13 +318,13 @@
info = WordNumInfoNew();
DFHashTableAdd(infoByStyleId,style->selector,info);
}
- curType = strdup(info->cssType);
- curLvlText = strdup(info->cssLvlText);
+ curType = xstrdup(info->cssType);
+ curLvlText = xstrdup(info->cssLvlText);
}
if (curType == NULL)
- curType = (prevType != NULL) ? strdup(prevType) : strdup("decimal");
+ curType = (prevType != NULL) ? xstrdup(prevType) : xstrdup("decimal");
if ((curLvlText == NULL) || (strlen(curLvlText) == 0)) {
free(curLvlText);
@@ -340,7 +343,7 @@
assert(info->wordLevel != NULL);
free(info->wordNumId);
free(info->wordIlvl);
- info->wordNumId = strdup(concreteNum->numId);
+ info->wordNumId = xstrdup(concreteNum->numId);
info->wordIlvl = DFFormatString("%d",i);
}
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordNumPr.h b/DocFormats/filters/ooxml/src/word/formatting/WordNumPr.h
index 5ccbbbf..93ce768 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordNumPr.h
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordNumPr.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordNumPr_h
#define DocFormats_WordNumPr_h
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordPPr.c b/DocFormats/filters/ooxml/src/word/formatting/WordPPr.c
index a40da92..022ba5e 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordPPr.c
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordPPr.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordPPr.h"
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordPPr.h b/DocFormats/filters/ooxml/src/word/formatting/WordPPr.h
index 6572992..4961bce 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordPPr.h
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordPPr.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordPPr_h
#define DocFormats_WordPPr_h
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordRPr.c b/DocFormats/filters/ooxml/src/word/formatting/WordRPr.c
index 551d145..a2f13a1 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordRPr.c
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordRPr.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordRPr.h"
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordRPr.h b/DocFormats/filters/ooxml/src/word/formatting/WordRPr.h
index 376eba4..487c5d8 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordRPr.h
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordRPr.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordRPr_h
#define DocFormats_WordRPr_h
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordTblPr.c b/DocFormats/filters/ooxml/src/word/formatting/WordTblPr.c
index bb398b3..5ce603f 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordTblPr.c
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordTblPr.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordTblPr.h"
@@ -104,13 +107,13 @@
// Units: 1/50ths of a percent
double pct = atoi(width)/50.0;
char buf[100];
- return strdup(DFFormatDoublePct(buf,100,pct));
+ return xstrdup(DFFormatDoublePct(buf,100,pct));
}
else if (!strcmp(type,"dxa") && (WordSectionContentWidth(section) > 0)) {
// Units: 1/20ths of a point
double pct = 100.0*atoi(width)/(double)WordSectionContentWidth(section);
char buf[100];
- return strdup(DFFormatDoublePct(buf,100,pct));
+ return xstrdup(DFFormatDoublePct(buf,100,pct));
}
return NULL;
}
@@ -205,7 +208,7 @@
double pts = atoi(w)/20.0;
char *name = DFFormatString("padding-%s",side);
char buf[100];
- char *value = strdup(DFFormatDoublePt(buf,100,pts));
+ char *value = xstrdup(DFFormatDoublePt(buf,100,pts));
CSSPut(properties,name,value);
free(name);
free(value);
diff --git a/DocFormats/filters/ooxml/src/word/formatting/WordTblPr.h b/DocFormats/filters/ooxml/src/word/formatting/WordTblPr.h
index a394dc6..a2a1926 100644
--- a/DocFormats/filters/ooxml/src/word/formatting/WordTblPr.h
+++ b/DocFormats/filters/ooxml/src/word/formatting/WordTblPr.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordTblPr_h
#define DocFormats_WordTblPr_h
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordBlockLevel.c b/DocFormats/filters/ooxml/src/word/lenses/WordBlockLevel.c
index fe71ff2..c7857ae 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordBlockLevel.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordBlockLevel.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordBody.c b/DocFormats/filters/ooxml/src/word/lenses/WordBody.c
index 6c8b92f..a1f920e 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordBody.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordBody.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordBookmark.c b/DocFormats/filters/ooxml/src/word/lenses/WordBookmark.c
index fcd2f53..56d8a02 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordBookmark.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordBookmark.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "WordBookmark.h"
#include "WordLenses.h"
@@ -23,6 +26,7 @@
#include "DFHTML.h"
#include "DFString.h"
#include "DFCommon.h"
+#include "DFPlatform.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
@@ -68,10 +72,10 @@
WordBookmark *WordBookmarkNew(const char *bookmarkId1, const char *bookmarkName1)
{
- WordBookmark *bookmark = (WordBookmark *)calloc(1,sizeof(WordBookmark));
+ WordBookmark *bookmark = (WordBookmark *)xcalloc(1,sizeof(WordBookmark));
bookmark->retainCount = 1;
- bookmark->bookmarkId = (bookmarkId1 != NULL) ? strdup(bookmarkId1) : NULL;
- bookmark->bookmarkName = (bookmarkName1 != NULL) ? strdup(bookmarkName1) : NULL;
+ bookmark->bookmarkId = (bookmarkId1 != NULL) ? xstrdup(bookmarkId1) : NULL;
+ bookmark->bookmarkName = (bookmarkName1 != NULL) ? xstrdup(bookmarkName1) : NULL;
bookmark->type = WordBookmarkUnknown;
return bookmark;
}
@@ -160,7 +164,7 @@
DFNodeTextToBuffer(child,buffer);
}
free(bookmark->label);
- bookmark->label = strdup(buffer->data);
+ bookmark->label = xstrdup(buffer->data);
DFBufferRelease(buffer);
}
@@ -438,7 +442,7 @@
WordRawBookmark *WordRawBookmarkNew(void)
{
- WordRawBookmark *bookmark = (WordRawBookmark *)calloc(1,sizeof(WordRawBookmark));
+ WordRawBookmark *bookmark = (WordRawBookmark *)xcalloc(1,sizeof(WordRawBookmark));
bookmark->startOffset = -1;
bookmark->endOffset = -1;
return bookmark;
@@ -532,8 +536,8 @@
case WORD_BOOKMARKEND: {
DFArray *startElements = DFArrayNew(NULL,NULL);
DFArray *endElements = DFArrayNew(NULL,NULL);
- DFHashTable *startIds = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
- DFHashTable *endIds = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFHashTable *startIds = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
+ DFHashTable *endIds = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
DFNode *n;
for (n = child;
(n != NULL) && ((n->tag == WORD_BOOKMARKSTART) || (n->tag == WORD_BOOKMARKEND));
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordBookmark.h b/DocFormats/filters/ooxml/src/word/lenses/WordBookmark.h
index 18f2d87..ce66df4 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordBookmark.h
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordBookmark.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordBookmark_h
#define DocFormats_WordBookmark_h
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordChange.c b/DocFormats/filters/ooxml/src/word/lenses/WordChange.c
index 484131c..861706a 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordChange.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordChange.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordDocument.c b/DocFormats/filters/ooxml/src/word/lenses/WordDocument.c
index 8c2ce78..01bb883 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordDocument.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordDocument.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordDrawing.c b/DocFormats/filters/ooxml/src/word/lenses/WordDrawing.c
index 0d53286..77ef362 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordDrawing.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordDrawing.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordDrawing.h"
@@ -68,7 +71,7 @@
static ImageInfo *ImageInfoNew(const char *rId, double widthPts, double heightPts)
{
- ImageInfo *info = (ImageInfo *)calloc(1,sizeof(ImageInfo));
+ ImageInfo *info = (ImageInfo *)xcalloc(1,sizeof(ImageInfo));
info->rId = DFStrDup(rId);
info->widthPts = widthPts;
info->heightPts = heightPts;
@@ -144,9 +147,9 @@
WordDrawing *WordDrawingNew(const char *drawingId)
{
- WordDrawing *drawing = (WordDrawing *)calloc(1,sizeof(WordDrawing));
+ WordDrawing *drawing = (WordDrawing *)xcalloc(1,sizeof(WordDrawing));
drawing->retainCount = 1;
- drawing->drawingId = strdup(drawingId);
+ drawing->drawingId = xstrdup(drawingId);
return drawing;
}
@@ -335,7 +338,7 @@
if (paths == NULL)
return NULL;;
- DFHashTable *existingPaths = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *existingPaths = DFHashTableNew((DFCopyFunction)xstrdup,free);
for (int i = 0; paths[i]; i++) {
const char *path = paths[i];
char *lowerPath = DFLowerCase(path);
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordDrawing.h b/DocFormats/filters/ooxml/src/word/lenses/WordDrawing.h
index 6b8b5a3..c10c661 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordDrawing.h
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordDrawing.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordDrawing_h
#define DocFormats_WordDrawing_h
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordEquation.c b/DocFormats/filters/ooxml/src/word/lenses/WordEquation.c
index d56b9e2..79694b3 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordEquation.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordEquation.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordField.c b/DocFormats/filters/ooxml/src/word/lenses/WordField.c
index 9235a45..5ba51ac 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordField.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordField.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordField.h"
@@ -34,7 +37,7 @@
const char **Word_parseField(const char *str)
{
size_t len = strlen(str);
- DFArray *components = DFArrayNew((DFCopyFunction)strdup,free);
+ DFArray *components = DFArrayNew((DFCopyFunction)xstrdup,free);
size_t start = 0;
int inString = 0;
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordField.h b/DocFormats/filters/ooxml/src/word/lenses/WordField.h
index a2c2e74..3b5647b 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordField.h
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordField.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordField_h
#define DocFormats_WordField_h
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordHyperlink.c b/DocFormats/filters/ooxml/src/word/lenses/WordHyperlink.c
index 7d19742..00ee642 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordHyperlink.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordHyperlink.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordLenses.c b/DocFormats/filters/ooxml/src/word/lenses/WordLenses.c
index 2137762..994f45a 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordLenses.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordLenses.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordLenses.h b/DocFormats/filters/ooxml/src/word/lenses/WordLenses.h
index 0337bea..fd13d5f 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordLenses.h
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordLenses.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordLenses_h
#define DocFormats_WordLenses_h
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordParagraph.c b/DocFormats/filters/ooxml/src/word/lenses/WordParagraph.c
index 0a836d0..5801221 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordParagraph.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordParagraph.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
@@ -192,7 +195,7 @@
// FIXME: Won't work with Word documents created in non-English languages
if ((selector != NULL) && (abstract->tag == HTML_P) && DFStringEquals(className,"Caption")) {
free(selector);
- selector = strdup("caption");
+ selector = xstrdup("caption");
}
if (selector != NULL) {
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordParagraphContent.c b/DocFormats/filters/ooxml/src/word/lenses/WordParagraphContent.c
index 19e86f2..5bc9e57 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordParagraphContent.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordParagraphContent.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordRun.c b/DocFormats/filters/ooxml/src/word/lenses/WordRun.c
index 86b21be..9496dba 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordRun.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordRun.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordRunContent.c b/DocFormats/filters/ooxml/src/word/lenses/WordRunContent.c
index 784e145..0cc5a09 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordRunContent.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordRunContent.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordSmartTag.c b/DocFormats/filters/ooxml/src/word/lenses/WordSmartTag.c
index 5f527d0..df74119 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordSmartTag.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordSmartTag.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
diff --git a/DocFormats/filters/ooxml/src/word/lenses/WordTable.c b/DocFormats/filters/ooxml/src/word/lenses/WordTable.c
index 36f51d5..6f69130 100644
--- a/DocFormats/filters/ooxml/src/word/lenses/WordTable.c
+++ b/DocFormats/filters/ooxml/src/word/lenses/WordTable.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordLenses.h"
@@ -40,7 +43,7 @@
static ConcreteInfo *ConcreteInfoNew(void)
{
- ConcreteInfo *info = (ConcreteInfo *)calloc(1,sizeof(ConcreteInfo));
+ ConcreteInfo *info = (ConcreteInfo *)xcalloc(1,sizeof(ConcreteInfo));
info->tableProperties = CSSPropertiesNew();
info->cellProperties = CSSPropertiesNew();
return info;
diff --git a/DocFormats/filters/ooxml/tests/word/WordPlain.c b/DocFormats/filters/ooxml/tests/word/WordPlain.c
index 9857817..dfb13a4 100644
--- a/DocFormats/filters/ooxml/tests/word/WordPlain.c
+++ b/DocFormats/filters/ooxml/tests/word/WordPlain.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "WordPlain.h"
@@ -84,7 +87,7 @@
if (strcmp(type,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"))
continue;
- result = strdup(target);
+ result = xstrdup(target);
ok = 1;
break;
}
@@ -155,7 +158,7 @@
DFBuffer *output, DFStorage *storage, DFError **error)
{
int ok = 0;
- DFHashTable *includeTypes = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *includeTypes = DFHashTableNew((DFCopyFunction)xstrdup,free);
DFHashTableAdd(includeTypes,WORDREL_HYPERLINK,"");
DFHashTableAdd(includeTypes,WORDREL_IMAGE,"");
@@ -222,7 +225,7 @@
if (!DFStringHasSuffix(filename,"/"))
absFilename = DFFormatString("/%s",filename);
else
- absFilename = strdup(filename);
+ absFilename = xstrdup(filename);
DFBuffer *data = DFBufferReadFromStorage(storage,absFilename,NULL);
addSerializedBinary(output,data,absFilename);
DFBufferRelease(data);
@@ -243,7 +246,7 @@
static char *Word_toPlainFromDir(DFStorage *storage, DFHashTable *parts, DFError **error)
{
char *documentPath = NULL;
- DFHashTable *rels = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFHashTable *rels = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
DFBuffer *output = DFBufferNew();
char *relsPathRel = NULL;
DFDocument *relsDoc = NULL;
@@ -279,7 +282,7 @@
return NULL;
}
else {
- char *result = strdup(output->data);
+ char *result = xstrdup(output->data);
DFBufferRelease(output);
return result;
}
@@ -421,11 +424,11 @@
const char *documentStr = DFHashTableLookup(tp->items,"document.xml");
const char **allFilenames = NULL;
- DFHashTable *ctDefaults = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
- DFHashTable *ctOverrides = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
- DFHashTable *docRelURIs = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
- DFHashTable *docRelTypes = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
- DFHashTable *docRelModes = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFHashTable *ctDefaults = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
+ DFHashTable *ctOverrides = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
+ DFHashTable *docRelURIs = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
+ DFHashTable *docRelTypes = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
+ DFHashTable *docRelModes = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
if (documentStr == NULL) {
@@ -516,9 +519,9 @@
DFHashTableRelease(docRelURIs);
DFHashTableRelease(docRelTypes);
DFHashTableRelease(docRelModes);
- docRelURIs = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
- docRelTypes = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
- docRelModes = DFHashTableNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ docRelURIs = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
+ docRelTypes = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
+ docRelModes = DFHashTableNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
for (DFNode *child = doc->root->first; child != NULL; child = child->next) {
if (child->tag == REL_RELATIONSHIP) {
diff --git a/DocFormats/filters/ooxml/tests/word/WordPlain.h b/DocFormats/filters/ooxml/tests/word/WordPlain.h
index 8b44911..93bafb9 100644
--- a/DocFormats/filters/ooxml/tests/word/WordPlain.h
+++ b/DocFormats/filters/ooxml/tests/word/WordPlain.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_WordPlain_h
#define DocFormats_WordPlain_h
diff --git a/DocFormats/filters/ooxml/tests/word/WordTests.c b/DocFormats/filters/ooxml/tests/word/WordTests.c
index 270403d..e32aef8 100644
--- a/DocFormats/filters/ooxml/tests/word/WordTests.c
+++ b/DocFormats/filters/ooxml/tests/word/WordTests.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFUnitTest.h"
@@ -19,6 +22,7 @@
#include "Word.h"
#include "HTMLPlain.h"
#include "DFString.h"
+#include "DFHTML.h"
#include <DocFormats/Operations.h>
#include <stddef.h>
#include <string.h>
@@ -41,7 +45,7 @@
return;
}
- DFHashTable *parts = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *parts = DFHashTableNew((DFCopyFunction)xstrdup,free);
DFHashTableAdd(parts,"document","");
// Output the docx file
@@ -69,7 +73,7 @@
return;
}
- DFHashTable *parts = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *parts = DFHashTableNew((DFCopyFunction)xstrdup,free);
DFHashTableAdd(parts,"document","");
// Output the docx file
@@ -95,6 +99,7 @@
concreteDoc = DFConcreteDocumentNew(concreteStorage);
abstractStorage = DFStorageNewMemory(DFFileFormatHTML);
+ DFStorageWrite(abstractStorage,"test-mode",NULL,0,NULL);
abstractDoc = DFAbstractDocumentNew(abstractStorage);
if (!DFGet(concreteDoc,abstractDoc,&error))
@@ -106,6 +111,7 @@
goto end;
}
+ HTMLMetaRemove(htmlDoc,"corinthia-document-hash");
htmlPlain = HTML_toPlain(htmlDoc,abstractStorage,&error);
end:
@@ -126,7 +132,7 @@
{
if (utgetargc() == 0)
return NULL;;
- DFHashTable *set = DFHashTableNew((DFCopyFunction)strdup,free);
+ DFHashTable *set = DFHashTableNew((DFCopyFunction)xstrdup,free);
for (int i = 0; i < utgetargc(); i++) {
const char *colon = strchr(utgetargv()[i],':');
if (colon == NULL)
@@ -211,6 +217,7 @@
if (htmlDoc == NULL)
goto end;
+ HTMLMetaSet(htmlDoc,"corinthia-document-hash","ignore");
DFAbstractDocumentSetHTML(abstractDoc,htmlDoc);
// Update the docx file based on the contents of the HTML file
diff --git a/DocFormats/headers/DFCommon.h b/DocFormats/headers/DFCommon.h
index 27b3e5c..e9e8f10 100644
--- a/DocFormats/headers/DFCommon.h
+++ b/DocFormats/headers/DFCommon.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFCommon_h
#define DocFormats_DFCommon_h
diff --git a/DocFormats/headers/DFCore.h b/DocFormats/headers/DFCore.h
index 3505038..8355bd3 100644
--- a/DocFormats/headers/DFCore.h
+++ b/DocFormats/headers/DFCore.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFCore_h
#define DocFormats_DFCore_h
diff --git a/DocFormats/headers/DFPlatform.h b/DocFormats/headers/DFPlatform.h
index ea517e7..70e4591 100755
--- a/DocFormats/headers/DFPlatform.h
+++ b/DocFormats/headers/DFPlatform.h
@@ -1,21 +1,24 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFPlatform_h
#define DocFormats_DFPlatform_h
-#ifdef WIN32
+#ifdef _WINDOWS
#include <direct.h>
#define _CRT_SECURE_NO_WARNINGS
@@ -27,12 +30,11 @@
#ifndef snprintf
#define snprintf _snprintf
-#endif
+#endif // snprintf
#else
#include <unistd.h>
-#endif
-
+#endif // _WINDOWS
#ifndef ATTRIBUTE_FORMAT
#ifdef _MSC_VER
@@ -41,10 +43,8 @@
#else
#define ATTRIBUTE_FORMAT(archetype,index,first) __attribute__((format(archetype,index,first)))
#define ATTRIBUTE_ALIGNED(n) __attribute__((aligned (n)))
-#endif
-#endif
-
-
+#endif // _MSC_VER
+#endif // ATTRIBUTE_FORMAT
typedef struct DFDirEntryList DFDirEntryList;
@@ -54,13 +54,19 @@
};
int DFMkdirIfAbsent(const char *path, char **errmsg);
-int DFAddDirContents(const char *absPath, const char *relPath, int recursive, DFDirEntryList ***list, char **errmsg);
-int DFGetImageDimensions(const void *data, size_t len, const char *ext,
- unsigned int *width, unsigned int *height, char **errmsg);
+
+int DFAddDirContents(const char *absPath, const char *relPath,
+ int recursive, DFDirEntryList ***list,
+ char **errmsg);
+
+int DFGetImageDimensions(const void *data, size_t len,
+ const char *ext, unsigned int *width,
+ unsigned int *height, char **errmsg);
#define DF_ONCE_INIT 0
typedef int DFOnce;
typedef void (*DFOnceFunction)(void);
+
void DFInitOnce(DFOnce *once, DFOnceFunction fun);
// Zip functions
@@ -69,15 +75,36 @@
int zipFlag;
int zipFirst;
} DFextZipHandle;
+
typedef DFextZipHandle * DFextZipHandleP;
DFextZipHandleP DFextZipOpen(const char *zipFilename, int doUnzip);
-int DFextZipClose(DFextZipHandleP zipHandle);
-int DFextZipOpenNextFile(DFextZipHandleP zipHandle, char *entryName, const int maxName);
-int DFextZipAppendNewFile(DFextZipHandleP zipHandle, const char *entryName);
-int DFextZipCloseFile(DFextZipHandleP zipHandle);
+int DFextZipClose(DFextZipHandleP zipHandle);
-int DFextZipReadCurrentFile(DFextZipHandleP zipHandle, void *buf, const int maxLen);
-int DFextZipWriteCurrentFile(DFextZipHandleP zipHandle, const void *buf, const int len);
-#endif
+int DFextZipOpenNextFile(DFextZipHandleP zipHandle,
+ char *entryName,
+ const int maxName);
+
+int DFextZipAppendNewFile(DFextZipHandleP zipHandle,
+ const char *entryName);
+
+int DFextZipCloseFile(DFextZipHandleP zipHandle);
+
+int DFextZipReadCurrentFile(DFextZipHandleP zipHandle,
+ void *buf,
+ const int maxLen);
+
+int DFextZipWriteCurrentFile(DFextZipHandleP zipHandle,
+ const void *buf,
+ const int len);
+
+void *xmalloc(size_t size);
+
+void *xcalloc(size_t nmemb, size_t size);
+
+void *xrealloc(void *ptr, size_t size);
+
+char *xstrdup(const char *s);
+
+#endif // DocFormats_DFPlatform_h
diff --git a/DocFormats/headers/DFTypes.h b/DocFormats/headers/DFTypes.h
index 3b563c0..ef63766 100644
--- a/DocFormats/headers/DFTypes.h
+++ b/DocFormats/headers/DFTypes.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFTypes_h
#define DocFormats_DFTypes_h
diff --git a/DocFormats/platform/src/Apple.c b/DocFormats/platform/src/Apple.c
index 3c9d130..576743f 100644
--- a/DocFormats/platform/src/Apple.c
+++ b/DocFormats/platform/src/Apple.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
diff --git a/DocFormats/platform/src/Linux.c b/DocFormats/platform/src/Linux.c
index 5d93518..bba6658 100644
--- a/DocFormats/platform/src/Linux.c
+++ b/DocFormats/platform/src/Linux.c
@@ -1,22 +1,25 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
// This file contains functions that are applicable to Linux (or more generally, any non-Apple Unix platform)
-#ifndef WIN32
+#ifndef _WINDOWS
#ifndef __APPLE__
#include <SDL2/SDL_image.h>
@@ -27,7 +30,7 @@
SDL_Surface *image = IMG_Load_RW(SDL_RWFromMem((void *)data,len),1);
if (image == NULL) {
if (errmsg != NULL)
- *errmsg = strdup(IMG_GetError());
+ *errmsg = xstrdup(IMG_GetError());
return 0;
}
diff --git a/DocFormats/platform/src/Unix.c b/DocFormats/platform/src/Unix.c
index 00c8438..c318548 100644
--- a/DocFormats/platform/src/Unix.c
+++ b/DocFormats/platform/src/Unix.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include <errno.h>
@@ -21,7 +24,7 @@
// This file contains functions that are applicable to all Unix-based platforms, including Linux, iOS, and OS X
-#ifndef WIN32
+#ifndef _WINDOWS
#include <pthread.h>
#include <dirent.h>
@@ -47,7 +50,7 @@
if ((mkdir(path,0777) != 0) && (errno != EEXIST)) {
printf("DFMkdirIfAbsent: errno = %d (%s)\n",errno,strerror(errno));
if (errmsg != NULL)
- *errmsg = strdup(strerror(errno));
+ *errmsg = xstrdup(strerror(errno));
return 0;
}
return 1;
@@ -62,7 +65,7 @@
if (errmsg != NULL) {
char temp[1024];
snprintf(temp,1024,"%s: %s",relPath,strerror(errno));
- *errmsg = strdup(temp);
+ *errmsg = xstrdup(temp);
}
return 0;
}
@@ -77,8 +80,8 @@
size_t absSubPathLen = strlen(absPath) + 1 + strlen(result->d_name);
size_t relSubPathLen = strlen(relPath) + 1 + strlen(result->d_name);
- char *absSubPath = (char *)malloc(absSubPathLen+1);
- char *relSubPath = (char *)malloc(relSubPathLen+1);
+ char *absSubPath = (char *)xmalloc(absSubPathLen+1);
+ char *relSubPath = (char *)xmalloc(relSubPathLen+1);
snprintf(absSubPath,absSubPathLen+1,"%s/%s",absPath,result->d_name);
snprintf(relSubPath,relSubPathLen+1,"%s/%s",relPath,result->d_name);
@@ -89,8 +92,8 @@
else
entryName = relSubPath;
- *listptr = (DFDirEntryList *)calloc(1,sizeof(DFDirEntryList));
- (*listptr)->name = strdup(entryName);
+ *listptr = (DFDirEntryList *)xcalloc(1,sizeof(DFDirEntryList));
+ (*listptr)->name = xstrdup(entryName);
listptr = &(*listptr)->next;
struct stat statbuf;
diff --git a/DocFormats/platform/src/Win32.c b/DocFormats/platform/src/Win32.c
index f17303e..43cdbb2 100755
--- a/DocFormats/platform/src/Win32.c
+++ b/DocFormats/platform/src/Win32.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
@@ -44,7 +47,7 @@
(lpMsgBuf[len - 1] == '.')))
len--;
lpMsgBuf[len] = '\0';
- *errmsg = strdup(lpMsgBuf);
+ *errmsg = xstrdup(lpMsgBuf);
LocalFree(lpMsgBuf);
}
@@ -89,7 +92,7 @@
HANDLE hFind = INVALID_HANDLE_VALUE;
size_t patternLen = strlen(absPath) + 2;
- char *pattern = (char *)malloc(patternLen+1);
+ char *pattern = (char *)xmalloc(patternLen+1);
snprintf(pattern,patternLen+1,"%s/*",absPath);
hFind = FindFirstFile(pattern,&ffd);
if (hFind == INVALID_HANDLE_VALUE) {
@@ -106,8 +109,8 @@
size_t absSubPathLen = strlen(absPath) + 1 + strlen(ffd.cFileName);
size_t relSubPathLen = strlen(relPath) + 1 + strlen(ffd.cFileName);
- char *absSubPath = (char *)malloc(absSubPathLen+1);
- char *relSubPath = (char *)malloc(relSubPathLen+1);
+ char *absSubPath = (char *)xmalloc(absSubPathLen+1);
+ char *relSubPath = (char *)xmalloc(relSubPathLen+1);
snprintf(absSubPath,absSubPathLen+1,"%s/%s",absPath,ffd.cFileName);
snprintf(relSubPath,relSubPathLen+1,"%s/%s",relPath,ffd.cFileName);
@@ -118,8 +121,8 @@
else
entryName = relSubPath;
- *listptr = (DFDirEntryList *)calloc(1,sizeof(DFDirEntryList));
- (*listptr)->name = strdup(entryName);
+ *listptr = (DFDirEntryList *)xcalloc(1,sizeof(DFDirEntryList));
+ (*listptr)->name = xstrdup(entryName);
listptr = &(*listptr)->next;
if (recursive && (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
@@ -141,7 +144,7 @@
SDL_Surface *image = IMG_Load_RW(SDL_RWFromMem((void *)data,len),1);
if (image == NULL) {
if (errmsg != NULL)
- *errmsg = strdup(IMG_GetError());
+ *errmsg = xstrdup(IMG_GetError());
return 0;
}
diff --git a/DocFormats/platform/src/Wrapper.c b/DocFormats/platform/src/Wrapper.c
index 14ed093..1e8e506 100644
--- a/DocFormats/platform/src/Wrapper.c
+++ b/DocFormats/platform/src/Wrapper.c
@@ -1,25 +1,30 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
#include <string.h>
#include <stdlib.h>
+#include <stdio.h>
#include "DFPlatform.h"
#include "unzip.h"
#include "zip.h"
DFextZipHandleP DFextZipOpen(const char *zipFilename, int doUnzip) {
- DFextZipHandleP zipHandle = malloc(sizeof(DFextZipHandle));
+ DFextZipHandleP zipHandle = xmalloc(sizeof(DFextZipHandle));
// no more memory
if (!zipHandle)
@@ -144,3 +149,55 @@
{
return (zipWriteInFileInZip(zipHandle->handle, buf, len) == ZIP_OK) ? 1 : -1;
}
+
+
+
+void *xmalloc(size_t size)
+{
+ void *ptr = malloc(size);
+
+ if (ptr == NULL) {
+ perror("xmalloc: out of memory.\n");
+ abort();
+ return NULL;
+ }
+
+ return ptr;
+}
+
+
+
+void *xcalloc(size_t nmemb, size_t size)
+{
+ void *ptr = calloc(nmemb, size);
+
+ if (ptr == NULL) {
+ perror("xcalloc: out of memory.\n");
+ abort();
+ return NULL;
+ }
+
+ return ptr;
+}
+
+
+
+void *xrealloc(void *in_ptr, size_t size)
+{
+ void *ptr = realloc(in_ptr, size);
+
+ if (ptr == NULL) {
+ perror("xrealloc: out of memory.\n");
+ abort();
+ return NULL;
+ }
+
+ return ptr;
+}
+
+
+char *xstrdup(const char *s)
+{
+ size_t l = strlen(s)+1;
+ return (char*) memcpy (xmalloc (l), s, l);
+}
diff --git a/DocFormats/platform/tests/OStests.c b/DocFormats/platform/tests/OStests.c
index a1f430a..6ee74f1 100644
--- a/DocFormats/platform/tests/OStests.c
+++ b/DocFormats/platform/tests/OStests.c
@@ -1,21 +1,24 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFUnitTest.h"
#include "DFPlatform.h"
#include <stddef.h>
-
+#include <stdlib.h>
static void test_DFGetImageDimensions_gif(void)
{
@@ -172,11 +175,16 @@
char *errmsg;
int rc;
-
rc = DFAddDirContents(".", "", 1, &listptr, &errmsg);
utassert((rc == 1), "could not read dir");
-}
+ DFDirEntryList *next;
+ for (DFDirEntryList *l = list; l != NULL; l = next) {
+ next = l->next;
+ free(l->name);
+ free(l);
+ }
+}
TestGroup PlatformOSTests = {
diff --git a/DocFormats/platform/tests/WrapperTests.c b/DocFormats/platform/tests/WrapperTests.c
index f2a8f2b..5f5d74b 100644
--- a/DocFormats/platform/tests/WrapperTests.c
+++ b/DocFormats/platform/tests/WrapperTests.c
@@ -1,16 +1,20 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
#include "DFUnitTest.h"
#include <stddef.h>
diff --git a/DocFormats/unittest/DFUnitTest.c b/DocFormats/unittest/DFUnitTest.c
index 65a47d9..17e8ae1 100644
--- a/DocFormats/unittest/DFUnitTest.c
+++ b/DocFormats/unittest/DFUnitTest.c
@@ -1,18 +1,22 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFUnitTest.h"
+#include "DFPlatform.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -59,7 +63,7 @@
{
if (!condition) {
curtest.failed = 1;
- curtest.reason = strdup(description);
+ curtest.reason = xstrdup(description);
}
}
@@ -67,14 +71,14 @@
{
if (strcmp(actual,expected)) {
curtest.failed = 1;
- curtest.reason = strdup("Output mismatch");
+ curtest.reason = xstrdup("Output mismatch");
}
}
void utfail(const char *reason)
{
curtest.failed = 1;
- curtest.reason = strdup(reason);
+ curtest.reason = xstrdup(reason);
}
TestCase *utlookup(TestGroup **groups, const char *name)
diff --git a/DocFormats/unittest/DFUnitTest.h b/DocFormats/unittest/DFUnitTest.h
index 08b1729..1a24d46 100644
--- a/DocFormats/unittest/DFUnitTest.h
+++ b/DocFormats/unittest/DFUnitTest.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef DocFormats_DFUnitTest_h
#define DocFormats_DFUnitTest_h
diff --git a/Editor/src/3rdparty/showdown/license.txt b/Editor/src/3rdparty/showdown/license.txt
index a6096c8..e9c8672 100644
--- a/Editor/src/3rdparty/showdown/license.txt
+++ b/Editor/src/3rdparty/showdown/license.txt
@@ -1,34 +1,34 @@
-Copyright (c) 2007, John Fraser
-<http://www.attacklab.net/>
-All rights reserved.
-
-Original Markdown copyright (c) 2004, John Gruber
-<http://daringfireball.net/>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-* Neither the name "Markdown" nor the names of its contributors may
- be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-This software is provided by the copyright holders and contributors "as
-is" and any express or implied warranties, including, but not limited
-to, the implied warranties of merchantability and fitness for a
-particular purpose are disclaimed. In no event shall the copyright owner
-or contributors be liable for any direct, indirect, incidental, special,
-exemplary, or consequential damages (including, but not limited to,
-procurement of substitute goods or services; loss of use, data, or
-profits; or business interruption) however caused and on any theory of
-liability, whether in contract, strict liability, or tort (including
-negligence or otherwise) arising in any way out of the use of this
-software, even if advised of the possibility of such damage.
+Copyright (c) 2007, John Fraser
+<http://www.attacklab.net/>
+All rights reserved.
+
+Original Markdown copyright (c) 2004, John Gruber
+<http://daringfireball.net/>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name "Markdown" nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as
+is" and any express or implied warranties, including, but not limited
+to, the implied warranties of merchantability and fitness for a
+particular purpose are disclaimed. In no event shall the copyright owner
+or contributors be liable for any direct, indirect, incidental, special,
+exemplary, or consequential damages (including, but not limited to,
+procurement of substitute goods or services; loss of use, data, or
+profits; or business interruption) however caused and on any theory of
+liability, whether in contract, strict liability, or tort (including
+negligence or otherwise) arising in any way out of the use of this
+software, even if advised of the possibility of such damage.
diff --git a/Editor/src/3rdparty/showdown/showdown.js b/Editor/src/3rdparty/showdown/showdown.js
index c38bf0c..734dabb 100644
--- a/Editor/src/3rdparty/showdown/showdown.js
+++ b/Editor/src/3rdparty/showdown/showdown.js
@@ -1,1302 +1,1302 @@
-//
-// showdown.js -- A javascript port of Markdown.
-//
-// Copyright (c) 2007 John Fraser.
-//
-// Original Markdown Copyright (c) 2004-2005 John Gruber
-// <http://daringfireball.net/projects/markdown/>
-//
-// Redistributable under a BSD-style open source license.
-// See license.txt for more information.
-//
-// The full source distribution is at:
-//
-// A A L
-// T C A
-// T K B
-//
-// <http://www.attacklab.net/>
-//
-
-//
-// Wherever possible, Showdown is a straight, line-by-line port
-// of the Perl version of Markdown.
-//
-// This is not a normal parser design; it's basically just a
-// series of string substitutions. It's hard to read and
-// maintain this way, but keeping Showdown close to the original
-// design makes it easier to port new features.
-//
-// More importantly, Showdown behaves like markdown.pl in most
-// edge cases. So web applications can do client-side preview
-// in Javascript, and then build identical HTML on the server.
-//
-// This port needs the new RegExp functionality of ECMA 262,
-// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers
-// should do fine. Even with the new regular expression features,
-// We do a lot of work to emulate Perl's regex functionality.
-// The tricky changes in this file mostly have the "attacklab:"
-// label. Major or self-explanatory changes don't.
-//
-// Smart diff tools like Araxis Merge will be able to match up
-// this file with markdown.pl in a useful way. A little tweaking
-// helps: in a copy of markdown.pl, replace "#" with "//" and
-// replace "$text" with "text". Be sure to ignore whitespace
-// and line endings.
-//
-
-
-//
-// Showdown usage:
-//
-// var text = "Markdown *rocks*.";
-//
-// var converter = new Showdown.converter();
-// var html = converter.makeHtml(text);
-//
-// alert(html);
-//
-// Note: move the sample code to the bottom of this
-// file before uncommenting it.
-//
-
-
-//
-// Showdown namespace
-//
-var Showdown = {};
-
-//
-// converter
-//
-// Wraps all "globals" so that the only thing
-// exposed is makeHtml().
-//
-Showdown.converter = function() {
-
-//
-// Globals:
-//
-
-// Global hashes, used by various utility routines
-var g_urls;
-var g_titles;
-var g_html_blocks;
-
-// Used to track when we're inside an ordered or unordered list
-// (see _ProcessListItems() for details):
-var g_list_level = 0;
-
-
-this.makeHtml = function(text) {
-//
-// Main function. The order in which other subs are called here is
-// essential. Link and image substitutions need to happen before
-// _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>
-// and <img> tags get encoded.
-//
-
- // Clear the global hashes. If we don't clear these, you get conflicts
- // from other articles when generating a page which contains more than
- // one article (e.g. an index page that shows the N most recent
- // articles):
- g_urls = new Array();
- g_titles = new Array();
- g_html_blocks = new Array();
-
- // attacklab: Replace ~ with ~T
- // This lets us use tilde as an escape char to avoid md5 hashes
- // The choice of character is arbitray; anything that isn't
- // magic in Markdown will work.
- text = text.replace(/~/g,"~T");
-
- // attacklab: Replace $ with ~D
- // RegExp interprets $ as a special character
- // when it's in a replacement string
- text = text.replace(/\$/g,"~D");
-
- // Standardize line endings
- text = text.replace(/\r\n/g,"\n"); // DOS to Unix
- text = text.replace(/\r/g,"\n"); // Mac to Unix
-
- // Make sure text begins and ends with a couple of newlines:
- text = "\n\n" + text + "\n\n";
-
- // Convert all tabs to spaces.
- text = _Detab(text);
-
- // Strip any lines consisting only of spaces and tabs.
- // This makes subsequent regexen easier to write, because we can
- // match consecutive blank lines with /\n+/ instead of something
- // contorted like /[ \t]*\n+/ .
- text = text.replace(/^[ \t]+$/mg,"");
-
- // Turn block-level HTML blocks into hash entries
- text = _HashHTMLBlocks(text);
-
- // Strip link definitions, store in hashes.
- text = _StripLinkDefinitions(text);
-
- text = _RunBlockGamut(text);
-
- text = _UnescapeSpecialChars(text);
-
- // attacklab: Restore dollar signs
- text = text.replace(/~D/g,"$$");
-
- // attacklab: Restore tildes
- text = text.replace(/~T/g,"~");
-
- return text;
-}
-
-
-var _StripLinkDefinitions = function(text) {
-//
-// Strips link definitions from text, stores the URLs and titles in
-// hash references.
-//
-
- // Link defs are in the form: ^[id]: url "optional title"
-
- /*
- var text = text.replace(/
- ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1
- [ \t]*
- \n? // maybe *one* newline
- [ \t]*
- <?(\S+?)>? // url = $2
- [ \t]*
- \n? // maybe one newline
- [ \t]*
- (?:
- (\n*) // any lines skipped = $3 attacklab: lookbehind removed
- ["(]
- (.+?) // title = $4
- [")]
- [ \t]*
- )? // title is optional
- (?:\n+|$)
- /gm,
- function(){...});
- */
- var text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,
- function (wholeMatch,m1,m2,m3,m4) {
- m1 = m1.toLowerCase();
- g_urls[m1] = _EncodeAmpsAndAngles(m2); // Link IDs are case-insensitive
- if (m3) {
- // Oops, found blank lines, so it's not a title.
- // Put back the parenthetical statement we stole.
- return m3+m4;
- } else if (m4) {
- g_titles[m1] = m4.replace(/"/g,""");
- }
-
- // Completely remove the definition from the text
- return "";
- }
- );
-
- return text;
-}
-
-
-var _HashHTMLBlocks = function(text) {
- // attacklab: Double up blank lines to reduce lookaround
- text = text.replace(/\n/g,"\n\n");
-
- // Hashify HTML blocks:
- // We only want to do this for block-level HTML tags, such as headers,
- // lists, and tables. That's because we still want to wrap <p>s around
- // "paragraphs" that are wrapped in non-block-level tags, such as anchors,
- // phrase emphasis, and spans. The list of tags we're looking for is
- // hard-coded:
- var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del"
- var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math"
-
- // First, look for nested blocks, e.g.:
- // <div>
- // <div>
- // tags for inner block must be indented.
- // </div>
- // </div>
- //
- // The outermost tags must start at the left margin for this to match, and
- // the inner nested divs must be indented.
- // We need to do this before the next, more liberal match, because the next
- // match will start at the first `<div>` and stop at the first `</div>`.
-
- // attacklab: This regex can be expensive when it fails.
- /*
- var text = text.replace(/
- ( // save in $1
- ^ // start of line (with /m)
- <($block_tags_a) // start tag = $2
- \b // word break
- // attacklab: hack around khtml/pcre bug...
- [^\r]*?\n // any number of lines, minimally matching
- </\2> // the matching end tag
- [ \t]* // trailing spaces/tabs
- (?=\n+) // followed by a newline
- ) // attacklab: there are sentinel newlines at end of document
- /gm,function(){...}};
- */
- text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,hashElement);
-
- //
- // Now match more liberally, simply from `\n<tag>` to `</tag>\n`
- //
-
- /*
- var text = text.replace(/
- ( // save in $1
- ^ // start of line (with /m)
- <($block_tags_b) // start tag = $2
- \b // word break
- // attacklab: hack around khtml/pcre bug...
- [^\r]*? // any number of lines, minimally matching
- .*</\2> // the matching end tag
- [ \t]* // trailing spaces/tabs
- (?=\n+) // followed by a newline
- ) // attacklab: there are sentinel newlines at end of document
- /gm,function(){...}};
- */
- text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,hashElement);
-
- // Special case just for <hr />. It was easier to make a special case than
- // to make the other regex more complicated.
-
- /*
- text = text.replace(/
- ( // save in $1
- \n\n // Starting after a blank line
- [ ]{0,3}
- (<(hr) // start tag = $2
- \b // word break
- ([^<>])*? //
- \/?>) // the matching end tag
- [ \t]*
- (?=\n{2,}) // followed by a blank line
- )
- /g,hashElement);
- */
- text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,hashElement);
-
- // Special case for standalone HTML comments:
-
- /*
- text = text.replace(/
- ( // save in $1
- \n\n // Starting after a blank line
- [ ]{0,3} // attacklab: g_tab_width - 1
- <!
- (--[^\r]*?--\s*)+
- >
- [ \t]*
- (?=\n{2,}) // followed by a blank line
- )
- /g,hashElement);
- */
- text = text.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g,hashElement);
-
- // PHP and ASP-style processor instructions (<?...?> and <%...%>)
-
- /*
- text = text.replace(/
- (?:
- \n\n // Starting after a blank line
- )
- ( // save in $1
- [ ]{0,3} // attacklab: g_tab_width - 1
- (?:
- <([?%]) // $2
- [^\r]*?
- \2>
- )
- [ \t]*
- (?=\n{2,}) // followed by a blank line
- )
- /g,hashElement);
- */
- text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,hashElement);
-
- // attacklab: Undo double lines (see comment at top of this function)
- text = text.replace(/\n\n/g,"\n");
- return text;
-}
-
-var hashElement = function(wholeMatch,m1) {
- var blockText = m1;
-
- // Undo double lines
- blockText = blockText.replace(/\n\n/g,"\n");
- blockText = blockText.replace(/^\n/,"");
-
- // strip trailing blank lines
- blockText = blockText.replace(/\n+$/g,"");
-
- // Replace the element text with a marker ("~KxK" where x is its key)
- blockText = "\n\n~K" + (g_html_blocks.push(blockText)-1) + "K\n\n";
-
- return blockText;
-};
-
-var _RunBlockGamut = function(text) {
-//
-// These are all the transformations that form block-level
-// tags like paragraphs, headers, and list items.
-//
- text = _DoHeaders(text);
-
- // Do Horizontal Rules:
- var key = hashBlock("<hr />");
- text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key);
- text = text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key);
- text = text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key);
-
- text = _DoLists(text);
- text = _DoCodeBlocks(text);
- text = _DoBlockQuotes(text);
-
- // We already ran _HashHTMLBlocks() before, in Markdown(), but that
- // was to escape raw HTML in the original Markdown source. This time,
- // we're escaping the markup we've just created, so that we don't wrap
- // <p> tags around block-level tags.
- text = _HashHTMLBlocks(text);
- text = _FormParagraphs(text);
-
- return text;
-}
-
-
-var _RunSpanGamut = function(text) {
-//
-// These are all the transformations that occur *within* block-level
-// tags like paragraphs, headers, and list items.
-//
-
- text = _DoCodeSpans(text);
- text = _EscapeSpecialCharsWithinTagAttributes(text);
- text = _EncodeBackslashEscapes(text);
-
- // Process anchor and image tags. Images must come first,
- // because ![foo][f] looks like an anchor.
- text = _DoImages(text);
- text = _DoAnchors(text);
-
- // Make links out of things like `<http://example.com/>`
- // Must come after _DoAnchors(), because you can use < and >
- // delimiters in inline links like [this](<url>).
- text = _DoAutoLinks(text);
- text = _EncodeAmpsAndAngles(text);
- text = _DoItalicsAndBold(text);
-
- // Do hard breaks:
- text = text.replace(/ +\n/g," <br />\n");
-
- return text;
-}
-
-var _EscapeSpecialCharsWithinTagAttributes = function(text) {
-//
-// Within tags -- meaning between < and > -- encode [\ ` * _] so they
-// don't conflict with their use in Markdown for code, italics and strong.
-//
-
- // Build a regex to find HTML tags and comments. See Friedl's
- // "Mastering Regular Expressions", 2nd Ed., pp. 200-201.
- var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--.*?--\s*)+>)/gi;
-
- text = text.replace(regex, function(wholeMatch) {
- var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g,"$1`");
- tag = escapeCharacters(tag,"\\`*_");
- return tag;
- });
-
- return text;
-}
-
-var _DoAnchors = function(text) {
-//
-// Turn Markdown link shortcuts into XHTML <a> tags.
-//
- //
- // First, handle reference-style links: [link text] [id]
- //
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- \[
- (
- (?:
- \[[^\]]*\] // allow brackets nested one level
- |
- [^\[] // or anything else
- )*
- )
- \]
-
- [ ]? // one optional space
- (?:\n[ ]*)? // one optional newline followed by spaces
-
- \[
- (.*?) // id = $3
- \]
- )()()()() // pad remaining backreferences
- /g,_DoAnchors_callback);
- */
- text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeAnchorTag);
-
- //
- // Next, inline-style links: [link text](url "optional title")
- //
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- \[
- (
- (?:
- \[[^\]]*\] // allow brackets nested one level
- |
- [^\[\]] // or anything else
- )
- )
- \]
- \( // literal paren
- [ \t]*
- () // no id, so leave $3 empty
- <?(.*?)>? // href = $4
- [ \t]*
- ( // $5
- (['"]) // quote char = $6
- (.*?) // Title = $7
- \6 // matching quote
- [ \t]* // ignore any spaces/tabs between closing quote and )
- )? // title is optional
- \)
- )
- /g,writeAnchorTag);
- */
- text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeAnchorTag);
-
- //
- // Last, handle reference-style shortcuts: [link text]
- // These must come last in case you've also got [link test][1]
- // or [link test](/foo)
- //
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- \[
- ([^\[\]]+) // link text = $2; can't contain '[' or ']'
- \]
- )()()()()() // pad rest of backreferences
- /g, writeAnchorTag);
- */
- text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag);
-
- return text;
-}
-
-var writeAnchorTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {
- if (m7 == undefined) m7 = "";
- var whole_match = m1;
- var link_text = m2;
- var link_id = m3.toLowerCase();
- var url = m4;
- var title = m7;
-
- if (url == "") {
- if (link_id == "") {
- // lower-case and turn embedded newlines into spaces
- link_id = link_text.toLowerCase().replace(/ ?\n/g," ");
- }
- url = "#"+link_id;
-
- if (g_urls[link_id] != undefined) {
- url = g_urls[link_id];
- if (g_titles[link_id] != undefined) {
- title = g_titles[link_id];
- }
- }
- else {
- if (whole_match.search(/\(\s*\)$/m)>-1) {
- // Special case for explicit empty url
- url = "";
- } else {
- return whole_match;
- }
- }
- }
-
- url = escapeCharacters(url,"*_");
- var result = "<a href=\"" + url + "\"";
-
- if (title != "") {
- title = title.replace(/"/g,""");
- title = escapeCharacters(title,"*_");
- result += " title=\"" + title + "\"";
- }
-
- result += ">" + link_text + "</a>";
-
- return result;
-}
-
-
-var _DoImages = function(text) {
-//
-// Turn Markdown image shortcuts into <img> tags.
-//
-
- //
- // First, handle reference-style labeled images: ![alt text][id]
- //
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- !\[
- (.*?) // alt text = $2
- \]
-
- [ ]? // one optional space
- (?:\n[ ]*)? // one optional newline followed by spaces
-
- \[
- (.*?) // id = $3
- \]
- )()()()() // pad rest of backreferences
- /g,writeImageTag);
- */
- text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeImageTag);
-
- //
- // Next, handle inline images: ![alt text](url "optional title")
- // Don't forget: encode * and _
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- !\[
- (.*?) // alt text = $2
- \]
- \s? // One optional whitespace character
- \( // literal paren
- [ \t]*
- () // no id, so leave $3 empty
- <?(\S+?)>? // src url = $4
- [ \t]*
- ( // $5
- (['"]) // quote char = $6
- (.*?) // title = $7
- \6 // matching quote
- [ \t]*
- )? // title is optional
- \)
- )
- /g,writeImageTag);
- */
- text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeImageTag);
-
- return text;
-}
-
-var writeImageTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {
- var whole_match = m1;
- var alt_text = m2;
- var link_id = m3.toLowerCase();
- var url = m4;
- var title = m7;
-
- if (!title) title = "";
-
- if (url == "") {
- if (link_id == "") {
- // lower-case and turn embedded newlines into spaces
- link_id = alt_text.toLowerCase().replace(/ ?\n/g," ");
- }
- url = "#"+link_id;
-
- if (g_urls[link_id] != undefined) {
- url = g_urls[link_id];
- if (g_titles[link_id] != undefined) {
- title = g_titles[link_id];
- }
- }
- else {
- return whole_match;
- }
- }
-
- alt_text = alt_text.replace(/"/g,""");
- url = escapeCharacters(url,"*_");
- var result = "<img src=\"" + url + "\" alt=\"" + alt_text + "\"";
-
- // attacklab: Markdown.pl adds empty title attributes to images.
- // Replicate this bug.
-
- //if (title != "") {
- title = title.replace(/"/g,""");
- title = escapeCharacters(title,"*_");
- result += " title=\"" + title + "\"";
- //}
-
- result += " />";
-
- return result;
-}
-
-
-var _DoHeaders = function(text) {
-
- // Setext-style headers:
- // Header 1
- // ========
- //
- // Header 2
- // --------
- //
- text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,
- function(wholeMatch,m1){return hashBlock('<h1 id="' + headerId(m1) + '">' + _RunSpanGamut(m1) + "</h1>");});
-
- text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,
- function(matchFound,m1){return hashBlock('<h2 id="' + headerId(m1) + '">' + _RunSpanGamut(m1) + "</h2>");});
-
- // atx-style headers:
- // # Header 1
- // ## Header 2
- // ## Header 2 with closing hashes ##
- // ...
- // ###### Header 6
- //
-
- /*
- text = text.replace(/
- ^(\#{1,6}) // $1 = string of #'s
- [ \t]*
- (.+?) // $2 = Header text
- [ \t]*
- \#* // optional closing #'s (not counted)
- \n+
- /gm, function() {...});
- */
-
- text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,
- function(wholeMatch,m1,m2) {
- var h_level = m1.length;
- return hashBlock("<h" + h_level + ' id="' + headerId(m2) + '">' + _RunSpanGamut(m2) + "</h" + h_level + ">");
- });
-
- function headerId(m) {
- return m.replace(/[^\w]/g, '').toLowerCase();
- }
- return text;
-}
-
-// This declaration keeps Dojo compressor from outputting garbage:
-var _ProcessListItems;
-
-var _DoLists = function(text) {
-//
-// Form HTML ordered (numbered) and unordered (bulleted) lists.
-//
-
- // attacklab: add sentinel to hack around khtml/safari bug:
- // http://bugs.webkit.org/show_bug.cgi?id=11231
- text += "~0";
-
- // Re-usable pattern to match any entirel ul or ol list:
-
- /*
- var whole_list = /
- ( // $1 = whole list
- ( // $2
- [ ]{0,3} // attacklab: g_tab_width - 1
- ([*+-]|\d+[.]) // $3 = first list item marker
- [ \t]+
- )
- [^\r]+?
- ( // $4
- ~0 // sentinel for workaround; should be $
- |
- \n{2,}
- (?=\S)
- (?! // Negative lookahead for another list item marker
- [ \t]*
- (?:[*+-]|\d+[.])[ \t]+
- )
- )
- )/g
- */
- var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
-
- if (g_list_level) {
- text = text.replace(whole_list,function(wholeMatch,m1,m2) {
- var list = m1;
- var list_type = (m2.search(/[*+-]/g)>-1) ? "ul" : "ol";
-
- // Turn double returns into triple returns, so that we can make a
- // paragraph for the last item in a list, if necessary:
- list = list.replace(/\n{2,}/g,"\n\n\n");;
- var result = _ProcessListItems(list);
-
- // Trim any trailing whitespace, to put the closing `</$list_type>`
- // up on the preceding line, to get it past the current stupid
- // HTML block parser. This is a hack to work around the terrible
- // hack that is the HTML block parser.
- result = result.replace(/\s+$/,"");
- result = "<"+list_type+">" + result + "</"+list_type+">\n";
- return result;
- });
- } else {
- whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g;
- text = text.replace(whole_list,function(wholeMatch,m1,m2,m3) {
- var runup = m1;
- var list = m2;
-
- var list_type = (m3.search(/[*+-]/g)>-1) ? "ul" : "ol";
- // Turn double returns into triple returns, so that we can make a
- // paragraph for the last item in a list, if necessary:
- var list = list.replace(/\n{2,}/g,"\n\n\n");;
- var result = _ProcessListItems(list);
- result = runup + "<"+list_type+">\n" + result + "</"+list_type+">\n";
- return result;
- });
- }
-
- // attacklab: strip sentinel
- text = text.replace(/~0/,"");
-
- return text;
-}
-
-_ProcessListItems = function(list_str) {
-//
-// Process the contents of a single ordered or unordered list, splitting it
-// into individual list items.
-//
- // The $g_list_level global keeps track of when we're inside a list.
- // Each time we enter a list, we increment it; when we leave a list,
- // we decrement. If it's zero, we're not in a list anymore.
- //
- // We do this because when we're not inside a list, we want to treat
- // something like this:
- //
- // I recommend upgrading to version
- // 8. Oops, now this line is treated
- // as a sub-list.
- //
- // As a single paragraph, despite the fact that the second line starts
- // with a digit-period-space sequence.
- //
- // Whereas when we're inside a list (or sub-list), that line will be
- // treated as the start of a sub-list. What a kludge, huh? This is
- // an aspect of Markdown's syntax that's hard to parse perfectly
- // without resorting to mind-reading. Perhaps the solution is to
- // change the syntax rules such that sub-lists must start with a
- // starting cardinal number; e.g. "1." or "a.".
-
- g_list_level++;
-
- // trim trailing blank lines:
- list_str = list_str.replace(/\n{2,}$/,"\n");
-
- // attacklab: add sentinel to emulate \z
- list_str += "~0";
-
- /*
- list_str = list_str.replace(/
- (\n)? // leading line = $1
- (^[ \t]*) // leading whitespace = $2
- ([*+-]|\d+[.]) [ \t]+ // list marker = $3
- ([^\r]+? // list item text = $4
- (\n{1,2}))
- (?= \n* (~0 | \2 ([*+-]|\d+[.]) [ \t]+))
- /gm, function(){...});
- */
- list_str = list_str.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,
- function(wholeMatch,m1,m2,m3,m4){
- var item = m4;
- var leading_line = m1;
- var leading_space = m2;
-
- if (leading_line || (item.search(/\n{2,}/)>-1)) {
- item = _RunBlockGamut(_Outdent(item));
- }
- else {
- // Recursion for sub-lists:
- item = _DoLists(_Outdent(item));
- item = item.replace(/\n$/,""); // chomp(item)
- item = _RunSpanGamut(item);
- }
-
- return "<li>" + item + "</li>\n";
- }
- );
-
- // attacklab: strip sentinel
- list_str = list_str.replace(/~0/g,"");
-
- g_list_level--;
- return list_str;
-}
-
-
-var _DoCodeBlocks = function(text) {
-//
-// Process Markdown `<pre><code>` blocks.
-//
-
- /*
- text = text.replace(text,
- /(?:\n\n|^)
- ( // $1 = the code block -- one or more lines, starting with a space/tab
- (?:
- (?:[ ]{4}|\t) // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
- .*\n+
- )+
- )
- (\n*[ ]{0,3}[^ \t\n]|(?=~0)) // attacklab: g_tab_width
- /g,function(){...});
- */
-
- // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
- text += "~0";
-
- text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
- function(wholeMatch,m1,m2) {
- var codeblock = m1;
- var nextChar = m2;
-
- codeblock = _EncodeCode( _Outdent(codeblock));
- codeblock = _Detab(codeblock);
- codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines
- codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace
-
- codeblock = "<pre><code>" + codeblock + "\n</code></pre>";
-
- return hashBlock(codeblock) + nextChar;
- }
- );
-
- // attacklab: strip sentinel
- text = text.replace(/~0/,"");
-
- return text;
-}
-
-var hashBlock = function(text) {
- text = text.replace(/(^\n+|\n+$)/g,"");
- return "\n\n~K" + (g_html_blocks.push(text)-1) + "K\n\n";
-}
-
-
-var _DoCodeSpans = function(text) {
-//
-// * Backtick quotes are used for <code></code> spans.
-//
-// * You can use multiple backticks as the delimiters if you want to
-// include literal backticks in the code span. So, this input:
-//
-// Just type ``foo `bar` baz`` at the prompt.
-//
-// Will translate to:
-//
-// <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
-//
-// There's no arbitrary limit to the number of backticks you
-// can use as delimters. If you need three consecutive backticks
-// in your code, use four for delimiters, etc.
-//
-// * You can use spaces to get literal backticks at the edges:
-//
-// ... type `` `bar` `` ...
-//
-// Turns to:
-//
-// ... type <code>`bar`</code> ...
-//
-
- /*
- text = text.replace(/
- (^|[^\\]) // Character before opening ` can't be a backslash
- (`+) // $2 = Opening run of `
- ( // $3 = The code block
- [^\r]*?
- [^`] // attacklab: work around lack of lookbehind
- )
- \2 // Matching closer
- (?!`)
- /gm, function(){...});
- */
-
- text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,
- function(wholeMatch,m1,m2,m3,m4) {
- var c = m3;
- c = c.replace(/^([ \t]*)/g,""); // leading whitespace
- c = c.replace(/[ \t]*$/g,""); // trailing whitespace
- c = _EncodeCode(c);
- return m1+"<code>"+c+"</code>";
- });
-
- return text;
-}
-
-
-var _EncodeCode = function(text) {
-//
-// Encode/escape certain characters inside Markdown code runs.
-// The point is that in code, these characters are literals,
-// and lose their special Markdown meanings.
-//
- // Encode all ampersands; HTML entities are not
- // entities within a Markdown code span.
- text = text.replace(/&/g,"&");
-
- // Do the angle bracket song and dance:
- text = text.replace(/</g,"<");
- text = text.replace(/>/g,">");
-
- // Now, escape characters that are magic in Markdown:
- text = escapeCharacters(text,"\*_{}[]\\",false);
-
-// jj the line above breaks this:
-//---
-
-//* Item
-
-// 1. Subitem
-
-// special char: *
-//---
-
- return text;
-}
-
-
-var _DoItalicsAndBold = function(text) {
-
- // <strong> must go first:
- text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,
- "<strong>$2</strong>");
-
- text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,
- "<em>$2</em>");
-
- return text;
-}
-
-
-var _DoBlockQuotes = function(text) {
-
- /*
- text = text.replace(/
- ( // Wrap whole match in $1
- (
- ^[ \t]*>[ \t]? // '>' at the start of a line
- .+\n // rest of the first line
- (.+\n)* // subsequent consecutive lines
- \n* // blanks
- )+
- )
- /gm, function(){...});
- */
-
- text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,
- function(wholeMatch,m1) {
- var bq = m1;
-
- // attacklab: hack around Konqueror 3.5.4 bug:
- // "----------bug".replace(/^-/g,"") == "bug"
-
- bq = bq.replace(/^[ \t]*>[ \t]?/gm,"~0"); // trim one level of quoting
-
- // attacklab: clean up hack
- bq = bq.replace(/~0/g,"");
-
- bq = bq.replace(/^[ \t]+$/gm,""); // trim whitespace-only lines
- bq = _RunBlockGamut(bq); // recurse
-
- bq = bq.replace(/(^|\n)/g,"$1 ");
- // These leading spaces screw with <pre> content, so we need to fix that:
- bq = bq.replace(
- /(\s*<pre>[^\r]+?<\/pre>)/gm,
- function(wholeMatch,m1) {
- var pre = m1;
- // attacklab: hack around Konqueror 3.5.4 bug:
- pre = pre.replace(/^ /mg,"~0");
- pre = pre.replace(/~0/g,"");
- return pre;
- });
-
- return hashBlock("<blockquote>\n" + bq + "\n</blockquote>");
- });
- return text;
-}
-
-
-var _FormParagraphs = function(text) {
-//
-// Params:
-// $text - string to process with html <p> tags
-//
-
- // Strip leading and trailing lines:
- text = text.replace(/^\n+/g,"");
- text = text.replace(/\n+$/g,"");
-
- var grafs = text.split(/\n{2,}/g);
- var grafsOut = new Array();
-
- //
- // Wrap <p> tags.
- //
- var end = grafs.length;
- for (var i=0; i<end; i++) {
- var str = grafs[i];
-
- // if this is an HTML marker, copy it
- if (str.search(/~K(\d+)K/g) >= 0) {
- grafsOut.push(str);
- }
- else if (str.search(/\S/) >= 0) {
- str = _RunSpanGamut(str);
- str = str.replace(/^([ \t]*)/g,"<p>");
- str += "</p>"
- grafsOut.push(str);
- }
-
- }
-
- //
- // Unhashify HTML blocks
- //
- end = grafsOut.length;
- for (var i=0; i<end; i++) {
- // if this is a marker for an html block...
- while (grafsOut[i].search(/~K(\d+)K/) >= 0) {
- var blockText = g_html_blocks[RegExp.$1];
- blockText = blockText.replace(/\$/g,"$$$$"); // Escape any dollar signs
- grafsOut[i] = grafsOut[i].replace(/~K\d+K/,blockText);
- }
- }
-
- return grafsOut.join("\n\n");
-}
-
-
-var _EncodeAmpsAndAngles = function(text) {
-// Smart processing for ampersands and angle brackets that need to be encoded.
-
- // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
- // http://bumppo.net/projects/amputator/
- text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&");
-
- // Encode naked <'s
- text = text.replace(/<(?![a-z\/?\$!])/gi,"<");
-
- return text;
-}
-
-
-var _EncodeBackslashEscapes = function(text) {
-//
-// Parameter: String.
-// Returns: The string, with after processing the following backslash
-// escape sequences.
-//
-
- // attacklab: The polite way to do this is with the new
- // escapeCharacters() function:
- //
- // text = escapeCharacters(text,"\\",true);
- // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
- //
- // ...but we're sidestepping its use of the (slow) RegExp constructor
- // as an optimization for Firefox. This function gets called a LOT.
-
- text = text.replace(/\\(\\)/g,escapeCharacters_callback);
- text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g,escapeCharacters_callback);
- return text;
-}
-
-
-var _DoAutoLinks = function(text) {
-
- text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"<a href=\"$1\">$1</a>");
-
- // Email addresses: <address@domain.foo>
-
- /*
- text = text.replace(/
- <
- (?:mailto:)?
- (
- [-.\w]+
- \@
- [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
- )
- >
- /gi, _DoAutoLinks_callback());
- */
- text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
- function(wholeMatch,m1) {
- return _EncodeEmailAddress( _UnescapeSpecialChars(m1) );
- }
- );
-
- return text;
-}
-
-
-var _EncodeEmailAddress = function(addr) {
-//
-// Input: an email address, e.g. "foo@example.com"
-//
-// Output: the email address as a mailto link, with each character
-// of the address encoded as either a decimal or hex entity, in
-// the hopes of foiling most address harvesting spam bots. E.g.:
-//
-// <a href="mailto:foo@e
-// xample.com">foo
-// @example.com</a>
-//
-// Based on a filter by Matthew Wickline, posted to the BBEdit-Talk
-// mailing list: <http://tinyurl.com/yu7ue>
-//
-
- // attacklab: why can't javascript speak hex?
- function char2hex(ch) {
- var hexDigits = '0123456789ABCDEF';
- var dec = ch.charCodeAt(0);
- return(hexDigits.charAt(dec>>4) + hexDigits.charAt(dec&15));
- }
-
- var encode = [
- function(ch){return "&#"+ch.charCodeAt(0)+";";},
- function(ch){return "&#x"+char2hex(ch)+";";},
- function(ch){return ch;}
- ];
-
- addr = "mailto:" + addr;
-
- addr = addr.replace(/./g, function(ch) {
- if (ch == "@") {
- // this *must* be encoded. I insist.
- ch = encode[Math.floor(Math.random()*2)](ch);
- } else if (ch !=":") {
- // leave ':' alone (to spot mailto: later)
- var r = Math.random();
- // roughly 10% raw, 45% hex, 45% dec
- ch = (
- r > .9 ? encode[2](ch) :
- r > .45 ? encode[1](ch) :
- encode[0](ch)
- );
- }
- return ch;
- });
-
- addr = "<a href=\"" + addr + "\">" + addr + "</a>";
- addr = addr.replace(/">.+:/g,"\">"); // strip the mailto: from the visible part
-
- return addr;
-}
-
-
-var _UnescapeSpecialChars = function(text) {
-//
-// Swap back in all the special characters we've hidden.
-//
- text = text.replace(/~E(\d+)E/g,
- function(wholeMatch,m1) {
- var charCodeToReplace = parseInt(m1);
- return String.fromCharCode(charCodeToReplace);
- }
- );
- return text;
-}
-
-
-var _Outdent = function(text) {
-//
-// Remove one level of line-leading tabs or spaces
-//
-
- // attacklab: hack around Konqueror 3.5.4 bug:
- // "----------bug".replace(/^-/g,"") == "bug"
-
- text = text.replace(/^(\t|[ ]{1,4})/gm,"~0"); // attacklab: g_tab_width
-
- // attacklab: clean up hack
- text = text.replace(/~0/g,"")
-
- return text;
-}
-
-var _Detab = function(text) {
-// attacklab: Detab's completely rewritten for speed.
-// In perl we could fix it by anchoring the regexp with \G.
-// In javascript we're less fortunate.
-
- // expand first n-1 tabs
- text = text.replace(/\t(?=\t)/g," "); // attacklab: g_tab_width
-
- // replace the nth with two sentinels
- text = text.replace(/\t/g,"~A~B");
-
- // use the sentinel to anchor our regex so it doesn't explode
- text = text.replace(/~B(.+?)~A/g,
- function(wholeMatch,m1,m2) {
- var leadingText = m1;
- var numSpaces = 4 - leadingText.length % 4; // attacklab: g_tab_width
-
- // there *must* be a better way to do this:
- for (var i=0; i<numSpaces; i++) leadingText+=" ";
-
- return leadingText;
- }
- );
-
- // clean up sentinels
- text = text.replace(/~A/g," "); // attacklab: g_tab_width
- text = text.replace(/~B/g,"");
-
- return text;
-}
-
-
-//
-// attacklab: Utility functions
-//
-
-
-var escapeCharacters = function(text, charsToEscape, afterBackslash) {
- // First we have to escape the escape characters so that
- // we can build a character class out of them
- var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g,"\\$1") + "])";
-
- if (afterBackslash) {
- regexString = "\\\\" + regexString;
- }
-
- var regex = new RegExp(regexString,"g");
- text = text.replace(regex,escapeCharacters_callback);
-
- return text;
-}
-
-
-var escapeCharacters_callback = function(wholeMatch,m1) {
- var charCodeToEscape = m1.charCodeAt(0);
- return "~E"+charCodeToEscape+"E";
-}
-
-} // end of Showdown.converter
-
-// export
-if (typeof exports != 'undefined') exports.Showdown = Showdown;
+//
+// showdown.js -- A javascript port of Markdown.
+//
+// Copyright (c) 2007 John Fraser.
+//
+// Original Markdown Copyright (c) 2004-2005 John Gruber
+// <http://daringfireball.net/projects/markdown/>
+//
+// Redistributable under a BSD-style open source license.
+// See license.txt for more information.
+//
+// The full source distribution is at:
+//
+// A A L
+// T C A
+// T K B
+//
+// <http://www.attacklab.net/>
+//
+
+//
+// Wherever possible, Showdown is a straight, line-by-line port
+// of the Perl version of Markdown.
+//
+// This is not a normal parser design; it's basically just a
+// series of string substitutions. It's hard to read and
+// maintain this way, but keeping Showdown close to the original
+// design makes it easier to port new features.
+//
+// More importantly, Showdown behaves like markdown.pl in most
+// edge cases. So web applications can do client-side preview
+// in Javascript, and then build identical HTML on the server.
+//
+// This port needs the new RegExp functionality of ECMA 262,
+// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers
+// should do fine. Even with the new regular expression features,
+// We do a lot of work to emulate Perl's regex functionality.
+// The tricky changes in this file mostly have the "attacklab:"
+// label. Major or self-explanatory changes don't.
+//
+// Smart diff tools like Araxis Merge will be able to match up
+// this file with markdown.pl in a useful way. A little tweaking
+// helps: in a copy of markdown.pl, replace "#" with "//" and
+// replace "$text" with "text". Be sure to ignore whitespace
+// and line endings.
+//
+
+
+//
+// Showdown usage:
+//
+// var text = "Markdown *rocks*.";
+//
+// var converter = new Showdown.converter();
+// var html = converter.makeHtml(text);
+//
+// alert(html);
+//
+// Note: move the sample code to the bottom of this
+// file before uncommenting it.
+//
+
+
+//
+// Showdown namespace
+//
+var Showdown = {};
+
+//
+// converter
+//
+// Wraps all "globals" so that the only thing
+// exposed is makeHtml().
+//
+Showdown.converter = function() {
+
+//
+// Globals:
+//
+
+// Global hashes, used by various utility routines
+var g_urls;
+var g_titles;
+var g_html_blocks;
+
+// Used to track when we're inside an ordered or unordered list
+// (see _ProcessListItems() for details):
+var g_list_level = 0;
+
+
+this.makeHtml = function(text) {
+//
+// Main function. The order in which other subs are called here is
+// essential. Link and image substitutions need to happen before
+// _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>
+// and <img> tags get encoded.
+//
+
+ // Clear the global hashes. If we don't clear these, you get conflicts
+ // from other articles when generating a page which contains more than
+ // one article (e.g. an index page that shows the N most recent
+ // articles):
+ g_urls = new Array();
+ g_titles = new Array();
+ g_html_blocks = new Array();
+
+ // attacklab: Replace ~ with ~T
+ // This lets us use tilde as an escape char to avoid md5 hashes
+ // The choice of character is arbitray; anything that isn't
+ // magic in Markdown will work.
+ text = text.replace(/~/g,"~T");
+
+ // attacklab: Replace $ with ~D
+ // RegExp interprets $ as a special character
+ // when it's in a replacement string
+ text = text.replace(/\$/g,"~D");
+
+ // Standardize line endings
+ text = text.replace(/\r\n/g,"\n"); // DOS to Unix
+ text = text.replace(/\r/g,"\n"); // Mac to Unix
+
+ // Make sure text begins and ends with a couple of newlines:
+ text = "\n\n" + text + "\n\n";
+
+ // Convert all tabs to spaces.
+ text = _Detab(text);
+
+ // Strip any lines consisting only of spaces and tabs.
+ // This makes subsequent regexen easier to write, because we can
+ // match consecutive blank lines with /\n+/ instead of something
+ // contorted like /[ \t]*\n+/ .
+ text = text.replace(/^[ \t]+$/mg,"");
+
+ // Turn block-level HTML blocks into hash entries
+ text = _HashHTMLBlocks(text);
+
+ // Strip link definitions, store in hashes.
+ text = _StripLinkDefinitions(text);
+
+ text = _RunBlockGamut(text);
+
+ text = _UnescapeSpecialChars(text);
+
+ // attacklab: Restore dollar signs
+ text = text.replace(/~D/g,"$$");
+
+ // attacklab: Restore tildes
+ text = text.replace(/~T/g,"~");
+
+ return text;
+}
+
+
+var _StripLinkDefinitions = function(text) {
+//
+// Strips link definitions from text, stores the URLs and titles in
+// hash references.
+//
+
+ // Link defs are in the form: ^[id]: url "optional title"
+
+ /*
+ var text = text.replace(/
+ ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1
+ [ \t]*
+ \n? // maybe *one* newline
+ [ \t]*
+ <?(\S+?)>? // url = $2
+ [ \t]*
+ \n? // maybe one newline
+ [ \t]*
+ (?:
+ (\n*) // any lines skipped = $3 attacklab: lookbehind removed
+ ["(]
+ (.+?) // title = $4
+ [")]
+ [ \t]*
+ )? // title is optional
+ (?:\n+|$)
+ /gm,
+ function(){...});
+ */
+ var text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,
+ function (wholeMatch,m1,m2,m3,m4) {
+ m1 = m1.toLowerCase();
+ g_urls[m1] = _EncodeAmpsAndAngles(m2); // Link IDs are case-insensitive
+ if (m3) {
+ // Oops, found blank lines, so it's not a title.
+ // Put back the parenthetical statement we stole.
+ return m3+m4;
+ } else if (m4) {
+ g_titles[m1] = m4.replace(/"/g,""");
+ }
+
+ // Completely remove the definition from the text
+ return "";
+ }
+ );
+
+ return text;
+}
+
+
+var _HashHTMLBlocks = function(text) {
+ // attacklab: Double up blank lines to reduce lookaround
+ text = text.replace(/\n/g,"\n\n");
+
+ // Hashify HTML blocks:
+ // We only want to do this for block-level HTML tags, such as headers,
+ // lists, and tables. That's because we still want to wrap <p>s around
+ // "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+ // phrase emphasis, and spans. The list of tags we're looking for is
+ // hard-coded:
+ var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del"
+ var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math"
+
+ // First, look for nested blocks, e.g.:
+ // <div>
+ // <div>
+ // tags for inner block must be indented.
+ // </div>
+ // </div>
+ //
+ // The outermost tags must start at the left margin for this to match, and
+ // the inner nested divs must be indented.
+ // We need to do this before the next, more liberal match, because the next
+ // match will start at the first `<div>` and stop at the first `</div>`.
+
+ // attacklab: This regex can be expensive when it fails.
+ /*
+ var text = text.replace(/
+ ( // save in $1
+ ^ // start of line (with /m)
+ <($block_tags_a) // start tag = $2
+ \b // word break
+ // attacklab: hack around khtml/pcre bug...
+ [^\r]*?\n // any number of lines, minimally matching
+ </\2> // the matching end tag
+ [ \t]* // trailing spaces/tabs
+ (?=\n+) // followed by a newline
+ ) // attacklab: there are sentinel newlines at end of document
+ /gm,function(){...}};
+ */
+ text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,hashElement);
+
+ //
+ // Now match more liberally, simply from `\n<tag>` to `</tag>\n`
+ //
+
+ /*
+ var text = text.replace(/
+ ( // save in $1
+ ^ // start of line (with /m)
+ <($block_tags_b) // start tag = $2
+ \b // word break
+ // attacklab: hack around khtml/pcre bug...
+ [^\r]*? // any number of lines, minimally matching
+ .*</\2> // the matching end tag
+ [ \t]* // trailing spaces/tabs
+ (?=\n+) // followed by a newline
+ ) // attacklab: there are sentinel newlines at end of document
+ /gm,function(){...}};
+ */
+ text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,hashElement);
+
+ // Special case just for <hr />. It was easier to make a special case than
+ // to make the other regex more complicated.
+
+ /*
+ text = text.replace(/
+ ( // save in $1
+ \n\n // Starting after a blank line
+ [ ]{0,3}
+ (<(hr) // start tag = $2
+ \b // word break
+ ([^<>])*? //
+ \/?>) // the matching end tag
+ [ \t]*
+ (?=\n{2,}) // followed by a blank line
+ )
+ /g,hashElement);
+ */
+ text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,hashElement);
+
+ // Special case for standalone HTML comments:
+
+ /*
+ text = text.replace(/
+ ( // save in $1
+ \n\n // Starting after a blank line
+ [ ]{0,3} // attacklab: g_tab_width - 1
+ <!
+ (--[^\r]*?--\s*)+
+ >
+ [ \t]*
+ (?=\n{2,}) // followed by a blank line
+ )
+ /g,hashElement);
+ */
+ text = text.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g,hashElement);
+
+ // PHP and ASP-style processor instructions (<?...?> and <%...%>)
+
+ /*
+ text = text.replace(/
+ (?:
+ \n\n // Starting after a blank line
+ )
+ ( // save in $1
+ [ ]{0,3} // attacklab: g_tab_width - 1
+ (?:
+ <([?%]) // $2
+ [^\r]*?
+ \2>
+ )
+ [ \t]*
+ (?=\n{2,}) // followed by a blank line
+ )
+ /g,hashElement);
+ */
+ text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,hashElement);
+
+ // attacklab: Undo double lines (see comment at top of this function)
+ text = text.replace(/\n\n/g,"\n");
+ return text;
+}
+
+var hashElement = function(wholeMatch,m1) {
+ var blockText = m1;
+
+ // Undo double lines
+ blockText = blockText.replace(/\n\n/g,"\n");
+ blockText = blockText.replace(/^\n/,"");
+
+ // strip trailing blank lines
+ blockText = blockText.replace(/\n+$/g,"");
+
+ // Replace the element text with a marker ("~KxK" where x is its key)
+ blockText = "\n\n~K" + (g_html_blocks.push(blockText)-1) + "K\n\n";
+
+ return blockText;
+};
+
+var _RunBlockGamut = function(text) {
+//
+// These are all the transformations that form block-level
+// tags like paragraphs, headers, and list items.
+//
+ text = _DoHeaders(text);
+
+ // Do Horizontal Rules:
+ var key = hashBlock("<hr />");
+ text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key);
+ text = text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key);
+ text = text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key);
+
+ text = _DoLists(text);
+ text = _DoCodeBlocks(text);
+ text = _DoBlockQuotes(text);
+
+ // We already ran _HashHTMLBlocks() before, in Markdown(), but that
+ // was to escape raw HTML in the original Markdown source. This time,
+ // we're escaping the markup we've just created, so that we don't wrap
+ // <p> tags around block-level tags.
+ text = _HashHTMLBlocks(text);
+ text = _FormParagraphs(text);
+
+ return text;
+}
+
+
+var _RunSpanGamut = function(text) {
+//
+// These are all the transformations that occur *within* block-level
+// tags like paragraphs, headers, and list items.
+//
+
+ text = _DoCodeSpans(text);
+ text = _EscapeSpecialCharsWithinTagAttributes(text);
+ text = _EncodeBackslashEscapes(text);
+
+ // Process anchor and image tags. Images must come first,
+ // because ![foo][f] looks like an anchor.
+ text = _DoImages(text);
+ text = _DoAnchors(text);
+
+ // Make links out of things like `<http://example.com/>`
+ // Must come after _DoAnchors(), because you can use < and >
+ // delimiters in inline links like [this](<url>).
+ text = _DoAutoLinks(text);
+ text = _EncodeAmpsAndAngles(text);
+ text = _DoItalicsAndBold(text);
+
+ // Do hard breaks:
+ text = text.replace(/ +\n/g," <br />\n");
+
+ return text;
+}
+
+var _EscapeSpecialCharsWithinTagAttributes = function(text) {
+//
+// Within tags -- meaning between < and > -- encode [\ ` * _] so they
+// don't conflict with their use in Markdown for code, italics and strong.
+//
+
+ // Build a regex to find HTML tags and comments. See Friedl's
+ // "Mastering Regular Expressions", 2nd Ed., pp. 200-201.
+ var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--.*?--\s*)+>)/gi;
+
+ text = text.replace(regex, function(wholeMatch) {
+ var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g,"$1`");
+ tag = escapeCharacters(tag,"\\`*_");
+ return tag;
+ });
+
+ return text;
+}
+
+var _DoAnchors = function(text) {
+//
+// Turn Markdown link shortcuts into XHTML <a> tags.
+//
+ //
+ // First, handle reference-style links: [link text] [id]
+ //
+
+ /*
+ text = text.replace(/
+ ( // wrap whole match in $1
+ \[
+ (
+ (?:
+ \[[^\]]*\] // allow brackets nested one level
+ |
+ [^\[] // or anything else
+ )*
+ )
+ \]
+
+ [ ]? // one optional space
+ (?:\n[ ]*)? // one optional newline followed by spaces
+
+ \[
+ (.*?) // id = $3
+ \]
+ )()()()() // pad remaining backreferences
+ /g,_DoAnchors_callback);
+ */
+ text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeAnchorTag);
+
+ //
+ // Next, inline-style links: [link text](url "optional title")
+ //
+
+ /*
+ text = text.replace(/
+ ( // wrap whole match in $1
+ \[
+ (
+ (?:
+ \[[^\]]*\] // allow brackets nested one level
+ |
+ [^\[\]] // or anything else
+ )
+ )
+ \]
+ \( // literal paren
+ [ \t]*
+ () // no id, so leave $3 empty
+ <?(.*?)>? // href = $4
+ [ \t]*
+ ( // $5
+ (['"]) // quote char = $6
+ (.*?) // Title = $7
+ \6 // matching quote
+ [ \t]* // ignore any spaces/tabs between closing quote and )
+ )? // title is optional
+ \)
+ )
+ /g,writeAnchorTag);
+ */
+ text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeAnchorTag);
+
+ //
+ // Last, handle reference-style shortcuts: [link text]
+ // These must come last in case you've also got [link test][1]
+ // or [link test](/foo)
+ //
+
+ /*
+ text = text.replace(/
+ ( // wrap whole match in $1
+ \[
+ ([^\[\]]+) // link text = $2; can't contain '[' or ']'
+ \]
+ )()()()()() // pad rest of backreferences
+ /g, writeAnchorTag);
+ */
+ text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag);
+
+ return text;
+}
+
+var writeAnchorTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {
+ if (m7 == undefined) m7 = "";
+ var whole_match = m1;
+ var link_text = m2;
+ var link_id = m3.toLowerCase();
+ var url = m4;
+ var title = m7;
+
+ if (url == "") {
+ if (link_id == "") {
+ // lower-case and turn embedded newlines into spaces
+ link_id = link_text.toLowerCase().replace(/ ?\n/g," ");
+ }
+ url = "#"+link_id;
+
+ if (g_urls[link_id] != undefined) {
+ url = g_urls[link_id];
+ if (g_titles[link_id] != undefined) {
+ title = g_titles[link_id];
+ }
+ }
+ else {
+ if (whole_match.search(/\(\s*\)$/m)>-1) {
+ // Special case for explicit empty url
+ url = "";
+ } else {
+ return whole_match;
+ }
+ }
+ }
+
+ url = escapeCharacters(url,"*_");
+ var result = "<a href=\"" + url + "\"";
+
+ if (title != "") {
+ title = title.replace(/"/g,""");
+ title = escapeCharacters(title,"*_");
+ result += " title=\"" + title + "\"";
+ }
+
+ result += ">" + link_text + "</a>";
+
+ return result;
+}
+
+
+var _DoImages = function(text) {
+//
+// Turn Markdown image shortcuts into <img> tags.
+//
+
+ //
+ // First, handle reference-style labeled images: ![alt text][id]
+ //
+
+ /*
+ text = text.replace(/
+ ( // wrap whole match in $1
+ !\[
+ (.*?) // alt text = $2
+ \]
+
+ [ ]? // one optional space
+ (?:\n[ ]*)? // one optional newline followed by spaces
+
+ \[
+ (.*?) // id = $3
+ \]
+ )()()()() // pad rest of backreferences
+ /g,writeImageTag);
+ */
+ text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeImageTag);
+
+ //
+ // Next, handle inline images: ![alt text](url "optional title")
+ // Don't forget: encode * and _
+
+ /*
+ text = text.replace(/
+ ( // wrap whole match in $1
+ !\[
+ (.*?) // alt text = $2
+ \]
+ \s? // One optional whitespace character
+ \( // literal paren
+ [ \t]*
+ () // no id, so leave $3 empty
+ <?(\S+?)>? // src url = $4
+ [ \t]*
+ ( // $5
+ (['"]) // quote char = $6
+ (.*?) // title = $7
+ \6 // matching quote
+ [ \t]*
+ )? // title is optional
+ \)
+ )
+ /g,writeImageTag);
+ */
+ text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeImageTag);
+
+ return text;
+}
+
+var writeImageTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {
+ var whole_match = m1;
+ var alt_text = m2;
+ var link_id = m3.toLowerCase();
+ var url = m4;
+ var title = m7;
+
+ if (!title) title = "";
+
+ if (url == "") {
+ if (link_id == "") {
+ // lower-case and turn embedded newlines into spaces
+ link_id = alt_text.toLowerCase().replace(/ ?\n/g," ");
+ }
+ url = "#"+link_id;
+
+ if (g_urls[link_id] != undefined) {
+ url = g_urls[link_id];
+ if (g_titles[link_id] != undefined) {
+ title = g_titles[link_id];
+ }
+ }
+ else {
+ return whole_match;
+ }
+ }
+
+ alt_text = alt_text.replace(/"/g,""");
+ url = escapeCharacters(url,"*_");
+ var result = "<img src=\"" + url + "\" alt=\"" + alt_text + "\"";
+
+ // attacklab: Markdown.pl adds empty title attributes to images.
+ // Replicate this bug.
+
+ //if (title != "") {
+ title = title.replace(/"/g,""");
+ title = escapeCharacters(title,"*_");
+ result += " title=\"" + title + "\"";
+ //}
+
+ result += " />";
+
+ return result;
+}
+
+
+var _DoHeaders = function(text) {
+
+ // Setext-style headers:
+ // Header 1
+ // ========
+ //
+ // Header 2
+ // --------
+ //
+ text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,
+ function(wholeMatch,m1){return hashBlock('<h1 id="' + headerId(m1) + '">' + _RunSpanGamut(m1) + "</h1>");});
+
+ text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,
+ function(matchFound,m1){return hashBlock('<h2 id="' + headerId(m1) + '">' + _RunSpanGamut(m1) + "</h2>");});
+
+ // atx-style headers:
+ // # Header 1
+ // ## Header 2
+ // ## Header 2 with closing hashes ##
+ // ...
+ // ###### Header 6
+ //
+
+ /*
+ text = text.replace(/
+ ^(\#{1,6}) // $1 = string of #'s
+ [ \t]*
+ (.+?) // $2 = Header text
+ [ \t]*
+ \#* // optional closing #'s (not counted)
+ \n+
+ /gm, function() {...});
+ */
+
+ text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,
+ function(wholeMatch,m1,m2) {
+ var h_level = m1.length;
+ return hashBlock("<h" + h_level + ' id="' + headerId(m2) + '">' + _RunSpanGamut(m2) + "</h" + h_level + ">");
+ });
+
+ function headerId(m) {
+ return m.replace(/[^\w]/g, '').toLowerCase();
+ }
+ return text;
+}
+
+// This declaration keeps Dojo compressor from outputting garbage:
+var _ProcessListItems;
+
+var _DoLists = function(text) {
+//
+// Form HTML ordered (numbered) and unordered (bulleted) lists.
+//
+
+ // attacklab: add sentinel to hack around khtml/safari bug:
+ // http://bugs.webkit.org/show_bug.cgi?id=11231
+ text += "~0";
+
+ // Re-usable pattern to match any entirel ul or ol list:
+
+ /*
+ var whole_list = /
+ ( // $1 = whole list
+ ( // $2
+ [ ]{0,3} // attacklab: g_tab_width - 1
+ ([*+-]|\d+[.]) // $3 = first list item marker
+ [ \t]+
+ )
+ [^\r]+?
+ ( // $4
+ ~0 // sentinel for workaround; should be $
+ |
+ \n{2,}
+ (?=\S)
+ (?! // Negative lookahead for another list item marker
+ [ \t]*
+ (?:[*+-]|\d+[.])[ \t]+
+ )
+ )
+ )/g
+ */
+ var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
+
+ if (g_list_level) {
+ text = text.replace(whole_list,function(wholeMatch,m1,m2) {
+ var list = m1;
+ var list_type = (m2.search(/[*+-]/g)>-1) ? "ul" : "ol";
+
+ // Turn double returns into triple returns, so that we can make a
+ // paragraph for the last item in a list, if necessary:
+ list = list.replace(/\n{2,}/g,"\n\n\n");;
+ var result = _ProcessListItems(list);
+
+ // Trim any trailing whitespace, to put the closing `</$list_type>`
+ // up on the preceding line, to get it past the current stupid
+ // HTML block parser. This is a hack to work around the terrible
+ // hack that is the HTML block parser.
+ result = result.replace(/\s+$/,"");
+ result = "<"+list_type+">" + result + "</"+list_type+">\n";
+ return result;
+ });
+ } else {
+ whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g;
+ text = text.replace(whole_list,function(wholeMatch,m1,m2,m3) {
+ var runup = m1;
+ var list = m2;
+
+ var list_type = (m3.search(/[*+-]/g)>-1) ? "ul" : "ol";
+ // Turn double returns into triple returns, so that we can make a
+ // paragraph for the last item in a list, if necessary:
+ var list = list.replace(/\n{2,}/g,"\n\n\n");;
+ var result = _ProcessListItems(list);
+ result = runup + "<"+list_type+">\n" + result + "</"+list_type+">\n";
+ return result;
+ });
+ }
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/,"");
+
+ return text;
+}
+
+_ProcessListItems = function(list_str) {
+//
+// Process the contents of a single ordered or unordered list, splitting it
+// into individual list items.
+//
+ // The $g_list_level global keeps track of when we're inside a list.
+ // Each time we enter a list, we increment it; when we leave a list,
+ // we decrement. If it's zero, we're not in a list anymore.
+ //
+ // We do this because when we're not inside a list, we want to treat
+ // something like this:
+ //
+ // I recommend upgrading to version
+ // 8. Oops, now this line is treated
+ // as a sub-list.
+ //
+ // As a single paragraph, despite the fact that the second line starts
+ // with a digit-period-space sequence.
+ //
+ // Whereas when we're inside a list (or sub-list), that line will be
+ // treated as the start of a sub-list. What a kludge, huh? This is
+ // an aspect of Markdown's syntax that's hard to parse perfectly
+ // without resorting to mind-reading. Perhaps the solution is to
+ // change the syntax rules such that sub-lists must start with a
+ // starting cardinal number; e.g. "1." or "a.".
+
+ g_list_level++;
+
+ // trim trailing blank lines:
+ list_str = list_str.replace(/\n{2,}$/,"\n");
+
+ // attacklab: add sentinel to emulate \z
+ list_str += "~0";
+
+ /*
+ list_str = list_str.replace(/
+ (\n)? // leading line = $1
+ (^[ \t]*) // leading whitespace = $2
+ ([*+-]|\d+[.]) [ \t]+ // list marker = $3
+ ([^\r]+? // list item text = $4
+ (\n{1,2}))
+ (?= \n* (~0 | \2 ([*+-]|\d+[.]) [ \t]+))
+ /gm, function(){...});
+ */
+ list_str = list_str.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,
+ function(wholeMatch,m1,m2,m3,m4){
+ var item = m4;
+ var leading_line = m1;
+ var leading_space = m2;
+
+ if (leading_line || (item.search(/\n{2,}/)>-1)) {
+ item = _RunBlockGamut(_Outdent(item));
+ }
+ else {
+ // Recursion for sub-lists:
+ item = _DoLists(_Outdent(item));
+ item = item.replace(/\n$/,""); // chomp(item)
+ item = _RunSpanGamut(item);
+ }
+
+ return "<li>" + item + "</li>\n";
+ }
+ );
+
+ // attacklab: strip sentinel
+ list_str = list_str.replace(/~0/g,"");
+
+ g_list_level--;
+ return list_str;
+}
+
+
+var _DoCodeBlocks = function(text) {
+//
+// Process Markdown `<pre><code>` blocks.
+//
+
+ /*
+ text = text.replace(text,
+ /(?:\n\n|^)
+ ( // $1 = the code block -- one or more lines, starting with a space/tab
+ (?:
+ (?:[ ]{4}|\t) // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
+ .*\n+
+ )+
+ )
+ (\n*[ ]{0,3}[^ \t\n]|(?=~0)) // attacklab: g_tab_width
+ /g,function(){...});
+ */
+
+ // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
+ text += "~0";
+
+ text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
+ function(wholeMatch,m1,m2) {
+ var codeblock = m1;
+ var nextChar = m2;
+
+ codeblock = _EncodeCode( _Outdent(codeblock));
+ codeblock = _Detab(codeblock);
+ codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines
+ codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace
+
+ codeblock = "<pre><code>" + codeblock + "\n</code></pre>";
+
+ return hashBlock(codeblock) + nextChar;
+ }
+ );
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/,"");
+
+ return text;
+}
+
+var hashBlock = function(text) {
+ text = text.replace(/(^\n+|\n+$)/g,"");
+ return "\n\n~K" + (g_html_blocks.push(text)-1) + "K\n\n";
+}
+
+
+var _DoCodeSpans = function(text) {
+//
+// * Backtick quotes are used for <code></code> spans.
+//
+// * You can use multiple backticks as the delimiters if you want to
+// include literal backticks in the code span. So, this input:
+//
+// Just type ``foo `bar` baz`` at the prompt.
+//
+// Will translate to:
+//
+// <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
+//
+// There's no arbitrary limit to the number of backticks you
+// can use as delimters. If you need three consecutive backticks
+// in your code, use four for delimiters, etc.
+//
+// * You can use spaces to get literal backticks at the edges:
+//
+// ... type `` `bar` `` ...
+//
+// Turns to:
+//
+// ... type <code>`bar`</code> ...
+//
+
+ /*
+ text = text.replace(/
+ (^|[^\\]) // Character before opening ` can't be a backslash
+ (`+) // $2 = Opening run of `
+ ( // $3 = The code block
+ [^\r]*?
+ [^`] // attacklab: work around lack of lookbehind
+ )
+ \2 // Matching closer
+ (?!`)
+ /gm, function(){...});
+ */
+
+ text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,
+ function(wholeMatch,m1,m2,m3,m4) {
+ var c = m3;
+ c = c.replace(/^([ \t]*)/g,""); // leading whitespace
+ c = c.replace(/[ \t]*$/g,""); // trailing whitespace
+ c = _EncodeCode(c);
+ return m1+"<code>"+c+"</code>";
+ });
+
+ return text;
+}
+
+
+var _EncodeCode = function(text) {
+//
+// Encode/escape certain characters inside Markdown code runs.
+// The point is that in code, these characters are literals,
+// and lose their special Markdown meanings.
+//
+ // Encode all ampersands; HTML entities are not
+ // entities within a Markdown code span.
+ text = text.replace(/&/g,"&");
+
+ // Do the angle bracket song and dance:
+ text = text.replace(/</g,"<");
+ text = text.replace(/>/g,">");
+
+ // Now, escape characters that are magic in Markdown:
+ text = escapeCharacters(text,"\*_{}[]\\",false);
+
+// jj the line above breaks this:
+//---
+
+//* Item
+
+// 1. Subitem
+
+// special char: *
+//---
+
+ return text;
+}
+
+
+var _DoItalicsAndBold = function(text) {
+
+ // <strong> must go first:
+ text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,
+ "<strong>$2</strong>");
+
+ text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,
+ "<em>$2</em>");
+
+ return text;
+}
+
+
+var _DoBlockQuotes = function(text) {
+
+ /*
+ text = text.replace(/
+ ( // Wrap whole match in $1
+ (
+ ^[ \t]*>[ \t]? // '>' at the start of a line
+ .+\n // rest of the first line
+ (.+\n)* // subsequent consecutive lines
+ \n* // blanks
+ )+
+ )
+ /gm, function(){...});
+ */
+
+ text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,
+ function(wholeMatch,m1) {
+ var bq = m1;
+
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ // "----------bug".replace(/^-/g,"") == "bug"
+
+ bq = bq.replace(/^[ \t]*>[ \t]?/gm,"~0"); // trim one level of quoting
+
+ // attacklab: clean up hack
+ bq = bq.replace(/~0/g,"");
+
+ bq = bq.replace(/^[ \t]+$/gm,""); // trim whitespace-only lines
+ bq = _RunBlockGamut(bq); // recurse
+
+ bq = bq.replace(/(^|\n)/g,"$1 ");
+ // These leading spaces screw with <pre> content, so we need to fix that:
+ bq = bq.replace(
+ /(\s*<pre>[^\r]+?<\/pre>)/gm,
+ function(wholeMatch,m1) {
+ var pre = m1;
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ pre = pre.replace(/^ /mg,"~0");
+ pre = pre.replace(/~0/g,"");
+ return pre;
+ });
+
+ return hashBlock("<blockquote>\n" + bq + "\n</blockquote>");
+ });
+ return text;
+}
+
+
+var _FormParagraphs = function(text) {
+//
+// Params:
+// $text - string to process with html <p> tags
+//
+
+ // Strip leading and trailing lines:
+ text = text.replace(/^\n+/g,"");
+ text = text.replace(/\n+$/g,"");
+
+ var grafs = text.split(/\n{2,}/g);
+ var grafsOut = new Array();
+
+ //
+ // Wrap <p> tags.
+ //
+ var end = grafs.length;
+ for (var i=0; i<end; i++) {
+ var str = grafs[i];
+
+ // if this is an HTML marker, copy it
+ if (str.search(/~K(\d+)K/g) >= 0) {
+ grafsOut.push(str);
+ }
+ else if (str.search(/\S/) >= 0) {
+ str = _RunSpanGamut(str);
+ str = str.replace(/^([ \t]*)/g,"<p>");
+ str += "</p>"
+ grafsOut.push(str);
+ }
+
+ }
+
+ //
+ // Unhashify HTML blocks
+ //
+ end = grafsOut.length;
+ for (var i=0; i<end; i++) {
+ // if this is a marker for an html block...
+ while (grafsOut[i].search(/~K(\d+)K/) >= 0) {
+ var blockText = g_html_blocks[RegExp.$1];
+ blockText = blockText.replace(/\$/g,"$$$$"); // Escape any dollar signs
+ grafsOut[i] = grafsOut[i].replace(/~K\d+K/,blockText);
+ }
+ }
+
+ return grafsOut.join("\n\n");
+}
+
+
+var _EncodeAmpsAndAngles = function(text) {
+// Smart processing for ampersands and angle brackets that need to be encoded.
+
+ // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
+ // http://bumppo.net/projects/amputator/
+ text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&");
+
+ // Encode naked <'s
+ text = text.replace(/<(?![a-z\/?\$!])/gi,"<");
+
+ return text;
+}
+
+
+var _EncodeBackslashEscapes = function(text) {
+//
+// Parameter: String.
+// Returns: The string, with after processing the following backslash
+// escape sequences.
+//
+
+ // attacklab: The polite way to do this is with the new
+ // escapeCharacters() function:
+ //
+ // text = escapeCharacters(text,"\\",true);
+ // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
+ //
+ // ...but we're sidestepping its use of the (slow) RegExp constructor
+ // as an optimization for Firefox. This function gets called a LOT.
+
+ text = text.replace(/\\(\\)/g,escapeCharacters_callback);
+ text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g,escapeCharacters_callback);
+ return text;
+}
+
+
+var _DoAutoLinks = function(text) {
+
+ text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"<a href=\"$1\">$1</a>");
+
+ // Email addresses: <address@domain.foo>
+
+ /*
+ text = text.replace(/
+ <
+ (?:mailto:)?
+ (
+ [-.\w]+
+ \@
+ [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
+ )
+ >
+ /gi, _DoAutoLinks_callback());
+ */
+ text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
+ function(wholeMatch,m1) {
+ return _EncodeEmailAddress( _UnescapeSpecialChars(m1) );
+ }
+ );
+
+ return text;
+}
+
+
+var _EncodeEmailAddress = function(addr) {
+//
+// Input: an email address, e.g. "foo@example.com"
+//
+// Output: the email address as a mailto link, with each character
+// of the address encoded as either a decimal or hex entity, in
+// the hopes of foiling most address harvesting spam bots. E.g.:
+//
+// <a href="mailto:foo@e
+// xample.com">foo
+// @example.com</a>
+//
+// Based on a filter by Matthew Wickline, posted to the BBEdit-Talk
+// mailing list: <http://tinyurl.com/yu7ue>
+//
+
+ // attacklab: why can't javascript speak hex?
+ function char2hex(ch) {
+ var hexDigits = '0123456789ABCDEF';
+ var dec = ch.charCodeAt(0);
+ return(hexDigits.charAt(dec>>4) + hexDigits.charAt(dec&15));
+ }
+
+ var encode = [
+ function(ch){return "&#"+ch.charCodeAt(0)+";";},
+ function(ch){return "&#x"+char2hex(ch)+";";},
+ function(ch){return ch;}
+ ];
+
+ addr = "mailto:" + addr;
+
+ addr = addr.replace(/./g, function(ch) {
+ if (ch == "@") {
+ // this *must* be encoded. I insist.
+ ch = encode[Math.floor(Math.random()*2)](ch);
+ } else if (ch !=":") {
+ // leave ':' alone (to spot mailto: later)
+ var r = Math.random();
+ // roughly 10% raw, 45% hex, 45% dec
+ ch = (
+ r > .9 ? encode[2](ch) :
+ r > .45 ? encode[1](ch) :
+ encode[0](ch)
+ );
+ }
+ return ch;
+ });
+
+ addr = "<a href=\"" + addr + "\">" + addr + "</a>";
+ addr = addr.replace(/">.+:/g,"\">"); // strip the mailto: from the visible part
+
+ return addr;
+}
+
+
+var _UnescapeSpecialChars = function(text) {
+//
+// Swap back in all the special characters we've hidden.
+//
+ text = text.replace(/~E(\d+)E/g,
+ function(wholeMatch,m1) {
+ var charCodeToReplace = parseInt(m1);
+ return String.fromCharCode(charCodeToReplace);
+ }
+ );
+ return text;
+}
+
+
+var _Outdent = function(text) {
+//
+// Remove one level of line-leading tabs or spaces
+//
+
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ // "----------bug".replace(/^-/g,"") == "bug"
+
+ text = text.replace(/^(\t|[ ]{1,4})/gm,"~0"); // attacklab: g_tab_width
+
+ // attacklab: clean up hack
+ text = text.replace(/~0/g,"")
+
+ return text;
+}
+
+var _Detab = function(text) {
+// attacklab: Detab's completely rewritten for speed.
+// In perl we could fix it by anchoring the regexp with \G.
+// In javascript we're less fortunate.
+
+ // expand first n-1 tabs
+ text = text.replace(/\t(?=\t)/g," "); // attacklab: g_tab_width
+
+ // replace the nth with two sentinels
+ text = text.replace(/\t/g,"~A~B");
+
+ // use the sentinel to anchor our regex so it doesn't explode
+ text = text.replace(/~B(.+?)~A/g,
+ function(wholeMatch,m1,m2) {
+ var leadingText = m1;
+ var numSpaces = 4 - leadingText.length % 4; // attacklab: g_tab_width
+
+ // there *must* be a better way to do this:
+ for (var i=0; i<numSpaces; i++) leadingText+=" ";
+
+ return leadingText;
+ }
+ );
+
+ // clean up sentinels
+ text = text.replace(/~A/g," "); // attacklab: g_tab_width
+ text = text.replace(/~B/g,"");
+
+ return text;
+}
+
+
+//
+// attacklab: Utility functions
+//
+
+
+var escapeCharacters = function(text, charsToEscape, afterBackslash) {
+ // First we have to escape the escape characters so that
+ // we can build a character class out of them
+ var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g,"\\$1") + "])";
+
+ if (afterBackslash) {
+ regexString = "\\\\" + regexString;
+ }
+
+ var regex = new RegExp(regexString,"g");
+ text = text.replace(regex,escapeCharacters_callback);
+
+ return text;
+}
+
+
+var escapeCharacters_callback = function(wholeMatch,m1) {
+ var charCodeToEscape = m1.charCodeAt(0);
+ return "~E"+charCodeToEscape+"E";
+}
+
+} // end of Showdown.converter
+
+// export
+if (typeof exports != 'undefined') exports.Showdown = Showdown;
diff --git a/Editor/src/AutoCorrect.js b/Editor/src/AutoCorrect.js
index 7bb0783..a80e17d 100644
--- a/Editor/src/AutoCorrect.js
+++ b/Editor/src/AutoCorrect.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var AutoCorrect_init;
var AutoCorrect_removeListeners;
diff --git a/Editor/src/ChangeTracking.js b/Editor/src/ChangeTracking.js
index 9704b17..ba25a44 100644
--- a/Editor/src/ChangeTracking.js
+++ b/Editor/src/ChangeTracking.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var ChangeTracking_showChanges;
var ChangeTracking_trackChanges;
diff --git a/Editor/src/Clipboard.js b/Editor/src/Clipboard.js
index a0c5381..03efdcc 100644
--- a/Editor/src/Clipboard.js
+++ b/Editor/src/Clipboard.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Markdown_htmlToMarkdown;
var Clipboard_htmlToText;
diff --git a/Editor/src/Cursor.js b/Editor/src/Cursor.js
index 606c4bd..7362a9e 100644
--- a/Editor/src/Cursor.js
+++ b/Editor/src/Cursor.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Cursor_ensurePositionVisible;
var Cursor_ensureCursorVisible;
@@ -494,6 +497,39 @@
Cursor_ensureCursorVisible();
}
+ function tryDeleteEmptyCaption(pos)
+ {
+ var caption = Position_captionAncestor(pos);
+ if ((caption == null) || nodeHasContent(caption))
+ return false;
+
+ var container = Position_figureOrTableAncestor(pos);
+ if (container == null)
+ return false;
+
+ Cursor_set(container.parentNode,DOM_nodeOffset(container)+1);
+ Selection_preserveWhileExecuting(function() {
+ DOM_deleteNode(caption);
+ });
+
+ return true;
+ }
+
+ function tryDeleteEmptyNote(pos)
+ {
+ var note = Position_noteAncestor(pos);
+ if ((note == null) || nodeHasContent(note))
+ return false;
+
+ var parent = note.parentNode;
+ Cursor_set(note.parentNode,DOM_nodeOffset(note)+1);
+ Selection_preserveWhileExecuting(function() {
+ DOM_deleteNode(note);
+ });
+
+ return true;
+ }
+
// public
Cursor_deleteCharacter = function()
{
@@ -511,7 +547,8 @@
else {
var currentPos = selRange.start;
- // Special case of pressing backspace after a table, figure, or TOC
+ // Special cases of pressing backspace after a table, figure, TOC, hyperlink,
+ // footnote, or endnote. For each of these we delete the whole thing.
var back = Position_closestMatchBackwards(currentPos,Position_okForMovement);
if ((back != null) && (back.node.nodeType == Node.ELEMENT_NODE) && (back.offset > 0)) {
var prevNode = back.node.childNodes[back.offset-1];
@@ -524,7 +561,7 @@
Cursor_ensureCursorVisible();
return;
}
- if (prevNode._type == HTML_A) {
+ if ((prevNode._type == HTML_A) || isNoteNode(prevNode)) {
Cursor_set(back.node,back.offset-1);
Selection_preserveWhileExecuting(function() {
DOM_deleteNode(prevNode);
@@ -533,8 +570,19 @@
}
}
+ // Backspace inside an empty figure or table caption
+ if (tryDeleteEmptyCaption(currentPos))
+ return;
+
currentPos = Position_preferTextPosition(currentPos);
var prevPos = Position_prevMatch(currentPos,Position_okForMovement);
+
+ // Backspace inside or just after a footnote or endnote
+ if (tryDeleteEmptyNote(currentPos))
+ return;
+ if ((prevPos != null) && tryDeleteEmptyNote(prevPos))
+ return;
+
if (prevPos != null) {
var startBlock = firstBlockAncestor(Position_closestActualNode(prevPos));
var endBlock = firstBlockAncestor(Position_closestActualNode(selRange.end));
@@ -606,6 +654,27 @@
}
}
+ // Are we inside a footnote or endnote? If so, move the cursor immediately after it
+ var note = null;
+ if (selRange.start.node.nodeType == Node.TEXT_NODE) {
+ note = Position_noteAncestor(selRange.start);
+ }
+ else {
+ // We can't use Position_noteAncestor in this case, because we want to to break
+ // the paragraph *before* the note, not after
+ var checkNode = selRange.start.node;
+ for (var anc = checkNode; anc != null; anc = anc.parentNode) {
+ if (isNoteNode(anc)) {
+ note = anc;
+ break;
+ }
+ }
+ }
+ if (note != null) {
+ var noteOffset = DOM_nodeOffset(note);
+ selRange = new Range(note.parentNode,noteOffset+1,note.parentNode,noteOffset+1);
+ }
+
var check = Position_preferElementPosition(selRange.start);
if (check.node.nodeType == Node.ELEMENT_NODE) {
var before = check.node.childNodes[check.offset-1];
@@ -802,16 +871,31 @@
Cursor_getAdjacentNodeWithType = function(type)
{
var selRange = Selection_get();
- var position = selRange.start;
- while (position != null) {
- var node = Position_closestActualNode(position);
- for (; node != null; node = node.parentNode) {
- if (node._type == type)
- return node;
+ var pos = Position_preferElementPosition(selRange.start);
+ var node = pos.node;
+ var offset = pos.offset;
+
+ while (true) {
+
+ if (node._type == type)
+ return node;
+
+ if (node.nodeType == Node.ELEMENT_NODE) {
+ var before = node.childNodes[offset-1];
+ if ((before != null) && (before._type == type))
+ return before;
+
+ var after = node.childNodes[offset];
+ if ((after != null) && (after._type == type))
+ return after;
}
- position = Position_prev(position);
+
+ if (node.parentNode == null)
+ return null;
+
+ offset = DOM_nodeOffset(node);
+ node = node.parentNode;
}
- return null;
}
Cursor_getLinkProperties = function()
@@ -905,6 +989,22 @@
cursorX = null;
}
+ function moveRangeOutsideOfNote(range)
+ {
+ var node = range.start.node;
+ var offset = range.start.offset;
+
+ for (var anc = node; anc != null; anc = anc.parentNode) {
+ if (isNoteNode(anc) && (anc.parentNode != null)) {
+ node = anc.parentNode;
+ offset = DOM_nodeOffset(anc)+1;
+ return new Range(node,offset,node,offset);
+ }
+ }
+
+ return range;
+ }
+
function insertNote(className,content)
{
var footnote = DOM_createElement(document,"span");
@@ -912,9 +1012,25 @@
DOM_appendChild(footnote,DOM_createTextNode(document,content));
var range = Selection_get();
+ range = moveRangeOutsideOfNote(range);
Formatting_splitAroundSelection(range,false);
- var pos = Position_preferElementPosition(range.start);
+ // If we're part-way through a text node, splitAroundSelection will give us an
+ // empty text node between the before and after text. For formatting purposes that's
+ // fine (not sure if necessary), but when inserting a footnote or endnote we want
+ // to avoid this as it causes problems with cursor movement - specifically, the cursor
+ // is allowed to go inside the empty text node, and this doesn't show up in the correct
+ // position on screen.
+ var pos = range.start;
+ if ((pos.node._type == HTML_TEXT) &&
+ (pos.node.nodeValue.length == 0)) {
+ var empty = pos.node;
+ pos = new Position(empty.parentNode,DOM_nodeOffset(empty));
+ DOM_deleteNode(empty);
+ }
+ else {
+ pos = Position_preferElementPosition(pos);
+ }
DOM_insertBefore(pos.node,footnote,pos.node.childNodes[pos.offset]);
Selection_set(footnote,0,footnote,footnote.childNodes.length);
diff --git a/Editor/src/DOM.js b/Editor/src/DOM.js
index 723f20e..b2371bc 100644
--- a/Editor/src/DOM.js
+++ b/Editor/src/DOM.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
// Helper functions
var DOM_assignNodeIds;
diff --git a/Editor/src/Editor.js b/Editor/src/Editor.js
index 88a6ce2..50f0d21 100644
--- a/Editor/src/Editor.js
+++ b/Editor/src/Editor.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Editor_getBackMessages;
var Editor_debug;
diff --git a/Editor/src/Equations.js b/Editor/src/Equations.js
index d18d21d..46bace8 100644
--- a/Editor/src/Equations.js
+++ b/Editor/src/Equations.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Equations_insertEquation;
diff --git a/Editor/src/Figures.js b/Editor/src/Figures.js
index 21c8511..dcda1fc 100644
--- a/Editor/src/Figures.js
+++ b/Editor/src/Figures.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Figures_insertFigure;
var Figures_getSelectedFigureId;
diff --git a/Editor/src/Formatting.js b/Editor/src/Formatting.js
index 625b928..51bc5d3 100644
--- a/Editor/src/Formatting.js
+++ b/Editor/src/Formatting.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Formatting_splitTextBefore;
var Formatting_splitTextAfter;
@@ -123,12 +126,12 @@
range.start.offset = 0;
}
else if (range.start.node.nodeType == Node.ELEMENT_NODE) {
- Formatting_movePreceding(range.start,isBlockNode);
+ Formatting_movePreceding(range.start,isBlockOrNoteNode);
}
else {
Formatting_movePreceding(new Position(range.start.node.parentNode,
DOM_nodeOffset(range.start.node)),
- isBlockNode);
+ isBlockOrNoteNode);
}
// Save the start and end position of the range. The mutation listeners will move it
@@ -143,12 +146,12 @@
Formatting_splitTextAfter(range.end);
}
else if (range.end.node.nodeType == Node.ELEMENT_NODE) {
- Formatting_moveFollowing(range.end,isBlockNode);
+ Formatting_moveFollowing(range.end,isBlockOrNoteNode);
}
else {
Formatting_moveFollowing(new Position(range.end.node.parentNode,
DOM_nodeOffset(range.end.node)+1),
- isBlockNode);
+ isBlockOrNoteNode);
}
range.start.node = startNode;
@@ -1038,7 +1041,10 @@
if (span._type == HTML_SPAN) {
if (span.hasAttribute(Keys.ABSTRACT_ELEMENT))
return true;
- if (DOM_getStringAttribute(span,"class").indexOf(Keys.UXWRITE_PREFIX) == 0)
+ var className = DOM_getStringAttribute(span,"class");
+ if (className.indexOf(Keys.UXWRITE_PREFIX) == 0)
+ return true;
+ if ((className == "footnote") || (className == "endnote"))
return true;
}
return false;
diff --git a/Editor/src/Hierarchy.js b/Editor/src/Hierarchy.js
index 3151082..07c0526 100644
--- a/Editor/src/Hierarchy.js
+++ b/Editor/src/Hierarchy.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Hierarchy_ensureValidHierarchy;
var Hierarchy_ensureInlineNodesInParagraph;
diff --git a/Editor/src/Input.js b/Editor/src/Input.js
index 0be1294..db8cb99 100644
--- a/Editor/src/Input.js
+++ b/Editor/src/Input.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Input_removePosition;
var Input_addPosition;
diff --git a/Editor/src/Lists.js b/Editor/src/Lists.js
index 2a72520..a3a9772 100644
--- a/Editor/src/Lists.js
+++ b/Editor/src/Lists.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Lists_increaseIndent;
var Lists_decreaseIndent;
diff --git a/Editor/src/Main.js b/Editor/src/Main.js
index 98eccbf..f123423 100644
--- a/Editor/src/Main.js
+++ b/Editor/src/Main.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Main_getLanguage;
var Main_setLanguage;
diff --git a/Editor/src/Metadata.js b/Editor/src/Metadata.js
index 668c44e..fce4cca 100644
--- a/Editor/src/Metadata.js
+++ b/Editor/src/Metadata.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Metadata_getMetadata;
var Metadata_setMetadata;
diff --git a/Editor/src/NodeSet.js b/Editor/src/NodeSet.js
index 00e63bc..77b7600 100644
--- a/Editor/src/NodeSet.js
+++ b/Editor/src/NodeSet.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function NodeSet()
{
diff --git a/Editor/src/Outline.js b/Editor/src/Outline.js
index 4d838df..9812041 100644
--- a/Editor/src/Outline.js
+++ b/Editor/src/Outline.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
// FIXME: The TOC/ItemList stuff won't work with Undo, because we're making DOM mutations in
// response to other DOM mutations, so at undo time the changes will be made twice
@@ -1099,7 +1102,19 @@
}
});
+ // Ensure the cursor or selection start/end positions are valid positions that the
+ // user is allowed to move to. This ensures we get an accurate rect for each position,
+ // avoiding an ugly effect where the cursor occupies the entire height of the document
+ // and is displayed on the far-left edge of the editing area.
+ var selRange = Selection_get();
+ if (selRange != null) {
+ var start = Position_closestMatchForwards(selRange.start,Position_okForMovement);
+ var end = Position_closestMatchForwards(selRange.end,Position_okForMovement);
+ Selection_set(start.node,start.offset,end.node,end.offset);
+ }
+
scheduleUpdateStructure();
+ PostponedActions_add(Cursor_ensureCursorVisible);
PostponedActions_add(UndoManager_newGroup);
}
diff --git a/Editor/src/Position.js b/Editor/src/Position.js
index 6af3c7b..ce4bc18 100644
--- a/Editor/src/Position.js
+++ b/Editor/src/Position.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Position;
var Position_assertValid;
@@ -27,6 +30,9 @@
var Position_track;
var Position_untrack;
var Position_rectAtPos;
+var Position_noteAncestor;
+var Position_captionAncestor;
+var Position_figureOrTableAncestor;
var Position_displayRectAtPos;
var Position_preferTextPosition;
var Position_preferElementPosition;
@@ -440,6 +446,7 @@
return (haveNextChar &&
((node.previousSibling == null) ||
(node.previousSibling._type == HTML_BR) ||
+ isNoteNode(node.previousSibling) ||
(isParagraphNode(node.previousSibling)) ||
(getNodeText(node.previousSibling).match(/\s$/)) ||
isItemNumber(node.previousSibling) ||
@@ -450,6 +457,7 @@
if (isWhitespaceString(followingText)) {
return (havePrevChar &&
((node.nextSibling == null) ||
+ isNoteNode(node.nextSibling) ||
(followingText.length > 0) ||
(spacesUntilNextContent(node) != 0)));
}
@@ -476,6 +484,15 @@
var prevType = (prevNode != null) ? prevNode._type : 0;
var nextType = (nextNode != null) ? nextNode._type : 0;
+ var prevIsNote = (prevNode != null) && isNoteNode(prevNode);
+ var nextIsNote = (nextNode != null) && isNoteNode(nextNode);
+ if (((nextNode == null) || !nodeHasContent(nextNode)) && prevIsNote)
+ return true;
+ if (((prevNode == null) || !nodeHasContent(prevNode)) && nextIsNote)
+ return true;
+ if (prevIsNote && nextIsNote)
+ return true;
+
if ((prevNode == null) && (nextNode == null) &&
(CONTAINERS_ALLOWING_CHILDREN[type] ||
(isInlineNode(node) && !isOpaqueNode(node) && (type != HTML_BR))))
@@ -676,6 +693,47 @@
height: rect.height };
}
+ function zeroWidthMidRect(rect)
+ {
+ var mid = rect.left + rect.width/2;
+ return { left: mid,
+ right: mid, // 0 width
+ top: rect.top,
+ bottom: rect.bottom,
+ width: 0,
+ height: rect.height };
+ }
+
+ Position_noteAncestor = function(pos)
+ {
+ var node = Position_closestActualNode(pos);
+ for (; node != null; node = node.parentNode) {
+ if (isNoteNode(node))
+ return node;
+ }
+ return null;
+ }
+
+ Position_captionAncestor = function(pos)
+ {
+ var node = Position_closestActualNode(pos);
+ for (; node != null; node = node.parentNode) {
+ if ((node._type == HTML_FIGCAPTION) || (node._type == HTML_CAPTION))
+ return node;
+ }
+ return null;
+ }
+
+ Position_figureOrTableAncestor = function(pos)
+ {
+ var node = Position_closestActualNode(pos);
+ for (; node != null; node = node.parentNode) {
+ if ((node._type == HTML_FIGURE) || (node._type == HTML_TABLE))
+ return node;
+ }
+ return null;
+ }
+
function exactRectAtPos(pos)
{
var node = pos.node;
@@ -733,12 +791,55 @@
}
}
+ function tempSpaceRect(parentNode,nextSibling)
+ {
+ var space = DOM_createTextNode(document,String.fromCharCode(160));
+ DOM_insertBefore(parentNode,space,nextSibling);
+ var range = new Range(space,0,space,1);
+ var rects = Range_getClientRects(range);
+ DOM_deleteNode(space);
+ if (rects.length > 0)
+ return rects[0];
+ else
+ return nil;
+ }
+
Position_displayRectAtPos = function(pos)
{
rect = exactRectAtPos(pos);
if (rect != null)
return rect;
+ var noteNode = Position_noteAncestor(pos);
+ if ((noteNode != null) && !nodeHasContent(noteNode)) // In empty footnote or endnote
+ return zeroWidthMidRect(noteNode.getBoundingClientRect());
+
+ // If we're immediately before or after a footnote or endnote, calculate the rect by
+ // temporarily inserting a space character, and getting the rect at the start of that.
+ // This avoids us instead getting a rect inside the note, which is what would otherwise
+ // happen if there was no adjacent text node outside the note.
+ if ((pos.node.nodeType == Node.ELEMENT_NODE)) {
+ var before = pos.node.childNodes[pos.offset-1];
+ var after = pos.node.childNodes[pos.offset];
+ if (((before != null) && isNoteNode(before)) ||
+ ((after != null) && isNoteNode(after))) {
+ var rect = tempSpaceRect(pos.node,pos.node.childNodes[pos.offset]);
+ if (rect != null)
+ return zeroWidthLeftRect(rect);
+ }
+ }
+
+ var captionNode = Position_captionAncestor(pos);
+ if ((captionNode != null) && !nodeHasContent(captionNode)) {
+ // Even if an empty caption has generated content (e.g. "Figure X: ") preceding it,
+ // we can't directly get the rect of that generated content. So we temporarily insert
+ // a text node containing a single space character, get the position to the right of
+ // that character, and then remove the text node.
+ var rect = tempSpaceRect(captionNode,null);
+ if (rect != null)
+ return zeroWidthRightRect(rect);
+ }
+
var paragraph = Text_findParagraphBoundaries(pos);
var backRect = null;
@@ -896,16 +997,30 @@
// intended if the document's last text node is a direct child of the body (as it may be in some
// HTML documents that users open).
+ function posOutsideSelection(pos)
+ {
+ pos = Position_preferElementPosition(pos);
+
+ if (!isSelectionSpan(pos.node))
+ return pos;
+
+ if (pos.offset == 0)
+ return new Position(pos.node.parentNode,DOM_nodeOffset(pos.node));
+ else if (pos.offset == pos.node.childNodes.length)
+ return new Position(pos.node.parentNode,DOM_nodeOffset(pos.node)+1);
+ else
+ return pos;
+ }
+
Position_atPoint = function(x,y)
{
// In general, we can use document.caretRangeFromPoint(x,y) to determine the location of the
// cursor based on screen coordinates. However, this doesn't work if the screen coordinates
// are outside the bounding box of the document's body. So when this is true, we find either
// the first or last non-whitespace text node, calculate a y value that is half-way between
- // the top and bottom of its first or last rect (respectively), and then make a call to
- // caretRangeFromPoint with the same x value but this new y value. This results in the
- // cursor being placed on the first or last line when the user taps outside the document
- // bounds.
+ // the top and bottom of its first or last rect (respectively), and use that instead. This
+ // results in the cursor being placed on the first or last line when the user taps outside
+ // the document bounds.
var bodyRect = document.body.getBoundingClientRect();
var boundaryRect = null;
@@ -914,12 +1029,8 @@
else if (y >= bodyRect.bottom)
boundaryRect = findLastTextRect();
- if (boundaryRect != null) {
- var boundaryY = boundaryRect.top + boundaryRect.height/2;
- var range = document.caretRangeFromPoint(x,boundaryY);
- if (range != null)
- return new Position(range.startContainer,range.startOffset);
- }
+ if (boundaryRect != null)
+ y = boundaryRect.top + boundaryRect.height/2;
// We get here if the coordinates are inside the document's bounding rect, or if getting the
// position from the first or last rect failed for some reason.
@@ -929,16 +1040,35 @@
return null;
var pos = new Position(range.startContainer,range.startOffset);
+ pos = Position_preferElementPosition(pos);
if (pos.node.nodeType == Node.ELEMENT_NODE) {
- var prev = pos.node.childNodes[pos.offset-1];
- var next = pos.node.childNodes[pos.offset];
+ var outside = posOutsideSelection(pos);
+ var prev = outside.node.childNodes[outside.offset-1];
+ var next = outside.node.childNodes[outside.offset];
- if ((prev != null) && (prev._type == HTML_IMG) && elementContainsPoint(prev,x,y))
+ if ((prev != null) && nodeMayContainPos(prev) && elementContainsPoint(prev,x,y))
return new Position(prev,0);
- if ((next != null) && (next._type == HTML_IMG) && elementContainsPoint(next,x,y))
+ if ((next != null) && nodeMayContainPos(next) && elementContainsPoint(next,x,y))
return new Position(next,0);
+
+ if (next != null) {
+ var nextNode = outside.node;
+ var nextOffset = outside.offset+1;
+
+ if (isSelectionSpan(next) && (next.firstChild != null)) {
+ nextNode = next;
+ nextOffset = 1;
+ next = next.firstChild;
+ }
+
+ if ((next != null) && isEmptyNoteNode(next)) {
+ var rect = next.getBoundingClientRect();
+ if (x > rect.right)
+ return new Position(nextNode,nextOffset);
+ }
+ }
}
pos = adjustPositionForFigure(pos);
@@ -946,6 +1076,13 @@
return pos;
}
+ // This is used for nodes that can potentially be the right match for a hit test, but for
+ // which caretRangeFromPoint() returns the wrong result
+ function nodeMayContainPos(node)
+ {
+ return ((node._type == HTML_IMG) || isEmptyNoteNode(node));
+ }
+
function elementContainsPoint(element,x,y)
{
var rect = element.getBoundingClientRect();
diff --git a/Editor/src/PostponedActions.js b/Editor/src/PostponedActions.js
index b63923f..d445536 100644
--- a/Editor/src/PostponedActions.js
+++ b/Editor/src/PostponedActions.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var PostponedActions_add;
var PostponedActions_perform;
diff --git a/Editor/src/Preview.js b/Editor/src/Preview.js
index 9267b3f..97f9bf1 100644
--- a/Editor/src/Preview.js
+++ b/Editor/src/Preview.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Preview_showForStyle;
diff --git a/Editor/src/Range.js b/Editor/src/Range.js
index 883bbdc..8d7c655 100644
--- a/Editor/src/Range.js
+++ b/Editor/src/Range.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Range;
diff --git a/Editor/src/Scan.js b/Editor/src/Scan.js
index 88938a6..e6cf4f5 100644
--- a/Editor/src/Scan.js
+++ b/Editor/src/Scan.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Scan_reset;
var Scan_next;
diff --git a/Editor/src/Selection.js b/Editor/src/Selection.js
index 42158f3..c4f8efb 100644
--- a/Editor/src/Selection.js
+++ b/Editor/src/Selection.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
// FIXME: cursor does not display correctly if it is after a space at the end of the line
@@ -316,6 +319,13 @@
newHighlights.push(wrapped);
}
}
+ else if (isNoteNode(node)) {
+ if (!isSelectionHighlight(node.parentNode)) {
+ var wrapped = DOM_wrapNode(node,"SPAN");
+ DOM_setAttribute(wrapped,"class",Keys.SELECTION_CLASS);
+ newHighlights.push(wrapped);
+ }
+ }
else if (node.nodeType == Node.TEXT_NODE) {
createTextHighlight(node,data,newHighlights);
}
diff --git a/Editor/src/StringBuilder.js b/Editor/src/StringBuilder.js
index 9c7460c..9332b79 100644
--- a/Editor/src/StringBuilder.js
+++ b/Editor/src/StringBuilder.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function StringBuilder()
{
diff --git a/Editor/src/Styles.js b/Editor/src/Styles.js
index 232f3b0..c09f41d 100644
--- a/Editor/src/Styles.js
+++ b/Editor/src/Styles.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Styles_getRule;
var Styles_nextSelectorAfter;
diff --git a/Editor/src/Tables.js b/Editor/src/Tables.js
index 153212c..f1f27be 100644
--- a/Editor/src/Tables.js
+++ b/Editor/src/Tables.js
@@ -1,22 +1,25 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Tables_insertTable;
var Tables_addAdjacentRow;
var Tables_addAdjacentColumn;
-var Tables_deleteOneRow;
-var Tables_deleteOneColumn;
+var Tables_removeAdjacentRow;
+var Tables_removeAdjacentColumn;
var Tables_deleteRegion;
var Tables_clearCells;
var Tables_mergeCells;
@@ -278,19 +281,84 @@
}
}
+ function tableAtRightOfRange(range)
+ {
+ if (!Range_isEmpty(range))
+ return null;
+
+ var pos = Position_preferElementPosition(range.start);
+ if ((pos.node.nodeType == Node.ELEMENT_NODE) &&
+ (pos.offset < pos.node.childNodes.length) &&
+ (pos.node.childNodes[pos.offset]._type == HTML_TABLE)) {
+ var element = pos.node.childNodes[pos.offset];
+ var table = Tables_analyseStructure(element);
+ return table;
+ }
+ return null;
+ }
+
+ function tableAtLeftOfRange(range)
+ {
+ if (!Range_isEmpty(range))
+ return null;
+
+ var pos = Position_preferElementPosition(range.start);
+ if ((pos.node.nodeType == Node.ELEMENT_NODE) &&
+ (pos.offset > 0) &&
+ (pos.node.childNodes[pos.offset-1]._type == HTML_TABLE)) {
+ var element = pos.node.childNodes[pos.offset-1];
+ var table = Tables_analyseStructure(element);
+ return table;
+ }
+ return null;
+ }
+
+ function insertRowAbove(table,row)
+ {
+ var cell = Table_get(table,row,0);
+ var oldTR = cell.element.parentNode;
+ var newTR = DOM_createElement(document,"TR");
+ DOM_insertBefore(oldTR.parentNode,newTR,oldTR);
+ populateNewRow(table,newTR,row-1,row);
+ }
+
+ function insertRowBelow(table,row)
+ {
+ var cell = Table_get(table,row,0);
+ var oldTR = cell.element.parentNode;
+ var newTR = DOM_createElement(document,"TR");
+ DOM_insertBefore(oldTR.parentNode,newTR,oldTR.nextSibling);
+ populateNewRow(table,newTR,row+1,row);
+ }
+
+ function insertRowAdjacentToRange(range)
+ {
+ var table;
+
+ table = tableAtLeftOfRange(range);
+ if (table != null) {
+ insertRowBelow(table,table.numRows-1);
+ return;
+ }
+
+ table = tableAtRightOfRange(range);
+ if (table != null) {
+ insertRowAbove(table,0);
+ return;
+ }
+ }
+
// public
Tables_addAdjacentRow = function()
{
UndoManager_newGroup("Insert row below");
Selection_preserveWhileExecuting(function() {
- var region = Tables_regionFromRange(Selection_get(),true);
- if (region != null) {
- var cell = Table_get(region.structure,region.bottom,region.left);
- var oldTR = cell.element.parentNode;
- var newTR = DOM_createElement(document,"TR");
- DOM_insertBefore(oldTR.parentNode,newTR,oldTR.nextSibling);
- populateNewRow(region.structure,newTR,region.bottom+1,region.bottom);
- }
+ var range = Selection_get();
+ var region = Tables_regionFromRange(range,true);
+ if (region != null)
+ insertRowBelow(region.structure,region.bottom);
+ else
+ insertRowAdjacentToRange(range);
});
UndoManager_newGroup();
}
@@ -457,16 +525,41 @@
}
}
+ function insertColumnAdjacentToRange(range)
+ {
+ var table;
+
+ table = tableAtLeftOfRange(range);
+ if (table != null) {
+ var right = table.numCols-1;
+ addColElement(table,right,right+1);
+ addColumnCells(table,right,true);
+ return;
+ }
+
+ table = tableAtRightOfRange(range);
+ if (table != null) {
+ var left = 0;
+ addColElement(table,left,left-1);
+ addColumnCells(table,left,false);
+ return;
+ }
+ }
+
// public
Tables_addAdjacentColumn = function()
{
UndoManager_newGroup("Insert column at right");
Selection_preserveWhileExecuting(function() {
- var region = Tables_regionFromRange(Selection_get(),true);
+ var range = Selection_get();
+ var region = Tables_regionFromRange(range,true);
if (region != null) {
addColElement(region.structure,region.right,region.right+1);
addColumnCells(region.structure,region.right,true);
}
+ else {
+ insertColumnAdjacentToRange(range);
+ }
});
UndoManager_newGroup();
}
@@ -529,10 +622,39 @@
return row;
}
- Tables_deleteOneRow = function()
+ function removeRowAdjacentToRange(range)
{
- var region = Tables_regionFromRange(Selection_get(),true);
- if ((region == null) || (region.structure.numRows <= 1))
+ var table;
+
+ table = tableAtLeftOfRange(range);
+ if ((table != null) && (table.numRows >= 2)) {
+ UndoManager_newGroup("Delete one row");
+ var row = table.numRows-1;
+ Tables_deleteRegion(new TableRegion(table,row,row,0,table.numCols-1));
+ UndoManager_newGroup();
+ return;
+ }
+
+ table = tableAtRightOfRange(range);
+ if ((table != null) && (table.numRows >= 2)) {
+ UndoManager_newGroup("Delete one row");
+ Tables_deleteRegion(new TableRegion(table,0,0,0,table.numCols-1));
+ UndoManager_newGroup();
+ return;
+ }
+ }
+
+ Tables_removeAdjacentRow = function()
+ {
+ var range = Selection_get();
+ var region = Tables_regionFromRange(range,true);
+
+ if (region == null) {
+ removeRowAdjacentToRange(range);
+ return;
+ }
+
+ if (region.structure.numRows <= 1)
return;
UndoManager_newGroup("Delete one row");
@@ -585,10 +707,39 @@
UndoManager_newGroup();
}
- Tables_deleteOneColumn = function()
+ function removeColumnAdjacentToRange(range)
{
- var region = Tables_regionFromRange(Selection_get(),true);
- if ((region == null) || (region.structure.numCols <= 1))
+ var table;
+
+ table = tableAtLeftOfRange(range);
+ if ((table != null) && (table.numCols >= 2)) {
+ UndoManager_newGroup("Delete one column");
+ var col = table.numCols-1;
+ Tables_deleteRegion(new TableRegion(table,0,table.numRows-1,col,col));
+ UndoManager_newGroup();
+ return;
+ }
+
+ table = tableAtRightOfRange(range);
+ if ((table != null) && (table.numCols >= 2)) {
+ UndoManager_newGroup("Delete one column");
+ Tables_deleteRegion(new TableRegion(table,0,table.numRows-1,0,0));
+ UndoManager_newGroup();
+ return;
+ }
+ }
+
+ Tables_removeAdjacentColumn = function()
+ {
+ var range = Selection_get();
+ var region = Tables_regionFromRange(range,true);
+
+ if (region == null) {
+ removeColumnAdjacentToRange(range);
+ return;
+ }
+
+ if (region.structure.numCols <= 1)
return;
UndoManager_newGroup("Delete one column");
diff --git a/Editor/src/Text.js b/Editor/src/Text.js
index 10a90b8..5a69feb 100644
--- a/Editor/src/Text.js
+++ b/Editor/src/Text.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Text_findParagraphBoundaries;
var Text_analyseParagraph;
diff --git a/Editor/src/UndoManager.js b/Editor/src/UndoManager.js
index 44cb279..9f63c43 100644
--- a/Editor/src/UndoManager.js
+++ b/Editor/src/UndoManager.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
// FIXME: place a limit on the number of undo steps recorded - say, 30-50?
@@ -29,7 +32,6 @@
var UndoManager_clear;
var UndoManager_setProperty;
var UndoManager_deleteProperty;
-var UndoManager_groupType;
(function() {
@@ -263,14 +265,6 @@
delete obj[name];
}
- UndoManager_groupType = function()
- {
- if (undoStack.length == 0)
- return null;
- else
- return undoStack[undoStack.length-1].type;
- }
-
})();
window.undoSupported = true;
diff --git a/Editor/src/Viewport.js b/Editor/src/Viewport.js
index c78df45..47fbdfd 100644
--- a/Editor/src/Viewport.js
+++ b/Editor/src/Viewport.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var Viewport_init;
var Viewport_setViewportWidth;
diff --git a/Editor/src/first.js b/Editor/src/first.js
index 953ef4b..48cfd85 100644
--- a/Editor/src/first.js
+++ b/Editor/src/first.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
// FIXME: The _PREFIX variables below must be replaced with functions that return the
// appropriate namespace prefix for the document in question (since we can't rely on the
diff --git a/Editor/src/traversal.js b/Editor/src/traversal.js
index 40227ea..439870f 100644
--- a/Editor/src/traversal.js
+++ b/Editor/src/traversal.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function prevNode(node)
{
diff --git a/Editor/src/types.js b/Editor/src/types.js
index 243f5e9..b49a709 100644
--- a/Editor/src/types.js
+++ b/Editor/src/types.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var CONTAINER_ELEMENTS = new Array(HTML_COUNT);
CONTAINER_ELEMENTS[HTML_DOCUMENT] = true;
@@ -135,6 +138,11 @@
return BLOCK_ELEMENTS[node._type];
}
+function isBlockOrNoteNode(node)
+{
+ return BLOCK_ELEMENTS[node._type] || isNoteNode(node);
+}
+
function isInlineNode(node)
{
return INLINE_ELEMENTS[node._type];
@@ -164,6 +172,19 @@
node.getAttribute("href").charAt(0) == "#");
}
+function isNoteNode(node)
+{
+ if (node._type != HTML_SPAN)
+ return false;
+ var className = DOM_getAttribute(node,"class");
+ return ((className == "footnote") || (className == "endnote"));
+}
+
+function isEmptyNoteNode(node)
+{
+ return isNoteNode(node) && !nodeHasContent(node);
+}
+
function isItemNumber(node)
{
if (node.nodeType == Node.TEXT_NODE) {
diff --git a/Editor/src/util.js b/Editor/src/util.js
index fbe23e4..191fc55 100644
--- a/Editor/src/util.js
+++ b/Editor/src/util.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function arrayContains(array,value)
{
diff --git a/Editor/tests/PrettyPrinter.js b/Editor/tests/PrettyPrinter.js
index c39e7e1..f18d7ba 100644
--- a/Editor/tests/PrettyPrinter.js
+++ b/Editor/tests/PrettyPrinter.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
(function() {
@@ -157,6 +160,28 @@
}
}
+ function isContainer(node)
+ {
+ switch (node._type) {
+ case HTML_BODY:
+ case HTML_SECTION:
+ case HTML_FIGURE:
+ case HTML_TABLE:
+ case HTML_TBODY:
+ case HTML_THEAD:
+ case HTML_TFOOT:
+ case HTML_TR:
+ case HTML_DIV:
+ case HTML_UL:
+ case HTML_OL:
+ case HTML_NAV:
+ case HTML_COLGROUP:
+ return true;
+ default:
+ return false;
+ }
+ }
+
function prettyPrint(output,options,node,indent)
{
if ((node.nodeType == Node.ELEMENT_NODE) && (node.nodeName != "SCRIPT")) {
@@ -171,7 +196,7 @@
prettyPrint(output,options,child,"");
output.push(indent + "</" + name + ">\n");
}
- else if (!options.separateLines && singleDescendents(node)) {
+ else if (!options.separateLines && singleDescendents(node) && !isContainer(node)) {
output.push(indent);
prettyPrintOneLine(output,options,node);
output.push("\n");
diff --git a/Editor/tests/autocorrect/AutoCorrectTests.js b/Editor/tests/autocorrect/AutoCorrectTests.js
index ba514bb..fdc771d 100644
--- a/Editor/tests/autocorrect/AutoCorrectTests.js
+++ b/Editor/tests/autocorrect/AutoCorrectTests.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function findTextMatching(re)
{
diff --git a/Editor/tests/autocorrect/acceptCorrection-undo-expected.html b/Editor/tests/autocorrect/acceptCorrection-undo-expected.html
index 0460b60..3399e01 100644
--- a/Editor/tests/autocorrect/acceptCorrection-undo-expected.html
+++ b/Editor/tests/autocorrect/acceptCorrection-undo-expected.html
@@ -33,7 +33,9 @@
</p>
</body>
==================== Version 3 ====================
- <body><p>one two three four five six seven[]</p></body>
+ <body>
+ <p>one two three four five six seven[]</p>
+ </body>
===================================================
First undo to version 2: OK
First undo to version 1: OK
diff --git a/Editor/tests/autocorrect/acceptCorrection02-expected.html b/Editor/tests/autocorrect/acceptCorrection02-expected.html
index 5848dfc..2257b03 100644
--- a/Editor/tests/autocorrect/acceptCorrection02-expected.html
+++ b/Editor/tests/autocorrect/acceptCorrection02-expected.html
@@ -1,7 +1,9 @@
<html>
<head>
</head>
- <body><p>one two three four five[]</p></body>
+ <body>
+ <p>one two three four five[]</p>
+ </body>
</html>
Corrections:
diff --git a/Editor/tests/autocorrect/removedSpan02-expected.html b/Editor/tests/autocorrect/removedSpan02-expected.html
index 17b33b8..1815348 100644
--- a/Editor/tests/autocorrect/removedSpan02-expected.html
+++ b/Editor/tests/autocorrect/removedSpan02-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>th[]</p></body>
+ <body>
+ <p>th[]</p>
+ </body>
</html>
diff --git a/Editor/tests/autocorrect/removedSpan03-expected.html b/Editor/tests/autocorrect/removedSpan03-expected.html
index 7bf269f..b0c230d 100644
--- a/Editor/tests/autocorrect/removedSpan03-expected.html
+++ b/Editor/tests/autocorrect/removedSpan03-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>thex[]</p></body>
+ <body>
+ <p>thex[]</p>
+ </body>
</html>
diff --git a/Editor/tests/autocorrect/replaceCorrection-undo-expected.html b/Editor/tests/autocorrect/replaceCorrection-undo-expected.html
index e397207..badefe7 100644
--- a/Editor/tests/autocorrect/replaceCorrection-undo-expected.html
+++ b/Editor/tests/autocorrect/replaceCorrection-undo-expected.html
@@ -33,7 +33,9 @@
</p>
</body>
==================== Version 3 ====================
- <body><p>one r3 three r2 five r1 seven[]</p></body>
+ <body>
+ <p>one r3 three r2 five r1 seven[]</p>
+ </body>
===================================================
First undo to version 2: OK
First undo to version 1: OK
diff --git a/Editor/tests/autocorrect/replaceCorrection02-expected.html b/Editor/tests/autocorrect/replaceCorrection02-expected.html
index 32f3134..659ad6f 100644
--- a/Editor/tests/autocorrect/replaceCorrection02-expected.html
+++ b/Editor/tests/autocorrect/replaceCorrection02-expected.html
@@ -1,7 +1,9 @@
<html>
<head>
</head>
- <body><p>one B three A five[]</p></body>
+ <body>
+ <p>one B three A five[]</p>
+ </body>
</html>
Corrections:
diff --git a/Editor/tests/autocorrect/undo03-expected.html b/Editor/tests/autocorrect/undo03-expected.html
index 6900e6d..0280119 100644
--- a/Editor/tests/autocorrect/undo03-expected.html
+++ b/Editor/tests/autocorrect/undo03-expected.html
@@ -1,7 +1,9 @@
<html>
<head>
</head>
- <body><p>one twox[]</p></body>
+ <body>
+ <p>one twox[]</p>
+ </body>
</html>
Corrections:
diff --git a/Editor/tests/clipboard/cut-li04-expected.html b/Editor/tests/clipboard/cut-li04-expected.html
index 9c6c5e3..edbaeae 100644
--- a/Editor/tests/clipboard/cut-li04-expected.html
+++ b/Editor/tests/clipboard/cut-li04-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body></body>
+ <body>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li05-expected.html b/Editor/tests/clipboard/cut-li05-expected.html
index 9c6c5e3..edbaeae 100644
--- a/Editor/tests/clipboard/cut-li05-expected.html
+++ b/Editor/tests/clipboard/cut-li05-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body></body>
+ <body>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li06-expected.html b/Editor/tests/clipboard/cut-li06-expected.html
index b51592c..53a2ebc 100644
--- a/Editor/tests/clipboard/cut-li06-expected.html
+++ b/Editor/tests/clipboard/cut-li06-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body></body>
+ <body>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li07-expected.html b/Editor/tests/clipboard/cut-li07-expected.html
index a8b01fb..84e2750 100644
--- a/Editor/tests/clipboard/cut-li07-expected.html
+++ b/Editor/tests/clipboard/cut-li07-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body></body>
+ <body>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li08-expected.html b/Editor/tests/clipboard/cut-li08-expected.html
index 0aa8552..62a7e5e 100644
--- a/Editor/tests/clipboard/cut-li08-expected.html
+++ b/Editor/tests/clipboard/cut-li08-expected.html
@@ -1,6 +1,10 @@
<html>
<head></head>
- <body><ul><li>Zero</li></ul></body>
+ <body>
+ <ul>
+ <li>Zero</li>
+ </ul>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li09-expected.html b/Editor/tests/clipboard/cut-li09-expected.html
index 4ab8993..954bcf6 100644
--- a/Editor/tests/clipboard/cut-li09-expected.html
+++ b/Editor/tests/clipboard/cut-li09-expected.html
@@ -1,6 +1,10 @@
<html>
<head></head>
- <body><ul><li>Four</li></ul></body>
+ <body>
+ <ul>
+ <li>Four</li>
+ </ul>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li11-expected.html b/Editor/tests/clipboard/cut-li11-expected.html
index 4092b56..389188e 100644
--- a/Editor/tests/clipboard/cut-li11-expected.html
+++ b/Editor/tests/clipboard/cut-li11-expected.html
@@ -1,6 +1,10 @@
<html>
<head></head>
- <body><ul><li/></ul></body>
+ <body>
+ <ul>
+ <li/>
+ </ul>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li12-expected.html b/Editor/tests/clipboard/cut-li12-expected.html
index 4092b56..389188e 100644
--- a/Editor/tests/clipboard/cut-li12-expected.html
+++ b/Editor/tests/clipboard/cut-li12-expected.html
@@ -1,6 +1,10 @@
<html>
<head></head>
- <body><ul><li/></ul></body>
+ <body>
+ <ul>
+ <li/>
+ </ul>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li15-expected.html b/Editor/tests/clipboard/cut-li15-expected.html
index 833d862..246eac6 100644
--- a/Editor/tests/clipboard/cut-li15-expected.html
+++ b/Editor/tests/clipboard/cut-li15-expected.html
@@ -1,6 +1,10 @@
<html>
<head></head>
- <body><ul><li>One[]</li></ul></body>
+ <body>
+ <ul>
+ <li>One[]</li>
+ </ul>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li15a-expected.html b/Editor/tests/clipboard/cut-li15a-expected.html
index e7b87a1..dff4fb6 100644
--- a/Editor/tests/clipboard/cut-li15a-expected.html
+++ b/Editor/tests/clipboard/cut-li15a-expected.html
@@ -1,6 +1,10 @@
<html>
<head></head>
- <body><ul><li><p>One[]</p></li></ul></body>
+ <body>
+ <ul>
+ <li><p>One[]</p></li>
+ </ul>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li16-expected.html b/Editor/tests/clipboard/cut-li16-expected.html
index 2737ea3..e030c62 100644
--- a/Editor/tests/clipboard/cut-li16-expected.html
+++ b/Editor/tests/clipboard/cut-li16-expected.html
@@ -1,6 +1,10 @@
<html>
<head></head>
- <body><ul><li>[]Three</li></ul></body>
+ <body>
+ <ul>
+ <li>[]Three</li>
+ </ul>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/cut-li16a-expected.html b/Editor/tests/clipboard/cut-li16a-expected.html
index 98e3e0a..41619fc 100644
--- a/Editor/tests/clipboard/cut-li16a-expected.html
+++ b/Editor/tests/clipboard/cut-li16a-expected.html
@@ -1,6 +1,10 @@
<html>
<head></head>
- <body><ul><li><p>[]Three</p></li></ul></body>
+ <body>
+ <ul>
+ <li><p>[]Three</p></li>
+ </ul>
+ </body>
</html>
text/html
diff --git a/Editor/tests/clipboard/paste-htmldoc01-expected.html b/Editor/tests/clipboard/paste-htmldoc01-expected.html
index d5446e7..49ad39a 100644
--- a/Editor/tests/clipboard/paste-htmldoc01-expected.html
+++ b/Editor/tests/clipboard/paste-htmldoc01-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div class="page" title="Page 1">[]</div></body>
+ <body>
+ <div class="page" title="Page 1">
+ []
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/clipboard/paste-htmldoc02-expected.html b/Editor/tests/clipboard/paste-htmldoc02-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/clipboard/paste-htmldoc02-expected.html
+++ b/Editor/tests/clipboard/paste-htmldoc02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/clipboard/paste-invalid10-expected.html b/Editor/tests/clipboard/paste-invalid10-expected.html
index d000049..bf06bed 100644
--- a/Editor/tests/clipboard/paste-invalid10-expected.html
+++ b/Editor/tests/clipboard/paste-invalid10-expected.html
@@ -2,7 +2,13 @@
<head></head>
<body>
<p id="p1" z="1">Before</p>
- <table><tbody><tr><td>Table[]</td></tr></tbody></table>
+ <table>
+ <tbody>
+ <tr>
+ <td>Table[]</td>
+ </tr>
+ </tbody>
+ </table>
<p z="1">After</p>
</body>
</html>
diff --git a/Editor/tests/clipboard/paste01-expected.html b/Editor/tests/clipboard/paste01-expected.html
index 764f28f..b91c420 100644
--- a/Editor/tests/clipboard/paste01-expected.html
+++ b/Editor/tests/clipboard/paste01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text[]</p></body>
+ <body>
+ <p>Sample text[]</p>
+ </body>
</html>
diff --git a/Editor/tests/clipboard/paste02-expected.html b/Editor/tests/clipboard/paste02-expected.html
index 4d6f98e..f3ebde4 100644
--- a/Editor/tests/clipboard/paste02-expected.html
+++ b/Editor/tests/clipboard/paste02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>ASample text[]B</p></body>
+ <body>
+ <p>ASample text[]B</p>
+ </body>
</html>
diff --git a/Editor/tests/clipboard/paste03-expected.html b/Editor/tests/clipboard/paste03-expected.html
index 764f28f..b91c420 100644
--- a/Editor/tests/clipboard/paste03-expected.html
+++ b/Editor/tests/clipboard/paste03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text[]</p></body>
+ <body>
+ <p>Sample text[]</p>
+ </body>
</html>
diff --git a/Editor/tests/clipboard/paste04-expected.html b/Editor/tests/clipboard/paste04-expected.html
index 4d6f98e..f3ebde4 100644
--- a/Editor/tests/clipboard/paste04-expected.html
+++ b/Editor/tests/clipboard/paste04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>ASample text[]B</p></body>
+ <body>
+ <p>ASample text[]B</p>
+ </body>
</html>
diff --git a/Editor/tests/clipboard/pasteText-whitespace01-expected.html b/Editor/tests/clipboard/pasteText-whitespace01-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/clipboard/pasteText-whitespace01-expected.html
+++ b/Editor/tests/clipboard/pasteText-whitespace01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteBeforeParagraph-list01-expected.html b/Editor/tests/cursor/deleteBeforeParagraph-list01-expected.html
index 814e47d..6b29d99 100644
--- a/Editor/tests/cursor/deleteBeforeParagraph-list01-expected.html
+++ b/Editor/tests/cursor/deleteBeforeParagraph-list01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Heading[]List item</h1></body>
+ <body>
+ <h1>Heading[]List item</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteBeforeParagraph-list01a-expected.html b/Editor/tests/cursor/deleteBeforeParagraph-list01a-expected.html
index 2212855..56b2016 100644
--- a/Editor/tests/cursor/deleteBeforeParagraph-list01a-expected.html
+++ b/Editor/tests/cursor/deleteBeforeParagraph-list01a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Head[]item</h1></body>
+ <body>
+ <h1>Head[]item</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteBeforeParagraph-list02a-expected.html b/Editor/tests/cursor/deleteBeforeParagraph-list02a-expected.html
index ab3ff63..cb02a93 100644
--- a/Editor/tests/cursor/deleteBeforeParagraph-list02a-expected.html
+++ b/Editor/tests/cursor/deleteBeforeParagraph-list02a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Heading[]</h1></body>
+ <body>
+ <h1>Heading[]</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteBeforeParagraph-list03a-expected.html b/Editor/tests/cursor/deleteBeforeParagraph-list03a-expected.html
index 4bac699..f71834a 100644
--- a/Editor/tests/cursor/deleteBeforeParagraph-list03a-expected.html
+++ b/Editor/tests/cursor/deleteBeforeParagraph-list03a-expected.html
@@ -2,6 +2,8 @@
<head></head>
<body>
<h1>Head[]o</h1>
- <ul><li><p>Three</p></li></ul>
+ <ul>
+ <li><p>Three</p></li>
+ </ul>
</body>
</html>
diff --git a/Editor/tests/cursor/deleteBeforeParagraph01-expected.html b/Editor/tests/cursor/deleteBeforeParagraph01-expected.html
index e7f6b51..a6d4d90 100644
--- a/Editor/tests/cursor/deleteBeforeParagraph01-expected.html
+++ b/Editor/tests/cursor/deleteBeforeParagraph01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Heading[]Paragraph</h1></body>
+ <body>
+ <h1>Heading[]Paragraph</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteBeforeParagraph01a-expected.html b/Editor/tests/cursor/deleteBeforeParagraph01a-expected.html
index 1b1e421..ffab8d1 100644
--- a/Editor/tests/cursor/deleteBeforeParagraph01a-expected.html
+++ b/Editor/tests/cursor/deleteBeforeParagraph01a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Head[]aph</h1></body>
+ <body>
+ <h1>Head[]aph</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteBeforeParagraph02-expected.html b/Editor/tests/cursor/deleteBeforeParagraph02-expected.html
index e7f6b51..a6d4d90 100644
--- a/Editor/tests/cursor/deleteBeforeParagraph02-expected.html
+++ b/Editor/tests/cursor/deleteBeforeParagraph02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Heading[]Paragraph</h1></body>
+ <body>
+ <h1>Heading[]Paragraph</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteBeforeParagraph02a-expected.html b/Editor/tests/cursor/deleteBeforeParagraph02a-expected.html
index 1b1e421..ffab8d1 100644
--- a/Editor/tests/cursor/deleteBeforeParagraph02a-expected.html
+++ b/Editor/tests/cursor/deleteBeforeParagraph02a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Head[]aph</h1></body>
+ <body>
+ <h1>Head[]aph</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-emoji02-expected.html b/Editor/tests/cursor/deleteCharacter-emoji02-expected.html
index 1132e2d..77c9d9f 100644
--- a/Editor/tests/cursor/deleteCharacter-emoji02-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-emoji02-expected.html
@@ -3,5 +3,7 @@
<meta charset="utf-8"/>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><p>😃👿[]</p></body>
+ <body>
+ <p>😃👿[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-emoji03-expected.html b/Editor/tests/cursor/deleteCharacter-emoji03-expected.html
index 46518c4..4969443 100644
--- a/Editor/tests/cursor/deleteCharacter-emoji03-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-emoji03-expected.html
@@ -3,5 +3,7 @@
<meta charset="utf-8"/>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><p>before[]</p></body>
+ <body>
+ <p>before[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-emoji04-expected.html b/Editor/tests/cursor/deleteCharacter-emoji04-expected.html
index 4f8962e..bca34fc 100644
--- a/Editor/tests/cursor/deleteCharacter-emoji04-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-emoji04-expected.html
@@ -3,5 +3,7 @@
<meta charset="utf-8"/>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><p>before😃👿[]</p></body>
+ <body>
+ <p>before😃👿[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-emoji05-expected.html b/Editor/tests/cursor/deleteCharacter-emoji05-expected.html
index a8f151a..6bc2dfc 100644
--- a/Editor/tests/cursor/deleteCharacter-emoji05-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-emoji05-expected.html
@@ -3,5 +3,7 @@
<meta charset="utf-8"/>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><p>[]after</p></body>
+ <body>
+ <p>[]after</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-emoji06-expected.html b/Editor/tests/cursor/deleteCharacter-emoji06-expected.html
index d9da288..be7725c 100644
--- a/Editor/tests/cursor/deleteCharacter-emoji06-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-emoji06-expected.html
@@ -3,5 +3,7 @@
<meta charset="utf-8"/>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><p>😃👿[]after</p></body>
+ <body>
+ <p>😃👿[]after</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-emoji07-expected.html b/Editor/tests/cursor/deleteCharacter-emoji07-expected.html
index 35e19b7..b830d5b 100644
--- a/Editor/tests/cursor/deleteCharacter-emoji07-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-emoji07-expected.html
@@ -3,5 +3,7 @@
<meta charset="utf-8"/>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><p>before[]after</p></body>
+ <body>
+ <p>before[]after</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-emoji08-expected.html b/Editor/tests/cursor/deleteCharacter-emoji08-expected.html
index 9824806..fd1ee55 100644
--- a/Editor/tests/cursor/deleteCharacter-emoji08-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-emoji08-expected.html
@@ -3,5 +3,7 @@
<meta charset="utf-8"/>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><p>before😃👿[]after</p></body>
+ <body>
+ <p>before😃👿[]after</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote01-expected.html b/Editor/tests/cursor/deleteCharacter-endnote01-expected.html
new file mode 100644
index 0000000..225c9b4
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote01-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote01-input.html b/Editor/tests/cursor/deleteCharacter-endnote01-input.html
new file mode 100644
index 0000000..0757734
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote01-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote02-expected.html b/Editor/tests/cursor/deleteCharacter-endnote02-expected.html
new file mode 100644
index 0000000..225c9b4
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote02-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote02-input.html b/Editor/tests/cursor/deleteCharacter-endnote02-input.html
new file mode 100644
index 0000000..b55d7d2
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote02-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote"><b>[]</b></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote03-expected.html b/Editor/tests/cursor/deleteCharacter-endnote03-expected.html
new file mode 100644
index 0000000..895cd24
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote03-expected.html
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>before[]</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote03-input.html b/Editor/tests/cursor/deleteCharacter-endnote03-input.html
new file mode 100644
index 0000000..d94a572
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote03-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">[]</span></p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote04-expected.html b/Editor/tests/cursor/deleteCharacter-endnote04-expected.html
new file mode 100644
index 0000000..88dd17b
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote04-expected.html
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote04-input.html b/Editor/tests/cursor/deleteCharacter-endnote04-input.html
new file mode 100644
index 0000000..f6ad6e1
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote04-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p><span class="endnote">[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote05-expected.html b/Editor/tests/cursor/deleteCharacter-endnote05-expected.html
new file mode 100644
index 0000000..0abd902
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote05-expected.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>Initial paragraph</p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote05-input.html b/Editor/tests/cursor/deleteCharacter-endnote05-input.html
new file mode 100644
index 0000000..0f82b31
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote05-input.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>Initial paragraph</p>
+ <p><span class="endnote">[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote06-expected.html b/Editor/tests/cursor/deleteCharacter-endnote06-expected.html
new file mode 100644
index 0000000..225c9b4
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote06-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote06-input.html b/Editor/tests/cursor/deleteCharacter-endnote06-input.html
new file mode 100644
index 0000000..bcaeeb1
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote06-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote"></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote07-expected.html b/Editor/tests/cursor/deleteCharacter-endnote07-expected.html
new file mode 100644
index 0000000..225c9b4
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote07-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote07-input.html b/Editor/tests/cursor/deleteCharacter-endnote07-input.html
new file mode 100644
index 0000000..efd68bc
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote07-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote"><b></b></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote08-expected.html b/Editor/tests/cursor/deleteCharacter-endnote08-expected.html
new file mode 100644
index 0000000..e2952bf
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote08-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote08-input.html b/Editor/tests/cursor/deleteCharacter-endnote08-input.html
new file mode 100644
index 0000000..bff2f51
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote08-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote"></span>[]</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote09-expected.html b/Editor/tests/cursor/deleteCharacter-endnote09-expected.html
new file mode 100644
index 0000000..88dd17b
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote09-expected.html
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote09-input.html b/Editor/tests/cursor/deleteCharacter-endnote09-input.html
new file mode 100644
index 0000000..ab3f8ac
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote09-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p><span class="endnote"></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote10-expected.html b/Editor/tests/cursor/deleteCharacter-endnote10-expected.html
new file mode 100644
index 0000000..0abd902
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote10-expected.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>Initial paragraph</p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-endnote10-input.html b/Editor/tests/cursor/deleteCharacter-endnote10-input.html
new file mode 100644
index 0000000..8f7aa92
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-endnote10-input.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>Initial paragraph</p>
+ <p><span class="endnote"></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-figcaption03-expected.html b/Editor/tests/cursor/deleteCharacter-figcaption03-expected.html
new file mode 100644
index 0000000..f1ab352
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-figcaption03-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-figcaption03-input.html b/Editor/tests/cursor/deleteCharacter-figcaption03-input.html
new file mode 100644
index 0000000..0b9dced
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-figcaption03-input.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <figure>
+ <img src="../figures/nothing.png">
+ <figcaption>[]</figcaption>
+ </figure>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-figcaption04-expected.html b/Editor/tests/cursor/deleteCharacter-figcaption04-expected.html
new file mode 100644
index 0000000..f1ab352
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-figcaption04-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-figcaption04-input.html b/Editor/tests/cursor/deleteCharacter-figcaption04-input.html
new file mode 100644
index 0000000..9aa4617
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-figcaption04-input.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <figure>
+ <img src="../figures/nothing.png">
+ <figcaption><b>[]</b></figcaption>
+ </figure>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote01-expected.html b/Editor/tests/cursor/deleteCharacter-footnote01-expected.html
new file mode 100644
index 0000000..225c9b4
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote01-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote01-input.html b/Editor/tests/cursor/deleteCharacter-footnote01-input.html
new file mode 100644
index 0000000..cf02a9e
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote01-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote02-expected.html b/Editor/tests/cursor/deleteCharacter-footnote02-expected.html
new file mode 100644
index 0000000..225c9b4
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote02-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote02-input.html b/Editor/tests/cursor/deleteCharacter-footnote02-input.html
new file mode 100644
index 0000000..495be1c
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote02-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote"><b>[]</b></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote03-expected.html b/Editor/tests/cursor/deleteCharacter-footnote03-expected.html
new file mode 100644
index 0000000..895cd24
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote03-expected.html
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>before[]</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote03-input.html b/Editor/tests/cursor/deleteCharacter-footnote03-input.html
new file mode 100644
index 0000000..6ecd381
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote03-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">[]</span></p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote04-expected.html b/Editor/tests/cursor/deleteCharacter-footnote04-expected.html
new file mode 100644
index 0000000..88dd17b
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote04-expected.html
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote04-input.html b/Editor/tests/cursor/deleteCharacter-footnote04-input.html
new file mode 100644
index 0000000..c84d178
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote04-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p><span class="footnote">[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote05-expected.html b/Editor/tests/cursor/deleteCharacter-footnote05-expected.html
new file mode 100644
index 0000000..0abd902
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote05-expected.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>Initial paragraph</p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote05-input.html b/Editor/tests/cursor/deleteCharacter-footnote05-input.html
new file mode 100644
index 0000000..5f7eb34
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote05-input.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>Initial paragraph</p>
+ <p><span class="footnote">[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote06-expected.html b/Editor/tests/cursor/deleteCharacter-footnote06-expected.html
new file mode 100644
index 0000000..225c9b4
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote06-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote06-input.html b/Editor/tests/cursor/deleteCharacter-footnote06-input.html
new file mode 100644
index 0000000..3496595
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote06-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote"></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote07-expected.html b/Editor/tests/cursor/deleteCharacter-footnote07-expected.html
new file mode 100644
index 0000000..225c9b4
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote07-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote07-input.html b/Editor/tests/cursor/deleteCharacter-footnote07-input.html
new file mode 100644
index 0000000..141f5d8
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote07-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote"><b></b></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote08-expected.html b/Editor/tests/cursor/deleteCharacter-footnote08-expected.html
new file mode 100644
index 0000000..e2952bf
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote08-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ []
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote08-input.html b/Editor/tests/cursor/deleteCharacter-footnote08-input.html
new file mode 100644
index 0000000..9b637e2
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote08-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote"></span>[]</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote09-expected.html b/Editor/tests/cursor/deleteCharacter-footnote09-expected.html
new file mode 100644
index 0000000..88dd17b
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote09-expected.html
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote09-input.html b/Editor/tests/cursor/deleteCharacter-footnote09-input.html
new file mode 100644
index 0000000..6f74db3
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote09-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p><span class="footnote"></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote10-expected.html b/Editor/tests/cursor/deleteCharacter-footnote10-expected.html
new file mode 100644
index 0000000..0abd902
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote10-expected.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>Initial paragraph</p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-footnote10-input.html b/Editor/tests/cursor/deleteCharacter-footnote10-input.html
new file mode 100644
index 0000000..ad5a014
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-footnote10-input.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>Initial paragraph</p>
+ <p><span class="footnote"></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-link02-expected.html b/Editor/tests/cursor/deleteCharacter-link02-expected.html
index 7fe0864..7b72d83 100644
--- a/Editor/tests/cursor/deleteCharacter-link02-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-link02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Text[]</p></body>
+ <body>
+ <p>Text[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-list06-expected.html b/Editor/tests/cursor/deleteCharacter-list06-expected.html
index 8718df2..1e26a12 100644
--- a/Editor/tests/cursor/deleteCharacter-list06-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-list06-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li>[]</li></ul></body>
+ <body>
+ <ul>
+ <li>[]</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-list07-expected.html b/Editor/tests/cursor/deleteCharacter-list07-expected.html
index 764f28f..b91c420 100644
--- a/Editor/tests/cursor/deleteCharacter-list07-expected.html
+++ b/Editor/tests/cursor/deleteCharacter-list07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text[]</p></body>
+ <body>
+ <p>Sample text[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter-tablecaption01-expected.html b/Editor/tests/cursor/deleteCharacter-tablecaption01-expected.html
new file mode 100644
index 0000000..02fd8e0
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-tablecaption01-expected.html
@@ -0,0 +1,18 @@
+<html>
+ <head></head>
+ <body>
+ <table width="100%">
+ <tbody>
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ </tr>
+ <tr>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ </tbody>
+ </table>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-tablecaption01-input.html b/Editor/tests/cursor/deleteCharacter-tablecaption01-input.html
new file mode 100644
index 0000000..5089a5d
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-tablecaption01-input.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+<table width="100%">
+ <caption>[]</caption>
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ </tr>
+ <tr>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+</table>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-tablecaption02-expected.html b/Editor/tests/cursor/deleteCharacter-tablecaption02-expected.html
new file mode 100644
index 0000000..02fd8e0
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-tablecaption02-expected.html
@@ -0,0 +1,18 @@
+<html>
+ <head></head>
+ <body>
+ <table width="100%">
+ <tbody>
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ </tr>
+ <tr>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ </tbody>
+ </table>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter-tablecaption02-input.html b/Editor/tests/cursor/deleteCharacter-tablecaption02-input.html
new file mode 100644
index 0000000..402c13b
--- /dev/null
+++ b/Editor/tests/cursor/deleteCharacter-tablecaption02-input.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Cursor_deleteCharacter();
+ showSelection();
+}
+</script>
+</head>
+<body>
+<table width="100%">
+ <caption><b>[]</b></caption>
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ </tr>
+ <tr>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+</table>
+</body>
+</html>
diff --git a/Editor/tests/cursor/deleteCharacter01-expected.html b/Editor/tests/cursor/deleteCharacter01-expected.html
index 94217ba..b8521ba 100644
--- a/Editor/tests/cursor/deleteCharacter01-expected.html
+++ b/Editor/tests/cursor/deleteCharacter01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample tex[]</p></body>
+ <body>
+ <p>Sample tex[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter02-expected.html b/Editor/tests/cursor/deleteCharacter02-expected.html
index cf06551..778bf58 100644
--- a/Editor/tests/cursor/deleteCharacter02-expected.html
+++ b/Editor/tests/cursor/deleteCharacter02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Samp[]e text</p></body>
+ <body>
+ <p>Samp[]e text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter03-expected.html b/Editor/tests/cursor/deleteCharacter03-expected.html
index 973cbfe..2ad40ec 100644
--- a/Editor/tests/cursor/deleteCharacter03-expected.html
+++ b/Editor/tests/cursor/deleteCharacter03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[]Sample text</p></body>
+ <body>
+ <p>[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter04-expected.html b/Editor/tests/cursor/deleteCharacter04-expected.html
index d70dc08..26501f0 100644
--- a/Editor/tests/cursor/deleteCharacter04-expected.html
+++ b/Editor/tests/cursor/deleteCharacter04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>First one[]Second two</p></body>
+ <body>
+ <p>First one[]Second two</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter04a-expected.html b/Editor/tests/cursor/deleteCharacter04a-expected.html
index d70dc08..26501f0 100644
--- a/Editor/tests/cursor/deleteCharacter04a-expected.html
+++ b/Editor/tests/cursor/deleteCharacter04a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>First one[]Second two</p></body>
+ <body>
+ <p>First one[]Second two</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter04b-expected.html b/Editor/tests/cursor/deleteCharacter04b-expected.html
index d70dc08..26501f0 100644
--- a/Editor/tests/cursor/deleteCharacter04b-expected.html
+++ b/Editor/tests/cursor/deleteCharacter04b-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>First one[]Second two</p></body>
+ <body>
+ <p>First one[]Second two</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter05-expected.html b/Editor/tests/cursor/deleteCharacter05-expected.html
index d208d94..e72ef9e 100644
--- a/Editor/tests/cursor/deleteCharacter05-expected.html
+++ b/Editor/tests/cursor/deleteCharacter05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>First one[]Second two</b></p></body>
+ <body>
+ <p><b>First one[]Second two</b></p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter05a-expected.html b/Editor/tests/cursor/deleteCharacter05a-expected.html
index d208d94..e72ef9e 100644
--- a/Editor/tests/cursor/deleteCharacter05a-expected.html
+++ b/Editor/tests/cursor/deleteCharacter05a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>First one[]Second two</b></p></body>
+ <body>
+ <p><b>First one[]Second two</b></p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter05b-expected.html b/Editor/tests/cursor/deleteCharacter05b-expected.html
index d208d94..e72ef9e 100644
--- a/Editor/tests/cursor/deleteCharacter05b-expected.html
+++ b/Editor/tests/cursor/deleteCharacter05b-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>First one[]Second two</b></p></body>
+ <body>
+ <p><b>First one[]Second two</b></p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter06-expected.html b/Editor/tests/cursor/deleteCharacter06-expected.html
index d6e2b98..761f37c 100644
--- a/Editor/tests/cursor/deleteCharacter06-expected.html
+++ b/Editor/tests/cursor/deleteCharacter06-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p>First one[]Second two</p></div></body>
+ <body>
+ <div>
+ <p>First one[]Second two</p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter06a-expected.html b/Editor/tests/cursor/deleteCharacter06a-expected.html
index d6e2b98..761f37c 100644
--- a/Editor/tests/cursor/deleteCharacter06a-expected.html
+++ b/Editor/tests/cursor/deleteCharacter06a-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p>First one[]Second two</p></div></body>
+ <body>
+ <div>
+ <p>First one[]Second two</p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter06b-expected.html b/Editor/tests/cursor/deleteCharacter06b-expected.html
index d6e2b98..761f37c 100644
--- a/Editor/tests/cursor/deleteCharacter06b-expected.html
+++ b/Editor/tests/cursor/deleteCharacter06b-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p>First one[]Second two</p></div></body>
+ <body>
+ <div>
+ <p>First one[]Second two</p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter07-expected.html b/Editor/tests/cursor/deleteCharacter07-expected.html
index 68cd062..a853cc3 100644
--- a/Editor/tests/cursor/deleteCharacter07-expected.html
+++ b/Editor/tests/cursor/deleteCharacter07-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p><b>First one[]Second two</b></p></div></body>
+ <body>
+ <div>
+ <p><b>First one[]Second two</b></p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter07a-expected.html b/Editor/tests/cursor/deleteCharacter07a-expected.html
index 68cd062..a853cc3 100644
--- a/Editor/tests/cursor/deleteCharacter07a-expected.html
+++ b/Editor/tests/cursor/deleteCharacter07a-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p><b>First one[]Second two</b></p></div></body>
+ <body>
+ <div>
+ <p><b>First one[]Second two</b></p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter07b-expected.html b/Editor/tests/cursor/deleteCharacter07b-expected.html
index 68cd062..a853cc3 100644
--- a/Editor/tests/cursor/deleteCharacter07b-expected.html
+++ b/Editor/tests/cursor/deleteCharacter07b-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p><b>First one[]Second two</b></p></div></body>
+ <body>
+ <div>
+ <p><b>First one[]Second two</b></p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter11-expected.html b/Editor/tests/cursor/deleteCharacter11-expected.html
index 4d05c15..336000d 100644
--- a/Editor/tests/cursor/deleteCharacter11-expected.html
+++ b/Editor/tests/cursor/deleteCharacter11-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>xxxxxxx[]</p></body>
+ <body>
+ <p>xxxxxxx[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter12-expected.html b/Editor/tests/cursor/deleteCharacter12-expected.html
index d3c0179..4910ec8 100644
--- a/Editor/tests/cursor/deleteCharacter12-expected.html
+++ b/Editor/tests/cursor/deleteCharacter12-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>xxxxxx[]</p></body>
+ <body>
+ <p>xxxxxx[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter13-expected.html b/Editor/tests/cursor/deleteCharacter13-expected.html
index 68f4276..8637eec 100644
--- a/Editor/tests/cursor/deleteCharacter13-expected.html
+++ b/Editor/tests/cursor/deleteCharacter13-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>xxxx[]</p></body>
+ <body>
+ <p>xxxx[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter14-expected.html b/Editor/tests/cursor/deleteCharacter14-expected.html
index 159d25e..a4da091 100644
--- a/Editor/tests/cursor/deleteCharacter14-expected.html
+++ b/Editor/tests/cursor/deleteCharacter14-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>A []</p></body>
+ <body>
+ <p>A []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter15-expected.html b/Editor/tests/cursor/deleteCharacter15-expected.html
index 2da444d..e65b76c 100644
--- a/Editor/tests/cursor/deleteCharacter15-expected.html
+++ b/Editor/tests/cursor/deleteCharacter15-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>A []</p></body>
+ <body>
+ <p>A []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter16-expected.html b/Editor/tests/cursor/deleteCharacter16-expected.html
index 70a8bd2..882eb15 100644
--- a/Editor/tests/cursor/deleteCharacter16-expected.html
+++ b/Editor/tests/cursor/deleteCharacter16-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>A []</body>
+ <body>
+ A []
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter17-expected.html b/Editor/tests/cursor/deleteCharacter17-expected.html
index 74a208b..e98abd8 100644
--- a/Editor/tests/cursor/deleteCharacter17-expected.html
+++ b/Editor/tests/cursor/deleteCharacter17-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>A []</body>
+ <body>
+ A []
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter21-expected.html b/Editor/tests/cursor/deleteCharacter21-expected.html
index 8a2c526..ff21e33 100644
--- a/Editor/tests/cursor/deleteCharacter21-expected.html
+++ b/Editor/tests/cursor/deleteCharacter21-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p id="p2">[]Sample text</p></body>
+ <body>
+ <p id="p2">[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/deleteCharacter22-expected.html b/Editor/tests/cursor/deleteCharacter22-expected.html
index 2a939c0..768504b 100644
--- a/Editor/tests/cursor/deleteCharacter22-expected.html
+++ b/Editor/tests/cursor/deleteCharacter22-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1 id="item1">[]Sample text</h1></body>
+ <body>
+ <h1 id="item1">[]Sample text</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/doubleSpacePeriod01-expected.html b/Editor/tests/cursor/doubleSpacePeriod01-expected.html
index a42b30a..69d4d64 100644
--- a/Editor/tests/cursor/doubleSpacePeriod01-expected.html
+++ b/Editor/tests/cursor/doubleSpacePeriod01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text. []</p></body>
+ <body>
+ <p>Sample text. []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/doubleSpacePeriod02-expected.html b/Editor/tests/cursor/doubleSpacePeriod02-expected.html
index a42b30a..69d4d64 100644
--- a/Editor/tests/cursor/doubleSpacePeriod02-expected.html
+++ b/Editor/tests/cursor/doubleSpacePeriod02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text. []</p></body>
+ <body>
+ <p>Sample text. []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/doubleSpacePeriod03-expected.html b/Editor/tests/cursor/doubleSpacePeriod03-expected.html
index a42b30a..69d4d64 100644
--- a/Editor/tests/cursor/doubleSpacePeriod03-expected.html
+++ b/Editor/tests/cursor/doubleSpacePeriod03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text. []</p></body>
+ <body>
+ <p>Sample text. []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/doubleSpacePeriod04-expected.html b/Editor/tests/cursor/doubleSpacePeriod04-expected.html
index b629b7d..ecc4490 100644
--- a/Editor/tests/cursor/doubleSpacePeriod04-expected.html
+++ b/Editor/tests/cursor/doubleSpacePeriod04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text []</p></body>
+ <body>
+ <p>Sample text []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/doubleSpacePeriod05-expected.html b/Editor/tests/cursor/doubleSpacePeriod05-expected.html
index ece68a9..c758a73 100644
--- a/Editor/tests/cursor/doubleSpacePeriod05-expected.html
+++ b/Editor/tests/cursor/doubleSpacePeriod05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text. A. []</p></body>
+ <body>
+ <p>Sample text. A. []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/enter-delete01-expected.html b/Editor/tests/cursor/enter-delete01-expected.html
index 764f28f..b91c420 100644
--- a/Editor/tests/cursor/enter-delete01-expected.html
+++ b/Editor/tests/cursor/enter-delete01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text[]</p></body>
+ <body>
+ <p>Sample text[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/enter-delete02-expected.html b/Editor/tests/cursor/enter-delete02-expected.html
index 764f28f..b91c420 100644
--- a/Editor/tests/cursor/enter-delete02-expected.html
+++ b/Editor/tests/cursor/enter-delete02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text[]</p></body>
+ <body>
+ <p>Sample text[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/enter-delete03-expected.html b/Editor/tests/cursor/enter-delete03-expected.html
index 764f28f..b91c420 100644
--- a/Editor/tests/cursor/enter-delete03-expected.html
+++ b/Editor/tests/cursor/enter-delete03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text[]</p></body>
+ <body>
+ <p>Sample text[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/enterAfterFigure01-expected.html b/Editor/tests/cursor/enterAfterFigure01-expected.html
index a3c9f6c..1423796 100644
--- a/Editor/tests/cursor/enterAfterFigure01-expected.html
+++ b/Editor/tests/cursor/enterAfterFigure01-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
<p>
[]
<br/>
diff --git a/Editor/tests/cursor/enterAfterFigure02-expected.html b/Editor/tests/cursor/enterAfterFigure02-expected.html
index f2e19ab..e30e81e 100644
--- a/Editor/tests/cursor/enterAfterFigure02-expected.html
+++ b/Editor/tests/cursor/enterAfterFigure02-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
<p>a</p>
<p>
[]
diff --git a/Editor/tests/cursor/enterAfterFigure03-expected.html b/Editor/tests/cursor/enterAfterFigure03-expected.html
index acffee0..28082ef 100644
--- a/Editor/tests/cursor/enterAfterFigure03-expected.html
+++ b/Editor/tests/cursor/enterAfterFigure03-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
<p>
[]
<br/>
diff --git a/Editor/tests/cursor/enterBeforeFigure01-expected.html b/Editor/tests/cursor/enterBeforeFigure01-expected.html
index caad8da..6ca614d 100644
--- a/Editor/tests/cursor/enterBeforeFigure01-expected.html
+++ b/Editor/tests/cursor/enterBeforeFigure01-expected.html
@@ -6,6 +6,8 @@
[]
<br/>
</p>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
</body>
</html>
diff --git a/Editor/tests/cursor/enterBeforeFigure02-expected.html b/Editor/tests/cursor/enterBeforeFigure02-expected.html
index 303c756..9f4264f 100644
--- a/Editor/tests/cursor/enterBeforeFigure02-expected.html
+++ b/Editor/tests/cursor/enterBeforeFigure02-expected.html
@@ -7,6 +7,8 @@
[]
<br/>
</p>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
</body>
</html>
diff --git a/Editor/tests/cursor/enterBeforeFigure03-expected.html b/Editor/tests/cursor/enterBeforeFigure03-expected.html
index b24e06e..58cb2c2 100644
--- a/Editor/tests/cursor/enterBeforeFigure03-expected.html
+++ b/Editor/tests/cursor/enterBeforeFigure03-expected.html
@@ -4,6 +4,8 @@
<p>one two three</p>
<p><br/></p>
<p>[]a</p>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
</body>
</html>
diff --git a/Editor/tests/cursor/enterPressed-emptyContainer03-expected.html b/Editor/tests/cursor/enterPressed-emptyContainer03-expected.html
index 8ce762c..46f41bb 100644
--- a/Editor/tests/cursor/enterPressed-emptyContainer03-expected.html
+++ b/Editor/tests/cursor/enterPressed-emptyContainer03-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <figure><figcaption></figcaption></figure>
+ <figure>
+ <figcaption></figcaption>
+ </figure>
<p>
[]
<br/>
diff --git a/Editor/tests/cursor/enterPressed-emptyContainer03a-expected.html b/Editor/tests/cursor/enterPressed-emptyContainer03a-expected.html
index 0b6036b..07efe23 100644
--- a/Editor/tests/cursor/enterPressed-emptyContainer03a-expected.html
+++ b/Editor/tests/cursor/enterPressed-emptyContainer03a-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <figure><figcaption/></figure>
+ <figure>
+ <figcaption/>
+ </figure>
<p>
[]
<br/>
diff --git a/Editor/tests/cursor/enterPressed-emptyContainer04-expected.html b/Editor/tests/cursor/enterPressed-emptyContainer04-expected.html
index f8ec74c..3b39650 100644
--- a/Editor/tests/cursor/enterPressed-emptyContainer04-expected.html
+++ b/Editor/tests/cursor/enterPressed-emptyContainer04-expected.html
@@ -3,7 +3,11 @@
<body>
<table>
<caption></caption>
- <tbody><tr><td>Cell</td></tr></tbody>
+ <tbody>
+ <tr>
+ <td>Cell</td>
+ </tr>
+ </tbody>
</table>
<p>
[]
diff --git a/Editor/tests/cursor/enterPressed-emptyContainer04a-expected.html b/Editor/tests/cursor/enterPressed-emptyContainer04a-expected.html
index ebdb3ca..020c65b 100644
--- a/Editor/tests/cursor/enterPressed-emptyContainer04a-expected.html
+++ b/Editor/tests/cursor/enterPressed-emptyContainer04a-expected.html
@@ -3,7 +3,11 @@
<body>
<table>
<caption/>
- <tbody><tr><td>Cell</td></tr></tbody>
+ <tbody>
+ <tr>
+ <td>Cell</td>
+ </tr>
+ </tbody>
</table>
<p>
[]
diff --git a/Editor/tests/cursor/enterPressed-endnote01-expected.html b/Editor/tests/cursor/enterPressed-endnote01-expected.html
new file mode 100644
index 0000000..a0c6787
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote01-expected.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>before</p>
+ <p>
+ []
+ <span class="endnote"/>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote01-input.html b/Editor/tests/cursor/enterPressed-endnote01-input.html
new file mode 100644
index 0000000..6291f6e
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote01-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before[]<span class="endnote"></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote02-expected.html b/Editor/tests/cursor/enterPressed-endnote02-expected.html
new file mode 100644
index 0000000..3c70c9e
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote02-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="endnote"></span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote02-input.html b/Editor/tests/cursor/enterPressed-endnote02-input.html
new file mode 100644
index 0000000..0349f77
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote02-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote03-expected.html b/Editor/tests/cursor/enterPressed-endnote03-expected.html
new file mode 100644
index 0000000..a3966aa
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote03-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="endnote"/>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote03-input.html b/Editor/tests/cursor/enterPressed-endnote03-input.html
new file mode 100644
index 0000000..ab48008
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote03-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote"></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote04-expected.html b/Editor/tests/cursor/enterPressed-endnote04-expected.html
new file mode 100644
index 0000000..1664fb5
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote04-expected.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>before</p>
+ <p>
+ []
+ <span class="endnote">endnote</span>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote04-input.html b/Editor/tests/cursor/enterPressed-endnote04-input.html
new file mode 100644
index 0000000..e9e050e
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote04-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before[]<span class="endnote">endnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote05-expected.html b/Editor/tests/cursor/enterPressed-endnote05-expected.html
new file mode 100644
index 0000000..ad381c2
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote05-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="endnote">endnote</span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote05-input.html b/Editor/tests/cursor/enterPressed-endnote05-input.html
new file mode 100644
index 0000000..6a3b67f
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote05-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">[]endnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote06-expected.html b/Editor/tests/cursor/enterPressed-endnote06-expected.html
new file mode 100644
index 0000000..ad381c2
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote06-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="endnote">endnote</span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote06-input.html b/Editor/tests/cursor/enterPressed-endnote06-input.html
new file mode 100644
index 0000000..f13892f
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote06-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">end[]note</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote07-expected.html b/Editor/tests/cursor/enterPressed-endnote07-expected.html
new file mode 100644
index 0000000..ad381c2
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote07-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="endnote">endnote</span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote07-input.html b/Editor/tests/cursor/enterPressed-endnote07-input.html
new file mode 100644
index 0000000..c57b762
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote07-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">endnote[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote08-expected.html b/Editor/tests/cursor/enterPressed-endnote08-expected.html
new file mode 100644
index 0000000..ad381c2
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote08-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="endnote">endnote</span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-endnote08-input.html b/Editor/tests/cursor/enterPressed-endnote08-input.html
new file mode 100644
index 0000000..79503c7
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-endnote08-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">endnote</span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote01-expected.html b/Editor/tests/cursor/enterPressed-footnote01-expected.html
new file mode 100644
index 0000000..3650dc8
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote01-expected.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>before</p>
+ <p>
+ []
+ <span class="footnote"/>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote01-input.html b/Editor/tests/cursor/enterPressed-footnote01-input.html
new file mode 100644
index 0000000..7d1d2a2
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote01-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before[]<span class="footnote"></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote02-expected.html b/Editor/tests/cursor/enterPressed-footnote02-expected.html
new file mode 100644
index 0000000..5f52e4d
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote02-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="footnote"></span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote02-input.html b/Editor/tests/cursor/enterPressed-footnote02-input.html
new file mode 100644
index 0000000..0ee7ad4
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote02-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote03-expected.html b/Editor/tests/cursor/enterPressed-footnote03-expected.html
new file mode 100644
index 0000000..b9ab906
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote03-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="footnote"/>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote03-input.html b/Editor/tests/cursor/enterPressed-footnote03-input.html
new file mode 100644
index 0000000..f2e61c0
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote03-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote"></span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote04-expected.html b/Editor/tests/cursor/enterPressed-footnote04-expected.html
new file mode 100644
index 0000000..31207ea
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote04-expected.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>before</p>
+ <p>
+ []
+ <span class="footnote">footnote</span>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote04-input.html b/Editor/tests/cursor/enterPressed-footnote04-input.html
new file mode 100644
index 0000000..1c23e5e
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote04-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before[]<span class="footnote">footnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote05-expected.html b/Editor/tests/cursor/enterPressed-footnote05-expected.html
new file mode 100644
index 0000000..62280e9
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote05-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="footnote">footnote</span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote05-input.html b/Editor/tests/cursor/enterPressed-footnote05-input.html
new file mode 100644
index 0000000..78dc232
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote05-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">[]footnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote06-expected.html b/Editor/tests/cursor/enterPressed-footnote06-expected.html
new file mode 100644
index 0000000..62280e9
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote06-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="footnote">footnote</span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote06-input.html b/Editor/tests/cursor/enterPressed-footnote06-input.html
new file mode 100644
index 0000000..c7d159c
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote06-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">foot[]note</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote07-expected.html b/Editor/tests/cursor/enterPressed-footnote07-expected.html
new file mode 100644
index 0000000..62280e9
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote07-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="footnote">footnote</span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote07-input.html b/Editor/tests/cursor/enterPressed-footnote07-input.html
new file mode 100644
index 0000000..e6777ad
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote07-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">footnote[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote08-expected.html b/Editor/tests/cursor/enterPressed-footnote08-expected.html
new file mode 100644
index 0000000..62280e9
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote08-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <p>
+ before
+ <span class="footnote">footnote</span>
+ </p>
+ <p>[]after</p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-footnote08-input.html b/Editor/tests/cursor/enterPressed-footnote08-input.html
new file mode 100644
index 0000000..50f1986
--- /dev/null
+++ b/Editor/tests/cursor/enterPressed-footnote08-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Cursor_enterPressed();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">footnote</span>[]after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/enterPressed-heading10-expected.html b/Editor/tests/cursor/enterPressed-heading10-expected.html
index 7e0351e..59cde39 100644
--- a/Editor/tests/cursor/enterPressed-heading10-expected.html
+++ b/Editor/tests/cursor/enterPressed-heading10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1 id="item1">[]Some text</h1></body>
+ <body>
+ <h1 id="item1">[]Some text</h1>
+ </body>
</html>
diff --git a/Editor/tests/cursor/enterPressed-list31-expected.html b/Editor/tests/cursor/enterPressed-list31-expected.html
index 6a8264a..71813d4 100644
--- a/Editor/tests/cursor/enterPressed-list31-expected.html
+++ b/Editor/tests/cursor/enterPressed-list31-expected.html
@@ -8,7 +8,9 @@
[]
<br/>
</p>
- <ul><li><p>Two</p></li></ul>
+ <ul>
+ <li><p>Two</p></li>
+ </ul>
</li>
</ul>
</body>
diff --git a/Editor/tests/cursor/enterPressed-list32-expected.html b/Editor/tests/cursor/enterPressed-list32-expected.html
index 8d27a97..866a621 100644
--- a/Editor/tests/cursor/enterPressed-list32-expected.html
+++ b/Editor/tests/cursor/enterPressed-list32-expected.html
@@ -11,7 +11,9 @@
[]
<br/>
</p>
- <ul><li><p>Three</p></li></ul>
+ <ul>
+ <li><p>Three</p></li>
+ </ul>
</li>
</ul>
</li>
diff --git a/Editor/tests/cursor/enterPressed-list33-expected.html b/Editor/tests/cursor/enterPressed-list33-expected.html
index 6755de5..11d2874 100644
--- a/Editor/tests/cursor/enterPressed-list33-expected.html
+++ b/Editor/tests/cursor/enterPressed-list33-expected.html
@@ -11,7 +11,9 @@
<ul>
<li>
<p>Two</p>
- <ul><li><p>Three</p></li></ul>
+ <ul>
+ <li><p>Three</p></li>
+ </ul>
</li>
</ul>
</li>
diff --git a/Editor/tests/cursor/enterPressed03-expected.html b/Editor/tests/cursor/enterPressed03-expected.html
index 8555b1f..ff5b01b 100644
--- a/Editor/tests/cursor/enterPressed03-expected.html
+++ b/Editor/tests/cursor/enterPressed03-expected.html
@@ -1,7 +1,11 @@
<html>
<head></head>
<body>
- <div>Sample t</div>
- <div>[]ext</div>
+ <div>
+ Sample t
+ </div>
+ <div>
+ []ext
+ </div>
</body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty01-expected.html b/Editor/tests/cursor/insertCharacter-empty01-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty01-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty02-expected.html b/Editor/tests/cursor/insertCharacter-empty02-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty02-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty03-expected.html b/Editor/tests/cursor/insertCharacter-empty03-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty03-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty04-expected.html b/Editor/tests/cursor/insertCharacter-empty04-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty04-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty05-expected.html b/Editor/tests/cursor/insertCharacter-empty05-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty05-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty06-expected.html b/Editor/tests/cursor/insertCharacter-empty06-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty06-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty07-expected.html b/Editor/tests/cursor/insertCharacter-empty07-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty07-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty08-expected.html b/Editor/tests/cursor/insertCharacter-empty08-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty08-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty08-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty09-expected.html b/Editor/tests/cursor/insertCharacter-empty09-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty09-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty09-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty10-expected.html b/Editor/tests/cursor/insertCharacter-empty10-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty10-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-empty11-expected.html b/Editor/tests/cursor/insertCharacter-empty11-expected.html
index 809ffc3..cd37670 100644
--- a/Editor/tests/cursor/insertCharacter-empty11-expected.html
+++ b/Editor/tests/cursor/insertCharacter-empty11-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]</p></body>
+ <body>
+ <p>X[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-quotes01-expected.html b/Editor/tests/cursor/insertCharacter-quotes01-expected.html
index 1d54adb..c76e9d6 100644
--- a/Editor/tests/cursor/insertCharacter-quotes01-expected.html
+++ b/Editor/tests/cursor/insertCharacter-quotes01-expected.html
@@ -2,5 +2,7 @@
<head>
<meta charset="utf-8"/>
</head>
- <body><p>A 15" “screen”</p></body>
+ <body>
+ <p>A 15" “screen”</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-space01-expected.html b/Editor/tests/cursor/insertCharacter-space01-expected.html
index b1d8dad..17b4917 100644
--- a/Editor/tests/cursor/insertCharacter-space01-expected.html
+++ b/Editor/tests/cursor/insertCharacter-space01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X []</p></body>
+ <body>
+ <p>X []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-spchar01-expected.html b/Editor/tests/cursor/insertCharacter-spchar01-expected.html
index 052e8a9..5be3b04 100644
--- a/Editor/tests/cursor/insertCharacter-spchar01-expected.html
+++ b/Editor/tests/cursor/insertCharacter-spchar01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>{X[]}</p></body>
+ <body>
+ <p>{X[]}</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-spchar03-expected.html b/Editor/tests/cursor/insertCharacter-spchar03-expected.html
index a9bb7f3..2877945 100644
--- a/Editor/tests/cursor/insertCharacter-spchar03-expected.html
+++ b/Editor/tests/cursor/insertCharacter-spchar03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>{X[]}</b></p></body>
+ <body>
+ <p><b>{X[]}</b></p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-toparagraph01-expected.html b/Editor/tests/cursor/insertCharacter-toparagraph01-expected.html
index a64235d..92f8165 100644
--- a/Editor/tests/cursor/insertCharacter-toparagraph01-expected.html
+++ b/Editor/tests/cursor/insertCharacter-toparagraph01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]Sample text</p></body>
+ <body>
+ <p>X[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-toparagraph02-expected.html b/Editor/tests/cursor/insertCharacter-toparagraph02-expected.html
index fb4aefb..d287729 100644
--- a/Editor/tests/cursor/insertCharacter-toparagraph02-expected.html
+++ b/Editor/tests/cursor/insertCharacter-toparagraph02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample textX[]</p></body>
+ <body>
+ <p>Sample textX[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-toparagraph03-expected.html b/Editor/tests/cursor/insertCharacter-toparagraph03-expected.html
index a64235d..92f8165 100644
--- a/Editor/tests/cursor/insertCharacter-toparagraph03-expected.html
+++ b/Editor/tests/cursor/insertCharacter-toparagraph03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]Sample text</p></body>
+ <body>
+ <p>X[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-toparagraph04-expected.html b/Editor/tests/cursor/insertCharacter-toparagraph04-expected.html
index fb4aefb..d287729 100644
--- a/Editor/tests/cursor/insertCharacter-toparagraph04-expected.html
+++ b/Editor/tests/cursor/insertCharacter-toparagraph04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample textX[]</p></body>
+ <body>
+ <p>Sample textX[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-toparagraph05-expected.html b/Editor/tests/cursor/insertCharacter-toparagraph05-expected.html
index a64235d..92f8165 100644
--- a/Editor/tests/cursor/insertCharacter-toparagraph05-expected.html
+++ b/Editor/tests/cursor/insertCharacter-toparagraph05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]Sample text</p></body>
+ <body>
+ <p>X[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter-toparagraph06-expected.html b/Editor/tests/cursor/insertCharacter-toparagraph06-expected.html
index fb4aefb..d287729 100644
--- a/Editor/tests/cursor/insertCharacter-toparagraph06-expected.html
+++ b/Editor/tests/cursor/insertCharacter-toparagraph06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample textX[]</p></body>
+ <body>
+ <p>Sample textX[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter01-expected.html b/Editor/tests/cursor/insertCharacter01-expected.html
index fb4aefb..d287729 100644
--- a/Editor/tests/cursor/insertCharacter01-expected.html
+++ b/Editor/tests/cursor/insertCharacter01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample textX[]</p></body>
+ <body>
+ <p>Sample textX[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter02-expected.html b/Editor/tests/cursor/insertCharacter02-expected.html
index be6fe09..19a3a39 100644
--- a/Editor/tests/cursor/insertCharacter02-expected.html
+++ b/Editor/tests/cursor/insertCharacter02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample tX[]ext</p></body>
+ <body>
+ <p>Sample tX[]ext</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter03-expected.html b/Editor/tests/cursor/insertCharacter03-expected.html
index a64235d..92f8165 100644
--- a/Editor/tests/cursor/insertCharacter03-expected.html
+++ b/Editor/tests/cursor/insertCharacter03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]Sample text</p></body>
+ <body>
+ <p>X[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter04-expected.html b/Editor/tests/cursor/insertCharacter04-expected.html
index fb4aefb..d287729 100644
--- a/Editor/tests/cursor/insertCharacter04-expected.html
+++ b/Editor/tests/cursor/insertCharacter04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample textX[]</p></body>
+ <body>
+ <p>Sample textX[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter05-expected.html b/Editor/tests/cursor/insertCharacter05-expected.html
index be6fe09..19a3a39 100644
--- a/Editor/tests/cursor/insertCharacter05-expected.html
+++ b/Editor/tests/cursor/insertCharacter05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample tX[]ext</p></body>
+ <body>
+ <p>Sample tX[]ext</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter06-expected.html b/Editor/tests/cursor/insertCharacter06-expected.html
index a64235d..92f8165 100644
--- a/Editor/tests/cursor/insertCharacter06-expected.html
+++ b/Editor/tests/cursor/insertCharacter06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]Sample text</p></body>
+ <body>
+ <p>X[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter07-expected.html b/Editor/tests/cursor/insertCharacter07-expected.html
index a64235d..92f8165 100644
--- a/Editor/tests/cursor/insertCharacter07-expected.html
+++ b/Editor/tests/cursor/insertCharacter07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>X[]Sample text</p></body>
+ <body>
+ <p>X[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter08-expected.html b/Editor/tests/cursor/insertCharacter08-expected.html
index fb4aefb..d287729 100644
--- a/Editor/tests/cursor/insertCharacter08-expected.html
+++ b/Editor/tests/cursor/insertCharacter08-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample textX[]</p></body>
+ <body>
+ <p>Sample textX[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertCharacter10-expected.html b/Editor/tests/cursor/insertCharacter10-expected.html
index 2f18009..475d789 100644
--- a/Editor/tests/cursor/insertCharacter10-expected.html
+++ b/Editor/tests/cursor/insertCharacter10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text one two three[]</p></body>
+ <body>
+ <p>Sample text one two three[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertEndnote01-input.html b/Editor/tests/cursor/insertEndnote01-input.html
index 9ff5e4d..8a52b5c 100644
--- a/Editor/tests/cursor/insertEndnote01-input.html
+++ b/Editor/tests/cursor/insertEndnote01-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertEndnote02-input.html b/Editor/tests/cursor/insertEndnote02-input.html
index 1074b1c..0875055 100644
--- a/Editor/tests/cursor/insertEndnote02-input.html
+++ b/Editor/tests/cursor/insertEndnote02-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertEndnote03-input.html b/Editor/tests/cursor/insertEndnote03-input.html
index 9226476..b10fba6 100644
--- a/Editor/tests/cursor/insertEndnote03-input.html
+++ b/Editor/tests/cursor/insertEndnote03-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertEndnote04-expected.html b/Editor/tests/cursor/insertEndnote04-expected.html
index 2e542e9..dddacd5 100644
--- a/Editor/tests/cursor/insertEndnote04-expected.html
+++ b/Editor/tests/cursor/insertEndnote04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><span class="endnote">[Endnote content]</span></p></body>
+ <body>
+ <p><span class="endnote">[Endnote content]</span></p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertEndnote04-input.html b/Editor/tests/cursor/insertEndnote04-input.html
index 73cc7c4..5063da9 100644
--- a/Editor/tests/cursor/insertEndnote04-input.html
+++ b/Editor/tests/cursor/insertEndnote04-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertEndnote05-expected.html b/Editor/tests/cursor/insertEndnote05-expected.html
index 2e542e9..dddacd5 100644
--- a/Editor/tests/cursor/insertEndnote05-expected.html
+++ b/Editor/tests/cursor/insertEndnote05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><span class="endnote">[Endnote content]</span></p></body>
+ <body>
+ <p><span class="endnote">[Endnote content]</span></p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertEndnote05-input.html b/Editor/tests/cursor/insertEndnote05-input.html
index 04eac74..10e397f 100644
--- a/Editor/tests/cursor/insertEndnote05-input.html
+++ b/Editor/tests/cursor/insertEndnote05-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertEndnote06-expected.html b/Editor/tests/cursor/insertEndnote06-expected.html
index 2a32f60..47f40a9 100644
--- a/Editor/tests/cursor/insertEndnote06-expected.html
+++ b/Editor/tests/cursor/insertEndnote06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><span class="endnote">[Endnote content]</span></body>
+ <body>
+ <span class="endnote">[Endnote content]</span>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertEndnote06-input.html b/Editor/tests/cursor/insertEndnote06-input.html
index a527c5e..040d642 100644
--- a/Editor/tests/cursor/insertEndnote06-input.html
+++ b/Editor/tests/cursor/insertEndnote06-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertEndnote07-expected.html b/Editor/tests/cursor/insertEndnote07-expected.html
new file mode 100644
index 0000000..8b3f2f0
--- /dev/null
+++ b/Editor/tests/cursor/insertEndnote07-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ before
+ <span class="endnote">inside</span>
+ <span class="endnote">[Endnote content]</span>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/insertEndnote07-input.html b/Editor/tests/cursor/insertEndnote07-input.html
new file mode 100644
index 0000000..e4b618a
--- /dev/null
+++ b/Editor/tests/cursor/insertEndnote07-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before <span class="endnote">ins[]ide</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/insertEndnote08-expected.html b/Editor/tests/cursor/insertEndnote08-expected.html
new file mode 100644
index 0000000..8b3f2f0
--- /dev/null
+++ b/Editor/tests/cursor/insertEndnote08-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ before
+ <span class="endnote">inside</span>
+ <span class="endnote">[Endnote content]</span>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/insertEndnote08-input.html b/Editor/tests/cursor/insertEndnote08-input.html
new file mode 100644
index 0000000..5c5fa70
--- /dev/null
+++ b/Editor/tests/cursor/insertEndnote08-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before <span class="endnote">inside[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/insertEndnote09-expected.html b/Editor/tests/cursor/insertEndnote09-expected.html
new file mode 100644
index 0000000..8b3f2f0
--- /dev/null
+++ b/Editor/tests/cursor/insertEndnote09-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ before
+ <span class="endnote">inside</span>
+ <span class="endnote">[Endnote content]</span>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/insertEndnote09-input.html b/Editor/tests/cursor/insertEndnote09-input.html
new file mode 100644
index 0000000..d915ef5
--- /dev/null
+++ b/Editor/tests/cursor/insertEndnote09-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Cursor_insertEndnote("Endnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before <span class="endnote">[]inside</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/insertFootnote01-input.html b/Editor/tests/cursor/insertFootnote01-input.html
index 7d4852c..22c102b 100644
--- a/Editor/tests/cursor/insertFootnote01-input.html
+++ b/Editor/tests/cursor/insertFootnote01-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertFootnote02-input.html b/Editor/tests/cursor/insertFootnote02-input.html
index 0957ba4..e1ac92a 100644
--- a/Editor/tests/cursor/insertFootnote02-input.html
+++ b/Editor/tests/cursor/insertFootnote02-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertFootnote03-input.html b/Editor/tests/cursor/insertFootnote03-input.html
index ec62f58..b24f4df 100644
--- a/Editor/tests/cursor/insertFootnote03-input.html
+++ b/Editor/tests/cursor/insertFootnote03-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertFootnote04-expected.html b/Editor/tests/cursor/insertFootnote04-expected.html
index 48b50fb..331c33c 100644
--- a/Editor/tests/cursor/insertFootnote04-expected.html
+++ b/Editor/tests/cursor/insertFootnote04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><span class="footnote">[Footnote content]</span></p></body>
+ <body>
+ <p><span class="footnote">[Footnote content]</span></p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertFootnote04-input.html b/Editor/tests/cursor/insertFootnote04-input.html
index 22d9e2d..5e8ee78 100644
--- a/Editor/tests/cursor/insertFootnote04-input.html
+++ b/Editor/tests/cursor/insertFootnote04-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertFootnote05-expected.html b/Editor/tests/cursor/insertFootnote05-expected.html
index 48b50fb..331c33c 100644
--- a/Editor/tests/cursor/insertFootnote05-expected.html
+++ b/Editor/tests/cursor/insertFootnote05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><span class="footnote">[Footnote content]</span></p></body>
+ <body>
+ <p><span class="footnote">[Footnote content]</span></p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertFootnote05-input.html b/Editor/tests/cursor/insertFootnote05-input.html
index 5c3885e..a976635 100644
--- a/Editor/tests/cursor/insertFootnote05-input.html
+++ b/Editor/tests/cursor/insertFootnote05-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertFootnote06-expected.html b/Editor/tests/cursor/insertFootnote06-expected.html
index 86c4dac..a70222a 100644
--- a/Editor/tests/cursor/insertFootnote06-expected.html
+++ b/Editor/tests/cursor/insertFootnote06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><span class="footnote">[Footnote content]</span></body>
+ <body>
+ <span class="footnote">[Footnote content]</span>
+ </body>
</html>
diff --git a/Editor/tests/cursor/insertFootnote06-input.html b/Editor/tests/cursor/insertFootnote06-input.html
index 9452059..d4c318c 100644
--- a/Editor/tests/cursor/insertFootnote06-input.html
+++ b/Editor/tests/cursor/insertFootnote06-input.html
@@ -5,6 +5,7 @@
function performTest()
{
Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
showSelection();
}
</script>
diff --git a/Editor/tests/cursor/insertFootnote07-expected.html b/Editor/tests/cursor/insertFootnote07-expected.html
new file mode 100644
index 0000000..70fa0f7
--- /dev/null
+++ b/Editor/tests/cursor/insertFootnote07-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ before
+ <span class="footnote">inside</span>
+ <span class="footnote">[Footnote content]</span>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/insertFootnote07-input.html b/Editor/tests/cursor/insertFootnote07-input.html
new file mode 100644
index 0000000..98ed6d9
--- /dev/null
+++ b/Editor/tests/cursor/insertFootnote07-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before <span class="footnote">ins[]ide</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/insertFootnote08-expected.html b/Editor/tests/cursor/insertFootnote08-expected.html
new file mode 100644
index 0000000..70fa0f7
--- /dev/null
+++ b/Editor/tests/cursor/insertFootnote08-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ before
+ <span class="footnote">inside</span>
+ <span class="footnote">[Footnote content]</span>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/insertFootnote08-input.html b/Editor/tests/cursor/insertFootnote08-input.html
new file mode 100644
index 0000000..695c7d5
--- /dev/null
+++ b/Editor/tests/cursor/insertFootnote08-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before <span class="footnote">inside[]</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/insertFootnote09-expected.html b/Editor/tests/cursor/insertFootnote09-expected.html
new file mode 100644
index 0000000..70fa0f7
--- /dev/null
+++ b/Editor/tests/cursor/insertFootnote09-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ before
+ <span class="footnote">inside</span>
+ <span class="footnote">[Footnote content]</span>
+ after
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/cursor/insertFootnote09-input.html b/Editor/tests/cursor/insertFootnote09-input.html
new file mode 100644
index 0000000..9feec88
--- /dev/null
+++ b/Editor/tests/cursor/insertFootnote09-input.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Cursor_insertFootnote("Footnote content");
+ Selection_preserveWhileExecuting(showEmptyTextNodes);
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>before <span class="footnote">[]inside</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/cursor/nbsp01-expected.html b/Editor/tests/cursor/nbsp01-expected.html
index 0421d72..8098ad9 100644
--- a/Editor/tests/cursor/nbsp01-expected.html
+++ b/Editor/tests/cursor/nbsp01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text []</p></body>
+ <body>
+ <p>Sample text []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/nbsp02-expected.html b/Editor/tests/cursor/nbsp02-expected.html
index b629b7d..ecc4490 100644
--- a/Editor/tests/cursor/nbsp02-expected.html
+++ b/Editor/tests/cursor/nbsp02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text []</p></body>
+ <body>
+ <p>Sample text []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/nbsp03-expected.html b/Editor/tests/cursor/nbsp03-expected.html
index 8fcec03..61c2a8a 100644
--- a/Editor/tests/cursor/nbsp03-expected.html
+++ b/Editor/tests/cursor/nbsp03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text a[]</p></body>
+ <body>
+ <p>Sample text a[]</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/nbsp04-expected.html b/Editor/tests/cursor/nbsp04-expected.html
index 0421d72..8098ad9 100644
--- a/Editor/tests/cursor/nbsp04-expected.html
+++ b/Editor/tests/cursor/nbsp04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text []</p></body>
+ <body>
+ <p>Sample text []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/nbsp05-expected.html b/Editor/tests/cursor/nbsp05-expected.html
index b629b7d..ecc4490 100644
--- a/Editor/tests/cursor/nbsp05-expected.html
+++ b/Editor/tests/cursor/nbsp05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text []</p></body>
+ <body>
+ <p>Sample text []</p>
+ </body>
</html>
diff --git a/Editor/tests/cursor/textAfterFigure01-expected.html b/Editor/tests/cursor/textAfterFigure01-expected.html
index 19deea7..5498785 100644
--- a/Editor/tests/cursor/textAfterFigure01-expected.html
+++ b/Editor/tests/cursor/textAfterFigure01-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
<p>X[]</p>
<p>one two three</p>
</body>
diff --git a/Editor/tests/cursor/textAfterFigure02-expected.html b/Editor/tests/cursor/textAfterFigure02-expected.html
index 47a6df3..5163f29 100644
--- a/Editor/tests/cursor/textAfterFigure02-expected.html
+++ b/Editor/tests/cursor/textAfterFigure02-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
<p>aX[]</p>
<p>one two three</p>
</body>
diff --git a/Editor/tests/cursor/textAfterFigure03-expected.html b/Editor/tests/cursor/textAfterFigure03-expected.html
index 4da2c29..6035b43 100644
--- a/Editor/tests/cursor/textAfterFigure03-expected.html
+++ b/Editor/tests/cursor/textAfterFigure03-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
<p>X[]a</p>
<p>one two three</p>
</body>
diff --git a/Editor/tests/cursor/textBeforeFigure01-expected.html b/Editor/tests/cursor/textBeforeFigure01-expected.html
index b264b98..99ccaa9 100644
--- a/Editor/tests/cursor/textBeforeFigure01-expected.html
+++ b/Editor/tests/cursor/textBeforeFigure01-expected.html
@@ -3,6 +3,8 @@
<body>
<p>one two three</p>
<p>X[]</p>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
</body>
</html>
diff --git a/Editor/tests/cursor/textBeforeFigure02-expected.html b/Editor/tests/cursor/textBeforeFigure02-expected.html
index 7fcff8f..92b6ebe 100644
--- a/Editor/tests/cursor/textBeforeFigure02-expected.html
+++ b/Editor/tests/cursor/textBeforeFigure02-expected.html
@@ -3,6 +3,8 @@
<body>
<p>one two three</p>
<p>aX[]</p>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
</body>
</html>
diff --git a/Editor/tests/cursor/textBeforeFigure03-expected.html b/Editor/tests/cursor/textBeforeFigure03-expected.html
index 8947896..37ef96c 100644
--- a/Editor/tests/cursor/textBeforeFigure03-expected.html
+++ b/Editor/tests/cursor/textBeforeFigure03-expected.html
@@ -3,6 +3,8 @@
<body>
<p>one two three</p>
<p>X[]a</p>
- <figure><img src="../figures/nothing.png"/></figure>
+ <figure>
+ <img src="../figures/nothing.png"/>
+ </figure>
</body>
</html>
diff --git a/Editor/tests/dom/RangeTest.js b/Editor/tests/dom/RangeTest.js
index b182f63..2d69cc3 100644
--- a/Editor/tests/dom/RangeTest.js
+++ b/Editor/tests/dom/RangeTest.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var allPositions;
var allPositionsIndexMap;
diff --git a/Editor/tests/dom/avoidInline01-expected.html b/Editor/tests/dom/avoidInline01-expected.html
index 85d14c3..9616757 100644
--- a/Editor/tests/dom/avoidInline01-expected.html
+++ b/Editor/tests/dom/avoidInline01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One</p></body>
+ <body>
+ <p>One</p>
+ </body>
</html>
diff --git a/Editor/tests/dom/ensureInlineNodesInParagraph01-expected.html b/Editor/tests/dom/ensureInlineNodesInParagraph01-expected.html
index 430934e..7bd9ea5 100644
--- a/Editor/tests/dom/ensureInlineNodesInParagraph01-expected.html
+++ b/Editor/tests/dom/ensureInlineNodesInParagraph01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Test</p></body>
+ <body>
+ <p>Test</p>
+ </body>
</html>
diff --git a/Editor/tests/dom/ensureValidHierarchy01-expected.html b/Editor/tests/dom/ensureValidHierarchy01-expected.html
index 9a38b37..d79a0f8 100644
--- a/Editor/tests/dom/ensureValidHierarchy01-expected.html
+++ b/Editor/tests/dom/ensureValidHierarchy01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>Sample text</b></p></body>
+ <body>
+ <p><b>Sample text</b></p>
+ </body>
</html>
diff --git a/Editor/tests/dom/ensureValidHierarchy02-expected.html b/Editor/tests/dom/ensureValidHierarchy02-expected.html
index 9a38b37..d79a0f8 100644
--- a/Editor/tests/dom/ensureValidHierarchy02-expected.html
+++ b/Editor/tests/dom/ensureValidHierarchy02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>Sample text</b></p></body>
+ <body>
+ <p><b>Sample text</b></p>
+ </body>
</html>
diff --git a/Editor/tests/dom/ensureValidHierarchy06-expected.html b/Editor/tests/dom/ensureValidHierarchy06-expected.html
index d26dd5b..300d365 100644
--- a/Editor/tests/dom/ensureValidHierarchy06-expected.html
+++ b/Editor/tests/dom/ensureValidHierarchy06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b><i><u>Sample text</u></i></b></p></body>
+ <body>
+ <p><b><i><u>Sample text</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/dom/ensureValidHierarchy07-expected.html b/Editor/tests/dom/ensureValidHierarchy07-expected.html
index c9589ff..d1da84b 100644
--- a/Editor/tests/dom/ensureValidHierarchy07-expected.html
+++ b/Editor/tests/dom/ensureValidHierarchy07-expected.html
@@ -1,14 +1,22 @@
<html>
<head></head>
<body>
- <ul><li><b><i><u>Item 1</u></i></b></li></ul>
+ <ul>
+ <li><b><i><u>Item 1</u></i></b></li>
+ </ul>
<b>
<i>
<u>
- <ol><li>Item 2</li></ol>
+ <ol>
+ <li>Item 2</li>
+ </ol>
<p>Sample text</p>
- <ul><li>Item 3</li></ul>
- <ol><li>Item 4</li></ol>
+ <ul>
+ <li>Item 3</li>
+ </ul>
+ <ol>
+ <li>Item 4</li>
+ </ol>
</u>
</i>
</b>
diff --git a/Editor/tests/dom/ensureValidHierarchy08-expected.html b/Editor/tests/dom/ensureValidHierarchy08-expected.html
index d10f177..555f18d 100644
--- a/Editor/tests/dom/ensureValidHierarchy08-expected.html
+++ b/Editor/tests/dom/ensureValidHierarchy08-expected.html
@@ -2,13 +2,19 @@
<head></head>
<body>
<b><i><u><ul><li>Item 1</li></ul></u></i></b>
- <ol><li><b><i><u>Item 2</u></i></b></li></ol>
+ <ol>
+ <li><b><i><u>Item 2</u></i></b></li>
+ </ol>
<b>
<i>
<u>
<p>Sample text</p>
- <ul><li>Item 3</li></ul>
- <ol><li>Item 4</li></ol>
+ <ul>
+ <li>Item 3</li>
+ </ul>
+ <ol>
+ <li>Item 4</li>
+ </ol>
</u>
</i>
</b>
diff --git a/Editor/tests/dom/ensureValidHierarchy09-expected.html b/Editor/tests/dom/ensureValidHierarchy09-expected.html
index 8d208ca..b463ceb 100644
--- a/Editor/tests/dom/ensureValidHierarchy09-expected.html
+++ b/Editor/tests/dom/ensureValidHierarchy09-expected.html
@@ -4,8 +4,12 @@
<b>
<i>
<u>
- <ul><li>Item 1</li></ul>
- <ol><li>Item 2</li></ol>
+ <ul>
+ <li>Item 1</li>
+ </ul>
+ <ol>
+ <li>Item 2</li>
+ </ol>
</u>
</i>
</b>
@@ -13,8 +17,12 @@
<b>
<i>
<u>
- <ul><li>Item 3</li></ul>
- <ol><li>Item 4</li></ol>
+ <ul>
+ <li>Item 3</li>
+ </ul>
+ <ol>
+ <li>Item 4</li>
+ </ol>
</u>
</i>
</b>
diff --git a/Editor/tests/dom/ensureValidHierarchy10-expected.html b/Editor/tests/dom/ensureValidHierarchy10-expected.html
index 3abc400..a77382d 100644
--- a/Editor/tests/dom/ensureValidHierarchy10-expected.html
+++ b/Editor/tests/dom/ensureValidHierarchy10-expected.html
@@ -4,13 +4,19 @@
<b>
<i>
<u>
- <ul><li>Item 1</li></ul>
- <ol><li>Item 2</li></ol>
+ <ul>
+ <li>Item 1</li>
+ </ul>
+ <ol>
+ <li>Item 2</li>
+ </ol>
<p>Sample text</p>
</u>
</i>
</b>
- <ul><li><b><i><u>Item 3</u></i></b></li></ul>
+ <ul>
+ <li><b><i><u>Item 3</u></i></b></li>
+ </ul>
<b><i><u><ol><li>Item 4</li></ol></u></i></b>
</body>
</html>
diff --git a/Editor/tests/dom/ensureValidHierarchy11-expected.html b/Editor/tests/dom/ensureValidHierarchy11-expected.html
index 79abfad..1d96c09 100644
--- a/Editor/tests/dom/ensureValidHierarchy11-expected.html
+++ b/Editor/tests/dom/ensureValidHierarchy11-expected.html
@@ -4,13 +4,21 @@
<b>
<i>
<u>
- <ul><li>Item 1</li></ul>
- <ol><li>Item 2</li></ol>
+ <ul>
+ <li>Item 1</li>
+ </ul>
+ <ol>
+ <li>Item 2</li>
+ </ol>
<p>Sample text</p>
- <ul><li>Item 3</li></ul>
+ <ul>
+ <li>Item 3</li>
+ </ul>
</u>
</i>
</b>
- <ol><li><b><i><u>Item 4</u></i></b></li></ol>
+ <ol>
+ <li><b><i><u>Item 4</u></i></b></li>
+ </ol>
</body>
</html>
diff --git a/Editor/tests/dom/mergeWithNeighbours01-expected.html b/Editor/tests/dom/mergeWithNeighbours01-expected.html
index 4a2e136..bb8d07e 100644
--- a/Editor/tests/dom/mergeWithNeighbours01-expected.html
+++ b/Editor/tests/dom/mergeWithNeighbours01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>OneT[woThreeFou]rFive</p></body>
+ <body>
+ <p>OneT[woThreeFou]rFive</p>
+ </body>
</html>
diff --git a/Editor/tests/dom/mergeWithNeighbours02-expected.html b/Editor/tests/dom/mergeWithNeighbours02-expected.html
index 375e220..e827e60 100644
--- a/Editor/tests/dom/mergeWithNeighbours02-expected.html
+++ b/Editor/tests/dom/mergeWithNeighbours02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>O[neTwoThreeFourFiv]e</p></body>
+ <body>
+ <p>O[neTwoThreeFourFiv]e</p>
+ </body>
</html>
diff --git a/Editor/tests/dom/mergeWithNeighbours03-expected.html b/Editor/tests/dom/mergeWithNeighbours03-expected.html
index 36e255d..9430e9d 100644
--- a/Editor/tests/dom/mergeWithNeighbours03-expected.html
+++ b/Editor/tests/dom/mergeWithNeighbours03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One[TwoThreeFourFive]</p></body>
+ <body>
+ <p>One[TwoThreeFourFive]</p>
+ </body>
</html>
diff --git a/Editor/tests/dom/mergeWithNeighbours04-expected.html b/Editor/tests/dom/mergeWithNeighbours04-expected.html
index 367f373..40431bb 100644
--- a/Editor/tests/dom/mergeWithNeighbours04-expected.html
+++ b/Editor/tests/dom/mergeWithNeighbours04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One[OneOneOneOne]</p></body>
+ <body>
+ <p>One[OneOneOneOne]</p>
+ </body>
</html>
diff --git a/Editor/tests/dom/mergeWithNeighbours05-expected.html b/Editor/tests/dom/mergeWithNeighbours05-expected.html
index 012fd26..1e895ad 100644
--- a/Editor/tests/dom/mergeWithNeighbours05-expected.html
+++ b/Editor/tests/dom/mergeWithNeighbours05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b><i>OneTwoThreeFour[FiveSixSevenEight]Nine</i></b></p></body>
+ <body>
+ <p><b><i>OneTwoThreeFour[FiveSixSevenEight]Nine</i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/dom/mergeWithNeighbours07-expected.html b/Editor/tests/dom/mergeWithNeighbours07-expected.html
index 9e1999b..790e84c 100644
--- a/Editor/tests/dom/mergeWithNeighbours07-expected.html
+++ b/Editor/tests/dom/mergeWithNeighbours07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>OneTwo[ThreeFour]Five</p></body>
+ <body>
+ <p>OneTwo[ThreeFour]Five</p>
+ </body>
</html>
diff --git a/Editor/tests/dom/mergeWithNeighbours11-expected.html b/Editor/tests/dom/mergeWithNeighbours11-expected.html
index b6a7057..73d9c83 100644
--- a/Editor/tests/dom/mergeWithNeighbours11-expected.html
+++ b/Editor/tests/dom/mergeWithNeighbours11-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b><i>OneTwoThree[FourFiveSix]SevenEightNine</i></b></p></body>
+ <body>
+ <p><b><i>OneTwoThree[FourFiveSix]SevenEightNine</i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/dom/replaceElement01-expected.html b/Editor/tests/dom/replaceElement01-expected.html
index a788a5c..bb9a23e 100644
--- a/Editor/tests/dom/replaceElement01-expected.html
+++ b/Editor/tests/dom/replaceElement01-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div>Sample text</div></body>
+ <body>
+ <div>
+ Sample text
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/dom/replaceElement02-expected.html b/Editor/tests/dom/replaceElement02-expected.html
index 2ba0efc..7b87b12 100644
--- a/Editor/tests/dom/replaceElement02-expected.html
+++ b/Editor/tests/dom/replaceElement02-expected.html
@@ -3,7 +3,9 @@
<body>
<p>One</p>
<p>Two</p>
- <div>Three</div>
+ <div>
+ Three
+ </div>
<p>Four</p>
<p>Five</p>
</body>
diff --git a/Editor/tests/dom/replaceElement03-expected.html b/Editor/tests/dom/replaceElement03-expected.html
index d5a25eb..560309a 100644
--- a/Editor/tests/dom/replaceElement03-expected.html
+++ b/Editor/tests/dom/replaceElement03-expected.html
@@ -3,7 +3,9 @@
<body>
<p>One</p>
<p>Two</p>
- <div align="center" style="color: red">Three</div>
+ <div align="center" style="color: red">
+ Three
+ </div>
<p>Four</p>
<p>Five</p>
</body>
diff --git a/Editor/tests/dom/replaceElement06-expected.html b/Editor/tests/dom/replaceElement06-expected.html
index 86ba135..362f32d 100644
--- a/Editor/tests/dom/replaceElement06-expected.html
+++ b/Editor/tests/dom/replaceElement06-expected.html
@@ -3,7 +3,9 @@
<body>
<p>One</p>
<p>Two</p>
- <div>Sam[ple te]xt</div>
+ <div>
+ Sam[ple te]xt
+ </div>
<p>Six</p>
<p>Seven</p>
</body>
diff --git a/Editor/tests/dom/replaceElement07-expected.html b/Editor/tests/dom/replaceElement07-expected.html
index 13ec421..ef72dcb 100644
--- a/Editor/tests/dom/replaceElement07-expected.html
+++ b/Editor/tests/dom/replaceElement07-expected.html
@@ -4,7 +4,9 @@
<p>One</p>
<p>Two</p>
[
- <div>Sample text</div>
+ <div>
+ Sample text
+ </div>
]
<p>Six</p>
<p>Seven</p>
diff --git a/Editor/tests/dom/replaceElement08-expected.html b/Editor/tests/dom/replaceElement08-expected.html
index b4e915d..377cfda 100644
--- a/Editor/tests/dom/replaceElement08-expected.html
+++ b/Editor/tests/dom/replaceElement08-expected.html
@@ -3,7 +3,9 @@
<body>
<p>One</p>
<p>Two</p>
- <div>[Sample text]</div>
+ <div>
+ [Sample text]
+ </div>
<p>Six</p>
<p>Seven</p>
</body>
diff --git a/Editor/tests/dom/splitAroundSelection-endnote01-expected.html b/Editor/tests/dom/splitAroundSelection-endnote01-expected.html
new file mode 100644
index 0000000..648d67e
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-endnote01-expected.html
@@ -0,0 +1,10 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="endnote">[two] three four</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-endnote01-input.html b/Editor/tests/dom/splitAroundSelection-endnote01-input.html
new file mode 100644
index 0000000..394273a
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-endnote01-input.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ var range = Selection_get();
+ Range_trackWhileExecuting(range,function() {
+ Formatting_splitAroundSelection(range);
+ });
+ showRangeAsBrackets(range);
+}
+</script>
+</head>
+<body>
+ <p>one <span class="endnote">[two] three four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-endnote02-expected.html b/Editor/tests/dom/splitAroundSelection-endnote02-expected.html
new file mode 100644
index 0000000..e722f31
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-endnote02-expected.html
@@ -0,0 +1,10 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="endnote">two [three] four</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-endnote02-input.html b/Editor/tests/dom/splitAroundSelection-endnote02-input.html
new file mode 100644
index 0000000..bf3250d
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-endnote02-input.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ var range = Selection_get();
+ Range_trackWhileExecuting(range,function() {
+ Formatting_splitAroundSelection(range);
+ });
+ showRangeAsBrackets(range);
+}
+</script>
+</head>
+<body>
+ <p>one <span class="endnote">two [three] four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-endnote03-expected.html b/Editor/tests/dom/splitAroundSelection-endnote03-expected.html
new file mode 100644
index 0000000..f3ac04e
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-endnote03-expected.html
@@ -0,0 +1,10 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="endnote">two three [four]</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-endnote03-input.html b/Editor/tests/dom/splitAroundSelection-endnote03-input.html
new file mode 100644
index 0000000..ed7cb29
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-endnote03-input.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ var range = Selection_get();
+ Range_trackWhileExecuting(range,function() {
+ Formatting_splitAroundSelection(range);
+ });
+ showRangeAsBrackets(range);
+}
+</script>
+</head>
+<body>
+ <p>one <span class="endnote">two three [four]</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-footnote01-expected.html b/Editor/tests/dom/splitAroundSelection-footnote01-expected.html
new file mode 100644
index 0000000..5245a0c
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-footnote01-expected.html
@@ -0,0 +1,10 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="footnote">[two] three four</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-footnote01-input.html b/Editor/tests/dom/splitAroundSelection-footnote01-input.html
new file mode 100644
index 0000000..256fdc7
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-footnote01-input.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ var range = Selection_get();
+ Range_trackWhileExecuting(range,function() {
+ Formatting_splitAroundSelection(range);
+ });
+ showRangeAsBrackets(range);
+}
+</script>
+</head>
+<body>
+ <p>one <span class="footnote">[two] three four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-footnote02-expected.html b/Editor/tests/dom/splitAroundSelection-footnote02-expected.html
new file mode 100644
index 0000000..fce0569
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-footnote02-expected.html
@@ -0,0 +1,10 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="footnote">two [three] four</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-footnote02-input.html b/Editor/tests/dom/splitAroundSelection-footnote02-input.html
new file mode 100644
index 0000000..737c18d
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-footnote02-input.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ var range = Selection_get();
+ Range_trackWhileExecuting(range,function() {
+ Formatting_splitAroundSelection(range);
+ });
+ showRangeAsBrackets(range);
+}
+</script>
+</head>
+<body>
+ <p>one <span class="footnote">two [three] four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-footnote03-expected.html b/Editor/tests/dom/splitAroundSelection-footnote03-expected.html
new file mode 100644
index 0000000..772d336
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-footnote03-expected.html
@@ -0,0 +1,10 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="footnote">two three [four]</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/dom/splitAroundSelection-footnote03-input.html b/Editor/tests/dom/splitAroundSelection-footnote03-input.html
new file mode 100644
index 0000000..7dd0542
--- /dev/null
+++ b/Editor/tests/dom/splitAroundSelection-footnote03-input.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ var range = Selection_get();
+ Range_trackWhileExecuting(range,function() {
+ Formatting_splitAroundSelection(range);
+ });
+ showRangeAsBrackets(range);
+}
+</script>
+</head>
+<body>
+ <p>one <span class="footnote">two three [four]</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/dom/tracking-delete01-expected.html b/Editor/tests/dom/tracking-delete01-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/dom/tracking-delete01-expected.html
+++ b/Editor/tests/dom/tracking-delete01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-delete02-expected.html b/Editor/tests/dom/tracking-delete02-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/dom/tracking-delete02-expected.html
+++ b/Editor/tests/dom/tracking-delete02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-delete03-expected.html b/Editor/tests/dom/tracking-delete03-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/dom/tracking-delete03-expected.html
+++ b/Editor/tests/dom/tracking-delete03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-mergeWithNeighbours01-expected.html b/Editor/tests/dom/tracking-mergeWithNeighbours01-expected.html
index d1477c0..b48aa59 100644
--- a/Editor/tests/dom/tracking-mergeWithNeighbours01-expected.html
+++ b/Editor/tests/dom/tracking-mergeWithNeighbours01-expected.html
@@ -1,7 +1,8 @@
<html>
<head>
</head>
- <body>-
+ <body>
+ -
Before: positions[0] = (BODY,0)
Before: positions[1] = (P,0)
Before: positions[2] = (BR#br1,0)
@@ -51,5 +52,6 @@
After: positions[21] = (BR#br2,0)
After: positions[22] = (P,3) - changed from (P,5)
After: positions[23] = (BODY,1)
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-mergeWithNeighbours02-expected.html b/Editor/tests/dom/tracking-mergeWithNeighbours02-expected.html
index 9a91f0d..9f592e5 100644
--- a/Editor/tests/dom/tracking-mergeWithNeighbours02-expected.html
+++ b/Editor/tests/dom/tracking-mergeWithNeighbours02-expected.html
@@ -1,7 +1,8 @@
<html>
<head>
</head>
- <body>-
+ <body>
+ -
Before: positions[0] = (BODY,0)
Before: positions[1] = (P,0)
Before: positions[2] = (SPAN#span1,0)
@@ -65,5 +66,6 @@
After: positions[28] = (SPAN#span5,0)
After: positions[29] = (P,3) - changed from (P,5)
After: positions[30] = (BODY,1)
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-moveNode-expected.html b/Editor/tests/dom/tracking-moveNode-expected.html
index 796ef0a..561690d 100644
--- a/Editor/tests/dom/tracking-moveNode-expected.html
+++ b/Editor/tests/dom/tracking-moveNode-expected.html
@@ -1,7 +1,8 @@
<html>
<head>
</head>
- <body>-
+ <body>
+ -
Before: positions[0] = (BODY,0)
Before: positions[1] = (P#p1,0)
Before: positions[2] = (B,0)
@@ -173,5 +174,6 @@
After: positions[82] = (B,2)
After: positions[83] = (P#p2,6) - changed from (P#p2,5)
After: positions[84] = (BODY,2)
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-removeNodeButKeepChildren-expected.html b/Editor/tests/dom/tracking-removeNodeButKeepChildren-expected.html
index 88f6503..95eab37 100644
--- a/Editor/tests/dom/tracking-removeNodeButKeepChildren-expected.html
+++ b/Editor/tests/dom/tracking-removeNodeButKeepChildren-expected.html
@@ -1,7 +1,8 @@
<html>
<head>
</head>
- <body>-
+ <body>
+ -
Before: positions[0] = (BODY,0)
Before: positions[1] = (P#p1,0)
Before: positions[2] = "|ab"
@@ -81,5 +82,6 @@
After: positions[36] = "\n|\n"
After: positions[37] = "\n\n|"
After: positions[38] = (BODY,6) - changed from (BODY,4)
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-replaceElement-expected.html b/Editor/tests/dom/tracking-replaceElement-expected.html
index a3e6149..a83cfa6 100644
--- a/Editor/tests/dom/tracking-replaceElement-expected.html
+++ b/Editor/tests/dom/tracking-replaceElement-expected.html
@@ -1,7 +1,8 @@
<html>
<head>
</head>
- <body>-
+ <body>
+ -
Before: positions[0] = (BODY,0)
Before: positions[1] = (P#p1,0)
Before: positions[2] = "|ab"
@@ -81,5 +82,6 @@
After: positions[36] = "\n|\n"
After: positions[37] = "\n\n|"
After: positions[38] = (BODY,4)
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text1-expected.html b/Editor/tests/dom/tracking-text1-expected.html
index c2814ab..964c4f3 100644
--- a/Editor/tests/dom/tracking-text1-expected.html
+++ b/Editor/tests/dom/tracking-text1-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "Here is te|xt"
positions[16] = "Here is tex|t"
positions[17] = "Here is text|"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text2-expected.html b/Editor/tests/dom/tracking-text2-expected.html
index f435e11..d5c122d 100644
--- a/Editor/tests/dom/tracking-text2-expected.html
+++ b/Editor/tests/dom/tracking-text2-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "is some te|xt"
positions[16] = "is some tex|t"
positions[17] = "is some text|"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text3-expected.html b/Editor/tests/dom/tracking-text3-expected.html
index 57b328e..1df6e5d 100644
--- a/Editor/tests/dom/tracking-text3-expected.html
+++ b/Editor/tests/dom/tracking-text3-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "Here is some|"
positions[16] = "Here is some|"
positions[17] = "Here is some|"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text4-expected.html b/Editor/tests/dom/tracking-text4-expected.html
index 1339a49..6103a83 100644
--- a/Editor/tests/dom/tracking-text4-expected.html
+++ b/Editor/tests/dom/tracking-text4-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "Here is (inserted)some te|xt"
positions[16] = "Here is (inserted)some tex|t"
positions[17] = "Here is (inserted)some text|"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text5-expected.html b/Editor/tests/dom/tracking-text5-expected.html
index a60a0ea..f935774 100644
--- a/Editor/tests/dom/tracking-text5-expected.html
+++ b/Editor/tests/dom/tracking-text5-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "(inserted)Here is some te|xt"
positions[16] = "(inserted)Here is some tex|t"
positions[17] = "(inserted)Here is some text|"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text6-expected.html b/Editor/tests/dom/tracking-text6-expected.html
index 81f5d4f..0f5ab29 100644
--- a/Editor/tests/dom/tracking-text6-expected.html
+++ b/Editor/tests/dom/tracking-text6-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "Here is some te|xt(inserted)"
positions[16] = "Here is some tex|t(inserted)"
positions[17] = "Here is some text|(inserted)"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text7-expected.html b/Editor/tests/dom/tracking-text7-expected.html
index 5b65f1b..6e62c11 100644
--- a/Editor/tests/dom/tracking-text7-expected.html
+++ b/Editor/tests/dom/tracking-text7-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "Here is (inserted)te|xt"
positions[16] = "Here is (inserted)tex|t"
positions[17] = "Here is (inserted)text|"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text8-expected.html b/Editor/tests/dom/tracking-text8-expected.html
index 5e9ba61..7fff8bb 100644
--- a/Editor/tests/dom/tracking-text8-expected.html
+++ b/Editor/tests/dom/tracking-text8-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "(inserted) is some te|xt"
positions[16] = "(inserted) is some tex|t"
positions[17] = "(inserted) is some text|"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-text9-expected.html b/Editor/tests/dom/tracking-text9-expected.html
index a6a11f4..369dd26 100644
--- a/Editor/tests/dom/tracking-text9-expected.html
+++ b/Editor/tests/dom/tracking-text9-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before text change:
positions[0] = "|Here is some text"
positions[1] = "H|ere is some text"
@@ -39,5 +40,6 @@
positions[15] = "te|xt(inserted)"
positions[16] = "tex|t(inserted)"
positions[17] = "text|(inserted)"
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking-wrapNode-expected.html b/Editor/tests/dom/tracking-wrapNode-expected.html
index 0e52b3f..7012054 100644
--- a/Editor/tests/dom/tracking-wrapNode-expected.html
+++ b/Editor/tests/dom/tracking-wrapNode-expected.html
@@ -1,7 +1,8 @@
<html>
<head>
</head>
- <body>-
+ <body>
+ -
Before: positions[0] = (BODY,0)
Before: positions[1] = (P#p1,0)
Before: positions[2] = "|ab"
@@ -61,5 +62,6 @@
After: positions[26] = "\n|\n"
After: positions[27] = "\n\n|"
After: positions[28] = (BODY,4)
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking1-expected.html b/Editor/tests/dom/tracking1-expected.html
index e058641..a4bd0ab 100644
--- a/Editor/tests/dom/tracking1-expected.html
+++ b/Editor/tests/dom/tracking1-expected.html
@@ -1,6 +1,7 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
posOffset 0, nodeOffset 0: (BODY,0) (BODY,0) (BODY,0)
posOffset 0, nodeOffset 1: (BODY,0) (BODY,0) (BODY,0)
posOffset 0, nodeOffset 2: (BODY,0) (BODY,0) (BODY,0)
@@ -26,5 +27,6 @@
posOffset 4, nodeOffset 2: (BODY,4) (BODY,5) (BODY,4)
posOffset 4, nodeOffset 3: (BODY,4) (BODY,5) (BODY,4)
posOffset 4, nodeOffset 4: (BODY,4) (BODY,4) (BODY,4)
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/dom/tracking2-expected.html b/Editor/tests/dom/tracking2-expected.html
index 33a85ba..bfde537 100644
--- a/Editor/tests/dom/tracking2-expected.html
+++ b/Editor/tests/dom/tracking2-expected.html
@@ -1,9 +1,11 @@
<html>
<head></head>
- <body>-
+ <body>
+ -
Before insertion: position = (BODY,4)
After insertion: position = (BODY,4)
Before removal: position = (BODY,4)
After removal: position = (BODY,4)
--</body>
+-
+ </body>
</html>
diff --git a/Editor/tests/figures/FiguresTest.js b/Editor/tests/figures/FiguresTest.js
index bae29c1..385017a 100644
--- a/Editor/tests/figures/FiguresTest.js
+++ b/Editor/tests/figures/FiguresTest.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function figurePropertiesString(index)
{
diff --git a/Editor/tests/figures/insertFigure-hierarchy01-expected.html b/Editor/tests/figures/insertFigure-hierarchy01-expected.html
index 264929e..e2892dc 100644
--- a/Editor/tests/figures/insertFigure-hierarchy01-expected.html
+++ b/Editor/tests/figures/insertFigure-hierarchy01-expected.html
@@ -7,6 +7,8 @@
<img src="nothing.png"/>
<figcaption>First figure</figcaption>
</figure>
- <figure id="item2"><img src="nothing.png"/></figure>
+ <figure id="item2">
+ <img src="nothing.png"/>
+ </figure>
</body>
</html>
diff --git a/Editor/tests/figures/insertFigure01-expected.html b/Editor/tests/figures/insertFigure01-expected.html
index b4683f9..637519d 100644
--- a/Editor/tests/figures/insertFigure01-expected.html
+++ b/Editor/tests/figures/insertFigure01-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><figure id="item1"><img src="nothing.png"/></figure></body>
+ <body>
+ <figure id="item1">
+ <img src="nothing.png"/>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/figures/insertFigure02-expected.html b/Editor/tests/figures/insertFigure02-expected.html
index ea52654..a26e458 100644
--- a/Editor/tests/figures/insertFigure02-expected.html
+++ b/Editor/tests/figures/insertFigure02-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><figure id="item1"><img src="nothing.png" style="width: 60%"/></figure></body>
+ <body>
+ <figure id="item1">
+ <img src="nothing.png" style="width: 60%"/>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/figures/setProperties01-expected.html b/Editor/tests/figures/setProperties01-expected.html
index 2517473..846b467 100644
--- a/Editor/tests/figures/setProperties01-expected.html
+++ b/Editor/tests/figures/setProperties01-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><figure id="item1"><img src="nothing.png" style="width: 50%"/></figure></body>
+ <body>
+ <figure id="item1">
+ <img src="nothing.png" style="width: 50%"/>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/figures/setProperties02-expected.html b/Editor/tests/figures/setProperties02-expected.html
index b4683f9..637519d 100644
--- a/Editor/tests/figures/setProperties02-expected.html
+++ b/Editor/tests/figures/setProperties02-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><figure id="item1"><img src="nothing.png"/></figure></body>
+ <body>
+ <figure id="item1">
+ <img src="nothing.png"/>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/figures/setProperties03-expected.html b/Editor/tests/figures/setProperties03-expected.html
index 6b066f9..b781301 100644
--- a/Editor/tests/figures/setProperties03-expected.html
+++ b/Editor/tests/figures/setProperties03-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><figure id="item1"><img src="other.png" style="width: 20%"/></figure></body>
+ <body>
+ <figure id="item1">
+ <img src="other.png" style="width: 20%"/>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/figures/setProperties04-expected.html b/Editor/tests/figures/setProperties04-expected.html
index 27a2b34..1ce2a75 100644
--- a/Editor/tests/figures/setProperties04-expected.html
+++ b/Editor/tests/figures/setProperties04-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><figure id="item1"><img style="width: 20%"/></figure></body>
+ <body>
+ <figure id="item1">
+ <img style="width: 20%"/>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/formatting/classNames01-expected.html b/Editor/tests/formatting/classNames01-expected.html
index 209197d..a988afe 100644
--- a/Editor/tests/formatting/classNames01-expected.html
+++ b/Editor/tests/formatting/classNames01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p class="test">Sample text</p></body>
+ <body>
+ <p class="test">Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/classNames02-expected.html b/Editor/tests/formatting/classNames02-expected.html
index 935458b..a34d57e 100644
--- a/Editor/tests/formatting/classNames02-expected.html
+++ b/Editor/tests/formatting/classNames02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Sample text</h1></body>
+ <body>
+ <h1>Sample text</h1>
+ </body>
</html>
diff --git a/Editor/tests/formatting/classNames03-expected.html b/Editor/tests/formatting/classNames03-expected.html
index 935458b..a34d57e 100644
--- a/Editor/tests/formatting/classNames03-expected.html
+++ b/Editor/tests/formatting/classNames03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Sample text</h1></body>
+ <body>
+ <h1>Sample text</h1>
+ </body>
</html>
diff --git a/Editor/tests/formatting/classNames04-expected.html b/Editor/tests/formatting/classNames04-expected.html
index 209197d..a988afe 100644
--- a/Editor/tests/formatting/classNames04-expected.html
+++ b/Editor/tests/formatting/classNames04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p class="test">Sample text</p></body>
+ <body>
+ <p class="test">Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/classNames05-expected.html b/Editor/tests/formatting/classNames05-expected.html
index 2d1beeb..756d54b 100644
--- a/Editor/tests/formatting/classNames05-expected.html
+++ b/Editor/tests/formatting/classNames05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h2 class="test">Sample text</h2></body>
+ <body>
+ <h2 class="test">Sample text</h2>
+ </body>
</html>
diff --git a/Editor/tests/formatting/classNames06-expected.html b/Editor/tests/formatting/classNames06-expected.html
index b691bda..966e4ad 100644
--- a/Editor/tests/formatting/classNames06-expected.html
+++ b/Editor/tests/formatting/classNames06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample text</p></body>
+ <body>
+ <p>Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/classNames07-expected.html b/Editor/tests/formatting/classNames07-expected.html
index 935458b..a34d57e 100644
--- a/Editor/tests/formatting/classNames07-expected.html
+++ b/Editor/tests/formatting/classNames07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Sample text</h1></body>
+ <body>
+ <h1>Sample text</h1>
+ </body>
</html>
diff --git a/Editor/tests/formatting/classNames08-expected.html b/Editor/tests/formatting/classNames08-expected.html
index 935458b..a34d57e 100644
--- a/Editor/tests/formatting/classNames08-expected.html
+++ b/Editor/tests/formatting/classNames08-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>Sample text</h1></body>
+ <body>
+ <h1>Sample text</h1>
+ </body>
</html>
diff --git a/Editor/tests/formatting/empty05-expected.html b/Editor/tests/formatting/empty05-expected.html
index 74641c9..ee0a065 100644
--- a/Editor/tests/formatting/empty05-expected.html
+++ b/Editor/tests/formatting/empty05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>a[]</b></p></body>
+ <body>
+ <p><b>a[]</b></p>
+ </body>
</html>
\ No newline at end of file
diff --git a/Editor/tests/formatting/empty06-expected.html b/Editor/tests/formatting/empty06-expected.html
index d784c8f..e673975 100644
--- a/Editor/tests/formatting/empty06-expected.html
+++ b/Editor/tests/formatting/empty06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>a[]</b></p></body>
+ <body>
+ <p><b>a[]</b></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/empty07-expected.html b/Editor/tests/formatting/empty07-expected.html
index cb6a59d..259fd6e 100644
--- a/Editor/tests/formatting/empty07-expected.html
+++ b/Editor/tests/formatting/empty07-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li><p><b>a[]</b></p></li></ul></body>
+ <body>
+ <ul>
+ <li><p><b>a[]</b></p></li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/formatting/getFormatting02-expected.html b/Editor/tests/formatting/getFormatting02-expected.html
index 9d2737d..f2ad17d 100644
--- a/Editor/tests/formatting/getFormatting02-expected.html
+++ b/Editor/tests/formatting/getFormatting02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>-uxwrite-paragraph-style = p</p></body>
+ <body>
+ <p>-uxwrite-paragraph-style = p</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/getFormatting03-expected.html b/Editor/tests/formatting/getFormatting03-expected.html
index 9d2737d..f2ad17d 100644
--- a/Editor/tests/formatting/getFormatting03-expected.html
+++ b/Editor/tests/formatting/getFormatting03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>-uxwrite-paragraph-style = p</p></body>
+ <body>
+ <p>-uxwrite-paragraph-style = p</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/getFormatting10-expected.html b/Editor/tests/formatting/getFormatting10-expected.html
index e125e49..21a0838 100644
--- a/Editor/tests/formatting/getFormatting10-expected.html
+++ b/Editor/tests/formatting/getFormatting10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>-uxwrite-paragraph-style = p.test</p></body>
+ <body>
+ <p>-uxwrite-paragraph-style = p.test</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/getFormatting11-expected.html b/Editor/tests/formatting/getFormatting11-expected.html
index e4009fd..2e704f5 100644
--- a/Editor/tests/formatting/getFormatting11-expected.html
+++ b/Editor/tests/formatting/getFormatting11-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>-uxwrite-paragraph-style = h1</p></body>
+ <body>
+ <p>-uxwrite-paragraph-style = h1</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-change01-expected.html b/Editor/tests/formatting/inline-change01-expected.html
index 7d3d2ac..481c064 100644
--- a/Editor/tests/formatting/inline-change01-expected.html
+++ b/Editor/tests/formatting/inline-change01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><s style="color: red">Text</s></p></body>
+ <body>
+ <p><s style="color: red">Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-change02-expected.html b/Editor/tests/formatting/inline-change02-expected.html
index 7d3d2ac..481c064 100644
--- a/Editor/tests/formatting/inline-change02-expected.html
+++ b/Editor/tests/formatting/inline-change02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><s style="color: red">Text</s></p></body>
+ <body>
+ <p><s style="color: red">Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-change03-expected.html b/Editor/tests/formatting/inline-change03-expected.html
index 7eab119..e747faf 100644
--- a/Editor/tests/formatting/inline-change03-expected.html
+++ b/Editor/tests/formatting/inline-change03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="color: red"><s>Text</s></p></body>
+ <body>
+ <p style="color: red"><s>Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-change04-expected.html b/Editor/tests/formatting/inline-change04-expected.html
index 7d3d2ac..481c064 100644
--- a/Editor/tests/formatting/inline-change04-expected.html
+++ b/Editor/tests/formatting/inline-change04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><s style="color: red">Text</s></p></body>
+ <body>
+ <p><s style="color: red">Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-change05-expected.html b/Editor/tests/formatting/inline-change05-expected.html
index 7d3d2ac..481c064 100644
--- a/Editor/tests/formatting/inline-change05-expected.html
+++ b/Editor/tests/formatting/inline-change05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><s style="color: red">Text</s></p></body>
+ <body>
+ <p><s style="color: red">Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-change06-expected.html b/Editor/tests/formatting/inline-change06-expected.html
index 7eab119..e747faf 100644
--- a/Editor/tests/formatting/inline-change06-expected.html
+++ b/Editor/tests/formatting/inline-change06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="color: red"><s>Text</s></p></body>
+ <body>
+ <p style="color: red"><s>Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-endnote01-expected.html b/Editor/tests/formatting/inline-endnote01-expected.html
new file mode 100644
index 0000000..984c59c
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote01-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <b>[two]</b>
+ three
+ <span class="endnote">four</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote01-input.html b/Editor/tests/formatting/inline-endnote01-input.html
new file mode 100644
index 0000000..e21130b
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote01-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"font-weight": "bold"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one [two] three <span class="endnote">four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote02-expected.html b/Editor/tests/formatting/inline-endnote02-expected.html
new file mode 100644
index 0000000..2d0bd0c
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote02-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span style="color: red">[two]</span>
+ three
+ <span class="endnote">four</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote02-input.html b/Editor/tests/formatting/inline-endnote02-input.html
new file mode 100644
index 0000000..165b67d
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote02-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"color": "red"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one [two] three <span class="endnote">four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote03-expected.html b/Editor/tests/formatting/inline-endnote03-expected.html
new file mode 100644
index 0000000..4c9d6c4
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote03-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="endnote">two</span>
+ three
+ <b>[four]</b>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote03-input.html b/Editor/tests/formatting/inline-endnote03-input.html
new file mode 100644
index 0000000..33244d5
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote03-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"font-weight": "bold"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one <span class="endnote">two</span> three [four] five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote04-expected.html b/Editor/tests/formatting/inline-endnote04-expected.html
new file mode 100644
index 0000000..7e25e59
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote04-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="endnote">two</span>
+ three
+ <span style="color: red">[four]</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote04-input.html b/Editor/tests/formatting/inline-endnote04-input.html
new file mode 100644
index 0000000..3e965f5
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote04-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"color": "red"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one <span class="endnote">two</span> three [four] five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote05-expected.html b/Editor/tests/formatting/inline-endnote05-expected.html
new file mode 100644
index 0000000..e8e64ae
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote05-expected.html
@@ -0,0 +1,14 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="endnote">
+ two
+ <b>[three]</b>
+ four
+ </span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote05-input.html b/Editor/tests/formatting/inline-endnote05-input.html
new file mode 100644
index 0000000..672d698
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote05-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"font-weight": "bold"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one <span class="endnote">two [three] four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote06-expected.html b/Editor/tests/formatting/inline-endnote06-expected.html
new file mode 100644
index 0000000..7b676ac
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote06-expected.html
@@ -0,0 +1,14 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="endnote">
+ two
+ <span style="color: red">[three]</span>
+ four
+ </span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-endnote06-input.html b/Editor/tests/formatting/inline-endnote06-input.html
new file mode 100644
index 0000000..daf5a7d
--- /dev/null
+++ b/Editor/tests/formatting/inline-endnote06-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"color": "red"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one <span class="endnote">two [three] four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote01-expected.html b/Editor/tests/formatting/inline-footnote01-expected.html
new file mode 100644
index 0000000..407cc39
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote01-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <b>[two]</b>
+ three
+ <span class="footnote">four</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote01-input.html b/Editor/tests/formatting/inline-footnote01-input.html
new file mode 100644
index 0000000..50f66fe
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote01-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"font-weight": "bold"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one [two] three <span class="footnote">four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote02-expected.html b/Editor/tests/formatting/inline-footnote02-expected.html
new file mode 100644
index 0000000..c679c9a
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote02-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span style="color: red">[two]</span>
+ three
+ <span class="footnote">four</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote02-input.html b/Editor/tests/formatting/inline-footnote02-input.html
new file mode 100644
index 0000000..7bf7ee4
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote02-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"color": "red"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one [two] three <span class="footnote">four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote03-expected.html b/Editor/tests/formatting/inline-footnote03-expected.html
new file mode 100644
index 0000000..2aa73ad
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote03-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="footnote">two</span>
+ three
+ <b>[four]</b>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote03-input.html b/Editor/tests/formatting/inline-footnote03-input.html
new file mode 100644
index 0000000..6fe6601
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote03-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"font-weight": "bold"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one <span class="footnote">two</span> three [four] five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote04-expected.html b/Editor/tests/formatting/inline-footnote04-expected.html
new file mode 100644
index 0000000..b1ef955
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote04-expected.html
@@ -0,0 +1,12 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="footnote">two</span>
+ three
+ <span style="color: red">[four]</span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote04-input.html b/Editor/tests/formatting/inline-footnote04-input.html
new file mode 100644
index 0000000..23f07d4
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote04-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"color": "red"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one <span class="footnote">two</span> three [four] five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote05-expected.html b/Editor/tests/formatting/inline-footnote05-expected.html
new file mode 100644
index 0000000..91a8092
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote05-expected.html
@@ -0,0 +1,14 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="footnote">
+ two
+ <b>[three]</b>
+ four
+ </span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote05-input.html b/Editor/tests/formatting/inline-footnote05-input.html
new file mode 100644
index 0000000..2b45eac
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote05-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"font-weight": "bold"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one <span class="footnote">two [three] four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote06-expected.html b/Editor/tests/formatting/inline-footnote06-expected.html
new file mode 100644
index 0000000..9ecb197
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote06-expected.html
@@ -0,0 +1,14 @@
+<html>
+ <head></head>
+ <body>
+ <p>
+ one
+ <span class="footnote">
+ two
+ <span style="color: red">[three]</span>
+ four
+ </span>
+ five
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/formatting/inline-footnote06-input.html b/Editor/tests/formatting/inline-footnote06-input.html
new file mode 100644
index 0000000..b19e110
--- /dev/null
+++ b/Editor/tests/formatting/inline-footnote06-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function performTest()
+{
+ Formatting_applyFormattingChanges(null,{"color": "red"});
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <p>one <span class="footnote">two [three] four</span> five</p>
+</body>
+</html>
diff --git a/Editor/tests/formatting/inline-remove01-expected.html b/Editor/tests/formatting/inline-remove01-expected.html
index 02e36f9..b51a95a 100644
--- a/Editor/tests/formatting/inline-remove01-expected.html
+++ b/Editor/tests/formatting/inline-remove01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><s>Text</s></p></body>
+ <body>
+ <p><s>Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove02-expected.html b/Editor/tests/formatting/inline-remove02-expected.html
index 1b144a1..2c9f2b7 100644
--- a/Editor/tests/formatting/inline-remove02-expected.html
+++ b/Editor/tests/formatting/inline-remove02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><s style="font-size: 18pt">Text</s></p></body>
+ <body>
+ <p><s style="font-size: 18pt">Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove05-expected.html b/Editor/tests/formatting/inline-remove05-expected.html
index 6d09348..fd43031 100644
--- a/Editor/tests/formatting/inline-remove05-expected.html
+++ b/Editor/tests/formatting/inline-remove05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><s style="color: blue">Text</s></p></body>
+ <body>
+ <p><s style="color: blue">Text</s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove06-expected.html b/Editor/tests/formatting/inline-remove06-expected.html
index 04b6311..39d4589 100644
--- a/Editor/tests/formatting/inline-remove06-expected.html
+++ b/Editor/tests/formatting/inline-remove06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b><s>Text</s></b></p></body>
+ <body>
+ <p><b><s>Text</s></b></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove07-expected.html b/Editor/tests/formatting/inline-remove07-expected.html
index 16a7ff2..b6836e0 100644
--- a/Editor/tests/formatting/inline-remove07-expected.html
+++ b/Editor/tests/formatting/inline-remove07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><i><s>Text</s></i></p></body>
+ <body>
+ <p><i><s>Text</s></i></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove08-expected.html b/Editor/tests/formatting/inline-remove08-expected.html
index 0c70e5c..5e43b82 100644
--- a/Editor/tests/formatting/inline-remove08-expected.html
+++ b/Editor/tests/formatting/inline-remove08-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><u><s>Text</s></u></p></body>
+ <body>
+ <p><u><s>Text</s></u></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove09-expected.html b/Editor/tests/formatting/inline-remove09-expected.html
index d2fb84b..06d2712 100644
--- a/Editor/tests/formatting/inline-remove09-expected.html
+++ b/Editor/tests/formatting/inline-remove09-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><s><s>Text</s></s></p></body>
+ <body>
+ <p><s><s>Text</s></s></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove10-expected.html b/Editor/tests/formatting/inline-remove10-expected.html
index 6d82c78..26b646b 100644
--- a/Editor/tests/formatting/inline-remove10-expected.html
+++ b/Editor/tests/formatting/inline-remove10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><span style="font-size: 18pt">Text</span></p></body>
+ <body>
+ <p><span style="font-size: 18pt">Text</span></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove11-expected.html b/Editor/tests/formatting/inline-remove11-expected.html
index e3d1cf1..77761d1 100644
--- a/Editor/tests/formatting/inline-remove11-expected.html
+++ b/Editor/tests/formatting/inline-remove11-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Text</p></body>
+ <body>
+ <p>Text</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-remove12-expected.html b/Editor/tests/formatting/inline-remove12-expected.html
index e3d1cf1..77761d1 100644
--- a/Editor/tests/formatting/inline-remove12-expected.html
+++ b/Editor/tests/formatting/inline-remove12-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Text</p></body>
+ <body>
+ <p>Text</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-set01-nop-expected.html b/Editor/tests/formatting/inline-set01-nop-expected.html
index a2376d2..e09a322 100644
--- a/Editor/tests/formatting/inline-set01-nop-expected.html
+++ b/Editor/tests/formatting/inline-set01-nop-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><span style="color: blue; font-size: 12pt">Sample text</span></body>
+ <body>
+ <span style="color: blue; font-size: 12pt">Sample text</span>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-set01-outer-expected.html b/Editor/tests/formatting/inline-set01-outer-expected.html
index 4cd2eae..e0e0797 100644
--- a/Editor/tests/formatting/inline-set01-outer-expected.html
+++ b/Editor/tests/formatting/inline-set01-outer-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="color: blue; font-size: 12pt">Sample text</p></body>
+ <body>
+ <p style="color: blue; font-size: 12pt">Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-set01-p-expected.html b/Editor/tests/formatting/inline-set01-p-expected.html
index 4cd2eae..e0e0797 100644
--- a/Editor/tests/formatting/inline-set01-p-expected.html
+++ b/Editor/tests/formatting/inline-set01-p-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="color: blue; font-size: 12pt">Sample text</p></body>
+ <body>
+ <p style="color: blue; font-size: 12pt">Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-set03-nop-expected.html b/Editor/tests/formatting/inline-set03-nop-expected.html
index aca72bf..48755bd 100644
--- a/Editor/tests/formatting/inline-set03-nop-expected.html
+++ b/Editor/tests/formatting/inline-set03-nop-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><b>Sample text</b></body>
+ <body>
+ <b>Sample text</b>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-set03-outer-expected.html b/Editor/tests/formatting/inline-set03-outer-expected.html
index 9a38b37..d79a0f8 100644
--- a/Editor/tests/formatting/inline-set03-outer-expected.html
+++ b/Editor/tests/formatting/inline-set03-outer-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>Sample text</b></p></body>
+ <body>
+ <p><b>Sample text</b></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-set03-p-expected.html b/Editor/tests/formatting/inline-set03-p-expected.html
index 9a38b37..d79a0f8 100644
--- a/Editor/tests/formatting/inline-set03-p-expected.html
+++ b/Editor/tests/formatting/inline-set03-p-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>Sample text</b></p></body>
+ <body>
+ <p><b>Sample text</b></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/inline-set04-expected.html b/Editor/tests/formatting/inline-set04-expected.html
index d26dd5b..300d365 100644
--- a/Editor/tests/formatting/inline-set04-expected.html
+++ b/Editor/tests/formatting/inline-set04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b><i><u>Sample text</u></i></b></p></body>
+ <body>
+ <p><b><i><u>Sample text</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/justCursor03-expected.html b/Editor/tests/formatting/justCursor03-expected.html
index a6c01c0..b0014b5 100644
--- a/Editor/tests/formatting/justCursor03-expected.html
+++ b/Editor/tests/formatting/justCursor03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="text-align: center">Here is sXome text</p></body>
+ <body>
+ <p style="text-align: center">Here is sXome text</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/mergeUpwards01-expected.html b/Editor/tests/formatting/mergeUpwards01-expected.html
index 7d3258f..a1738e6 100644
--- a/Editor/tests/formatting/mergeUpwards01-expected.html
+++ b/Editor/tests/formatting/mergeUpwards01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>One two []three</b></p></body>
+ <body>
+ <p><b>One two []three</b></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/mergeUpwards02-expected.html b/Editor/tests/formatting/mergeUpwards02-expected.html
index 38e2cb0..372f917 100644
--- a/Editor/tests/formatting/mergeUpwards02-expected.html
+++ b/Editor/tests/formatting/mergeUpwards02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b><i><u>One two []three</u></i></b></p></body>
+ <body>
+ <p><b><i><u>One two []three</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/mergeUpwards05-expected.html b/Editor/tests/formatting/mergeUpwards05-expected.html
index 652300e..6be8697 100644
--- a/Editor/tests/formatting/mergeUpwards05-expected.html
+++ b/Editor/tests/formatting/mergeUpwards05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[]One two three</p></body>
+ <body>
+ <p>[]One two three</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/mergeUpwards06-expected.html b/Editor/tests/formatting/mergeUpwards06-expected.html
index 652300e..6be8697 100644
--- a/Editor/tests/formatting/mergeUpwards06-expected.html
+++ b/Editor/tests/formatting/mergeUpwards06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[]One two three</p></body>
+ <body>
+ <p>[]One two three</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/mergeUpwards07-expected.html b/Editor/tests/formatting/mergeUpwards07-expected.html
index 652300e..6be8697 100644
--- a/Editor/tests/formatting/mergeUpwards07-expected.html
+++ b/Editor/tests/formatting/mergeUpwards07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[]One two three</p></body>
+ <body>
+ <p>[]One two three</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/mergeUpwards08-expected.html b/Editor/tests/formatting/mergeUpwards08-expected.html
index 652300e..6be8697 100644
--- a/Editor/tests/formatting/mergeUpwards08-expected.html
+++ b/Editor/tests/formatting/mergeUpwards08-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[]One two three</p></body>
+ <body>
+ <p>[]One two three</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/paragraph-change01-expected.html b/Editor/tests/formatting/paragraph-change01-expected.html
index 75764a2..4441b53 100644
--- a/Editor/tests/formatting/paragraph-change01-expected.html
+++ b/Editor/tests/formatting/paragraph-change01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="margin-left: 20%"></p></body>
+ <body>
+ <p style="margin-left: 20%"></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/paragraph-change02-expected.html b/Editor/tests/formatting/paragraph-change02-expected.html
index 2a887b0..2fcd240 100644
--- a/Editor/tests/formatting/paragraph-change02-expected.html
+++ b/Editor/tests/formatting/paragraph-change02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="margin-left: 20%"/></body>
+ <body>
+ <p style="margin-left: 20%"/>
+ </body>
</html>
diff --git a/Editor/tests/formatting/paragraph-change03-expected.html b/Editor/tests/formatting/paragraph-change03-expected.html
index e34a177..86f379f 100644
--- a/Editor/tests/formatting/paragraph-change03-expected.html
+++ b/Editor/tests/formatting/paragraph-change03-expected.html
@@ -3,6 +3,8 @@
<body>
<p style="margin-left: 10%">One</p>
<h1 style="margin-left: 10%">Two</h1>
- <div style="margin-left: 10%">Three</div>
+ <div style="margin-left: 10%">
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/paragraph-change04-expected.html b/Editor/tests/formatting/paragraph-change04-expected.html
index e34a177..86f379f 100644
--- a/Editor/tests/formatting/paragraph-change04-expected.html
+++ b/Editor/tests/formatting/paragraph-change04-expected.html
@@ -3,6 +3,8 @@
<body>
<p style="margin-left: 10%">One</p>
<h1 style="margin-left: 10%">Two</h1>
- <div style="margin-left: 10%">Three</div>
+ <div style="margin-left: 10%">
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/paragraph-change05-expected.html b/Editor/tests/formatting/paragraph-change05-expected.html
index d1c949b..65d536e 100644
--- a/Editor/tests/formatting/paragraph-change05-expected.html
+++ b/Editor/tests/formatting/paragraph-change05-expected.html
@@ -3,6 +3,8 @@
<body>
<p style="margin-left: 1%">One</p>
<h1 style="margin-left: 10%">Two</h1>
- <div style="margin-left: 3%">Three</div>
+ <div style="margin-left: 3%">
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/paragraph-remove01-expected.html b/Editor/tests/formatting/paragraph-remove01-expected.html
index 9b57168..4424e4d 100644
--- a/Editor/tests/formatting/paragraph-remove01-expected.html
+++ b/Editor/tests/formatting/paragraph-remove01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p></p></body>
+ <body>
+ <p></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/paragraph-remove02-expected.html b/Editor/tests/formatting/paragraph-remove02-expected.html
index a1ea0ac..572de6d 100644
--- a/Editor/tests/formatting/paragraph-remove02-expected.html
+++ b/Editor/tests/formatting/paragraph-remove02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="margin-right: 20%"></p></body>
+ <body>
+ <p style="margin-right: 20%"></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/paragraph-remove03-expected.html b/Editor/tests/formatting/paragraph-remove03-expected.html
index d45c18b..aec2fa1 100644
--- a/Editor/tests/formatting/paragraph-remove03-expected.html
+++ b/Editor/tests/formatting/paragraph-remove03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="margin-right: 20%"/></body>
+ <body>
+ <p style="margin-right: 20%"/>
+ </body>
</html>
diff --git a/Editor/tests/formatting/paragraph-remove04-expected.html b/Editor/tests/formatting/paragraph-remove04-expected.html
index c0ed067..22f5569 100644
--- a/Editor/tests/formatting/paragraph-remove04-expected.html
+++ b/Editor/tests/formatting/paragraph-remove04-expected.html
@@ -3,6 +3,8 @@
<body>
<p>One</p>
<h1>Two</h1>
- <div>Three</div>
+ <div>
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/paragraph-remove05-expected.html b/Editor/tests/formatting/paragraph-remove05-expected.html
index c2b1587..6381bf2 100644
--- a/Editor/tests/formatting/paragraph-remove05-expected.html
+++ b/Editor/tests/formatting/paragraph-remove05-expected.html
@@ -3,6 +3,8 @@
<body>
<p style="margin-left: 1%">One</p>
<h1>Two</h1>
- <div style="margin-left: 3%">Three</div>
+ <div style="margin-left: 3%">
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/paragraph-remove06-expected.html b/Editor/tests/formatting/paragraph-remove06-expected.html
index fd31291..dd1cec2 100644
--- a/Editor/tests/formatting/paragraph-remove06-expected.html
+++ b/Editor/tests/formatting/paragraph-remove06-expected.html
@@ -3,6 +3,8 @@
<body>
<p style="margin-left: 1%; margin-right: 11%">One</p>
<h1 style="margin-right: 22%">Two</h1>
- <div style="margin-left: 3%; margin-right: 33%">Three</div>
+ <div style="margin-left: 3%; margin-right: 33%">
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/paragraph-set01-expected.html b/Editor/tests/formatting/paragraph-set01-expected.html
index c8f7f18..7c2d2d8 100644
--- a/Editor/tests/formatting/paragraph-set01-expected.html
+++ b/Editor/tests/formatting/paragraph-set01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="margin-left: 10%"></p></body>
+ <body>
+ <p style="margin-left: 10%"></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/paragraph-set02-expected.html b/Editor/tests/formatting/paragraph-set02-expected.html
index 9cb08ff..63b2469 100644
--- a/Editor/tests/formatting/paragraph-set02-expected.html
+++ b/Editor/tests/formatting/paragraph-set02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="margin-left: 10%"/></body>
+ <body>
+ <p style="margin-left: 10%"/>
+ </body>
</html>
diff --git a/Editor/tests/formatting/paragraph-set03-expected.html b/Editor/tests/formatting/paragraph-set03-expected.html
index e34a177..86f379f 100644
--- a/Editor/tests/formatting/paragraph-set03-expected.html
+++ b/Editor/tests/formatting/paragraph-set03-expected.html
@@ -3,6 +3,8 @@
<body>
<p style="margin-left: 10%">One</p>
<h1 style="margin-left: 10%">Two</h1>
- <div style="margin-left: 10%">Three</div>
+ <div style="margin-left: 10%">
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/paragraph-set04-expected.html b/Editor/tests/formatting/paragraph-set04-expected.html
index e34a177..86f379f 100644
--- a/Editor/tests/formatting/paragraph-set04-expected.html
+++ b/Editor/tests/formatting/paragraph-set04-expected.html
@@ -3,6 +3,8 @@
<body>
<p style="margin-left: 10%">One</p>
<h1 style="margin-left: 10%">Two</h1>
- <div style="margin-left: 10%">Three</div>
+ <div style="margin-left: 10%">
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/paragraph-set05-expected.html b/Editor/tests/formatting/paragraph-set05-expected.html
index f774ad7..7ce9c3e 100644
--- a/Editor/tests/formatting/paragraph-set05-expected.html
+++ b/Editor/tests/formatting/paragraph-set05-expected.html
@@ -3,6 +3,8 @@
<body>
<p>One</p>
<h1 style="margin-left: 10%">Two</h1>
- <div>Three</div>
+ <div>
+ Three
+ </div>
</body>
</html>
diff --git a/Editor/tests/formatting/style-nop01-expected.html b/Editor/tests/formatting/style-nop01-expected.html
index 043cc20..f2a7521 100644
--- a/Editor/tests/formatting/style-nop01-expected.html
+++ b/Editor/tests/formatting/style-nop01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><br/></p></body>
+ <body>
+ <p><br/></p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/style-nop01a-expected.html b/Editor/tests/formatting/style-nop01a-expected.html
index c0aab59..a341e6e 100644
--- a/Editor/tests/formatting/style-nop01a-expected.html
+++ b/Editor/tests/formatting/style-nop01a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1><br/></h1></body>
+ <body>
+ <h1><br/></h1>
+ </body>
</html>
diff --git a/Editor/tests/formatting/style-nop02-expected.html b/Editor/tests/formatting/style-nop02-expected.html
index b4dfc65..9ef2a3e 100644
--- a/Editor/tests/formatting/style-nop02-expected.html
+++ b/Editor/tests/formatting/style-nop02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>a</p></body>
+ <body>
+ <p>a</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/style-nop03-expected.html b/Editor/tests/formatting/style-nop03-expected.html
index b4dfc65..9ef2a3e 100644
--- a/Editor/tests/formatting/style-nop03-expected.html
+++ b/Editor/tests/formatting/style-nop03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>a</p></body>
+ <body>
+ <p>a</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/style-nop04-expected.html b/Editor/tests/formatting/style-nop04-expected.html
index a243c42..68f377c 100644
--- a/Editor/tests/formatting/style-nop04-expected.html
+++ b/Editor/tests/formatting/style-nop04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>ab</p></body>
+ <body>
+ <p>ab</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/style-nop05-expected.html b/Editor/tests/formatting/style-nop05-expected.html
index b4dfc65..9ef2a3e 100644
--- a/Editor/tests/formatting/style-nop05-expected.html
+++ b/Editor/tests/formatting/style-nop05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>a</p></body>
+ <body>
+ <p>a</p>
+ </body>
</html>
diff --git a/Editor/tests/formatting/style-nop06-expected.html b/Editor/tests/formatting/style-nop06-expected.html
index 7e3d0f3..53e060d 100644
--- a/Editor/tests/formatting/style-nop06-expected.html
+++ b/Editor/tests/formatting/style-nop06-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><figure><p><br/></p></figure></body>
+ <body>
+ <figure>
+ <p><br/></p>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/formatting/style-nop07-expected.html b/Editor/tests/formatting/style-nop07-expected.html
index 49fe284..79c288f 100644
--- a/Editor/tests/formatting/style-nop07-expected.html
+++ b/Editor/tests/formatting/style-nop07-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><figure><figcaption><p><br/></p></figcaption></figure></body>
+ <body>
+ <figure>
+ <figcaption><p><br/></p></figcaption>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/formatting/style-nop08-expected.html b/Editor/tests/formatting/style-nop08-expected.html
index dfc5ed4..d242935 100644
--- a/Editor/tests/formatting/style-nop08-expected.html
+++ b/Editor/tests/formatting/style-nop08-expected.html
@@ -3,7 +3,11 @@
<body>
<table>
<caption><p><br/></p></caption>
- <tbody><tr><td>Cell</td></tr></tbody>
+ <tbody>
+ <tr>
+ <td>Cell</td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/formatting/style-nop09-expected.html b/Editor/tests/formatting/style-nop09-expected.html
index 6371754..4829db4 100644
--- a/Editor/tests/formatting/style-nop09-expected.html
+++ b/Editor/tests/formatting/style-nop09-expected.html
@@ -1,4 +1,12 @@
<html>
<head></head>
- <body><table><tbody><tr><td><p><br/></p></td></tr></tbody></table></body>
+ <body>
+ <table>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
</html>
diff --git a/Editor/tests/genindex.sh b/Editor/tests/genindex.sh
index eece866..3c99da3 100755
--- a/Editor/tests/genindex.sh
+++ b/Editor/tests/genindex.sh
@@ -1,7 +1,7 @@
#!/bin/bash
(
prevdir=""
-echo "// This file was generated by genindex.sh on `date`"
+echo "// This file was generated by genindex.sh"
echo "var tests = [";
for dir in *; do
if [ -d $dir ]; then
diff --git a/Editor/tests/index.js b/Editor/tests/index.js
index c26d2d1..485397b 100644
--- a/Editor/tests/index.js
+++ b/Editor/tests/index.js
@@ -1,4 +1,4 @@
-// This file was generated by genindex.sh on Thu 27 Nov 2014 10:34:42 ICT
+// This file was generated by genindex.sh
var tests = [
{ dir: "autocorrect",
files: ["acceptCorrection-undo",
@@ -257,12 +257,34 @@
"deleteCharacter-emoji06",
"deleteCharacter-emoji07",
"deleteCharacter-emoji08",
+ "deleteCharacter-endnote01",
+ "deleteCharacter-endnote02",
+ "deleteCharacter-endnote03",
+ "deleteCharacter-endnote04",
+ "deleteCharacter-endnote05",
+ "deleteCharacter-endnote06",
+ "deleteCharacter-endnote07",
+ "deleteCharacter-endnote08",
+ "deleteCharacter-endnote09",
+ "deleteCharacter-endnote10",
"deleteCharacter-figcaption01",
"deleteCharacter-figcaption02",
+ "deleteCharacter-figcaption03",
+ "deleteCharacter-figcaption04",
"deleteCharacter-figure01",
"deleteCharacter-figure02",
"deleteCharacter-figure03",
"deleteCharacter-figure04",
+ "deleteCharacter-footnote01",
+ "deleteCharacter-footnote02",
+ "deleteCharacter-footnote03",
+ "deleteCharacter-footnote04",
+ "deleteCharacter-footnote05",
+ "deleteCharacter-footnote06",
+ "deleteCharacter-footnote07",
+ "deleteCharacter-footnote08",
+ "deleteCharacter-footnote09",
+ "deleteCharacter-footnote10",
"deleteCharacter-last01",
"deleteCharacter-last02",
"deleteCharacter-last03",
@@ -303,6 +325,8 @@
"deleteCharacter-table02",
"deleteCharacter-table03",
"deleteCharacter-table04",
+ "deleteCharacter-tablecaption01",
+ "deleteCharacter-tablecaption02",
"deleteCharacter-toc01",
"deleteCharacter-toc02",
"deleteCharacter-toc03",
@@ -379,8 +403,24 @@
"enterPressed-emptyContainer07a",
"enterPressed-emptyContainer08",
"enterPressed-emptyContainer08a",
+ "enterPressed-endnote01",
+ "enterPressed-endnote02",
+ "enterPressed-endnote03",
+ "enterPressed-endnote04",
+ "enterPressed-endnote05",
+ "enterPressed-endnote06",
+ "enterPressed-endnote07",
+ "enterPressed-endnote08",
"enterPressed-figcaption01",
"enterPressed-figcaption02",
+ "enterPressed-footnote01",
+ "enterPressed-footnote02",
+ "enterPressed-footnote03",
+ "enterPressed-footnote04",
+ "enterPressed-footnote05",
+ "enterPressed-footnote06",
+ "enterPressed-footnote07",
+ "enterPressed-footnote08",
"enterPressed-heading01",
"enterPressed-heading02",
"enterPressed-heading03",
@@ -580,12 +620,18 @@
"insertEndnote04",
"insertEndnote05",
"insertEndnote06",
+ "insertEndnote07",
+ "insertEndnote08",
+ "insertEndnote09",
"insertFootnote01",
"insertFootnote02",
"insertFootnote03",
"insertFootnote04",
"insertFootnote05",
"insertFootnote06",
+ "insertFootnote07",
+ "insertFootnote08",
+ "insertFootnote09",
"makeContainerInsertionPoint01",
"makeContainerInsertionPoint02a",
"makeContainerInsertionPoint02b",
@@ -721,6 +767,12 @@
"replaceElement08",
"replaceElement09",
"replaceElement10",
+ "splitAroundSelection-endnote01",
+ "splitAroundSelection-endnote02",
+ "splitAroundSelection-endnote03",
+ "splitAroundSelection-footnote01",
+ "splitAroundSelection-footnote02",
+ "splitAroundSelection-footnote03",
"splitAroundSelection-nested01",
"splitAroundSelection-nested02",
"splitAroundSelection-nested03",
@@ -916,6 +968,18 @@
"inline-change20",
"inline-change21",
"inline-change22",
+ "inline-endnote01",
+ "inline-endnote02",
+ "inline-endnote03",
+ "inline-endnote04",
+ "inline-endnote05",
+ "inline-endnote06",
+ "inline-footnote01",
+ "inline-footnote02",
+ "inline-footnote03",
+ "inline-footnote04",
+ "inline-footnote05",
+ "inline-footnote06",
"inline-remove01",
"inline-remove02",
"inline-remove03",
@@ -1571,9 +1635,33 @@
"isValidCursorPosition-caption01a",
"isValidCursorPosition-caption01b",
"isValidCursorPosition-caption01c",
+ "isValidCursorPosition-endnote01",
+ "isValidCursorPosition-endnote02",
+ "isValidCursorPosition-endnote03",
+ "isValidCursorPosition-endnote04",
+ "isValidCursorPosition-endnote05",
+ "isValidCursorPosition-endnote06",
+ "isValidCursorPosition-endnote07",
+ "isValidCursorPosition-endnote08",
+ "isValidCursorPosition-endnote09",
+ "isValidCursorPosition-endnote10",
"isValidCursorPosition-figure01a",
"isValidCursorPosition-figure01b",
"isValidCursorPosition-figure01c",
+ "isValidCursorPosition-footnote01",
+ "isValidCursorPosition-footnote02",
+ "isValidCursorPosition-footnote03",
+ "isValidCursorPosition-footnote04",
+ "isValidCursorPosition-footnote05",
+ "isValidCursorPosition-footnote06",
+ "isValidCursorPosition-footnote07",
+ "isValidCursorPosition-footnote08",
+ "isValidCursorPosition-footnote09",
+ "isValidCursorPosition-footnote10",
+ "isValidCursorPosition-footnote11",
+ "isValidCursorPosition-footnote12",
+ "isValidCursorPosition-footnote13",
+ "isValidCursorPosition-footnote14",
"isValidCursorPosition-heading01a",
"isValidCursorPosition-heading01b",
"isValidCursorPosition-heading01c",
@@ -1963,6 +2051,8 @@
"addAdjacentColumn16",
"addAdjacentColumn17",
"addAdjacentColumn18",
+ "addAdjacentColumn19",
+ "addAdjacentColumn20",
"addAdjacentRow01",
"addAdjacentRow02",
"addAdjacentRow03",
@@ -1981,6 +2071,8 @@
"addAdjacentRow16",
"addAdjacentRow17",
"addAdjacentRow18",
+ "addAdjacentRow19",
+ "addAdjacentRow20",
"addColElement01",
"addColElement02",
"addColElement03",
@@ -2029,36 +2121,6 @@
"deleteColumns05",
"deleteColumns06",
"deleteColumns07",
- "deleteOneColumn01inside",
- "deleteOneColumn01right",
- "deleteOneColumn02inside",
- "deleteOneColumn02left",
- "deleteOneColumn02right",
- "deleteOneColumn03inside",
- "deleteOneColumn03left",
- "deleteOneColumn04inside",
- "deleteOneColumn04right",
- "deleteOneColumn05inside",
- "deleteOneColumn05left",
- "deleteOneColumn05right",
- "deleteOneColumn06inside",
- "deleteOneColumn06left",
- "deleteOneColumn07",
- "deleteOneRow01below",
- "deleteOneRow01inside",
- "deleteOneRow02above",
- "deleteOneRow02below",
- "deleteOneRow02inside",
- "deleteOneRow03above",
- "deleteOneRow03inside",
- "deleteOneRow04below",
- "deleteOneRow04inside",
- "deleteOneRow05above",
- "deleteOneRow05below",
- "deleteOneRow05inside",
- "deleteOneRow06above",
- "deleteOneRow06inside",
- "deleteOneRow07",
"deleteRows01",
"deleteRows02",
"deleteRows03",
@@ -2190,6 +2252,44 @@
"regionSpan14",
"regionSpan15",
"regionSpan16",
+ "removeAdjacentColumn01inside",
+ "removeAdjacentColumn01right",
+ "removeAdjacentColumn02inside",
+ "removeAdjacentColumn02left",
+ "removeAdjacentColumn02right",
+ "removeAdjacentColumn03inside",
+ "removeAdjacentColumn03left",
+ "removeAdjacentColumn04inside",
+ "removeAdjacentColumn04right",
+ "removeAdjacentColumn05inside",
+ "removeAdjacentColumn05left",
+ "removeAdjacentColumn05right",
+ "removeAdjacentColumn06inside",
+ "removeAdjacentColumn06left",
+ "removeAdjacentColumn07",
+ "removeAdjacentColumn08",
+ "removeAdjacentColumn09",
+ "removeAdjacentColumn10",
+ "removeAdjacentColumn11",
+ "removeAdjacentRow01below",
+ "removeAdjacentRow01inside",
+ "removeAdjacentRow02above",
+ "removeAdjacentRow02below",
+ "removeAdjacentRow02inside",
+ "removeAdjacentRow03above",
+ "removeAdjacentRow03inside",
+ "removeAdjacentRow04below",
+ "removeAdjacentRow04inside",
+ "removeAdjacentRow05above",
+ "removeAdjacentRow05below",
+ "removeAdjacentRow05inside",
+ "removeAdjacentRow06above",
+ "removeAdjacentRow06inside",
+ "removeAdjacentRow07",
+ "removeAdjacentRow08",
+ "removeAdjacentRow09",
+ "removeAdjacentRow10",
+ "removeAdjacentRow11",
"setColWidths01",
"setColWidths02",
"split00a",
diff --git a/Editor/tests/input/InputTests.js b/Editor/tests/input/InputTests.js
index f81a14f..d745b86 100644
--- a/Editor/tests/input/InputTests.js
+++ b/Editor/tests/input/InputTests.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function getNodeArrayText(nodes)
{
diff --git a/Editor/tests/input/replaceRange01-expected.html b/Editor/tests/input/replaceRange01-expected.html
index dc735e2..0237441 100644
--- a/Editor/tests/input/replaceRange01-expected.html
+++ b/Editor/tests/input/replaceRange01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>SamHELLO[]xt</p></body>
+ <body>
+ <p>SamHELLO[]xt</p>
+ </body>
</html>
diff --git a/Editor/tests/input/replaceRange02-expected.html b/Editor/tests/input/replaceRange02-expected.html
index 4d43c49..1f0ea6a 100644
--- a/Editor/tests/input/replaceRange02-expected.html
+++ b/Editor/tests/input/replaceRange02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>HELLO[]ple text</p></body>
+ <body>
+ <p>HELLO[]ple text</p>
+ </body>
</html>
diff --git a/Editor/tests/input/replaceRange03-expected.html b/Editor/tests/input/replaceRange03-expected.html
index 48f01df..cd71d5e 100644
--- a/Editor/tests/input/replaceRange03-expected.html
+++ b/Editor/tests/input/replaceRange03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample teHELLO[]</p></body>
+ <body>
+ <p>Sample teHELLO[]</p>
+ </body>
</html>
diff --git a/Editor/tests/input/replaceRange05-expected.html b/Editor/tests/input/replaceRange05-expected.html
index d6433c7..7bfc8e1 100644
--- a/Editor/tests/input/replaceRange05-expected.html
+++ b/Editor/tests/input/replaceRange05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>HELLO[]Sample text</p></body>
+ <body>
+ <p>HELLO[]Sample text</p>
+ </body>
</html>
diff --git a/Editor/tests/input/replaceRange06-expected.html b/Editor/tests/input/replaceRange06-expected.html
index 18ede2e..8df6771 100644
--- a/Editor/tests/input/replaceRange06-expected.html
+++ b/Editor/tests/input/replaceRange06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sample textHELLO[]</p></body>
+ <body>
+ <p>Sample textHELLO[]</p>
+ </body>
</html>
diff --git a/Editor/tests/lists/clearList08a-expected.html b/Editor/tests/lists/clearList08a-expected.html
index 60ff315..8947345 100644
--- a/Editor/tests/lists/clearList08a-expected.html
+++ b/Editor/tests/lists/clearList08a-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ol><li><p>One</p></li></ol>
+ <ol>
+ <li><p>One</p></li>
+ </ol>
<p>Two</p>
<ol>
<li><p>First</p></li>
diff --git a/Editor/tests/lists/clearList08b-expected.html b/Editor/tests/lists/clearList08b-expected.html
index 32d4756..b7946a6 100644
--- a/Editor/tests/lists/clearList08b-expected.html
+++ b/Editor/tests/lists/clearList08b-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ol><li>One</li></ol>
+ <ol>
+ <li>One</li>
+ </ol>
<p>Two</p>
<ol>
<li>First</li>
diff --git a/Editor/tests/lists/decrease-flat-tozero02a-expected.html b/Editor/tests/lists/decrease-flat-tozero02a-expected.html
index d5c80a1..d13aaf7 100644
--- a/Editor/tests/lists/decrease-flat-tozero02a-expected.html
+++ b/Editor/tests/lists/decrease-flat-tozero02a-expected.html
@@ -1,8 +1,12 @@
<html>
<head></head>
<body>
- <ol><li><p>One</p></li></ol>
+ <ol>
+ <li><p>One</p></li>
+ </ol>
<p>[Two]</p>
- <ol><li><p>Three</p></li></ol>
+ <ol>
+ <li><p>Three</p></li>
+ </ol>
</body>
</html>
diff --git a/Editor/tests/lists/decrease-flat-tozero02b-expected.html b/Editor/tests/lists/decrease-flat-tozero02b-expected.html
index a9495f7..088eaba 100644
--- a/Editor/tests/lists/decrease-flat-tozero02b-expected.html
+++ b/Editor/tests/lists/decrease-flat-tozero02b-expected.html
@@ -1,8 +1,12 @@
<html>
<head></head>
<body>
- <ol><li>One</li></ol>
+ <ol>
+ <li>One</li>
+ </ol>
<p>[Two]</p>
- <ol><li>Three</li></ol>
+ <ol>
+ <li>Three</li>
+ </ol>
</body>
</html>
diff --git a/Editor/tests/lists/decrease-nested-toone02a-expected.html b/Editor/tests/lists/decrease-nested-toone02a-expected.html
index 0ea0c47..97f4532 100644
--- a/Editor/tests/lists/decrease-nested-toone02a-expected.html
+++ b/Editor/tests/lists/decrease-nested-toone02a-expected.html
@@ -4,11 +4,15 @@
<ol>
<li>
<p>One</p>
- <ol><li><p>Two</p></li></ol>
+ <ol>
+ <li><p>Two</p></li>
+ </ol>
</li>
<li>
<p>[Three]</p>
- <ol><li><p>Four</p></li></ol>
+ <ol>
+ <li><p>Four</p></li>
+ </ol>
</li>
<li><p>Five</p></li>
</ol>
diff --git a/Editor/tests/lists/decrease-nested-toone02b-expected.html b/Editor/tests/lists/decrease-nested-toone02b-expected.html
index e435755..d68fbea 100644
--- a/Editor/tests/lists/decrease-nested-toone02b-expected.html
+++ b/Editor/tests/lists/decrease-nested-toone02b-expected.html
@@ -4,11 +4,15 @@
<ol>
<li>
One
- <ol><li>Two</li></ol>
+ <ol>
+ <li>Two</li>
+ </ol>
</li>
<li>
[Three]
- <ol><li>Four</li></ol>
+ <ol>
+ <li>Four</li>
+ </ol>
</li>
<li>Five</li>
</ol>
diff --git a/Editor/tests/lists/decrease-nested-toone04a-expected.html b/Editor/tests/lists/decrease-nested-toone04a-expected.html
index 532dde7..ccd7c67 100644
--- a/Editor/tests/lists/decrease-nested-toone04a-expected.html
+++ b/Editor/tests/lists/decrease-nested-toone04a-expected.html
@@ -6,7 +6,9 @@
<li><p>[Two</p></li>
<li>
<p>Three]</p>
- <ol><li><p>Four</p></li></ol>
+ <ol>
+ <li><p>Four</p></li>
+ </ol>
</li>
<li><p>Five</p></li>
</ol>
diff --git a/Editor/tests/lists/decrease-nested-toone04b-expected.html b/Editor/tests/lists/decrease-nested-toone04b-expected.html
index 07663ea..3783f4a 100644
--- a/Editor/tests/lists/decrease-nested-toone04b-expected.html
+++ b/Editor/tests/lists/decrease-nested-toone04b-expected.html
@@ -6,7 +6,9 @@
<li>[Two</li>
<li>
Three]
- <ol><li>Four</li></ol>
+ <ol>
+ <li>Four</li>
+ </ol>
</li>
<li>Five</li>
</ol>
diff --git a/Editor/tests/lists/decrease-nested-toone05a-expected.html b/Editor/tests/lists/decrease-nested-toone05a-expected.html
index c095fe7..2dbf1cc 100644
--- a/Editor/tests/lists/decrease-nested-toone05a-expected.html
+++ b/Editor/tests/lists/decrease-nested-toone05a-expected.html
@@ -4,7 +4,9 @@
<ol>
<li>
<p>One</p>
- <ol><li><p>Two</p></li></ol>
+ <ol>
+ <li><p>Two</p></li>
+ </ol>
</li>
<li><p>[Three</p></li>
<li><p>Four]</p></li>
diff --git a/Editor/tests/lists/decrease-nested-toone05b-expected.html b/Editor/tests/lists/decrease-nested-toone05b-expected.html
index 5b7de85..916515d 100644
--- a/Editor/tests/lists/decrease-nested-toone05b-expected.html
+++ b/Editor/tests/lists/decrease-nested-toone05b-expected.html
@@ -4,7 +4,9 @@
<ol>
<li>
One
- <ol><li>Two</li></ol>
+ <ol>
+ <li>Two</li>
+ </ol>
</li>
<li>[Three</li>
<li>Four]</li>
diff --git a/Editor/tests/lists/decrease-nested-tozero01a-expected.html b/Editor/tests/lists/decrease-nested-tozero01a-expected.html
index 912c2c6..c7ad61d 100644
--- a/Editor/tests/lists/decrease-nested-tozero01a-expected.html
+++ b/Editor/tests/lists/decrease-nested-tozero01a-expected.html
@@ -11,7 +11,9 @@
<ol>
<li>
<p>Four</p>
- <ol><li><p>Five]</p></li></ol>
+ <ol>
+ <li><p>Five]</p></li>
+ </ol>
</li>
</ol>
</li>
diff --git a/Editor/tests/lists/decrease-nested-tozero01b-expected.html b/Editor/tests/lists/decrease-nested-tozero01b-expected.html
index 44f7c1a..8f70ea1 100644
--- a/Editor/tests/lists/decrease-nested-tozero01b-expected.html
+++ b/Editor/tests/lists/decrease-nested-tozero01b-expected.html
@@ -11,7 +11,9 @@
<ol>
<li>
Four
- <ol><li>Five]</li></ol>
+ <ol>
+ <li>Five]</li>
+ </ol>
</li>
</ol>
</li>
diff --git a/Editor/tests/lists/decrease-nested-tozero02a-expected.html b/Editor/tests/lists/decrease-nested-tozero02a-expected.html
index f9dbfff..bfce678 100644
--- a/Editor/tests/lists/decrease-nested-tozero02a-expected.html
+++ b/Editor/tests/lists/decrease-nested-tozero02a-expected.html
@@ -9,7 +9,9 @@
<ol>
<li>
<p>Four</p>
- <ol><li><p>Five]</p></li></ol>
+ <ol>
+ <li><p>Five]</p></li>
+ </ol>
</li>
</ol>
</li>
diff --git a/Editor/tests/lists/decrease-nested-tozero02b-expected.html b/Editor/tests/lists/decrease-nested-tozero02b-expected.html
index a52fb5f..dd2ff11 100644
--- a/Editor/tests/lists/decrease-nested-tozero02b-expected.html
+++ b/Editor/tests/lists/decrease-nested-tozero02b-expected.html
@@ -9,7 +9,9 @@
<ol>
<li>
Four
- <ol><li>Five]</li></ol>
+ <ol>
+ <li>Five]</li>
+ </ol>
</li>
</ol>
</li>
diff --git a/Editor/tests/lists/decrease-nested-tozero03a-expected.html b/Editor/tests/lists/decrease-nested-tozero03a-expected.html
index 787e44a..6ff3a1b 100644
--- a/Editor/tests/lists/decrease-nested-tozero03a-expected.html
+++ b/Editor/tests/lists/decrease-nested-tozero03a-expected.html
@@ -7,7 +7,9 @@
<ol>
<li>
<p>Four</p>
- <ol><li><p>Five]</p></li></ol>
+ <ol>
+ <li><p>Five]</p></li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/decrease-nested-tozero03b-expected.html b/Editor/tests/lists/decrease-nested-tozero03b-expected.html
index c7ca17f..377d3aa 100644
--- a/Editor/tests/lists/decrease-nested-tozero03b-expected.html
+++ b/Editor/tests/lists/decrease-nested-tozero03b-expected.html
@@ -7,7 +7,9 @@
<ol>
<li>
Four
- <ol><li>Five]</li></ol>
+ <ol>
+ <li>Five]</li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/decrease-nested-tozero04a-expected.html b/Editor/tests/lists/decrease-nested-tozero04a-expected.html
index 3a2f690..e44a924 100644
--- a/Editor/tests/lists/decrease-nested-tozero04a-expected.html
+++ b/Editor/tests/lists/decrease-nested-tozero04a-expected.html
@@ -5,6 +5,8 @@
<p>Two</p>
<p>Three</p>
<p>Four</p>
- <ol><li><p>Five]</p></li></ol>
+ <ol>
+ <li><p>Five]</p></li>
+ </ol>
</body>
</html>
diff --git a/Editor/tests/lists/decrease-nested-tozero04b-expected.html b/Editor/tests/lists/decrease-nested-tozero04b-expected.html
index 83b0303..7b4c5e1 100644
--- a/Editor/tests/lists/decrease-nested-tozero04b-expected.html
+++ b/Editor/tests/lists/decrease-nested-tozero04b-expected.html
@@ -5,6 +5,8 @@
<p>Two</p>
<p>Three</p>
<p>Four</p>
- <ol><li>Five]</li></ol>
+ <ol>
+ <li>Five]</li>
+ </ol>
</body>
</html>
diff --git a/Editor/tests/lists/div01a-expected.html b/Editor/tests/lists/div01a-expected.html
index a4af1eb..3f37489 100644
--- a/Editor/tests/lists/div01a-expected.html
+++ b/Editor/tests/lists/div01a-expected.html
@@ -3,7 +3,9 @@
<body>
<div>
<p>One</p>
- <ol><li><p>Two[]</p></li></ol>
+ <ol>
+ <li><p>Two[]</p></li>
+ </ol>
<p>Three</p>
</div>
</body>
diff --git a/Editor/tests/lists/div02a-expected.html b/Editor/tests/lists/div02a-expected.html
index b817032..dc94c9f 100644
--- a/Editor/tests/lists/div02a-expected.html
+++ b/Editor/tests/lists/div02a-expected.html
@@ -2,9 +2,13 @@
<head></head>
<body>
<div>
- <ul><li><p>One</p></li></ul>
+ <ul>
+ <li><p>One</p></li>
+ </ul>
<p>Two[]</p>
- <ul><li><p>Three</p></li></ul>
+ <ul>
+ <li><p>Three</p></li>
+ </ul>
</div>
</body>
</html>
diff --git a/Editor/tests/lists/div03a-expected.html b/Editor/tests/lists/div03a-expected.html
index e026d5a..84a1a82 100644
--- a/Editor/tests/lists/div03a-expected.html
+++ b/Editor/tests/lists/div03a-expected.html
@@ -2,9 +2,13 @@
<head></head>
<body>
<div>
- <ul><li>One</li></ul>
+ <ul>
+ <li>One</li>
+ </ul>
<p>Two[]</p>
- <ul><li>Three</li></ul>
+ <ul>
+ <li>Three</li>
+ </ul>
</div>
</body>
</html>
diff --git a/Editor/tests/lists/increase-flat02a-expected.html b/Editor/tests/lists/increase-flat02a-expected.html
index f3a2bd4..3515f4b 100644
--- a/Editor/tests/lists/increase-flat02a-expected.html
+++ b/Editor/tests/lists/increase-flat02a-expected.html
@@ -4,7 +4,9 @@
<ol>
<li>
<p>One</p>
- <ol><li><p>[Two]</p></li></ol>
+ <ol>
+ <li><p>[Two]</p></li>
+ </ol>
</li>
<li><p>Three</p></li>
</ol>
diff --git a/Editor/tests/lists/increase-flat02b-expected.html b/Editor/tests/lists/increase-flat02b-expected.html
index 8013f97..7b82edc 100644
--- a/Editor/tests/lists/increase-flat02b-expected.html
+++ b/Editor/tests/lists/increase-flat02b-expected.html
@@ -4,7 +4,9 @@
<ol>
<li>
One
- <ol><li>[Two]</li></ol>
+ <ol>
+ <li>[Two]</li>
+ </ol>
</li>
<li>Three</li>
</ol>
diff --git a/Editor/tests/lists/increase-flat03a-expected.html b/Editor/tests/lists/increase-flat03a-expected.html
index 0032786..3ed43b3 100644
--- a/Editor/tests/lists/increase-flat03a-expected.html
+++ b/Editor/tests/lists/increase-flat03a-expected.html
@@ -5,7 +5,9 @@
<li><p>One</p></li>
<li>
<p>Two</p>
- <ol><li><p>[Three]</p></li></ol>
+ <ol>
+ <li><p>[Three]</p></li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/increase-flat03b-expected.html b/Editor/tests/lists/increase-flat03b-expected.html
index dd054ba..7b3c432 100644
--- a/Editor/tests/lists/increase-flat03b-expected.html
+++ b/Editor/tests/lists/increase-flat03b-expected.html
@@ -5,7 +5,9 @@
<li>One</li>
<li>
Two
- <ol><li>[Three]</li></ol>
+ <ol>
+ <li>[Three]</li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/increase-misc01a-expected.html b/Editor/tests/lists/increase-misc01a-expected.html
index 28f08ac..69f9c96 100644
--- a/Editor/tests/lists/increase-misc01a-expected.html
+++ b/Editor/tests/lists/increase-misc01a-expected.html
@@ -5,7 +5,9 @@
<li><p>One</p></li>
<li>
<p>Two</p>
- <ol><li><p>[]</p></li></ol>
+ <ol>
+ <li><p>[]</p></li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/increase-misc01b-expected.html b/Editor/tests/lists/increase-misc01b-expected.html
index 142abcd..c743f35 100644
--- a/Editor/tests/lists/increase-misc01b-expected.html
+++ b/Editor/tests/lists/increase-misc01b-expected.html
@@ -5,7 +5,9 @@
<li>One</li>
<li>
Two
- <ol><li>[]</li></ol>
+ <ol>
+ <li>[]</li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/increase-misc02a-expected.html b/Editor/tests/lists/increase-misc02a-expected.html
index 5c7431a..63e1c40 100644
--- a/Editor/tests/lists/increase-misc02a-expected.html
+++ b/Editor/tests/lists/increase-misc02a-expected.html
@@ -5,7 +5,9 @@
<li><p>One</p></li>
<li>
<p>Two</p>
- <ol><li><p id="test">[]</p></li></ol>
+ <ol>
+ <li><p id="test">[]</p></li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/increase-misc02b-expected.html b/Editor/tests/lists/increase-misc02b-expected.html
index 6cec2b1..ec81c0c 100644
--- a/Editor/tests/lists/increase-misc02b-expected.html
+++ b/Editor/tests/lists/increase-misc02b-expected.html
@@ -5,7 +5,9 @@
<li>One</li>
<li>
Two
- <ol><li id="test">[]</li></ol>
+ <ol>
+ <li id="test">[]</li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/increase-misc03a-expected.html b/Editor/tests/lists/increase-misc03a-expected.html
index 9796075..51cb507 100644
--- a/Editor/tests/lists/increase-misc03a-expected.html
+++ b/Editor/tests/lists/increase-misc03a-expected.html
@@ -4,7 +4,9 @@
<ol>
<li>
One
- <ol><li>[]</li></ol>
+ <ol>
+ <li>[]</li>
+ </ol>
</li>
</ol>
</body>
diff --git a/Editor/tests/lists/increase-multiple02a-expected.html b/Editor/tests/lists/increase-multiple02a-expected.html
index a30c863..c51b85e 100644
--- a/Editor/tests/lists/increase-multiple02a-expected.html
+++ b/Editor/tests/lists/increase-multiple02a-expected.html
@@ -13,7 +13,9 @@
<ol>
<li>
<p>Four</p>
- <ol><li><p>Five]</p></li></ol>
+ <ol>
+ <li><p>Five]</p></li>
+ </ol>
</li>
</ol>
</li>
diff --git a/Editor/tests/lists/increase-multiple02b-expected.html b/Editor/tests/lists/increase-multiple02b-expected.html
index 20bb4e2..589b47f 100644
--- a/Editor/tests/lists/increase-multiple02b-expected.html
+++ b/Editor/tests/lists/increase-multiple02b-expected.html
@@ -13,7 +13,9 @@
<ol>
<li>
Four
- <ol><li>Five]</li></ol>
+ <ol>
+ <li>Five]</li>
+ </ol>
</li>
</ol>
</li>
diff --git a/Editor/tests/lists/merge03a-expected.html b/Editor/tests/lists/merge03a-expected.html
index 4392139..906f4e8 100644
--- a/Editor/tests/lists/merge03a-expected.html
+++ b/Editor/tests/lists/merge03a-expected.html
@@ -5,9 +5,15 @@
<li><p>One</p></li>
<li><p>Two</p></li>
</ul>
- <ol><li><p>Three</p></li></ol>
- <ul><li><p>Four</p></li></ul>
- <ol><li><p>Five</p></li></ol>
+ <ol>
+ <li><p>Three</p></li>
+ </ol>
+ <ul>
+ <li><p>Four</p></li>
+ </ul>
+ <ol>
+ <li><p>Five</p></li>
+ </ol>
<ul>
<li><p>Six</p></li>
<li><p>Seven</p></li>
diff --git a/Editor/tests/lists/merge03b-expected.html b/Editor/tests/lists/merge03b-expected.html
index d63bb9a..1d2c048 100644
--- a/Editor/tests/lists/merge03b-expected.html
+++ b/Editor/tests/lists/merge03b-expected.html
@@ -5,9 +5,15 @@
<li>One</li>
<li>Two</li>
</ul>
- <ol><li>Three</li></ol>
- <ul><li>Four</li></ul>
- <ol><li>Five</li></ol>
+ <ol>
+ <li>Three</li>
+ </ol>
+ <ul>
+ <li>Four</li>
+ </ul>
+ <ol>
+ <li>Five</li>
+ </ol>
<ul>
<li>Six</li>
<li>Seven</li>
diff --git a/Editor/tests/lists/ol-from-ul02a-expected.html b/Editor/tests/lists/ol-from-ul02a-expected.html
index 85805d9..29f51f8 100644
--- a/Editor/tests/lists/ol-from-ul02a-expected.html
+++ b/Editor/tests/lists/ol-from-ul02a-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ol><li><p>One</p></li></ol>
+ <ol>
+ <li><p>One</p></li>
+ </ol>
<ul>
<li><p>Two</p></li>
<li><p>Three</p></li>
diff --git a/Editor/tests/lists/ol-from-ul02b-expected.html b/Editor/tests/lists/ol-from-ul02b-expected.html
index 37040c4..55be2e0 100644
--- a/Editor/tests/lists/ol-from-ul02b-expected.html
+++ b/Editor/tests/lists/ol-from-ul02b-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ol><li>One</li></ol>
+ <ol>
+ <li>One</li>
+ </ol>
<ul>
<li>Two</li>
<li>Three</li>
diff --git a/Editor/tests/lists/ol-from-ul03a-expected.html b/Editor/tests/lists/ol-from-ul03a-expected.html
index 3f7390e..780a1f7 100644
--- a/Editor/tests/lists/ol-from-ul03a-expected.html
+++ b/Editor/tests/lists/ol-from-ul03a-expected.html
@@ -5,7 +5,9 @@
<li><p>One</p></li>
<li><p>Two</p></li>
</ul>
- <ol><li><p>Three</p></li></ol>
+ <ol>
+ <li><p>Three</p></li>
+ </ol>
<ul>
<li><p>Four</p></li>
<li><p>Five</p></li>
diff --git a/Editor/tests/lists/ol-from-ul03b-expected.html b/Editor/tests/lists/ol-from-ul03b-expected.html
index 87968a5..e957e61 100644
--- a/Editor/tests/lists/ol-from-ul03b-expected.html
+++ b/Editor/tests/lists/ol-from-ul03b-expected.html
@@ -5,7 +5,9 @@
<li>One</li>
<li>Two</li>
</ul>
- <ol><li>Three</li></ol>
+ <ol>
+ <li>Three</li>
+ </ol>
<ul>
<li>Four</li>
<li>Five</li>
diff --git a/Editor/tests/lists/ol-from-ul04a-expected.html b/Editor/tests/lists/ol-from-ul04a-expected.html
index 82362f1..4f4f65e 100644
--- a/Editor/tests/lists/ol-from-ul04a-expected.html
+++ b/Editor/tests/lists/ol-from-ul04a-expected.html
@@ -7,6 +7,8 @@
<li><p>Three</p></li>
<li><p>Four</p></li>
</ul>
- <ol><li><p>Five</p></li></ol>
+ <ol>
+ <li><p>Five</p></li>
+ </ol>
</body>
</html>
\ No newline at end of file
diff --git a/Editor/tests/lists/ol-from-ul04b-expected.html b/Editor/tests/lists/ol-from-ul04b-expected.html
index edb66fb..02bef3d 100644
--- a/Editor/tests/lists/ol-from-ul04b-expected.html
+++ b/Editor/tests/lists/ol-from-ul04b-expected.html
@@ -7,6 +7,8 @@
<li>Three</li>
<li>Four</li>
</ul>
- <ol><li>Five</li></ol>
+ <ol>
+ <li>Five</li>
+ </ol>
</body>
</html>
\ No newline at end of file
diff --git a/Editor/tests/lists/ol-from-ul07a-expected.html b/Editor/tests/lists/ol-from-ul07a-expected.html
index 5e5cbb7..af0faed 100644
--- a/Editor/tests/lists/ol-from-ul07a-expected.html
+++ b/Editor/tests/lists/ol-from-ul07a-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ul><li><p>One</p></li></ul>
+ <ul>
+ <li><p>One</p></li>
+ </ul>
<ol>
<li>
<p>Two</p>
diff --git a/Editor/tests/lists/ol-from-ul07b-expected.html b/Editor/tests/lists/ol-from-ul07b-expected.html
index f508437..28dd3d2 100644
--- a/Editor/tests/lists/ol-from-ul07b-expected.html
+++ b/Editor/tests/lists/ol-from-ul07b-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ul><li>One</li></ul>
+ <ul>
+ <li>One</li>
+ </ul>
<ol>
<li>
Two
diff --git a/Editor/tests/lists/ol02-expected.html b/Editor/tests/lists/ol02-expected.html
index 3964d67..3bde522 100644
--- a/Editor/tests/lists/ol02-expected.html
+++ b/Editor/tests/lists/ol02-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ol><li><p>One</p></li></ol>
+ <ol>
+ <li><p>One</p></li>
+ </ol>
<p>Two</p>
<p>Three</p>
<p>Four</p>
diff --git a/Editor/tests/lists/ol03-expected.html b/Editor/tests/lists/ol03-expected.html
index 9ebc843..de420ba 100644
--- a/Editor/tests/lists/ol03-expected.html
+++ b/Editor/tests/lists/ol03-expected.html
@@ -3,7 +3,9 @@
<body>
<p>One</p>
<p>Two</p>
- <ol><li><p>Three</p></li></ol>
+ <ol>
+ <li><p>Three</p></li>
+ </ol>
<p>Four</p>
<p>Five</p>
</body>
diff --git a/Editor/tests/lists/ol04-expected.html b/Editor/tests/lists/ol04-expected.html
index ff39662..fd4d870 100644
--- a/Editor/tests/lists/ol04-expected.html
+++ b/Editor/tests/lists/ol04-expected.html
@@ -5,6 +5,8 @@
<p>Two</p>
<p>Three</p>
<p>Four</p>
- <ol><li><p>Five</p></li></ol>
+ <ol>
+ <li><p>Five</p></li>
+ </ol>
</body>
</html>
\ No newline at end of file
diff --git a/Editor/tests/lists/setList-headings01-expected.html b/Editor/tests/lists/setList-headings01-expected.html
index 98e1748..57a648a 100644
--- a/Editor/tests/lists/setList-headings01-expected.html
+++ b/Editor/tests/lists/setList-headings01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1 id="item1">[Test]</h1></body>
+ <body>
+ <h1 id="item1">[Test]</h1>
+ </body>
</html>
diff --git a/Editor/tests/lists/setList-headings03-expected.html b/Editor/tests/lists/setList-headings03-expected.html
index 516bacd..7a9cd9d 100644
--- a/Editor/tests/lists/setList-headings03-expected.html
+++ b/Editor/tests/lists/setList-headings03-expected.html
@@ -1,8 +1,12 @@
<html>
<head></head>
<body>
- <ul><li><p>[One</p></li></ul>
+ <ul>
+ <li><p>[One</p></li>
+ </ul>
<h1 id="item1">Two</h1>
- <ul><li><p>Three]</p></li></ul>
+ <ul>
+ <li><p>Three]</p></li>
+ </ul>
</body>
</html>
diff --git a/Editor/tests/lists/setList-innerp02-expected.html b/Editor/tests/lists/setList-innerp02-expected.html
index 2cceaea..3a20361 100644
--- a/Editor/tests/lists/setList-innerp02-expected.html
+++ b/Editor/tests/lists/setList-innerp02-expected.html
@@ -4,7 +4,9 @@
<ul>
<li>
<p>One</p>
- <ul><li><p>[]Two</p></li></ul>
+ <ul>
+ <li><p>[]Two</p></li>
+ </ul>
</li>
</ul>
</body>
diff --git a/Editor/tests/lists/setList-innerp04-expected.html b/Editor/tests/lists/setList-innerp04-expected.html
index 96db813..d0fe455 100644
--- a/Editor/tests/lists/setList-innerp04-expected.html
+++ b/Editor/tests/lists/setList-innerp04-expected.html
@@ -9,7 +9,9 @@
<li><p>Three</p></li>
<li><p>Four</p></li>
</ul>
- <ol><li><p>[]Five</p></li></ol>
+ <ol>
+ <li><p>[]Five</p></li>
+ </ol>
</li>
<li><p>Six</p></li>
</ul>
diff --git a/Editor/tests/lists/setList-nested07-expected.html b/Editor/tests/lists/setList-nested07-expected.html
index 77a3585..5caabe9 100644
--- a/Editor/tests/lists/setList-nested07-expected.html
+++ b/Editor/tests/lists/setList-nested07-expected.html
@@ -17,6 +17,8 @@
<li><p>Seven</p></li>
<li><p>Eigh]t</p></li>
</ol>
- <ul><li><p>Nine</p></li></ul>
+ <ul>
+ <li><p>Nine</p></li>
+ </ul>
</body>
</html>
diff --git a/Editor/tests/lists/setList-nested08-expected.html b/Editor/tests/lists/setList-nested08-expected.html
index 9dea7ca..23e238e 100644
--- a/Editor/tests/lists/setList-nested08-expected.html
+++ b/Editor/tests/lists/setList-nested08-expected.html
@@ -16,6 +16,8 @@
<li><p>Seven</p></li>
<li><p>Eigh]t</p></li>
</ol>
- <ul><li><p>Nine</p></li></ul>
+ <ul>
+ <li><p>Nine</p></li>
+ </ul>
</body>
</html>
diff --git a/Editor/tests/lists/setList-nop01-expected.html b/Editor/tests/lists/setList-nop01-expected.html
index 90128c8..f032705 100644
--- a/Editor/tests/lists/setList-nop01-expected.html
+++ b/Editor/tests/lists/setList-nop01-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li>[test]</li></ul></body>
+ <body>
+ <ul>
+ <li>[test]</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/lists/setList-nop02-expected.html b/Editor/tests/lists/setList-nop02-expected.html
index 8718df2..1e26a12 100644
--- a/Editor/tests/lists/setList-nop02-expected.html
+++ b/Editor/tests/lists/setList-nop02-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li>[]</li></ul></body>
+ <body>
+ <ul>
+ <li>[]</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/lists/setList-nop03-expected.html b/Editor/tests/lists/setList-nop03-expected.html
index b80d230..23649c7 100644
--- a/Editor/tests/lists/setList-nop03-expected.html
+++ b/Editor/tests/lists/setList-nop03-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li>test[]</li></ul></body>
+ <body>
+ <ul>
+ <li>test[]</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/lists/setList-nop04-expected.html b/Editor/tests/lists/setList-nop04-expected.html
index 55131c4..c43e793 100644
--- a/Editor/tests/lists/setList-nop04-expected.html
+++ b/Editor/tests/lists/setList-nop04-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li>[]test</li></ul></body>
+ <body>
+ <ul>
+ <li>[]test</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/lists/setList-nop05-expected.html b/Editor/tests/lists/setList-nop05-expected.html
index 8718df2..1e26a12 100644
--- a/Editor/tests/lists/setList-nop05-expected.html
+++ b/Editor/tests/lists/setList-nop05-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li>[]</li></ul></body>
+ <body>
+ <ul>
+ <li>[]</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/lists/setList-paragraphs05-expected.html b/Editor/tests/lists/setList-paragraphs05-expected.html
index 3bd1904..8172759 100644
--- a/Editor/tests/lists/setList-paragraphs05-expected.html
+++ b/Editor/tests/lists/setList-paragraphs05-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li><p>[]</p></li></ul></body>
+ <body>
+ <ul>
+ <li><p>[]</p></li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/lists/setList-paragraphs06-expected.html b/Editor/tests/lists/setList-paragraphs06-expected.html
index 4167390..b4060bf 100644
--- a/Editor/tests/lists/setList-paragraphs06-expected.html
+++ b/Editor/tests/lists/setList-paragraphs06-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li><p>test[]</p></li></ul></body>
+ <body>
+ <ul>
+ <li><p>test[]</p></li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/lists/setList-paragraphs07-expected.html b/Editor/tests/lists/setList-paragraphs07-expected.html
index e599090..548fbfe 100644
--- a/Editor/tests/lists/setList-paragraphs07-expected.html
+++ b/Editor/tests/lists/setList-paragraphs07-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li><p>[]test</p></li></ul></body>
+ <body>
+ <ul>
+ <li><p>[]test</p></li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/lists/ul02-expected.html b/Editor/tests/lists/ul02-expected.html
index b390081..f8fdae0 100644
--- a/Editor/tests/lists/ul02-expected.html
+++ b/Editor/tests/lists/ul02-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ul><li><p>One</p></li></ul>
+ <ul>
+ <li><p>One</p></li>
+ </ul>
<p>Two</p>
<p>Three</p>
<p>Four</p>
diff --git a/Editor/tests/lists/ul03-expected.html b/Editor/tests/lists/ul03-expected.html
index 7f7bfcd..230709c 100644
--- a/Editor/tests/lists/ul03-expected.html
+++ b/Editor/tests/lists/ul03-expected.html
@@ -3,7 +3,9 @@
<body>
<p>One</p>
<p>Two</p>
- <ul><li><p>Three</p></li></ul>
+ <ul>
+ <li><p>Three</p></li>
+ </ul>
<p>Four</p>
<p>Five</p>
</body>
diff --git a/Editor/tests/lists/ul04-expected.html b/Editor/tests/lists/ul04-expected.html
index 40bd0f4..0c28fc6 100644
--- a/Editor/tests/lists/ul04-expected.html
+++ b/Editor/tests/lists/ul04-expected.html
@@ -5,6 +5,8 @@
<p>Two</p>
<p>Three</p>
<p>Four</p>
- <ul><li><p>Five</p></li></ul>
+ <ul>
+ <li><p>Five</p></li>
+ </ul>
</body>
</html>
\ No newline at end of file
diff --git a/Editor/tests/main/removeSpecial02-expected.html b/Editor/tests/main/removeSpecial02-expected.html
index cdf9e3c..15d8615 100644
--- a/Editor/tests/main/removeSpecial02-expected.html
+++ b/Editor/tests/main/removeSpecial02-expected.html
@@ -3,7 +3,9 @@
<html>
<head></head>
- <body><p><span class="uxwrite-selection">one two three</span></p></body>
+ <body>
+ <p><span class="uxwrite-selection">one two three</span></p>
+ </body>
</html>
After
@@ -11,5 +13,7 @@
<html>
<head></head>
- <body><p>one two three</p></body>
+ <body>
+ <p>one two three</p>
+ </body>
</html>
diff --git a/Editor/tests/outline/OutlineTest.js b/Editor/tests/outline/OutlineTest.js
index 130b5c1..587e82c 100644
--- a/Editor/tests/outline/OutlineTest.js
+++ b/Editor/tests/outline/OutlineTest.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function createTestSections(topChildren)
{
diff --git a/Editor/tests/outline/changeHeadingToParagraph-expected.html b/Editor/tests/outline/changeHeadingToParagraph-expected.html
index 69eff63..f9b3d80 100644
--- a/Editor/tests/outline/changeHeadingToParagraph-expected.html
+++ b/Editor/tests/outline/changeHeadingToParagraph-expected.html
@@ -4,7 +4,9 @@
</style>
</head>
<body>
- <nav class="tableofcontents"><p class="toc1">[No sections defined]</p></nav>
+ <nav class="tableofcontents">
+ <p class="toc1">[No sections defined]</p>
+ </nav>
<p>Heading</p>
</body>
</html>
diff --git a/Editor/tests/outline/discovery02-expected.html b/Editor/tests/outline/discovery02-expected.html
index 2e9ec0d..dcb2a30 100644
--- a/Editor/tests/outline/discovery02-expected.html
+++ b/Editor/tests/outline/discovery02-expected.html
@@ -17,13 +17,25 @@
</head>
<body>
<h1 id="item1">First heading</h1>
- <figure id="item2"><figcaption/></figure>
- <table id="item3"><caption/></table>
+ <figure id="item2">
+ <figcaption/>
+ </figure>
+ <table id="item3">
+ <caption/>
+ </table>
<h2 id="item4">Second heading</h2>
- <figure id="item5"><figcaption/></figure>
- <table id="item6"><caption/></table>
+ <figure id="item5">
+ <figcaption/>
+ </figure>
+ <table id="item6">
+ <caption/>
+ </table>
<h3 id="item7">Third heading</h3>
- <figure id="item8"><figcaption/></figure>
- <table id="item9"><caption/></table>
+ <figure id="item8">
+ <figcaption/>
+ </figure>
+ <table id="item9">
+ <caption/>
+ </table>
</body>
</html>
diff --git a/Editor/tests/outline/discovery03-expected.html b/Editor/tests/outline/discovery03-expected.html
index cb9e66f..dae801d 100644
--- a/Editor/tests/outline/discovery03-expected.html
+++ b/Editor/tests/outline/discovery03-expected.html
@@ -15,13 +15,25 @@
</head>
<body>
<h1 id="item1">First section</h1>
- <figure id="item2"><figcaption class="Unnumbered">First figure</figcaption></figure>
- <table id="item3"><caption class="Unnumbered">First table</caption></table>
+ <figure id="item2">
+ <figcaption class="Unnumbered">First figure</figcaption>
+ </figure>
+ <table id="item3">
+ <caption class="Unnumbered">First table</caption>
+ </table>
<h1 id="item4">Second section</h1>
- <figure id="item5"><figcaption class="Unnumbered">Second figure</figcaption></figure>
- <table id="item6"><caption class="Unnumbered">Second table</caption></table>
+ <figure id="item5">
+ <figcaption class="Unnumbered">Second figure</figcaption>
+ </figure>
+ <table id="item6">
+ <caption class="Unnumbered">Second table</caption>
+ </table>
<h1 id="item7">Third section</h1>
- <figure id="item8"><figcaption class="Unnumbered">Third figure</figcaption></figure>
- <table id="item9"><caption class="Unnumbered">Third table</caption></table>
+ <figure id="item8">
+ <figcaption class="Unnumbered">Third figure</figcaption>
+ </figure>
+ <table id="item9">
+ <caption class="Unnumbered">Third table</caption>
+ </table>
</body>
</html>
diff --git a/Editor/tests/outline/discovery04-expected.html b/Editor/tests/outline/discovery04-expected.html
index 28a8f9f..09986e2 100644
--- a/Editor/tests/outline/discovery04-expected.html
+++ b/Editor/tests/outline/discovery04-expected.html
@@ -17,13 +17,25 @@
</head>
<body>
<h1 id="item1">First section</h1>
- <figure id="item2"><figcaption>First figure</figcaption></figure>
- <table id="item3"><caption>First table</caption></table>
+ <figure id="item2">
+ <figcaption>First figure</figcaption>
+ </figure>
+ <table id="item3">
+ <caption>First table</caption>
+ </table>
<h1 id="item4">Second section</h1>
- <figure id="item5"><figcaption>Second figure</figcaption></figure>
- <table id="item6"><caption>Second table</caption></table>
+ <figure id="item5">
+ <figcaption>Second figure</figcaption>
+ </figure>
+ <table id="item6">
+ <caption>Second table</caption>
+ </table>
<h1 id="item7">Third section</h1>
- <figure id="item8"><figcaption>Third figure</figcaption></figure>
- <table id="item9"><caption>Third table</caption></table>
+ <figure id="item8">
+ <figcaption>Third figure</figcaption>
+ </figure>
+ <table id="item9">
+ <caption>Third table</caption>
+ </table>
</body>
</html>
diff --git a/Editor/tests/outline/discovery05-expected.html b/Editor/tests/outline/discovery05-expected.html
index 28a8f9f..09986e2 100644
--- a/Editor/tests/outline/discovery05-expected.html
+++ b/Editor/tests/outline/discovery05-expected.html
@@ -17,13 +17,25 @@
</head>
<body>
<h1 id="item1">First section</h1>
- <figure id="item2"><figcaption>First figure</figcaption></figure>
- <table id="item3"><caption>First table</caption></table>
+ <figure id="item2">
+ <figcaption>First figure</figcaption>
+ </figure>
+ <table id="item3">
+ <caption>First table</caption>
+ </table>
<h1 id="item4">Second section</h1>
- <figure id="item5"><figcaption>Second figure</figcaption></figure>
- <table id="item6"><caption>Second table</caption></table>
+ <figure id="item5">
+ <figcaption>Second figure</figcaption>
+ </figure>
+ <table id="item6">
+ <caption>Second table</caption>
+ </table>
<h1 id="item7">Third section</h1>
- <figure id="item8"><figcaption>Third figure</figcaption></figure>
- <table id="item9"><caption>Third table</caption></table>
+ <figure id="item8">
+ <figcaption>Third figure</figcaption>
+ </figure>
+ <table id="item9">
+ <caption>Third table</caption>
+ </table>
</body>
</html>
diff --git a/Editor/tests/outline/discovery06-expected.html b/Editor/tests/outline/discovery06-expected.html
index adb404f..3f65556 100644
--- a/Editor/tests/outline/discovery06-expected.html
+++ b/Editor/tests/outline/discovery06-expected.html
@@ -17,13 +17,25 @@
</head>
<body>
<h1 class="Unnumbered" id="item1">First section</h1>
- <figure id="item2"><figcaption class="Unnumbered">First figure</figcaption></figure>
- <table id="item3"><caption class="Unnumbered">First table</caption></table>
+ <figure id="item2">
+ <figcaption class="Unnumbered">First figure</figcaption>
+ </figure>
+ <table id="item3">
+ <caption class="Unnumbered">First table</caption>
+ </table>
<h1 class="Unnumbered" id="item4">Second section</h1>
- <figure id="item5"><figcaption class="Unnumbered">Second figure</figcaption></figure>
- <table id="item6"><caption class="Unnumbered">Second table</caption></table>
+ <figure id="item5">
+ <figcaption class="Unnumbered">Second figure</figcaption>
+ </figure>
+ <table id="item6">
+ <caption class="Unnumbered">Second table</caption>
+ </table>
<h1 class="Unnumbered" id="item7">Third section</h1>
- <figure id="item8"><figcaption class="Unnumbered">Third figure</figcaption></figure>
- <table id="item9"><caption class="Unnumbered">Third table</caption></table>
+ <figure id="item8">
+ <figcaption class="Unnumbered">Third figure</figcaption>
+ </figure>
+ <table id="item9">
+ <caption class="Unnumbered">Third table</caption>
+ </table>
</body>
</html>
diff --git a/Editor/tests/outline/discovery07-expected.html b/Editor/tests/outline/discovery07-expected.html
index adb404f..3f65556 100644
--- a/Editor/tests/outline/discovery07-expected.html
+++ b/Editor/tests/outline/discovery07-expected.html
@@ -17,13 +17,25 @@
</head>
<body>
<h1 class="Unnumbered" id="item1">First section</h1>
- <figure id="item2"><figcaption class="Unnumbered">First figure</figcaption></figure>
- <table id="item3"><caption class="Unnumbered">First table</caption></table>
+ <figure id="item2">
+ <figcaption class="Unnumbered">First figure</figcaption>
+ </figure>
+ <table id="item3">
+ <caption class="Unnumbered">First table</caption>
+ </table>
<h1 class="Unnumbered" id="item4">Second section</h1>
- <figure id="item5"><figcaption class="Unnumbered">Second figure</figcaption></figure>
- <table id="item6"><caption class="Unnumbered">Second table</caption></table>
+ <figure id="item5">
+ <figcaption class="Unnumbered">Second figure</figcaption>
+ </figure>
+ <table id="item6">
+ <caption class="Unnumbered">Second table</caption>
+ </table>
<h1 class="Unnumbered" id="item7">Third section</h1>
- <figure id="item8"><figcaption class="Unnumbered">Third figure</figcaption></figure>
- <table id="item9"><caption class="Unnumbered">Third table</caption></table>
+ <figure id="item8">
+ <figcaption class="Unnumbered">Third figure</figcaption>
+ </figure>
+ <table id="item9">
+ <caption class="Unnumbered">Third table</caption>
+ </table>
</body>
</html>
diff --git a/Editor/tests/outline/heading-editing04-expected.html b/Editor/tests/outline/heading-editing04-expected.html
index 909decd..25e101b 100644
--- a/Editor/tests/outline/heading-editing04-expected.html
+++ b/Editor/tests/outline/heading-editing04-expected.html
@@ -4,7 +4,9 @@
</style>
</head>
<body>
- <nav class="tableofcontents"><p class="toc1">[No sections defined]</p></nav>
+ <nav class="tableofcontents">
+ <p class="toc1">[No sections defined]</p>
+ </nav>
<p>Texter</p>
</body>
</html>
diff --git a/Editor/tests/outline/heading-editing05-expected.html b/Editor/tests/outline/heading-editing05-expected.html
index 53122e5..b01af02 100644
--- a/Editor/tests/outline/heading-editing05-expected.html
+++ b/Editor/tests/outline/heading-editing05-expected.html
@@ -4,7 +4,9 @@
</style>
</head>
<body>
- <nav class="tableofcontents"><p class="toc1">[No sections defined]</p></nav>
+ <nav class="tableofcontents">
+ <p class="toc1">[No sections defined]</p>
+ </nav>
<p>Texer</p>
</body>
</html>
diff --git a/Editor/tests/outline/heading-editing07-expected.html b/Editor/tests/outline/heading-editing07-expected.html
index 7e1a033..616c3c5 100644
--- a/Editor/tests/outline/heading-editing07-expected.html
+++ b/Editor/tests/outline/heading-editing07-expected.html
@@ -4,7 +4,9 @@
</style>
</head>
<body>
- <nav class="tableofcontents"><p class="toc1"><a href="#item1">1</a></p></nav>
+ <nav class="tableofcontents">
+ <p class="toc1"><a href="#item1">1</a></p>
+ </nav>
<h1 id="item1"><br/></h1>
</body>
</html>
diff --git a/Editor/tests/outline/heading-hierarchy03a-expected.html b/Editor/tests/outline/heading-hierarchy03a-expected.html
index aa81985..5efc7d6 100644
--- a/Editor/tests/outline/heading-hierarchy03a-expected.html
+++ b/Editor/tests/outline/heading-hierarchy03a-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ol><li><p>One</p></li></ol>
+ <ol>
+ <li><p>One</p></li>
+ </ol>
<h1 id="item1">[Two]</h1>
<ol>
<li>
diff --git a/Editor/tests/outline/heading-hierarchy03c-expected.html b/Editor/tests/outline/heading-hierarchy03c-expected.html
index daa8627..0ae7cc1 100644
--- a/Editor/tests/outline/heading-hierarchy03c-expected.html
+++ b/Editor/tests/outline/heading-hierarchy03c-expected.html
@@ -9,6 +9,8 @@
</li>
</ol>
<h1 id="item1">[Four]</h1>
- <ol><li><p>Five</p></li></ol>
+ <ol>
+ <li><p>Five</p></li>
+ </ol>
</body>
</html>
diff --git a/Editor/tests/outline/heading-hierarchy04a-expected.html b/Editor/tests/outline/heading-hierarchy04a-expected.html
index 6d20bab..a95e2c1 100644
--- a/Editor/tests/outline/heading-hierarchy04a-expected.html
+++ b/Editor/tests/outline/heading-hierarchy04a-expected.html
@@ -1,7 +1,9 @@
<html>
<head></head>
<body>
- <ol><li>One</li></ol>
+ <ol>
+ <li>One</li>
+ </ol>
<h1 id="item1">[Two]</h1>
<ol>
<li>
diff --git a/Editor/tests/outline/heading-hierarchy04c-expected.html b/Editor/tests/outline/heading-hierarchy04c-expected.html
index 56bbcad..c320022 100644
--- a/Editor/tests/outline/heading-hierarchy04c-expected.html
+++ b/Editor/tests/outline/heading-hierarchy04c-expected.html
@@ -11,6 +11,8 @@
</li>
</ol>
<h1 id="item1">[Four]</h1>
- <ol><li>Five</li></ol>
+ <ol>
+ <li>Five</li>
+ </ol>
</body>
</html>
diff --git a/Editor/tests/outline/listOfFigures10-expected.html b/Editor/tests/outline/listOfFigures10-expected.html
index 3f708f6..d2216f7 100644
--- a/Editor/tests/outline/listOfFigures10-expected.html
+++ b/Editor/tests/outline/listOfFigures10-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><nav class="listoffigures"><p class="toc1">[No figures defined]</p></nav></body>
+ <body>
+ <nav class="listoffigures">
+ <p class="toc1">[No figures defined]</p>
+ </nav>
+ </body>
</html>
diff --git a/Editor/tests/outline/listOfFigures11-expected.html b/Editor/tests/outline/listOfFigures11-expected.html
index 3f708f6..d2216f7 100644
--- a/Editor/tests/outline/listOfFigures11-expected.html
+++ b/Editor/tests/outline/listOfFigures11-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><nav class="listoffigures"><p class="toc1">[No figures defined]</p></nav></body>
+ <body>
+ <nav class="listoffigures">
+ <p class="toc1">[No figures defined]</p>
+ </nav>
+ </body>
</html>
diff --git a/Editor/tests/outline/listOfTables01-expected.html b/Editor/tests/outline/listOfTables01-expected.html
index d83bd48..431c04a 100644
--- a/Editor/tests/outline/listOfTables01-expected.html
+++ b/Editor/tests/outline/listOfTables01-expected.html
@@ -32,22 +32,38 @@
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>Test table B</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption>Test table C</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption>Test table D</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables02-expected.html b/Editor/tests/outline/listOfTables02-expected.html
index 9372ca2..56cb8d6 100644
--- a/Editor/tests/outline/listOfTables02-expected.html
+++ b/Editor/tests/outline/listOfTables02-expected.html
@@ -32,7 +32,11 @@
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>
@@ -40,17 +44,29 @@
XYZ
</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption>Test table C</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption>Test table D</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables03-expected.html b/Editor/tests/outline/listOfTables03-expected.html
index 35b85d0..8d55a43 100644
--- a/Editor/tests/outline/listOfTables03-expected.html
+++ b/Editor/tests/outline/listOfTables03-expected.html
@@ -32,22 +32,38 @@
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>TeXYZst table B</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption>Test table C</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption>Test table D</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables04-expected.html b/Editor/tests/outline/listOfTables04-expected.html
index 51e410e..b6b451b 100644
--- a/Editor/tests/outline/listOfTables04-expected.html
+++ b/Editor/tests/outline/listOfTables04-expected.html
@@ -32,22 +32,38 @@
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>Teble B</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption>Test table C</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption>Test table D</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables05-expected.html b/Editor/tests/outline/listOfTables05-expected.html
index 28d6b4e..d630969 100644
--- a/Editor/tests/outline/listOfTables05-expected.html
+++ b/Editor/tests/outline/listOfTables05-expected.html
@@ -31,23 +31,47 @@
</nav>
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>Test table B</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption>Test table C</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption>Test table D</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables06-expected.html b/Editor/tests/outline/listOfTables06-expected.html
index 5a318f2..fa069fe 100644
--- a/Editor/tests/outline/listOfTables06-expected.html
+++ b/Editor/tests/outline/listOfTables06-expected.html
@@ -11,23 +11,47 @@
</nav>
<table id="item1" style="width: 100%">
<caption class="Unnumbered">Test table A</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption class="Unnumbered">Test table B</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption class="Unnumbered">Test table C</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption class="Unnumbered">Test table D</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables07-expected.html b/Editor/tests/outline/listOfTables07-expected.html
index 74cbb79..7e6c405 100644
--- a/Editor/tests/outline/listOfTables07-expected.html
+++ b/Editor/tests/outline/listOfTables07-expected.html
@@ -12,22 +12,38 @@
<table id="item1" style="width: 100%">
<caption class="Unnumbered">Test table A</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption class="Unnumbered">Test table B</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption class="Unnumbered">Test table C</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption class="Unnumbered">Test table D</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables08-expected.html b/Editor/tests/outline/listOfTables08-expected.html
index 74cbb79..7e6c405 100644
--- a/Editor/tests/outline/listOfTables08-expected.html
+++ b/Editor/tests/outline/listOfTables08-expected.html
@@ -12,22 +12,38 @@
<table id="item1" style="width: 100%">
<caption class="Unnumbered">Test table A</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption class="Unnumbered">Test table B</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption class="Unnumbered">Test table C</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption class="Unnumbered">Test table D</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables09-expected.html b/Editor/tests/outline/listOfTables09-expected.html
index a65575c..22f283e 100644
--- a/Editor/tests/outline/listOfTables09-expected.html
+++ b/Editor/tests/outline/listOfTables09-expected.html
@@ -22,22 +22,38 @@
<table id="item1" style="width: 100%">
<caption class="Unnumbered">Test table A</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption class="Unnumbered">Test table B</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption>Test table C</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption>Test table D</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables09a-expected.html b/Editor/tests/outline/listOfTables09a-expected.html
index d83bd48..431c04a 100644
--- a/Editor/tests/outline/listOfTables09a-expected.html
+++ b/Editor/tests/outline/listOfTables09a-expected.html
@@ -32,22 +32,38 @@
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>Test table B</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 100%">
<caption>Test table C</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item4" style="width: 100%">
<caption>Test table D</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/listOfTables10-expected.html b/Editor/tests/outline/listOfTables10-expected.html
index ae022b2..a2bb877 100644
--- a/Editor/tests/outline/listOfTables10-expected.html
+++ b/Editor/tests/outline/listOfTables10-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><nav class="listoftables"><p class="toc1">[No tables defined]</p></nav></body>
+ <body>
+ <nav class="listoftables">
+ <p class="toc1">[No tables defined]</p>
+ </nav>
+ </body>
</html>
diff --git a/Editor/tests/outline/listOfTables11-expected.html b/Editor/tests/outline/listOfTables11-expected.html
index ae022b2..a2bb877 100644
--- a/Editor/tests/outline/listOfTables11-expected.html
+++ b/Editor/tests/outline/listOfTables11-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><nav class="listoftables"><p class="toc1">[No tables defined]</p></nav></body>
+ <body>
+ <nav class="listoftables">
+ <p class="toc1">[No tables defined]</p>
+ </nav>
+ </body>
</html>
diff --git a/Editor/tests/outline/refTitle-figure01-expected.html b/Editor/tests/outline/refTitle-figure01-expected.html
index a5bc86a..9735bee 100644
--- a/Editor/tests/outline/refTitle-figure01-expected.html
+++ b/Editor/tests/outline/refTitle-figure01-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <figure id="item1"><figcaption>First figure</figcaption></figure>
- <figure id="item2"><figcaption>Second figure</figcaption></figure>
- <figure id="item3"><figcaption class="Unnumbered">Third figure</figcaption></figure>
- <figure id="item4"><figcaption class="Unnumbered">Fourth figure</figcaption></figure>
+ <figure id="item1">
+ <figcaption>First figure</figcaption>
+ </figure>
+ <figure id="item2">
+ <figcaption>Second figure</figcaption>
+ </figure>
+ <figure id="item3">
+ <figcaption class="Unnumbered">Third figure</figcaption>
+ </figure>
+ <figure id="item4">
+ <figcaption class="Unnumbered">Fourth figure</figcaption>
+ </figure>
<p>
First ref: Figure
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-figure03-expected.html b/Editor/tests/outline/refTitle-figure03-expected.html
index edf4979..bc2d68b 100644
--- a/Editor/tests/outline/refTitle-figure03-expected.html
+++ b/Editor/tests/outline/refTitle-figure03-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <figure id="item1"><figcaption>FiXYZrst figure</figcaption></figure>
- <figure id="item2"><figcaption>SeXYZcond figure</figcaption></figure>
- <figure id="item3"><figcaption class="Unnumbered">ThXYZird figure</figcaption></figure>
- <figure id="item4"><figcaption class="Unnumbered">FoXYZurth figure</figcaption></figure>
+ <figure id="item1">
+ <figcaption>FiXYZrst figure</figcaption>
+ </figure>
+ <figure id="item2">
+ <figcaption>SeXYZcond figure</figcaption>
+ </figure>
+ <figure id="item3">
+ <figcaption class="Unnumbered">ThXYZird figure</figcaption>
+ </figure>
+ <figure id="item4">
+ <figcaption class="Unnumbered">FoXYZurth figure</figcaption>
+ </figure>
<p>
First ref: Figure
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-figure04-expected.html b/Editor/tests/outline/refTitle-figure04-expected.html
index 845e38b..e1a3cba 100644
--- a/Editor/tests/outline/refTitle-figure04-expected.html
+++ b/Editor/tests/outline/refTitle-figure04-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <figure id="item1"><figcaption>Fit figure</figcaption></figure>
- <figure id="item2"><figcaption>Send figure</figcaption></figure>
- <figure id="item3"><figcaption class="Unnumbered">Thd figure</figcaption></figure>
- <figure id="item4"><figcaption class="Unnumbered">Foth figure</figcaption></figure>
+ <figure id="item1">
+ <figcaption>Fit figure</figcaption>
+ </figure>
+ <figure id="item2">
+ <figcaption>Send figure</figcaption>
+ </figure>
+ <figure id="item3">
+ <figcaption class="Unnumbered">Thd figure</figcaption>
+ </figure>
+ <figure id="item4">
+ <figcaption class="Unnumbered">Foth figure</figcaption>
+ </figure>
<p>
First ref: Figure
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-figure05-expected.html b/Editor/tests/outline/refTitle-figure05-expected.html
index 974f95a..c32c9a4 100644
--- a/Editor/tests/outline/refTitle-figure05-expected.html
+++ b/Editor/tests/outline/refTitle-figure05-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <figure id="item1"><figcaption>Figure A</figcaption></figure>
- <figure id="item2"><figcaption>Figure B</figcaption></figure>
- <figure id="item3"><figcaption class="Unnumbered">Figure C</figcaption></figure>
- <figure id="item4"><figcaption class="Unnumbered">Figure D</figcaption></figure>
+ <figure id="item1">
+ <figcaption>Figure A</figcaption>
+ </figure>
+ <figure id="item2">
+ <figcaption>Figure B</figcaption>
+ </figure>
+ <figure id="item3">
+ <figcaption class="Unnumbered">Figure C</figcaption>
+ </figure>
+ <figure id="item4">
+ <figcaption class="Unnumbered">Figure D</figcaption>
+ </figure>
<p>
First ref: Figure
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-figure06-expected.html b/Editor/tests/outline/refTitle-figure06-expected.html
index 34c77b7..15d7200 100644
--- a/Editor/tests/outline/refTitle-figure06-expected.html
+++ b/Editor/tests/outline/refTitle-figure06-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <figure id="item1"><figcaption>First figure</figcaption></figure>
- <figure id="item2"><figcaption class="Unnumbered">Second figure</figcaption></figure>
- <figure id="item3"><figcaption class="Unnumbered">Third figure</figcaption></figure>
- <figure id="item4"><figcaption class="Unnumbered">Fourth figure</figcaption></figure>
+ <figure id="item1">
+ <figcaption>First figure</figcaption>
+ </figure>
+ <figure id="item2">
+ <figcaption class="Unnumbered">Second figure</figcaption>
+ </figure>
+ <figure id="item3">
+ <figcaption class="Unnumbered">Third figure</figcaption>
+ </figure>
+ <figure id="item4">
+ <figcaption class="Unnumbered">Fourth figure</figcaption>
+ </figure>
<p>
First ref: Figure
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-figure07-expected.html b/Editor/tests/outline/refTitle-figure07-expected.html
index 04dc2c5..d6bc652 100644
--- a/Editor/tests/outline/refTitle-figure07-expected.html
+++ b/Editor/tests/outline/refTitle-figure07-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <figure id="item1"><figcaption>First figure</figcaption></figure>
- <figure id="item2"><figcaption>Second figure</figcaption></figure>
- <figure id="item3"><figcaption>Third figure</figcaption></figure>
- <figure id="item4"><figcaption class="Unnumbered">Fourth figure</figcaption></figure>
+ <figure id="item1">
+ <figcaption>First figure</figcaption>
+ </figure>
+ <figure id="item2">
+ <figcaption>Second figure</figcaption>
+ </figure>
+ <figure id="item3">
+ <figcaption>Third figure</figcaption>
+ </figure>
+ <figure id="item4">
+ <figcaption class="Unnumbered">Fourth figure</figcaption>
+ </figure>
<p>
First ref: Figure
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-table01-expected.html b/Editor/tests/outline/refTitle-table01-expected.html
index de204a8..0b7d604 100644
--- a/Editor/tests/outline/refTitle-table01-expected.html
+++ b/Editor/tests/outline/refTitle-table01-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <table id="item1"><caption>First table</caption></table>
- <table id="item2"><caption>Second table</caption></table>
- <table id="item3"><caption class="Unnumbered">Third table</caption></table>
- <table id="item4"><caption class="Unnumbered">Fourth table</caption></table>
+ <table id="item1">
+ <caption>First table</caption>
+ </table>
+ <table id="item2">
+ <caption>Second table</caption>
+ </table>
+ <table id="item3">
+ <caption class="Unnumbered">Third table</caption>
+ </table>
+ <table id="item4">
+ <caption class="Unnumbered">Fourth table</caption>
+ </table>
<p>
First ref: Table
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-table03-expected.html b/Editor/tests/outline/refTitle-table03-expected.html
index 4d4b717..dd48fea 100644
--- a/Editor/tests/outline/refTitle-table03-expected.html
+++ b/Editor/tests/outline/refTitle-table03-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <table id="item1"><caption>FiXYZrst table</caption></table>
- <table id="item2"><caption>SeXYZcond table</caption></table>
- <table id="item3"><caption class="Unnumbered">ThXYZird table</caption></table>
- <table id="item4"><caption class="Unnumbered">FoXYZurth table</caption></table>
+ <table id="item1">
+ <caption>FiXYZrst table</caption>
+ </table>
+ <table id="item2">
+ <caption>SeXYZcond table</caption>
+ </table>
+ <table id="item3">
+ <caption class="Unnumbered">ThXYZird table</caption>
+ </table>
+ <table id="item4">
+ <caption class="Unnumbered">FoXYZurth table</caption>
+ </table>
<p>
First ref: Table
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-table04-expected.html b/Editor/tests/outline/refTitle-table04-expected.html
index fd0ae9d..9d59ed2 100644
--- a/Editor/tests/outline/refTitle-table04-expected.html
+++ b/Editor/tests/outline/refTitle-table04-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <table id="item1"><caption>Fit table</caption></table>
- <table id="item2"><caption>Send table</caption></table>
- <table id="item3"><caption class="Unnumbered">Thd table</caption></table>
- <table id="item4"><caption class="Unnumbered">Foth table</caption></table>
+ <table id="item1">
+ <caption>Fit table</caption>
+ </table>
+ <table id="item2">
+ <caption>Send table</caption>
+ </table>
+ <table id="item3">
+ <caption class="Unnumbered">Thd table</caption>
+ </table>
+ <table id="item4">
+ <caption class="Unnumbered">Foth table</caption>
+ </table>
<p>
First ref: Table
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-table05-expected.html b/Editor/tests/outline/refTitle-table05-expected.html
index 0dd3e31..6aff79a 100644
--- a/Editor/tests/outline/refTitle-table05-expected.html
+++ b/Editor/tests/outline/refTitle-table05-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <table id="item1"><caption>Table A</caption></table>
- <table id="item2"><caption>Table B</caption></table>
- <table id="item3"><caption class="Unnumbered">Table C</caption></table>
- <table id="item4"><caption class="Unnumbered">Table D</caption></table>
+ <table id="item1">
+ <caption>Table A</caption>
+ </table>
+ <table id="item2">
+ <caption>Table B</caption>
+ </table>
+ <table id="item3">
+ <caption class="Unnumbered">Table C</caption>
+ </table>
+ <table id="item4">
+ <caption class="Unnumbered">Table D</caption>
+ </table>
<p>
First ref: Table
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-table06-expected.html b/Editor/tests/outline/refTitle-table06-expected.html
index b67c018..08b25ff 100644
--- a/Editor/tests/outline/refTitle-table06-expected.html
+++ b/Editor/tests/outline/refTitle-table06-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <table id="item1"><caption>First table</caption></table>
- <table id="item2"><caption class="Unnumbered">Second table</caption></table>
- <table id="item3"><caption class="Unnumbered">Third table</caption></table>
- <table id="item4"><caption class="Unnumbered">Fourth table</caption></table>
+ <table id="item1">
+ <caption>First table</caption>
+ </table>
+ <table id="item2">
+ <caption class="Unnumbered">Second table</caption>
+ </table>
+ <table id="item3">
+ <caption class="Unnumbered">Third table</caption>
+ </table>
+ <table id="item4">
+ <caption class="Unnumbered">Fourth table</caption>
+ </table>
<p>
First ref: Table
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/refTitle-table07-expected.html b/Editor/tests/outline/refTitle-table07-expected.html
index d9f00d0..5458f4e 100644
--- a/Editor/tests/outline/refTitle-table07-expected.html
+++ b/Editor/tests/outline/refTitle-table07-expected.html
@@ -9,10 +9,18 @@
<head>
</head>
<body>
- <table id="item1"><caption>First table</caption></table>
- <table id="item2"><caption>Second table</caption></table>
- <table id="item3"><caption>Third table</caption></table>
- <table id="item4"><caption class="Unnumbered">Fourth table</caption></table>
+ <table id="item1">
+ <caption>First table</caption>
+ </table>
+ <table id="item2">
+ <caption>Second table</caption>
+ </table>
+ <table id="item3">
+ <caption>Third table</caption>
+ </table>
+ <table id="item4">
+ <caption class="Unnumbered">Fourth table</caption>
+ </table>
<p>
First ref: Table
<a href="#item1">1</a>
diff --git a/Editor/tests/outline/reference-insert02-expected.html b/Editor/tests/outline/reference-insert02-expected.html
index 5a49ca9..d24c302 100644
--- a/Editor/tests/outline/reference-insert02-expected.html
+++ b/Editor/tests/outline/reference-insert02-expected.html
@@ -2,9 +2,15 @@
<head>
</head>
<body>
- <figure id="one"><figcaption></figcaption></figure>
- <figure id="two"><figcaption></figcaption></figure>
- <figure id="three"><figcaption></figcaption></figure>
+ <figure id="one">
+ <figcaption></figcaption>
+ </figure>
+ <figure id="two">
+ <figcaption></figcaption>
+ </figure>
+ <figure id="three">
+ <figcaption></figcaption>
+ </figure>
<a href="#one">1</a>
<a href="#two">2</a>
<a href="#three">3</a>
diff --git a/Editor/tests/outline/reference-insert03-expected.html b/Editor/tests/outline/reference-insert03-expected.html
index 830beb2..a1db37e 100644
--- a/Editor/tests/outline/reference-insert03-expected.html
+++ b/Editor/tests/outline/reference-insert03-expected.html
@@ -2,9 +2,15 @@
<head>
</head>
<body>
- <table id="one"><caption></caption></table>
- <table id="two"><caption></caption></table>
- <table id="three"><caption></caption></table>
+ <table id="one">
+ <caption></caption>
+ </table>
+ <table id="two">
+ <caption></caption>
+ </table>
+ <table id="three">
+ <caption></caption>
+ </table>
<a href="#one">1</a>
<a href="#two">2</a>
<a href="#three">3</a>
diff --git a/Editor/tests/outline/reference-static02-expected.html b/Editor/tests/outline/reference-static02-expected.html
index acac09d..bba4355 100644
--- a/Editor/tests/outline/reference-static02-expected.html
+++ b/Editor/tests/outline/reference-static02-expected.html
@@ -14,9 +14,15 @@
Reference
<a href="#three">3</a>
</p>
- <figure id="one"><figcaption></figcaption></figure>
- <figure id="two"><figcaption></figcaption></figure>
- <figure id="three"><figcaption></figcaption></figure>
+ <figure id="one">
+ <figcaption></figcaption>
+ </figure>
+ <figure id="two">
+ <figcaption></figcaption>
+ </figure>
+ <figure id="three">
+ <figcaption></figcaption>
+ </figure>
<p>
Reference
<a href="#one">1</a>
diff --git a/Editor/tests/outline/reference-static03-expected.html b/Editor/tests/outline/reference-static03-expected.html
index 28ec138..b2638e6 100644
--- a/Editor/tests/outline/reference-static03-expected.html
+++ b/Editor/tests/outline/reference-static03-expected.html
@@ -14,9 +14,15 @@
Reference
<a href="#three">3</a>
</p>
- <table id="one"><caption></caption></table>
- <table id="two"><caption></caption></table>
- <table id="three"><caption></caption></table>
+ <table id="one">
+ <caption></caption>
+ </table>
+ <table id="two">
+ <caption></caption>
+ </table>
+ <table id="three">
+ <caption></caption>
+ </table>
<p>
Reference
<a href="#one">1</a>
diff --git a/Editor/tests/outline/reference-update02-expected.html b/Editor/tests/outline/reference-update02-expected.html
index 7c88754..92d5bf3 100644
--- a/Editor/tests/outline/reference-update02-expected.html
+++ b/Editor/tests/outline/reference-update02-expected.html
@@ -14,10 +14,18 @@
Reference
<a href="#three">4</a>
</p>
- <figure id="one"><figcaption></figcaption></figure>
- <figure id="item1"><figcaption></figcaption></figure>
- <figure id="two"><figcaption></figcaption></figure>
- <figure id="three"><figcaption></figcaption></figure>
+ <figure id="one">
+ <figcaption></figcaption>
+ </figure>
+ <figure id="item1">
+ <figcaption></figcaption>
+ </figure>
+ <figure id="two">
+ <figcaption></figcaption>
+ </figure>
+ <figure id="three">
+ <figcaption></figcaption>
+ </figure>
<p>
Reference
<a href="#one">1</a>
diff --git a/Editor/tests/outline/reference-update03-expected.html b/Editor/tests/outline/reference-update03-expected.html
index f2826cc..ec4edae 100644
--- a/Editor/tests/outline/reference-update03-expected.html
+++ b/Editor/tests/outline/reference-update03-expected.html
@@ -14,10 +14,18 @@
Reference
<a href="#three">4</a>
</p>
- <table id="one"><caption></caption></table>
- <table id="item1"><caption></caption></table>
- <table id="two"><caption></caption></table>
- <table id="three"><caption></caption></table>
+ <table id="one">
+ <caption></caption>
+ </table>
+ <table id="item1">
+ <caption></caption>
+ </table>
+ <table id="two">
+ <caption></caption>
+ </table>
+ <table id="three">
+ <caption></caption>
+ </table>
<p>
Reference
<a href="#one">1</a>
diff --git a/Editor/tests/outline/reference01-expected.html b/Editor/tests/outline/reference01-expected.html
index f3d96e1..fd32c84 100644
--- a/Editor/tests/outline/reference01-expected.html
+++ b/Editor/tests/outline/reference01-expected.html
@@ -7,8 +7,12 @@
</head>
<body>
<h1 id="item3">New section</h1>
- <figure id="item2"><figcaption/></figure>
- <table id="item1"><caption/></table>
+ <figure id="item2">
+ <figcaption/>
+ </figure>
+ <table id="item1">
+ <caption/>
+ </table>
<p>
Dynamically added reference:
<a href="#hb">2.1</a>
diff --git a/Editor/tests/outline/refsById01-expected.html b/Editor/tests/outline/refsById01-expected.html
index 58a0237..6df1b7d 100644
--- a/Editor/tests/outline/refsById01-expected.html
+++ b/Editor/tests/outline/refsById01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1 id="item2">Second section</h1></body>
+ <body>
+ <h1 id="item2">Second section</h1>
+ </body>
</html>
diff --git a/Editor/tests/outline/setNumbered-figure02-expected.html b/Editor/tests/outline/setNumbered-figure02-expected.html
index bd75cbf..3760ea8 100644
--- a/Editor/tests/outline/setNumbered-figure02-expected.html
+++ b/Editor/tests/outline/setNumbered-figure02-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><figure id="item1"><img src="../figures/nothing.png" width="25%"/></figure></body>
+ <body>
+ <figure id="item1">
+ <img src="../figures/nothing.png" width="25%"/>
+ </figure>
+ </body>
</html>
diff --git a/Editor/tests/outline/tableOfContents10-expected.html b/Editor/tests/outline/tableOfContents10-expected.html
index 0be3e97..3d005dc 100644
--- a/Editor/tests/outline/tableOfContents10-expected.html
+++ b/Editor/tests/outline/tableOfContents10-expected.html
@@ -2,5 +2,9 @@
<head>
<link href="../generic.css" rel="stylesheet"/>
</head>
- <body><nav class="tableofcontents"><p class="toc1">[No sections defined]</p></nav></body>
+ <body>
+ <nav class="tableofcontents">
+ <p class="toc1">[No sections defined]</p>
+ </nav>
+ </body>
</html>
diff --git a/Editor/tests/outline/tableOfContents11-expected.html b/Editor/tests/outline/tableOfContents11-expected.html
index fd80db1..5ef310b 100644
--- a/Editor/tests/outline/tableOfContents11-expected.html
+++ b/Editor/tests/outline/tableOfContents11-expected.html
@@ -4,5 +4,9 @@
<style>
</style>
</head>
- <body><nav class="tableofcontents"><p class="toc1">[No sections defined]</p></nav></body>
+ <body>
+ <nav class="tableofcontents">
+ <p class="toc1">[No sections defined]</p>
+ </nav>
+ </body>
</html>
diff --git a/Editor/tests/outline/tocInsert01-expected.html b/Editor/tests/outline/tocInsert01-expected.html
index 6ca1634..1c42cb7 100644
--- a/Editor/tests/outline/tocInsert01-expected.html
+++ b/Editor/tests/outline/tocInsert01-expected.html
@@ -29,13 +29,25 @@
</figure>
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>Test table B</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/tocInsert02-expected.html b/Editor/tests/outline/tocInsert02-expected.html
index 30ee06c..7a6dd77 100644
--- a/Editor/tests/outline/tocInsert02-expected.html
+++ b/Editor/tests/outline/tocInsert02-expected.html
@@ -31,13 +31,25 @@
</figure>
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>Test table B</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/outline/tocInsert03-expected.html b/Editor/tests/outline/tocInsert03-expected.html
index c79557b..5b703f0 100644
--- a/Editor/tests/outline/tocInsert03-expected.html
+++ b/Editor/tests/outline/tocInsert03-expected.html
@@ -29,13 +29,25 @@
</figure>
<table id="item1" style="width: 100%">
<caption>Test table A</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 100%">
<caption>Test table B</caption>
- <colgroup><col width="100%"/></colgroup>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-body01a-expected.html b/Editor/tests/position/isValidCursorPosition-body01a-expected.html
index 0db0aa6..3c15d21 100644
--- a/Editor/tests/position/isValidCursorPosition-body01a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-body01a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body>.</body>
+ <body>
+ .
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-body01b-expected.html b/Editor/tests/position/isValidCursorPosition-body01b-expected.html
index 0db0aa6..3c15d21 100644
--- a/Editor/tests/position/isValidCursorPosition-body01b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-body01b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body>.</body>
+ <body>
+ .
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-body01c-expected.html b/Editor/tests/position/isValidCursorPosition-body01c-expected.html
index 0db0aa6..3c15d21 100644
--- a/Editor/tests/position/isValidCursorPosition-body01c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-body01c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body>.</body>
+ <body>
+ .
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-body01d-expected.html b/Editor/tests/position/isValidCursorPosition-body01d-expected.html
index 0db0aa6..3c15d21 100644
--- a/Editor/tests/position/isValidCursorPosition-body01d-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-body01d-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body>.</body>
+ <body>
+ .
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-body01e-expected.html b/Editor/tests/position/isValidCursorPosition-body01e-expected.html
index 0db0aa6..3c15d21 100644
--- a/Editor/tests/position/isValidCursorPosition-body01e-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-body01e-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body>.</body>
+ <body>
+ .
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-body01f-expected.html b/Editor/tests/position/isValidCursorPosition-body01f-expected.html
index 0db0aa6..3c15d21 100644
--- a/Editor/tests/position/isValidCursorPosition-body01f-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-body01f-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body>.</body>
+ <body>
+ .
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-body01g-expected.html b/Editor/tests/position/isValidCursorPosition-body01g-expected.html
index 0db0aa6..3c15d21 100644
--- a/Editor/tests/position/isValidCursorPosition-body01g-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-body01g-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body>.</body>
+ <body>
+ .
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote01-expected.html b/Editor/tests/position/isValidCursorPosition-endnote01-expected.html
new file mode 100644
index 0000000..cb7614e
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote01-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="endnote">.e.n.d.n.o.t.e.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote01-input.html b/Editor/tests/position/isValidCursorPosition-endnote01-input.html
new file mode 100644
index 0000000..3254c5e
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote01-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">endnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote02-expected.html b/Editor/tests/position/isValidCursorPosition-endnote02-expected.html
new file mode 100644
index 0000000..220a4e2
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote02-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="endnote">.e.n.d.n.o.t.e.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote02-input.html b/Editor/tests/position/isValidCursorPosition-endnote02-input.html
new file mode 100644
index 0000000..ee67b8a
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote02-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">endnote</span></p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote03-expected.html b/Editor/tests/position/isValidCursorPosition-endnote03-expected.html
new file mode 100644
index 0000000..56b5550
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote03-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="endnote">.e.n.d.n.o.t.e.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote03-input.html b/Editor/tests/position/isValidCursorPosition-endnote03-input.html
new file mode 100644
index 0000000..f4b15ab
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote03-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p><span class="endnote">endnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote04-expected.html b/Editor/tests/position/isValidCursorPosition-endnote04-expected.html
new file mode 100644
index 0000000..f2e6bfa
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote04-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="endnote">.e.n.d.n.o.t.e.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote04-input.html b/Editor/tests/position/isValidCursorPosition-endnote04-input.html
new file mode 100644
index 0000000..74a8606
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote04-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p><span class="endnote">endnote</span></p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote05-expected.html b/Editor/tests/position/isValidCursorPosition-endnote05-expected.html
new file mode 100644
index 0000000..735a24f
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote05-expected.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="endnote">.f.i.r.s.t.</span>
+ .
+ <span class="endnote">.s.e.c.o.n.d.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote05-input.html b/Editor/tests/position/isValidCursorPosition-endnote05-input.html
new file mode 100644
index 0000000..91277c9
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote05-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote">first</span><span class="endnote">second</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote06-expected.html b/Editor/tests/position/isValidCursorPosition-endnote06-expected.html
new file mode 100644
index 0000000..4b5fd0b
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote06-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="endnote">.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote06-input.html b/Editor/tests/position/isValidCursorPosition-endnote06-input.html
new file mode 100644
index 0000000..ed8e9fd
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote06-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote"></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote07-expected.html b/Editor/tests/position/isValidCursorPosition-endnote07-expected.html
new file mode 100644
index 0000000..abff27c
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote07-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="endnote">.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote07-input.html b/Editor/tests/position/isValidCursorPosition-endnote07-input.html
new file mode 100644
index 0000000..e10ba4b
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote07-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote"></span></p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote08-expected.html b/Editor/tests/position/isValidCursorPosition-endnote08-expected.html
new file mode 100644
index 0000000..bbccfb6
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote08-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="endnote">.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote08-input.html b/Editor/tests/position/isValidCursorPosition-endnote08-input.html
new file mode 100644
index 0000000..0691bb8
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote08-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p><span class="endnote"></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote09-expected.html b/Editor/tests/position/isValidCursorPosition-endnote09-expected.html
new file mode 100644
index 0000000..80c2f50
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote09-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="endnote">.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote09-input.html b/Editor/tests/position/isValidCursorPosition-endnote09-input.html
new file mode 100644
index 0000000..6d4d4e0
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote09-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p><span class="endnote"></span></p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote10-expected.html b/Editor/tests/position/isValidCursorPosition-endnote10-expected.html
new file mode 100644
index 0000000..70cab9a
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote10-expected.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="endnote">.</span>
+ .
+ <span class="endnote">.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-endnote10-input.html b/Editor/tests/position/isValidCursorPosition-endnote10-input.html
new file mode 100644
index 0000000..4f1a5c0
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-endnote10-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="endnote"></span><span class="endnote"></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote01-expected.html b/Editor/tests/position/isValidCursorPosition-footnote01-expected.html
new file mode 100644
index 0000000..30baef0
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote01-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="footnote">.f.o.o.t.n.o.t.e.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote01-input.html b/Editor/tests/position/isValidCursorPosition-footnote01-input.html
new file mode 100644
index 0000000..19f828f
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote01-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">footnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote02-expected.html b/Editor/tests/position/isValidCursorPosition-footnote02-expected.html
new file mode 100644
index 0000000..6c640e4
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote02-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="footnote">.f.o.o.t.n.o.t.e.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote02-input.html b/Editor/tests/position/isValidCursorPosition-footnote02-input.html
new file mode 100644
index 0000000..33071e2
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote02-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">footnote</span></p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote03-expected.html b/Editor/tests/position/isValidCursorPosition-footnote03-expected.html
new file mode 100644
index 0000000..ffa20d6
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote03-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="footnote">.f.o.o.t.n.o.t.e.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote03-input.html b/Editor/tests/position/isValidCursorPosition-footnote03-input.html
new file mode 100644
index 0000000..8f7f354
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote03-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p><span class="footnote">footnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote04-expected.html b/Editor/tests/position/isValidCursorPosition-footnote04-expected.html
new file mode 100644
index 0000000..df77fa9
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote04-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="footnote">.f.o.o.t.n.o.t.e.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote04-input.html b/Editor/tests/position/isValidCursorPosition-footnote04-input.html
new file mode 100644
index 0000000..4f84bb3
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote04-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p><span class="footnote">footnote</span></p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote05-expected.html b/Editor/tests/position/isValidCursorPosition-footnote05-expected.html
new file mode 100644
index 0000000..3c42ff3
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote05-expected.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="footnote">.f.i.r.s.t.</span>
+ .
+ <span class="footnote">.s.e.c.o.n.d.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote05-input.html b/Editor/tests/position/isValidCursorPosition-footnote05-input.html
new file mode 100644
index 0000000..6a41ff8
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote05-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">first</span><span class="footnote">second</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote06-expected.html b/Editor/tests/position/isValidCursorPosition-footnote06-expected.html
new file mode 100644
index 0000000..c7f7280
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote06-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="footnote">.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote06-input.html b/Editor/tests/position/isValidCursorPosition-footnote06-input.html
new file mode 100644
index 0000000..c73faa2
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote06-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote"></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote07-expected.html b/Editor/tests/position/isValidCursorPosition-footnote07-expected.html
new file mode 100644
index 0000000..610bd41
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote07-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="footnote">.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote07-input.html b/Editor/tests/position/isValidCursorPosition-footnote07-input.html
new file mode 100644
index 0000000..50f5b25
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote07-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote"></span></p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote08-expected.html b/Editor/tests/position/isValidCursorPosition-footnote08-expected.html
new file mode 100644
index 0000000..a257091
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote08-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="footnote">.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote08-input.html b/Editor/tests/position/isValidCursorPosition-footnote08-input.html
new file mode 100644
index 0000000..4e808bc
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote08-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p><span class="footnote"></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote09-expected.html b/Editor/tests/position/isValidCursorPosition-footnote09-expected.html
new file mode 100644
index 0000000..cc1183f
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote09-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="footnote">.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote09-input.html b/Editor/tests/position/isValidCursorPosition-footnote09-input.html
new file mode 100644
index 0000000..3790129
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote09-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p><span class="footnote"></span></p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote10-expected.html b/Editor/tests/position/isValidCursorPosition-footnote10-expected.html
new file mode 100644
index 0000000..b192062
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote10-expected.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="footnote">.</span>
+ .
+ <span class="footnote">.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote10-input.html b/Editor/tests/position/isValidCursorPosition-footnote10-input.html
new file mode 100644
index 0000000..bcf3749
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote10-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote"></span><span class="footnote"></span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote11-expected.html b/Editor/tests/position/isValidCursorPosition-footnote11-expected.html
new file mode 100644
index 0000000..6c640e4
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote11-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="footnote">.f.o.o.t.n.o.t.e.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote11-input.html b/Editor/tests/position/isValidCursorPosition-footnote11-input.html
new file mode 100644
index 0000000..5421f92
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote11-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">footnote</span> </p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote12-expected.html b/Editor/tests/position/isValidCursorPosition-footnote12-expected.html
new file mode 100644
index 0000000..6c640e4
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote12-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .b.e.f.o.r.e.
+ <span class="footnote">.f.o.o.t.n.o.t.e.</span>
+ .
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote12-input.html b/Editor/tests/position/isValidCursorPosition-footnote12-input.html
new file mode 100644
index 0000000..a06bb2a
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote12-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p>before<span class="footnote">footnote</span> </p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote13-expected.html b/Editor/tests/position/isValidCursorPosition-footnote13-expected.html
new file mode 100644
index 0000000..ffa20d6
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote13-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="footnote">.f.o.o.t.n.o.t.e.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote13-input.html b/Editor/tests/position/isValidCursorPosition-footnote13-input.html
new file mode 100644
index 0000000..14f51ba
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote13-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p> <span class="footnote">footnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote14-expected.html b/Editor/tests/position/isValidCursorPosition-footnote14-expected.html
new file mode 100644
index 0000000..ffa20d6
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote14-expected.html
@@ -0,0 +1,11 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <p>
+ .
+ <span class="footnote">.f.o.o.t.n.o.t.e.</span>
+ .a.f.t.e.r.
+ </p>
+ </body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-footnote14-input.html b/Editor/tests/position/isValidCursorPosition-footnote14-input.html
new file mode 100644
index 0000000..4335720
--- /dev/null
+++ b/Editor/tests/position/isValidCursorPosition-footnote14-input.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="validPositions.js"></script>
+<script>
+function performTest()
+{
+ showValidPositions();
+}
+</script>
+</head>
+<body>
+ <p> <span class="footnote">footnote</span>after</p>
+</body>
+</html>
diff --git a/Editor/tests/position/isValidCursorPosition-heading01a-expected.html b/Editor/tests/position/isValidCursorPosition-heading01a-expected.html
index cfa70ac..89d566b 100644
--- a/Editor/tests/position/isValidCursorPosition-heading01a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-heading01a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><h1 id="item1">.O.n.e.</h1></body>
+ <body>
+ <h1 id="item1">.O.n.e.</h1>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-heading01b-expected.html b/Editor/tests/position/isValidCursorPosition-heading01b-expected.html
index cfa70ac..89d566b 100644
--- a/Editor/tests/position/isValidCursorPosition-heading01b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-heading01b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><h1 id="item1">.O.n.e.</h1></body>
+ <body>
+ <h1 id="item1">.O.n.e.</h1>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-heading01c-expected.html b/Editor/tests/position/isValidCursorPosition-heading01c-expected.html
index cfa70ac..89d566b 100644
--- a/Editor/tests/position/isValidCursorPosition-heading01c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-heading01c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><h1 id="item1">.O.n.e.</h1></body>
+ <body>
+ <h1 id="item1">.O.n.e.</h1>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline05a-expected.html b/Editor/tests/position/isValidCursorPosition-inline05a-expected.html
index fc82311..9dcdd98 100644
--- a/Editor/tests/position/isValidCursorPosition-inline05a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline05a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.o.n.e.</b></p></body>
+ <body>
+ <p><b>.o.n.e.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline05b-expected.html b/Editor/tests/position/isValidCursorPosition-inline05b-expected.html
index fc82311..9dcdd98 100644
--- a/Editor/tests/position/isValidCursorPosition-inline05b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline05b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.o.n.e.</b></p></body>
+ <body>
+ <p><b>.o.n.e.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline05c-expected.html b/Editor/tests/position/isValidCursorPosition-inline05c-expected.html
index fc82311..9dcdd98 100644
--- a/Editor/tests/position/isValidCursorPosition-inline05c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline05c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.o.n.e.</b></p></body>
+ <body>
+ <p><b>.o.n.e.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline05d-expected.html b/Editor/tests/position/isValidCursorPosition-inline05d-expected.html
index fc82311..9dcdd98 100644
--- a/Editor/tests/position/isValidCursorPosition-inline05d-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline05d-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.o.n.e.</b></p></body>
+ <body>
+ <p><b>.o.n.e.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline05e-expected.html b/Editor/tests/position/isValidCursorPosition-inline05e-expected.html
index fc82311..9dcdd98 100644
--- a/Editor/tests/position/isValidCursorPosition-inline05e-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline05e-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.o.n.e.</b></p></body>
+ <body>
+ <p><b>.o.n.e.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline05f-expected.html b/Editor/tests/position/isValidCursorPosition-inline05f-expected.html
index fc82311..9dcdd98 100644
--- a/Editor/tests/position/isValidCursorPosition-inline05f-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline05f-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.o.n.e.</b></p></body>
+ <body>
+ <p><b>.o.n.e.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline05g-expected.html b/Editor/tests/position/isValidCursorPosition-inline05g-expected.html
index fc82311..9dcdd98 100644
--- a/Editor/tests/position/isValidCursorPosition-inline05g-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline05g-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.o.n.e.</b></p></body>
+ <body>
+ <p><b>.o.n.e.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06a-expected.html b/Editor/tests/position/isValidCursorPosition-inline06a-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06b-expected.html b/Editor/tests/position/isValidCursorPosition-inline06b-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06c-expected.html b/Editor/tests/position/isValidCursorPosition-inline06c-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06d-expected.html b/Editor/tests/position/isValidCursorPosition-inline06d-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06d-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06d-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06e-expected.html b/Editor/tests/position/isValidCursorPosition-inline06e-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06e-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06e-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06f-expected.html b/Editor/tests/position/isValidCursorPosition-inline06f-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06f-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06f-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06g-expected.html b/Editor/tests/position/isValidCursorPosition-inline06g-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06g-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06g-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06h-expected.html b/Editor/tests/position/isValidCursorPosition-inline06h-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06h-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06h-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06i-expected.html b/Editor/tests/position/isValidCursorPosition-inline06i-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06i-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06i-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06j-expected.html b/Editor/tests/position/isValidCursorPosition-inline06j-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06j-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06j-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline06k-expected.html b/Editor/tests/position/isValidCursorPosition-inline06k-expected.html
index 5ef0933..80dfe2f 100644
--- a/Editor/tests/position/isValidCursorPosition-inline06k-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline06k-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.o.n.e.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.o.n.e.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline07a-expected.html b/Editor/tests/position/isValidCursorPosition-inline07a-expected.html
index 93d9915..10a0e17 100644
--- a/Editor/tests/position/isValidCursorPosition-inline07a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline07a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.</b></p></body>
+ <body>
+ <p><b>.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline07b-expected.html b/Editor/tests/position/isValidCursorPosition-inline07b-expected.html
index 93d9915..10a0e17 100644
--- a/Editor/tests/position/isValidCursorPosition-inline07b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline07b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.</b></p></body>
+ <body>
+ <p><b>.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline07c-expected.html b/Editor/tests/position/isValidCursorPosition-inline07c-expected.html
index 93d9915..10a0e17 100644
--- a/Editor/tests/position/isValidCursorPosition-inline07c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline07c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.</b></p></body>
+ <body>
+ <p><b>.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline07d-expected.html b/Editor/tests/position/isValidCursorPosition-inline07d-expected.html
index 93d9915..10a0e17 100644
--- a/Editor/tests/position/isValidCursorPosition-inline07d-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline07d-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.</b></p></body>
+ <body>
+ <p><b>.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline07e-expected.html b/Editor/tests/position/isValidCursorPosition-inline07e-expected.html
index 93d9915..10a0e17 100644
--- a/Editor/tests/position/isValidCursorPosition-inline07e-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline07e-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.</b></p></body>
+ <body>
+ <p><b>.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline07f-expected.html b/Editor/tests/position/isValidCursorPosition-inline07f-expected.html
index 93d9915..10a0e17 100644
--- a/Editor/tests/position/isValidCursorPosition-inline07f-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline07f-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.</b></p></body>
+ <body>
+ <p><b>.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline07g-expected.html b/Editor/tests/position/isValidCursorPosition-inline07g-expected.html
index 93d9915..10a0e17 100644
--- a/Editor/tests/position/isValidCursorPosition-inline07g-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline07g-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b>.</b></p></body>
+ <body>
+ <p><b>.</b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08a-expected.html b/Editor/tests/position/isValidCursorPosition-inline08a-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08b-expected.html b/Editor/tests/position/isValidCursorPosition-inline08b-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08c-expected.html b/Editor/tests/position/isValidCursorPosition-inline08c-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08d-expected.html b/Editor/tests/position/isValidCursorPosition-inline08d-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08d-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08d-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08e-expected.html b/Editor/tests/position/isValidCursorPosition-inline08e-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08e-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08e-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08f-expected.html b/Editor/tests/position/isValidCursorPosition-inline08f-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08f-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08f-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08g-expected.html b/Editor/tests/position/isValidCursorPosition-inline08g-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08g-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08g-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08h-expected.html b/Editor/tests/position/isValidCursorPosition-inline08h-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08h-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08h-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08i-expected.html b/Editor/tests/position/isValidCursorPosition-inline08i-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08i-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08i-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08j-expected.html b/Editor/tests/position/isValidCursorPosition-inline08j-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08j-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08j-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-inline08k-expected.html b/Editor/tests/position/isValidCursorPosition-inline08k-expected.html
index 6a6ff8e..b07b5c9 100644
--- a/Editor/tests/position/isValidCursorPosition-inline08k-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-inline08k-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p><b><i><u>.</u></i></b></p></body>
+ <body>
+ <p><b><i><u>.</u></i></b></p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-list05a-expected.html b/Editor/tests/position/isValidCursorPosition-list05a-expected.html
index 21b859b..4dc8667 100644
--- a/Editor/tests/position/isValidCursorPosition-list05a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-list05a-expected.html
@@ -1,5 +1,9 @@
<html>
<head>
</head>
- <body><ul><li>.</li></ul></body>
+ <body>
+ <ul>
+ <li>.</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-list05b-expected.html b/Editor/tests/position/isValidCursorPosition-list05b-expected.html
index 21b859b..4dc8667 100644
--- a/Editor/tests/position/isValidCursorPosition-list05b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-list05b-expected.html
@@ -1,5 +1,9 @@
<html>
<head>
</head>
- <body><ul><li>.</li></ul></body>
+ <body>
+ <ul>
+ <li>.</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph01a-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph01a-expected.html
index 466a9a0..8e95516 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph01a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph01a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.o.n.e.</p></body>
+ <body>
+ <p>.o.n.e.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph01b-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph01b-expected.html
index 47d5423..f56b54e 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph01b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph01b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.o.n.e. .t.w.o.</p></body>
+ <body>
+ <p>.o.n.e. .t.w.o.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph01c-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph01c-expected.html
index bf4c30d..ad4bb6b 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph01c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph01c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.o.n.e. .t.w.o.</p></body>
+ <body>
+ <p>.o.n.e. .t.w.o.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph01d-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph01d-expected.html
index 47d5423..f56b54e 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph01d-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph01d-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.o.n.e. .t.w.o.</p></body>
+ <body>
+ <p>.o.n.e. .t.w.o.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph01e-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph01e-expected.html
index bf4c30d..ad4bb6b 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph01e-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph01e-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.o.n.e. .t.w.o.</p></body>
+ <body>
+ <p>.o.n.e. .t.w.o.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph03a-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph03a-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph03a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph03a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph03b-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph03b-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph03b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph03b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph03c-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph03c-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph03c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph03c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph03d-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph03d-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph03d-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph03d-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph04a-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph04a-expected.html
index 466a9a0..8e95516 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph04a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph04a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.o.n.e.</p></body>
+ <body>
+ <p>.o.n.e.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph04b-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph04b-expected.html
index 466a9a0..8e95516 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph04b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph04b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.o.n.e.</p></body>
+ <body>
+ <p>.o.n.e.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph04c-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph04c-expected.html
index 466a9a0..8e95516 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph04c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph04c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.o.n.e.</p></body>
+ <body>
+ <p>.o.n.e.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph08a-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph08a-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph08a-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph08a-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph08b-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph08b-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph08b-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph08b-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph08c-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph08c-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph08c-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph08c-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph08d-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph08d-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph08d-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph08d-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph08e-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph08e-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph08e-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph08e-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph08f-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph08f-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph08f-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph08f-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/isValidCursorPosition-paragraph08g-expected.html b/Editor/tests/position/isValidCursorPosition-paragraph08g-expected.html
index 8e173c5..8c272e1 100644
--- a/Editor/tests/position/isValidCursorPosition-paragraph08g-expected.html
+++ b/Editor/tests/position/isValidCursorPosition-paragraph08g-expected.html
@@ -1,5 +1,7 @@
<html>
<head>
</head>
- <body><p>.</p></body>
+ <body>
+ <p>.</p>
+ </body>
</html>
diff --git a/Editor/tests/position/validPositions.js b/Editor/tests/position/validPositions.js
index 4334774..e158d3f 100644
--- a/Editor/tests/position/validPositions.js
+++ b/Editor/tests/position/validPositions.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function oldInsertCharacter(character)
{
diff --git a/Editor/tests/range/cloneContents-list05-expected.html b/Editor/tests/range/cloneContents-list05-expected.html
index 2a213b1..a5cb641 100644
--- a/Editor/tests/range/cloneContents-list05-expected.html
+++ b/Editor/tests/range/cloneContents-list05-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><ul><li>Two</li></ul></body>
+ <body>
+ <ul>
+ <li>Two</li>
+ </ul>
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents01-expected.html b/Editor/tests/range/cloneContents01-expected.html
index 7c6a501..32ad03f 100644
--- a/Editor/tests/range/cloneContents01-expected.html
+++ b/Editor/tests/range/cloneContents01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>Here is some text</body>
+ <body>
+ Here is some text
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents02-expected.html b/Editor/tests/range/cloneContents02-expected.html
index c74d525..c6d3e67 100644
--- a/Editor/tests/range/cloneContents02-expected.html
+++ b/Editor/tests/range/cloneContents02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>is some</body>
+ <body>
+ is some
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents03-expected.html b/Editor/tests/range/cloneContents03-expected.html
index 51f76c6..5c06a00 100644
--- a/Editor/tests/range/cloneContents03-expected.html
+++ b/Editor/tests/range/cloneContents03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>Here is</body>
+ <body>
+ Here is
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents04-expected.html b/Editor/tests/range/cloneContents04-expected.html
index edc19b6..a4aabd7 100644
--- a/Editor/tests/range/cloneContents04-expected.html
+++ b/Editor/tests/range/cloneContents04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>some text</body>
+ <body>
+ some text
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents05-expected.html b/Editor/tests/range/cloneContents05-expected.html
index 7c6a501..32ad03f 100644
--- a/Editor/tests/range/cloneContents05-expected.html
+++ b/Editor/tests/range/cloneContents05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>Here is some text</body>
+ <body>
+ Here is some text
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents06-expected.html b/Editor/tests/range/cloneContents06-expected.html
index c74d525..c6d3e67 100644
--- a/Editor/tests/range/cloneContents06-expected.html
+++ b/Editor/tests/range/cloneContents06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>is some</body>
+ <body>
+ is some
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents07-expected.html b/Editor/tests/range/cloneContents07-expected.html
index 51f76c6..5c06a00 100644
--- a/Editor/tests/range/cloneContents07-expected.html
+++ b/Editor/tests/range/cloneContents07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>Here is</body>
+ <body>
+ Here is
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents08-expected.html b/Editor/tests/range/cloneContents08-expected.html
index edc19b6..a4aabd7 100644
--- a/Editor/tests/range/cloneContents08-expected.html
+++ b/Editor/tests/range/cloneContents08-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>some text</body>
+ <body>
+ some text
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents09-expected.html b/Editor/tests/range/cloneContents09-expected.html
index b450bf9..c359720 100644
--- a/Editor/tests/range/cloneContents09-expected.html
+++ b/Editor/tests/range/cloneContents09-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Here is some text</p></body>
+ <body>
+ <p>Here is some text</p>
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents10-expected.html b/Editor/tests/range/cloneContents10-expected.html
index e06d683..315c6b3 100644
--- a/Editor/tests/range/cloneContents10-expected.html
+++ b/Editor/tests/range/cloneContents10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Here is</p></body>
+ <body>
+ <p>Here is</p>
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents11-expected.html b/Editor/tests/range/cloneContents11-expected.html
index 6cfb2d7..9e13ca6 100644
--- a/Editor/tests/range/cloneContents11-expected.html
+++ b/Editor/tests/range/cloneContents11-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>some text</p></body>
+ <body>
+ <p>some text</p>
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents12-expected.html b/Editor/tests/range/cloneContents12-expected.html
index 954f35b..7ba5c9b 100644
--- a/Editor/tests/range/cloneContents12-expected.html
+++ b/Editor/tests/range/cloneContents12-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><b><i><u>is some</u></i></b></body>
+ <body>
+ <b><i><u>is some</u></i></b>
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents13-expected.html b/Editor/tests/range/cloneContents13-expected.html
index 954f35b..7ba5c9b 100644
--- a/Editor/tests/range/cloneContents13-expected.html
+++ b/Editor/tests/range/cloneContents13-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><b><i><u>is some</u></i></b></body>
+ <body>
+ <b><i><u>is some</u></i></b>
+ </body>
</html>
diff --git a/Editor/tests/range/cloneContents14-expected.html b/Editor/tests/range/cloneContents14-expected.html
index 954f35b..7ba5c9b 100644
--- a/Editor/tests/range/cloneContents14-expected.html
+++ b/Editor/tests/range/cloneContents14-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><b><i><u>is some</u></i></b></body>
+ <body>
+ <b><i><u>is some</u></i></b>
+ </body>
</html>
diff --git a/Editor/tests/scan/ScanTests.js b/Editor/tests/scan/ScanTests.js
index e039a14..15fb875 100644
--- a/Editor/tests/scan/ScanTests.js
+++ b/Editor/tests/scan/ScanTests.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function testNext()
{
diff --git a/Editor/tests/selection/PositionTests.js b/Editor/tests/selection/PositionTests.js
index 7367f9a..5b7810e 100644
--- a/Editor/tests/selection/PositionTests.js
+++ b/Editor/tests/selection/PositionTests.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function pad(str,length)
{
diff --git a/Editor/tests/selection/delete03-expected.html b/Editor/tests/selection/delete03-expected.html
index 6ad2497..7bc65e9 100644
--- a/Editor/tests/selection/delete03-expected.html
+++ b/Editor/tests/selection/delete03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>one two three[]four five six</p></body>
+ <body>
+ <p>one two three[]four five six</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/delete04-expected.html b/Editor/tests/selection/delete04-expected.html
index 6ad2497..7bc65e9 100644
--- a/Editor/tests/selection/delete04-expected.html
+++ b/Editor/tests/selection/delete04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>one two three[]four five six</p></body>
+ <body>
+ <p>one two three[]four five six</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/delete05-expected.html b/Editor/tests/selection/delete05-expected.html
index 23d8405..54b89fd 100644
--- a/Editor/tests/selection/delete05-expected.html
+++ b/Editor/tests/selection/delete05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>one two [] five six</p></body>
+ <body>
+ <p>one two [] five six</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-list03-expected.html b/Editor/tests/selection/deleteContents-list03-expected.html
index 92a6973..0730d3f 100644
--- a/Editor/tests/selection/deleteContents-list03-expected.html
+++ b/Editor/tests/selection/deleteContents-list03-expected.html
@@ -6,7 +6,9 @@
<li>Two</li>
<li>Three</li>
</ol>
- <ol><li>Fo[]x</li></ol>
+ <ol>
+ <li>Fo[]x</li>
+ </ol>
<ol>
<li>Seven</li>
<li>Eight</li>
diff --git a/Editor/tests/selection/deleteContents-list09-expected.html b/Editor/tests/selection/deleteContents-list09-expected.html
index cb347d2..a7364e1 100644
--- a/Editor/tests/selection/deleteContents-list09-expected.html
+++ b/Editor/tests/selection/deleteContents-list09-expected.html
@@ -6,7 +6,8 @@
<li>Two</li>
<li>Three</li>
</ol>
- <ol></ol>
+ <ol>
+ </ol>
<ol>
<li>Seven</li>
<li>Eight</li>
diff --git a/Editor/tests/selection/deleteContents-list18-expected.html b/Editor/tests/selection/deleteContents-list18-expected.html
index 053e5fe..0629fea 100644
--- a/Editor/tests/selection/deleteContents-list18-expected.html
+++ b/Editor/tests/selection/deleteContents-list18-expected.html
@@ -2,6 +2,8 @@
<head></head>
<body>
<p>Co[]wo</p>
- <ol><li>Three</li></ol>
+ <ol>
+ <li>Three</li>
+ </ol>
</body>
</html>
diff --git a/Editor/tests/selection/deleteContents-paragraph-span02-expected.html b/Editor/tests/selection/deleteContents-paragraph-span02-expected.html
index 79b1ff2..cf54cc3 100644
--- a/Editor/tests/selection/deleteContents-paragraph-span02-expected.html
+++ b/Editor/tests/selection/deleteContents-paragraph-span02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p id="x2"><span id="y2">[]Two</span></p></body>
+ <body>
+ <p id="x2"><span id="y2">[]Two</span></p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-paragraph-span03-expected.html b/Editor/tests/selection/deleteContents-paragraph-span03-expected.html
index e704a19..f2546ae 100644
--- a/Editor/tests/selection/deleteContents-paragraph-span03-expected.html
+++ b/Editor/tests/selection/deleteContents-paragraph-span03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p id="x1"><span id="y1">One[]</span></p></body>
+ <body>
+ <p id="x1"><span id="y1">One[]</span></p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-paragraph02-expected.html b/Editor/tests/selection/deleteContents-paragraph02-expected.html
index 93aed95..1914faa 100644
--- a/Editor/tests/selection/deleteContents-paragraph02-expected.html
+++ b/Editor/tests/selection/deleteContents-paragraph02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p id="x2">[]Two</p></body>
+ <body>
+ <p id="x2">[]Two</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-paragraph03-expected.html b/Editor/tests/selection/deleteContents-paragraph03-expected.html
index 0cbf638..1985c41 100644
--- a/Editor/tests/selection/deleteContents-paragraph03-expected.html
+++ b/Editor/tests/selection/deleteContents-paragraph03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p id="x1">One[]</p></body>
+ <body>
+ <p id="x1">One[]</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-table06-expected.html b/Editor/tests/selection/deleteContents-table06-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/selection/deleteContents-table06-expected.html
+++ b/Editor/tests/selection/deleteContents-table06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-table07-expected.html b/Editor/tests/selection/deleteContents-table07-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/selection/deleteContents-table07-expected.html
+++ b/Editor/tests/selection/deleteContents-table07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-table10-expected.html b/Editor/tests/selection/deleteContents-table10-expected.html
index 3031e70..a15e867 100644
--- a/Editor/tests/selection/deleteContents-table10-expected.html
+++ b/Editor/tests/selection/deleteContents-table10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Content 2</p></body>
+ <body>
+ <p>Content 2</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-table11-expected.html b/Editor/tests/selection/deleteContents-table11-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/selection/deleteContents-table11-expected.html
+++ b/Editor/tests/selection/deleteContents-table11-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-table13-expected.html b/Editor/tests/selection/deleteContents-table13-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/selection/deleteContents-table13-expected.html
+++ b/Editor/tests/selection/deleteContents-table13-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents-table15-expected.html b/Editor/tests/selection/deleteContents-table15-expected.html
index db75e86..4ce7ad1 100644
--- a/Editor/tests/selection/deleteContents-table15-expected.html
+++ b/Editor/tests/selection/deleteContents-table15-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>C[]t 4</p></body>
+ <body>
+ <p>C[]t 4</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents01-expected.html b/Editor/tests/selection/deleteContents01-expected.html
index ad79c2e..4724015 100644
--- a/Editor/tests/selection/deleteContents01-expected.html
+++ b/Editor/tests/selection/deleteContents01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sa[]t</p></body>
+ <body>
+ <p>Sa[]t</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents02-expected.html b/Editor/tests/selection/deleteContents02-expected.html
index 91d0366..023378f 100644
--- a/Editor/tests/selection/deleteContents02-expected.html
+++ b/Editor/tests/selection/deleteContents02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>Sa[]</p></body>
+ <body>
+ <p>Sa[]</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents03-expected.html b/Editor/tests/selection/deleteContents03-expected.html
index 9c16a44..a293fd8 100644
--- a/Editor/tests/selection/deleteContents03-expected.html
+++ b/Editor/tests/selection/deleteContents03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[]xt</p></body>
+ <body>
+ <p>[]xt</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents05-expected.html b/Editor/tests/selection/deleteContents05-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/selection/deleteContents05-expected.html
+++ b/Editor/tests/selection/deleteContents05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents09-expected.html b/Editor/tests/selection/deleteContents09-expected.html
index e3a4d99..c6b79d1 100644
--- a/Editor/tests/selection/deleteContents09-expected.html
+++ b/Editor/tests/selection/deleteContents09-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body>[]</body>
+ <body>
+ []
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents10-expected.html b/Editor/tests/selection/deleteContents10-expected.html
index 2f0ef70..72e0a69 100644
--- a/Editor/tests/selection/deleteContents10-expected.html
+++ b/Editor/tests/selection/deleteContents10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>First []two</p></body>
+ <body>
+ <p>First []two</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents11-expected.html b/Editor/tests/selection/deleteContents11-expected.html
index f539041..7979222 100644
--- a/Editor/tests/selection/deleteContents11-expected.html
+++ b/Editor/tests/selection/deleteContents11-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p>First []two</p></div></body>
+ <body>
+ <div>
+ <p>First []two</p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents12-expected.html b/Editor/tests/selection/deleteContents12-expected.html
index f539041..7979222 100644
--- a/Editor/tests/selection/deleteContents12-expected.html
+++ b/Editor/tests/selection/deleteContents12-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p>First []two</p></div></body>
+ <body>
+ <div>
+ <p>First []two</p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents13-expected.html b/Editor/tests/selection/deleteContents13-expected.html
index 16bde1f..509b325 100644
--- a/Editor/tests/selection/deleteContents13-expected.html
+++ b/Editor/tests/selection/deleteContents13-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><h1>First []two</h1></body>
+ <body>
+ <h1>First []two</h1>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents14-expected.html b/Editor/tests/selection/deleteContents14-expected.html
index 375e4e1..330b717 100644
--- a/Editor/tests/selection/deleteContents14-expected.html
+++ b/Editor/tests/selection/deleteContents14-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><h1>First []two</h1></div></body>
+ <body>
+ <div>
+ <h1>First []two</h1>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents15-expected.html b/Editor/tests/selection/deleteContents15-expected.html
index 375e4e1..330b717 100644
--- a/Editor/tests/selection/deleteContents15-expected.html
+++ b/Editor/tests/selection/deleteContents15-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><h1>First []two</h1></div></body>
+ <body>
+ <div>
+ <h1>First []two</h1>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents16-expected.html b/Editor/tests/selection/deleteContents16-expected.html
index bade143..c13e48b 100644
--- a/Editor/tests/selection/deleteContents16-expected.html
+++ b/Editor/tests/selection/deleteContents16-expected.html
@@ -5,5 +5,7 @@
.two { color: red }
</style>
</head>
- <body><p class="one">First []two</p></body>
+ <body>
+ <p class="one">First []two</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents17-expected.html b/Editor/tests/selection/deleteContents17-expected.html
index 012f1fd..62a51de 100644
--- a/Editor/tests/selection/deleteContents17-expected.html
+++ b/Editor/tests/selection/deleteContents17-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p style="color: blue">First []two</p></body>
+ <body>
+ <p style="color: blue">First []two</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents18-expected.html b/Editor/tests/selection/deleteContents18-expected.html
index 2f0ef70..72e0a69 100644
--- a/Editor/tests/selection/deleteContents18-expected.html
+++ b/Editor/tests/selection/deleteContents18-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>First []two</p></body>
+ <body>
+ <p>First []two</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents18a-expected.html b/Editor/tests/selection/deleteContents18a-expected.html
index 2f0ef70..72e0a69 100644
--- a/Editor/tests/selection/deleteContents18a-expected.html
+++ b/Editor/tests/selection/deleteContents18a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>First []two</p></body>
+ <body>
+ <p>First []two</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents18b-expected.html b/Editor/tests/selection/deleteContents18b-expected.html
index 2f0ef70..72e0a69 100644
--- a/Editor/tests/selection/deleteContents18b-expected.html
+++ b/Editor/tests/selection/deleteContents18b-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>First []two</p></body>
+ <body>
+ <p>First []two</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents19-expected.html b/Editor/tests/selection/deleteContents19-expected.html
index ea56e63..d516e02 100644
--- a/Editor/tests/selection/deleteContents19-expected.html
+++ b/Editor/tests/selection/deleteContents19-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>First []two</b></p></body>
+ <body>
+ <p><b>First []two</b></p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents19a-expected.html b/Editor/tests/selection/deleteContents19a-expected.html
index ea56e63..d516e02 100644
--- a/Editor/tests/selection/deleteContents19a-expected.html
+++ b/Editor/tests/selection/deleteContents19a-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>First []two</b></p></body>
+ <body>
+ <p><b>First []two</b></p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents19b-expected.html b/Editor/tests/selection/deleteContents19b-expected.html
index ea56e63..d516e02 100644
--- a/Editor/tests/selection/deleteContents19b-expected.html
+++ b/Editor/tests/selection/deleteContents19b-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p><b>First []two</b></p></body>
+ <body>
+ <p><b>First []two</b></p>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents20-expected.html b/Editor/tests/selection/deleteContents20-expected.html
index f539041..7979222 100644
--- a/Editor/tests/selection/deleteContents20-expected.html
+++ b/Editor/tests/selection/deleteContents20-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p>First []two</p></div></body>
+ <body>
+ <div>
+ <p>First []two</p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents20a-expected.html b/Editor/tests/selection/deleteContents20a-expected.html
index f539041..7979222 100644
--- a/Editor/tests/selection/deleteContents20a-expected.html
+++ b/Editor/tests/selection/deleteContents20a-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p>First []two</p></div></body>
+ <body>
+ <div>
+ <p>First []two</p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/selection/deleteContents20b-expected.html b/Editor/tests/selection/deleteContents20b-expected.html
index f539041..7979222 100644
--- a/Editor/tests/selection/deleteContents20b-expected.html
+++ b/Editor/tests/selection/deleteContents20b-expected.html
@@ -1,4 +1,8 @@
<html>
<head></head>
- <body><div><p>First []two</p></div></body>
+ <body>
+ <div>
+ <p>First []two</p>
+ </div>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor01-expected.html b/Editor/tests/selection/selectWordAtCursor01-expected.html
index f212d4c..06f792e 100644
--- a/Editor/tests/selection/selectWordAtCursor01-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor01-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[One] two three</p></body>
+ <body>
+ <p>[One] two three</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor02-expected.html b/Editor/tests/selection/selectWordAtCursor02-expected.html
index f212d4c..06f792e 100644
--- a/Editor/tests/selection/selectWordAtCursor02-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor02-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[One] two three</p></body>
+ <body>
+ <p>[One] two three</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor03-expected.html b/Editor/tests/selection/selectWordAtCursor03-expected.html
index f212d4c..06f792e 100644
--- a/Editor/tests/selection/selectWordAtCursor03-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor03-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[One] two three</p></body>
+ <body>
+ <p>[One] two three</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor04-expected.html b/Editor/tests/selection/selectWordAtCursor04-expected.html
index 081a382..1e30363 100644
--- a/Editor/tests/selection/selectWordAtCursor04-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor04-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One [two] three</p></body>
+ <body>
+ <p>One [two] three</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor05-expected.html b/Editor/tests/selection/selectWordAtCursor05-expected.html
index 081a382..1e30363 100644
--- a/Editor/tests/selection/selectWordAtCursor05-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor05-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One [two] three</p></body>
+ <body>
+ <p>One [two] three</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor06-expected.html b/Editor/tests/selection/selectWordAtCursor06-expected.html
index 081a382..1e30363 100644
--- a/Editor/tests/selection/selectWordAtCursor06-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor06-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One [two] three</p></body>
+ <body>
+ <p>One [two] three</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor07-expected.html b/Editor/tests/selection/selectWordAtCursor07-expected.html
index ac4f980..c787408 100644
--- a/Editor/tests/selection/selectWordAtCursor07-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor07-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One two [three]</p></body>
+ <body>
+ <p>One two [three]</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor08-expected.html b/Editor/tests/selection/selectWordAtCursor08-expected.html
index ac4f980..c787408 100644
--- a/Editor/tests/selection/selectWordAtCursor08-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor08-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One two [three]</p></body>
+ <body>
+ <p>One two [three]</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor09-expected.html b/Editor/tests/selection/selectWordAtCursor09-expected.html
index ac4f980..c787408 100644
--- a/Editor/tests/selection/selectWordAtCursor09-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor09-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One two [three]</p></body>
+ <body>
+ <p>One two [three]</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor10-expected.html b/Editor/tests/selection/selectWordAtCursor10-expected.html
index ccec3ac..59a0505 100644
--- a/Editor/tests/selection/selectWordAtCursor10-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor10-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One [two $*]*!&% three four</p></body>
+ <body>
+ <p>One [two $*]*!&% three four</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor11-expected.html b/Editor/tests/selection/selectWordAtCursor11-expected.html
index c000dd9..06697fa 100644
--- a/Editor/tests/selection/selectWordAtCursor11-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor11-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One two $**![&% three] four</p></body>
+ <body>
+ <p>One two $**![&% three] four</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor12-expected.html b/Editor/tests/selection/selectWordAtCursor12-expected.html
index d5b0d6e..f2426fa 100644
--- a/Editor/tests/selection/selectWordAtCursor12-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor12-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One [two &%]&% three</p></body>
+ <body>
+ <p>One [two &%]&% three</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor13-expected.html b/Editor/tests/selection/selectWordAtCursor13-expected.html
index 76f9d35..3aaf4b6 100644
--- a/Editor/tests/selection/selectWordAtCursor13-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor13-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>[&%!.One] two three</p></body>
+ <body>
+ <p>[&%!.One] two three</p>
+ </body>
</html>
diff --git a/Editor/tests/selection/selectWordAtCursor14-expected.html b/Editor/tests/selection/selectWordAtCursor14-expected.html
index cbad2fb..640492c 100644
--- a/Editor/tests/selection/selectWordAtCursor14-expected.html
+++ b/Editor/tests/selection/selectWordAtCursor14-expected.html
@@ -1,4 +1,6 @@
<html>
<head></head>
- <body><p>One two [three&%!.]</p></body>
+ <body>
+ <p>One two [three&%!.]</p>
+ </body>
</html>
diff --git a/Editor/tests/server.js b/Editor/tests/server.js
index 8946717..0e46945 100644
--- a/Editor/tests/server.js
+++ b/Editor/tests/server.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function debug(str)
{
diff --git a/Editor/tests/tables/TableTests.js b/Editor/tests/tables/TableTests.js
index 5aab601..a8859e5 100644
--- a/Editor/tests/tables/TableTests.js
+++ b/Editor/tests/tables/TableTests.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function showSelectedTableRegion()
{
diff --git a/Editor/tests/tables/addAdjacentColumn09-expected.html b/Editor/tests/tables/addAdjacentColumn09-expected.html
index 682c5c4..53c7d1f 100644
--- a/Editor/tests/tables/addAdjacentColumn09-expected.html
+++ b/Editor/tests/tables/addAdjacentColumn09-expected.html
@@ -28,7 +28,9 @@
<td>Nine</td>
<td colspan="4">Ten</td>
</tr>
- <tr><td colspan="5">Thirteen</td></tr>
+ <tr>
+ <td colspan="5">Thirteen</td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/addAdjacentColumn10-expected.html b/Editor/tests/tables/addAdjacentColumn10-expected.html
index c0e34ba..fa52b83 100644
--- a/Editor/tests/tables/addAdjacentColumn10-expected.html
+++ b/Editor/tests/tables/addAdjacentColumn10-expected.html
@@ -29,7 +29,9 @@
<td>Nine</td>
<td colspan="4">Ten</td>
</tr>
- <tr><td colspan="5">Thirteen</td></tr>
+ <tr>
+ <td colspan="5">Thirteen</td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/addAdjacentColumn11-expected.html b/Editor/tests/tables/addAdjacentColumn11-expected.html
index 3726a2f..b7b4bbe 100644
--- a/Editor/tests/tables/addAdjacentColumn11-expected.html
+++ b/Editor/tests/tables/addAdjacentColumn11-expected.html
@@ -30,7 +30,9 @@
<td><p><br/></p></td>
<td colspan="3">Ten</td>
</tr>
- <tr><td colspan="5">Thirteen</td></tr>
+ <tr>
+ <td colspan="5">Thirteen</td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/addAdjacentColumn19-expected.html b/Editor/tests/tables/addAdjacentColumn19-expected.html
new file mode 100644
index 0000000..e0db777
--- /dev/null
+++ b/Editor/tests/tables/addAdjacentColumn19-expected.html
@@ -0,0 +1,47 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ []
+ <table id="item1" style="width: 100%">
+ <colgroup>
+ <col width="20%"/>
+ <col width="20%"/>
+ <col width="20%"/>
+ <col width="20%"/>
+ <col width="20%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ <td>One</td>
+ <td>Two</td>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ <tr>
+ <td><p><br/></p></td>
+ <td>Five</td>
+ <td>Six</td>
+ <td>Seven</td>
+ <td>Eight</td>
+ </tr>
+ <tr>
+ <td><p><br/></p></td>
+ <td>Nine</td>
+ <td>Ten</td>
+ <td>Eleven</td>
+ <td>Twelve</td>
+ </tr>
+ <tr>
+ <td><p><br/></p></td>
+ <td>Thirteen</td>
+ <td>Fourteen</td>
+ <td>Fifteen</td>
+ <td>Sixteen</td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
+</html>
diff --git a/Editor/tests/tables/addAdjacentColumn19-input.html b/Editor/tests/tables/addAdjacentColumn19-input.html
new file mode 100644
index 0000000..c322356
--- /dev/null
+++ b/Editor/tests/tables/addAdjacentColumn19-input.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Outline_init();
+ PostponedActions_perform();
+
+ Tables_addAdjacentColumn();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ []<table style="width: 100%">
+ <col width="25%">
+ <col width="25%">
+ <col width="25%">
+ <col width="25%">
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ <tr>
+ <td>Five</td>
+ <td>Six</td>
+ <td>Seven</td>
+ <td>Eight</td>
+ </tr>
+ <tr>
+ <td>Nine</td>
+ <td>Ten</td>
+ <td>Eleven</td>
+ <td>Twelve</td>
+ </tr>
+ <tr>
+ <td>Thirteen</td>
+ <td>Fourteen</td>
+ <td>Fifteen</td>
+ <td>Sixteen</td>
+ </tr>
+ </table>
+</body>
+</html>
diff --git a/Editor/tests/tables/addAdjacentColumn20-expected.html b/Editor/tests/tables/addAdjacentColumn20-expected.html
new file mode 100644
index 0000000..53a204e
--- /dev/null
+++ b/Editor/tests/tables/addAdjacentColumn20-expected.html
@@ -0,0 +1,47 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <table id="item1" style="width: 100%">
+ <colgroup>
+ <col width="20%"/>
+ <col width="20%"/>
+ <col width="20%"/>
+ <col width="20%"/>
+ <col width="20%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ <td>Three</td>
+ <td>Four</td>
+ <td><p><br/></p></td>
+ </tr>
+ <tr>
+ <td>Five</td>
+ <td>Six</td>
+ <td>Seven</td>
+ <td>Eight</td>
+ <td><p><br/></p></td>
+ </tr>
+ <tr>
+ <td>Nine</td>
+ <td>Ten</td>
+ <td>Eleven</td>
+ <td>Twelve</td>
+ <td><p><br/></p></td>
+ </tr>
+ <tr>
+ <td>Thirteen</td>
+ <td>Fourteen</td>
+ <td>Fifteen</td>
+ <td>Sixteen</td>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
+ </table>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/tables/addAdjacentColumn20-input.html b/Editor/tests/tables/addAdjacentColumn20-input.html
new file mode 100644
index 0000000..4e38d64
--- /dev/null
+++ b/Editor/tests/tables/addAdjacentColumn20-input.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Outline_init();
+ PostponedActions_perform();
+
+ Tables_addAdjacentColumn();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <table style="width: 100%">
+ <col width="25%">
+ <col width="25%">
+ <col width="25%">
+ <col width="25%">
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ <tr>
+ <td>Five</td>
+ <td>Six</td>
+ <td>Seven</td>
+ <td>Eight</td>
+ </tr>
+ <tr>
+ <td>Nine</td>
+ <td>Ten</td>
+ <td>Eleven</td>
+ <td>Twelve</td>
+ </tr>
+ <tr>
+ <td>Thirteen</td>
+ <td>Fourteen</td>
+ <td>Fifteen</td>
+ <td>Sixteen</td>
+ </tr>
+ </table>[]
+</body>
+</html>
diff --git a/Editor/tests/tables/addAdjacentRow08-expected.html b/Editor/tests/tables/addAdjacentRow08-expected.html
index f40384f..8797a86 100644
--- a/Editor/tests/tables/addAdjacentRow08-expected.html
+++ b/Editor/tests/tables/addAdjacentRow08-expected.html
@@ -20,7 +20,9 @@
<td>Nine</td>
<td rowspan="2">Ten</td>
</tr>
- <tr><td>Thirteen]</td></tr>
+ <tr>
+ <td>Thirteen]</td>
+ </tr>
<tr>
<td><p><br/></p></td>
<td><p><br/></p></td>
diff --git a/Editor/tests/tables/addAdjacentRow09-expected.html b/Editor/tests/tables/addAdjacentRow09-expected.html
index c886b41..6e56678 100644
--- a/Editor/tests/tables/addAdjacentRow09-expected.html
+++ b/Editor/tests/tables/addAdjacentRow09-expected.html
@@ -20,8 +20,12 @@
<td>Nine]</td>
<td rowspan="3">Ten</td>
</tr>
- <tr><td><p><br/></p></td></tr>
- <tr><td>Thirteen</td></tr>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ <tr>
+ <td>Thirteen</td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/addAdjacentRow10-expected.html b/Editor/tests/tables/addAdjacentRow10-expected.html
index b4d72da..eea0889 100644
--- a/Editor/tests/tables/addAdjacentRow10-expected.html
+++ b/Editor/tests/tables/addAdjacentRow10-expected.html
@@ -24,7 +24,9 @@
<td>Nine</td>
<td rowspan="2">Ten</td>
</tr>
- <tr><td>Thirteen</td></tr>
+ <tr>
+ <td>Thirteen</td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/addAdjacentRow11-expected.html b/Editor/tests/tables/addAdjacentRow11-expected.html
index f87f09e..30d4d73 100644
--- a/Editor/tests/tables/addAdjacentRow11-expected.html
+++ b/Editor/tests/tables/addAdjacentRow11-expected.html
@@ -25,7 +25,9 @@
<td>Nine</td>
<td rowspan="2">Ten</td>
</tr>
- <tr><td>Thirteen</td></tr>
+ <tr>
+ <td>Thirteen</td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/addAdjacentRow19-expected.html b/Editor/tests/tables/addAdjacentRow19-expected.html
new file mode 100644
index 0000000..c67b18f
--- /dev/null
+++ b/Editor/tests/tables/addAdjacentRow19-expected.html
@@ -0,0 +1,42 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ []
+ <table id="item1" style="width: 100%">
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ <td><p><br/></p></td>
+ <td><p><br/></p></td>
+ <td><p><br/></p></td>
+ </tr>
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ <tr>
+ <td>Five</td>
+ <td>Six</td>
+ <td>Seven</td>
+ <td>Eight</td>
+ </tr>
+ <tr>
+ <td>Nine</td>
+ <td>Ten</td>
+ <td>Eleven</td>
+ <td>Twelve</td>
+ </tr>
+ <tr>
+ <td>Thirteen</td>
+ <td>Fourteen</td>
+ <td>Fifteen</td>
+ <td>Sixteen</td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
+</html>
diff --git a/Editor/tests/tables/addAdjacentRow19-input.html b/Editor/tests/tables/addAdjacentRow19-input.html
new file mode 100644
index 0000000..f87369a
--- /dev/null
+++ b/Editor/tests/tables/addAdjacentRow19-input.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Outline_init();
+ PostponedActions_perform();
+
+ Tables_addAdjacentRow();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ []<table style="width: 100%">
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ <tr>
+ <td>Five</td>
+ <td>Six</td>
+ <td>Seven</td>
+ <td>Eight</td>
+ </tr>
+ <tr>
+ <td>Nine</td>
+ <td>Ten</td>
+ <td>Eleven</td>
+ <td>Twelve</td>
+ </tr>
+ <tr>
+ <td>Thirteen</td>
+ <td>Fourteen</td>
+ <td>Fifteen</td>
+ <td>Sixteen</td>
+ </tr>
+ </table>
+</body>
+</html>
diff --git a/Editor/tests/tables/addAdjacentRow20-expected.html b/Editor/tests/tables/addAdjacentRow20-expected.html
new file mode 100644
index 0000000..2fb326a
--- /dev/null
+++ b/Editor/tests/tables/addAdjacentRow20-expected.html
@@ -0,0 +1,42 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <table id="item1" style="width: 100%">
+ <tbody>
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ <tr>
+ <td>Five</td>
+ <td>Six</td>
+ <td>Seven</td>
+ <td>Eight</td>
+ </tr>
+ <tr>
+ <td>Nine</td>
+ <td>Ten</td>
+ <td>Eleven</td>
+ <td>Twelve</td>
+ </tr>
+ <tr>
+ <td>Thirteen</td>
+ <td>Fourteen</td>
+ <td>Fifteen</td>
+ <td>Sixteen</td>
+ </tr>
+ <tr>
+ <td><p><br/></p></td>
+ <td><p><br/></p></td>
+ <td><p><br/></p></td>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
+ </table>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/tables/addAdjacentRow20-input.html b/Editor/tests/tables/addAdjacentRow20-input.html
new file mode 100644
index 0000000..83921d1
--- /dev/null
+++ b/Editor/tests/tables/addAdjacentRow20-input.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link href="../generic.css" rel="stylesheet"/>
+<script>
+function performTest()
+{
+ Outline_init();
+ PostponedActions_perform();
+
+ Tables_addAdjacentRow();
+ showSelection();
+}
+</script>
+</head>
+<body>
+ <table style="width: 100%">
+ <tr>
+ <td>One</td>
+ <td>Two</td>
+ <td>Three</td>
+ <td>Four</td>
+ </tr>
+ <tr>
+ <td>Five</td>
+ <td>Six</td>
+ <td>Seven</td>
+ <td>Eight</td>
+ </tr>
+ <tr>
+ <td>Nine</td>
+ <td>Ten</td>
+ <td>Eleven</td>
+ <td>Twelve</td>
+ </tr>
+ <tr>
+ <td>Thirteen</td>
+ <td>Fourteen</td>
+ <td>Fifteen</td>
+ <td>Sixteen</td>
+ </tr>
+ </table>[]
+</body>
+</html>
diff --git a/Editor/tests/tables/deleteOneColumn07-expected.html b/Editor/tests/tables/deleteOneColumn07-expected.html
deleted file mode 100644
index e828269..0000000
--- a/Editor/tests/tables/deleteOneColumn07-expected.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<html>
- <head>
- <link href="../generic.css" rel="stylesheet"/>
- </head>
- <body>
- <table style="width: 100%">
- <colgroup><col width="100%"/></colgroup>
- <tbody>
- <tr><td><p>0,0</p></td></tr>
- <tr><td><p>[1,0</p></td></tr>
- <tr><td><p>2,0]</p></td></tr>
- <tr><td><p>3,0</p></td></tr>
- </tbody>
- </table>
- </body>
-</html>
diff --git a/Editor/tests/tables/fixTable02-expected.html b/Editor/tests/tables/fixTable02-expected.html
index 22ba80b..a14d9fb 100644
--- a/Editor/tests/tables/fixTable02-expected.html
+++ b/Editor/tests/tables/fixTable02-expected.html
@@ -4,7 +4,9 @@
<body>
<table border="1" width="100%">
<tbody>
- <tr><td colspan="2">A</td></tr>
+ <tr>
+ <td colspan="2">A</td>
+ </tr>
<tr>
<td>B</td>
<td>C</td>
diff --git a/Editor/tests/tables/fixTable03-expected.html b/Editor/tests/tables/fixTable03-expected.html
index 3742346..1fda674 100644
--- a/Editor/tests/tables/fixTable03-expected.html
+++ b/Editor/tests/tables/fixTable03-expected.html
@@ -4,7 +4,9 @@
<body>
<table border="1" width="100%">
<tbody>
- <tr><td colspan="3">A</td></tr>
+ <tr>
+ <td colspan="3">A</td>
+ </tr>
<tr>
<td>B</td>
<td>C</td>
diff --git a/Editor/tests/tables/fixTable05-expected.html b/Editor/tests/tables/fixTable05-expected.html
index 0b41c14..df344b3 100644
--- a/Editor/tests/tables/fixTable05-expected.html
+++ b/Editor/tests/tables/fixTable05-expected.html
@@ -8,7 +8,9 @@
<td>A</td>
<td>B</td>
</tr>
- <tr><td colspan="2">C</td></tr>
+ <tr>
+ <td colspan="2">C</td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/fixTable06-expected.html b/Editor/tests/tables/fixTable06-expected.html
index 82030aa..826350f 100644
--- a/Editor/tests/tables/fixTable06-expected.html
+++ b/Editor/tests/tables/fixTable06-expected.html
@@ -9,7 +9,9 @@
<td>B</td>
<td><p><br/></p></td>
</tr>
- <tr><td colspan="3">C</td></tr>
+ <tr>
+ <td colspan="3">C</td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/fixTable10-expected.html b/Editor/tests/tables/fixTable10-expected.html
index 321886f..982d54a 100644
--- a/Editor/tests/tables/fixTable10-expected.html
+++ b/Editor/tests/tables/fixTable10-expected.html
@@ -9,7 +9,9 @@
<td rowspan="2">B</td>
<td>C</td>
</tr>
- <tr><td><p><br/></p></td></tr>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/fixTable12-expected.html b/Editor/tests/tables/fixTable12-expected.html
index e9b8e66..d093ef1 100644
--- a/Editor/tests/tables/fixTable12-expected.html
+++ b/Editor/tests/tables/fixTable12-expected.html
@@ -8,7 +8,8 @@
<td rowspan="3">A</td>
<td rowspan="3">B</td>
</tr>
- <tr></tr>
+ <tr>
+ </tr>
<tr/>
</tbody>
</table>
diff --git a/Editor/tests/tables/fixTable13-expected.html b/Editor/tests/tables/fixTable13-expected.html
index 20546c1..fe8ddfd 100644
--- a/Editor/tests/tables/fixTable13-expected.html
+++ b/Editor/tests/tables/fixTable13-expected.html
@@ -9,7 +9,9 @@
<td rowspan="2">B</td>
<td>C</td>
</tr>
- <tr><td><p><br/></p></td></tr>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/fixTable14-expected.html b/Editor/tests/tables/fixTable14-expected.html
index 9fe286d..24775ec 100644
--- a/Editor/tests/tables/fixTable14-expected.html
+++ b/Editor/tests/tables/fixTable14-expected.html
@@ -9,8 +9,12 @@
<td rowspan="3">B</td>
<td>C</td>
</tr>
- <tr><td><p><br/></p></td></tr>
- <tr><td><p><br/></p></td></tr>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/fixTable15-expected.html b/Editor/tests/tables/fixTable15-expected.html
index 08b5351..0fa26c0 100644
--- a/Editor/tests/tables/fixTable15-expected.html
+++ b/Editor/tests/tables/fixTable15-expected.html
@@ -9,8 +9,12 @@
<td rowspan="3">B</td>
<td>C</td>
</tr>
- <tr><td>D</td></tr>
- <tr><td><p><br/></p></td></tr>
+ <tr>
+ <td>D</td>
+ </tr>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/insertTable06-expected.html b/Editor/tests/tables/insertTable06-expected.html
index f2729c7..0e03215 100644
--- a/Editor/tests/tables/insertTable06-expected.html
+++ b/Editor/tests/tables/insertTable06-expected.html
@@ -7,7 +7,11 @@
<table id="item1" style="width: 100%">
<caption/>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
</html>
diff --git a/Editor/tests/tables/insertTable07-expected.html b/Editor/tests/tables/insertTable07-expected.html
index 54161c9..72baaa4 100644
--- a/Editor/tests/tables/insertTable07-expected.html
+++ b/Editor/tests/tables/insertTable07-expected.html
@@ -8,8 +8,12 @@
<caption/>
<col width="100%"/>
<tbody>
- <tr><td><p><br/></p></td></tr>
- <tr><td><p><br/></p></td></tr>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/deleteOneColumn01inside-expected.html b/Editor/tests/tables/removeAdjacentColumn01inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn01inside-expected.html
rename to Editor/tests/tables/removeAdjacentColumn01inside-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn01inside-input.html b/Editor/tests/tables/removeAdjacentColumn01inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn01inside-input.html
rename to Editor/tests/tables/removeAdjacentColumn01inside-input.html
index f58d1c1..a381aaf 100644
--- a/Editor/tests/tables/deleteOneColumn01inside-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn01inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn01right-expected.html b/Editor/tests/tables/removeAdjacentColumn01right-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn01right-expected.html
rename to Editor/tests/tables/removeAdjacentColumn01right-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn01right-input.html b/Editor/tests/tables/removeAdjacentColumn01right-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn01right-input.html
rename to Editor/tests/tables/removeAdjacentColumn01right-input.html
index 7d3bbd8..3b31e14 100644
--- a/Editor/tests/tables/deleteOneColumn01right-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn01right-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn02inside-expected.html b/Editor/tests/tables/removeAdjacentColumn02inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn02inside-expected.html
rename to Editor/tests/tables/removeAdjacentColumn02inside-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn02inside-input.html b/Editor/tests/tables/removeAdjacentColumn02inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn02inside-input.html
rename to Editor/tests/tables/removeAdjacentColumn02inside-input.html
index fb076dc..c528ba5 100644
--- a/Editor/tests/tables/deleteOneColumn02inside-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn02inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn02left-expected.html b/Editor/tests/tables/removeAdjacentColumn02left-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn02left-expected.html
rename to Editor/tests/tables/removeAdjacentColumn02left-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn02left-input.html b/Editor/tests/tables/removeAdjacentColumn02left-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn02left-input.html
rename to Editor/tests/tables/removeAdjacentColumn02left-input.html
index 42add40..8c0c646 100644
--- a/Editor/tests/tables/deleteOneColumn02left-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn02left-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn02right-expected.html b/Editor/tests/tables/removeAdjacentColumn02right-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn02right-expected.html
rename to Editor/tests/tables/removeAdjacentColumn02right-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn02right-input.html b/Editor/tests/tables/removeAdjacentColumn02right-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn02right-input.html
rename to Editor/tests/tables/removeAdjacentColumn02right-input.html
index 031e055..2ca8351 100644
--- a/Editor/tests/tables/deleteOneColumn02right-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn02right-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn03inside-expected.html b/Editor/tests/tables/removeAdjacentColumn03inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn03inside-expected.html
rename to Editor/tests/tables/removeAdjacentColumn03inside-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn03inside-input.html b/Editor/tests/tables/removeAdjacentColumn03inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn03inside-input.html
rename to Editor/tests/tables/removeAdjacentColumn03inside-input.html
index 63ada30..1504e64 100644
--- a/Editor/tests/tables/deleteOneColumn03inside-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn03inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn03left-expected.html b/Editor/tests/tables/removeAdjacentColumn03left-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn03left-expected.html
rename to Editor/tests/tables/removeAdjacentColumn03left-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn03left-input.html b/Editor/tests/tables/removeAdjacentColumn03left-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn03left-input.html
rename to Editor/tests/tables/removeAdjacentColumn03left-input.html
index d97286e..989affe 100644
--- a/Editor/tests/tables/deleteOneColumn03left-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn03left-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn04inside-expected.html b/Editor/tests/tables/removeAdjacentColumn04inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn04inside-expected.html
rename to Editor/tests/tables/removeAdjacentColumn04inside-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn04inside-input.html b/Editor/tests/tables/removeAdjacentColumn04inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn04inside-input.html
rename to Editor/tests/tables/removeAdjacentColumn04inside-input.html
index ffb79da..67424e4 100644
--- a/Editor/tests/tables/deleteOneColumn04inside-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn04inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn04right-expected.html b/Editor/tests/tables/removeAdjacentColumn04right-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn04right-expected.html
rename to Editor/tests/tables/removeAdjacentColumn04right-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn04right-input.html b/Editor/tests/tables/removeAdjacentColumn04right-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn04right-input.html
rename to Editor/tests/tables/removeAdjacentColumn04right-input.html
index cf1d950..5359736 100644
--- a/Editor/tests/tables/deleteOneColumn04right-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn04right-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn05inside-expected.html b/Editor/tests/tables/removeAdjacentColumn05inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn05inside-expected.html
rename to Editor/tests/tables/removeAdjacentColumn05inside-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn05inside-input.html b/Editor/tests/tables/removeAdjacentColumn05inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn05inside-input.html
rename to Editor/tests/tables/removeAdjacentColumn05inside-input.html
index 5a9cb92..830ea14 100644
--- a/Editor/tests/tables/deleteOneColumn05inside-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn05inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn05left-expected.html b/Editor/tests/tables/removeAdjacentColumn05left-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn05left-expected.html
rename to Editor/tests/tables/removeAdjacentColumn05left-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn05left-input.html b/Editor/tests/tables/removeAdjacentColumn05left-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn05left-input.html
rename to Editor/tests/tables/removeAdjacentColumn05left-input.html
index ed54558..23b2240 100644
--- a/Editor/tests/tables/deleteOneColumn05left-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn05left-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn05right-expected.html b/Editor/tests/tables/removeAdjacentColumn05right-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn05right-expected.html
rename to Editor/tests/tables/removeAdjacentColumn05right-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn05right-input.html b/Editor/tests/tables/removeAdjacentColumn05right-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn05right-input.html
rename to Editor/tests/tables/removeAdjacentColumn05right-input.html
index 0e561ed..b54f0f9 100644
--- a/Editor/tests/tables/deleteOneColumn05right-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn05right-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn06inside-expected.html b/Editor/tests/tables/removeAdjacentColumn06inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn06inside-expected.html
rename to Editor/tests/tables/removeAdjacentColumn06inside-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn06inside-input.html b/Editor/tests/tables/removeAdjacentColumn06inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn06inside-input.html
rename to Editor/tests/tables/removeAdjacentColumn06inside-input.html
index 54e25fb..9068a9d 100644
--- a/Editor/tests/tables/deleteOneColumn06inside-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn06inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneColumn06left-expected.html b/Editor/tests/tables/removeAdjacentColumn06left-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneColumn06left-expected.html
rename to Editor/tests/tables/removeAdjacentColumn06left-expected.html
diff --git a/Editor/tests/tables/deleteOneColumn06left-input.html b/Editor/tests/tables/removeAdjacentColumn06left-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneColumn06left-input.html
rename to Editor/tests/tables/removeAdjacentColumn06left-input.html
index 776422c..689b078 100644
--- a/Editor/tests/tables/deleteOneColumn06left-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn06left-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/removeAdjacentColumn07-expected.html b/Editor/tests/tables/removeAdjacentColumn07-expected.html
new file mode 100644
index 0000000..059c3c3
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentColumn07-expected.html
@@ -0,0 +1,26 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <table style="width: 100%">
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>0,0</p></td>
+ </tr>
+ <tr>
+ <td><p>[1,0</p></td>
+ </tr>
+ <tr>
+ <td><p>2,0]</p></td>
+ </tr>
+ <tr>
+ <td><p>3,0</p></td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneColumn07-input.html b/Editor/tests/tables/removeAdjacentColumn07-input.html
similarity index 92%
rename from Editor/tests/tables/deleteOneColumn07-input.html
rename to Editor/tests/tables/removeAdjacentColumn07-input.html
index 7413665..dadd8a6 100644
--- a/Editor/tests/tables/deleteOneColumn07-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn07-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/removeAdjacentColumn08-expected.html b/Editor/tests/tables/removeAdjacentColumn08-expected.html
new file mode 100644
index 0000000..2810099
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentColumn08-expected.html
@@ -0,0 +1,42 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ []
+ <table style="width: 100%">
+ <colgroup>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>0,1</p></td>
+ <td><p>0,2</p></td>
+ <td><p>0,3</p></td>
+ <td><p>0,4</p></td>
+ </tr>
+ <tr>
+ <td><p>1,1</p></td>
+ <td><p>1,2</p></td>
+ <td><p>1,3</p></td>
+ <td><p>1,4</p></td>
+ </tr>
+ <tr>
+ <td><p>2,1</p></td>
+ <td><p>2,2</p></td>
+ <td><p>2,3</p></td>
+ <td><p>2,4</p></td>
+ </tr>
+ <tr>
+ <td><p>3,1</p></td>
+ <td><p>3,2</p></td>
+ <td><p>3,3</p></td>
+ <td><p>3,4</p></td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneColumn04inside-input.html b/Editor/tests/tables/removeAdjacentColumn08-input.html
similarity index 87%
copy from Editor/tests/tables/deleteOneColumn04inside-input.html
copy to Editor/tests/tables/removeAdjacentColumn08-input.html
index ffb79da..df864bf 100644
--- a/Editor/tests/tables/deleteOneColumn04inside-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn08-input.html
@@ -5,13 +5,13 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
</head>
<body>
- <table style="width: 100%">
+ []<table style="width: 100%">
<col width="20%">
<col width="20%">
<col width="20%">
@@ -25,7 +25,7 @@
<td><p>0,4</p></td>
</tr>
<tr>
- <td><p>[1,0</p></td>
+ <td><p>1,0</p></td>
<td><p>1,1</p></td>
<td><p>1,2</p></td>
<td><p>1,3</p></td>
@@ -33,7 +33,7 @@
</tr>
<tr>
<td><p>2,0</p></td>
- <td><p>2,1]</p></td>
+ <td><p>2,1</p></td>
<td><p>2,2</p></td>
<td><p>2,3</p></td>
<td><p>2,4</p></td>
diff --git a/Editor/tests/tables/removeAdjacentColumn09-expected.html b/Editor/tests/tables/removeAdjacentColumn09-expected.html
new file mode 100644
index 0000000..087bce4
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentColumn09-expected.html
@@ -0,0 +1,42 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <table style="width: 100%">
+ <colgroup>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>0,0</p></td>
+ <td><p>0,1</p></td>
+ <td><p>0,2</p></td>
+ <td><p>0,3</p></td>
+ </tr>
+ <tr>
+ <td><p>1,0</p></td>
+ <td><p>1,1</p></td>
+ <td><p>1,2</p></td>
+ <td><p>1,3</p></td>
+ </tr>
+ <tr>
+ <td><p>2,0</p></td>
+ <td><p>2,1</p></td>
+ <td><p>2,2</p></td>
+ <td><p>2,3</p></td>
+ </tr>
+ <tr>
+ <td><p>3,0</p></td>
+ <td><p>3,1</p></td>
+ <td><p>3,2</p></td>
+ <td><p>3,3</p></td>
+ </tr>
+ </tbody>
+ </table>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneColumn04inside-input.html b/Editor/tests/tables/removeAdjacentColumn09-input.html
similarity index 89%
copy from Editor/tests/tables/deleteOneColumn04inside-input.html
copy to Editor/tests/tables/removeAdjacentColumn09-input.html
index ffb79da..f877401 100644
--- a/Editor/tests/tables/deleteOneColumn04inside-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn09-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
@@ -25,7 +25,7 @@
<td><p>0,4</p></td>
</tr>
<tr>
- <td><p>[1,0</p></td>
+ <td><p>1,0</p></td>
<td><p>1,1</p></td>
<td><p>1,2</p></td>
<td><p>1,3</p></td>
@@ -33,7 +33,7 @@
</tr>
<tr>
<td><p>2,0</p></td>
- <td><p>2,1]</p></td>
+ <td><p>2,1</p></td>
<td><p>2,2</p></td>
<td><p>2,3</p></td>
<td><p>2,4</p></td>
@@ -45,6 +45,6 @@
<td><p>3,3</p></td>
<td><p>3,4</p></td>
</tr>
- </table>
+ </table>[]
</body>
</html>
diff --git a/Editor/tests/tables/removeAdjacentColumn10-expected.html b/Editor/tests/tables/removeAdjacentColumn10-expected.html
new file mode 100644
index 0000000..fa8d9dd
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentColumn10-expected.html
@@ -0,0 +1,27 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ []
+ <table style="width: 100%">
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>0,0</p></td>
+ </tr>
+ <tr>
+ <td><p>1,0</p></td>
+ </tr>
+ <tr>
+ <td><p>2,0</p></td>
+ </tr>
+ <tr>
+ <td><p>3,0</p></td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneColumn07-input.html b/Editor/tests/tables/removeAdjacentColumn10-input.html
similarity index 73%
copy from Editor/tests/tables/deleteOneColumn07-input.html
copy to Editor/tests/tables/removeAdjacentColumn10-input.html
index 7413665..011384e 100644
--- a/Editor/tests/tables/deleteOneColumn07-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn10-input.html
@@ -5,22 +5,22 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+// Tables_removeAdjacentColumn();
showSelection();
}
</script>
</head>
<body>
- <table style="width: 100%">
+ []<table style="width: 100%">
<col width="100%">
<tr>
<td><p>0,0</p></td>
</tr>
<tr>
- <td><p>[1,0</p></td>
+ <td><p>1,0</p></td>
</tr>
<tr>
- <td><p>2,0]</p></td>
+ <td><p>2,0</p></td>
</tr>
<tr>
<td><p>3,0</p></td>
diff --git a/Editor/tests/tables/removeAdjacentColumn11-expected.html b/Editor/tests/tables/removeAdjacentColumn11-expected.html
new file mode 100644
index 0000000..e694a4e
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentColumn11-expected.html
@@ -0,0 +1,27 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <table style="width: 100%">
+ <colgroup>
+ <col width="100%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>0,0</p></td>
+ </tr>
+ <tr>
+ <td><p>1,0</p></td>
+ </tr>
+ <tr>
+ <td><p>2,0</p></td>
+ </tr>
+ <tr>
+ <td><p>3,0</p></td>
+ </tr>
+ </tbody>
+ </table>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneColumn07-input.html b/Editor/tests/tables/removeAdjacentColumn11-input.html
similarity index 77%
copy from Editor/tests/tables/deleteOneColumn07-input.html
copy to Editor/tests/tables/removeAdjacentColumn11-input.html
index 7413665..3061811 100644
--- a/Editor/tests/tables/deleteOneColumn07-input.html
+++ b/Editor/tests/tables/removeAdjacentColumn11-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneColumn();
+ Tables_removeAdjacentColumn();
showSelection();
}
</script>
@@ -17,14 +17,14 @@
<td><p>0,0</p></td>
</tr>
<tr>
- <td><p>[1,0</p></td>
+ <td><p>1,0</p></td>
</tr>
<tr>
- <td><p>2,0]</p></td>
+ <td><p>2,0</p></td>
</tr>
<tr>
<td><p>3,0</p></td>
</tr>
- </table>
+ </table>[]
</body>
</html>
diff --git a/Editor/tests/tables/deleteOneRow01below-expected.html b/Editor/tests/tables/removeAdjacentRow01below-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow01below-expected.html
rename to Editor/tests/tables/removeAdjacentRow01below-expected.html
diff --git a/Editor/tests/tables/deleteOneRow01below-input.html b/Editor/tests/tables/removeAdjacentRow01below-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow01below-input.html
rename to Editor/tests/tables/removeAdjacentRow01below-input.html
index 47fa205..a2813dc 100644
--- a/Editor/tests/tables/deleteOneRow01below-input.html
+++ b/Editor/tests/tables/removeAdjacentRow01below-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow01inside-expected.html b/Editor/tests/tables/removeAdjacentRow01inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow01inside-expected.html
rename to Editor/tests/tables/removeAdjacentRow01inside-expected.html
diff --git a/Editor/tests/tables/deleteOneRow01inside-input.html b/Editor/tests/tables/removeAdjacentRow01inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow01inside-input.html
rename to Editor/tests/tables/removeAdjacentRow01inside-input.html
index c5c8663..b57af94 100644
--- a/Editor/tests/tables/deleteOneRow01inside-input.html
+++ b/Editor/tests/tables/removeAdjacentRow01inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow02above-expected.html b/Editor/tests/tables/removeAdjacentRow02above-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow02above-expected.html
rename to Editor/tests/tables/removeAdjacentRow02above-expected.html
diff --git a/Editor/tests/tables/deleteOneRow02above-input.html b/Editor/tests/tables/removeAdjacentRow02above-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow02above-input.html
rename to Editor/tests/tables/removeAdjacentRow02above-input.html
index d9ea4d6..0fb49bb 100644
--- a/Editor/tests/tables/deleteOneRow02above-input.html
+++ b/Editor/tests/tables/removeAdjacentRow02above-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow02below-expected.html b/Editor/tests/tables/removeAdjacentRow02below-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow02below-expected.html
rename to Editor/tests/tables/removeAdjacentRow02below-expected.html
diff --git a/Editor/tests/tables/deleteOneRow02below-input.html b/Editor/tests/tables/removeAdjacentRow02below-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow02below-input.html
rename to Editor/tests/tables/removeAdjacentRow02below-input.html
index f44b583..1db0c1d 100644
--- a/Editor/tests/tables/deleteOneRow02below-input.html
+++ b/Editor/tests/tables/removeAdjacentRow02below-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow02inside-expected.html b/Editor/tests/tables/removeAdjacentRow02inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow02inside-expected.html
rename to Editor/tests/tables/removeAdjacentRow02inside-expected.html
diff --git a/Editor/tests/tables/deleteOneRow02inside-input.html b/Editor/tests/tables/removeAdjacentRow02inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow02inside-input.html
rename to Editor/tests/tables/removeAdjacentRow02inside-input.html
index d88d8b8..40cce6d 100644
--- a/Editor/tests/tables/deleteOneRow02inside-input.html
+++ b/Editor/tests/tables/removeAdjacentRow02inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow03above-expected.html b/Editor/tests/tables/removeAdjacentRow03above-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow03above-expected.html
rename to Editor/tests/tables/removeAdjacentRow03above-expected.html
diff --git a/Editor/tests/tables/deleteOneRow03above-input.html b/Editor/tests/tables/removeAdjacentRow03above-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow03above-input.html
rename to Editor/tests/tables/removeAdjacentRow03above-input.html
index ad40dad..12f68ce 100644
--- a/Editor/tests/tables/deleteOneRow03above-input.html
+++ b/Editor/tests/tables/removeAdjacentRow03above-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow03inside-expected.html b/Editor/tests/tables/removeAdjacentRow03inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow03inside-expected.html
rename to Editor/tests/tables/removeAdjacentRow03inside-expected.html
diff --git a/Editor/tests/tables/deleteOneRow03inside-input.html b/Editor/tests/tables/removeAdjacentRow03inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow03inside-input.html
rename to Editor/tests/tables/removeAdjacentRow03inside-input.html
index 0407d3c..dc8d190 100644
--- a/Editor/tests/tables/deleteOneRow03inside-input.html
+++ b/Editor/tests/tables/removeAdjacentRow03inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow04below-expected.html b/Editor/tests/tables/removeAdjacentRow04below-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow04below-expected.html
rename to Editor/tests/tables/removeAdjacentRow04below-expected.html
diff --git a/Editor/tests/tables/deleteOneRow04below-input.html b/Editor/tests/tables/removeAdjacentRow04below-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow04below-input.html
rename to Editor/tests/tables/removeAdjacentRow04below-input.html
index 5a3da46..042f77a 100644
--- a/Editor/tests/tables/deleteOneRow04below-input.html
+++ b/Editor/tests/tables/removeAdjacentRow04below-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow04inside-expected.html b/Editor/tests/tables/removeAdjacentRow04inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow04inside-expected.html
rename to Editor/tests/tables/removeAdjacentRow04inside-expected.html
diff --git a/Editor/tests/tables/deleteOneRow04inside-input.html b/Editor/tests/tables/removeAdjacentRow04inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow04inside-input.html
rename to Editor/tests/tables/removeAdjacentRow04inside-input.html
index e8b6a05..2635da4 100644
--- a/Editor/tests/tables/deleteOneRow04inside-input.html
+++ b/Editor/tests/tables/removeAdjacentRow04inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow05above-expected.html b/Editor/tests/tables/removeAdjacentRow05above-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow05above-expected.html
rename to Editor/tests/tables/removeAdjacentRow05above-expected.html
diff --git a/Editor/tests/tables/deleteOneRow05above-input.html b/Editor/tests/tables/removeAdjacentRow05above-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow05above-input.html
rename to Editor/tests/tables/removeAdjacentRow05above-input.html
index 1001311..d17d0fe 100644
--- a/Editor/tests/tables/deleteOneRow05above-input.html
+++ b/Editor/tests/tables/removeAdjacentRow05above-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow05below-expected.html b/Editor/tests/tables/removeAdjacentRow05below-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow05below-expected.html
rename to Editor/tests/tables/removeAdjacentRow05below-expected.html
diff --git a/Editor/tests/tables/deleteOneRow05below-input.html b/Editor/tests/tables/removeAdjacentRow05below-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow05below-input.html
rename to Editor/tests/tables/removeAdjacentRow05below-input.html
index a152f4f..0576bb3 100644
--- a/Editor/tests/tables/deleteOneRow05below-input.html
+++ b/Editor/tests/tables/removeAdjacentRow05below-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow05inside-expected.html b/Editor/tests/tables/removeAdjacentRow05inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow05inside-expected.html
rename to Editor/tests/tables/removeAdjacentRow05inside-expected.html
diff --git a/Editor/tests/tables/deleteOneRow05inside-input.html b/Editor/tests/tables/removeAdjacentRow05inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow05inside-input.html
rename to Editor/tests/tables/removeAdjacentRow05inside-input.html
index ff66abd..0cc0dee 100644
--- a/Editor/tests/tables/deleteOneRow05inside-input.html
+++ b/Editor/tests/tables/removeAdjacentRow05inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow06above-expected.html b/Editor/tests/tables/removeAdjacentRow06above-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow06above-expected.html
rename to Editor/tests/tables/removeAdjacentRow06above-expected.html
diff --git a/Editor/tests/tables/deleteOneRow06above-input.html b/Editor/tests/tables/removeAdjacentRow06above-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow06above-input.html
rename to Editor/tests/tables/removeAdjacentRow06above-input.html
index ab594f3..e684b7b 100644
--- a/Editor/tests/tables/deleteOneRow06above-input.html
+++ b/Editor/tests/tables/removeAdjacentRow06above-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow06inside-expected.html b/Editor/tests/tables/removeAdjacentRow06inside-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow06inside-expected.html
rename to Editor/tests/tables/removeAdjacentRow06inside-expected.html
diff --git a/Editor/tests/tables/deleteOneRow06inside-input.html b/Editor/tests/tables/removeAdjacentRow06inside-input.html
similarity index 96%
rename from Editor/tests/tables/deleteOneRow06inside-input.html
rename to Editor/tests/tables/removeAdjacentRow06inside-input.html
index 7f7a31a..08ac7bc 100644
--- a/Editor/tests/tables/deleteOneRow06inside-input.html
+++ b/Editor/tests/tables/removeAdjacentRow06inside-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/deleteOneRow07-expected.html b/Editor/tests/tables/removeAdjacentRow07-expected.html
similarity index 100%
rename from Editor/tests/tables/deleteOneRow07-expected.html
rename to Editor/tests/tables/removeAdjacentRow07-expected.html
diff --git a/Editor/tests/tables/deleteOneRow07-input.html b/Editor/tests/tables/removeAdjacentRow07-input.html
similarity index 92%
rename from Editor/tests/tables/deleteOneRow07-input.html
rename to Editor/tests/tables/removeAdjacentRow07-input.html
index 20fd50c..6d81993 100644
--- a/Editor/tests/tables/deleteOneRow07-input.html
+++ b/Editor/tests/tables/removeAdjacentRow07-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
diff --git a/Editor/tests/tables/removeAdjacentRow08-expected.html b/Editor/tests/tables/removeAdjacentRow08-expected.html
new file mode 100644
index 0000000..54d8c53
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentRow08-expected.html
@@ -0,0 +1,42 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ []
+ <table style="width: 100%">
+ <colgroup>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>1,0</p></td>
+ <td><p>1,1</p></td>
+ <td><p>1,2</p></td>
+ <td><p>1,3</p></td>
+ </tr>
+ <tr>
+ <td><p>2,0</p></td>
+ <td><p>2,1</p></td>
+ <td><p>2,2</p></td>
+ <td><p>2,3</p></td>
+ </tr>
+ <tr>
+ <td><p>3,0</p></td>
+ <td><p>3,1</p></td>
+ <td><p>3,2</p></td>
+ <td><p>3,3</p></td>
+ </tr>
+ <tr>
+ <td><p>4,0</p></td>
+ <td><p>4,1</p></td>
+ <td><p>4,2</p></td>
+ <td><p>4,3</p></td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneRow02inside-input.html b/Editor/tests/tables/removeAdjacentRow08-input.html
similarity index 87%
copy from Editor/tests/tables/deleteOneRow02inside-input.html
copy to Editor/tests/tables/removeAdjacentRow08-input.html
index d88d8b8..1d35691 100644
--- a/Editor/tests/tables/deleteOneRow02inside-input.html
+++ b/Editor/tests/tables/removeAdjacentRow08-input.html
@@ -5,13 +5,13 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
</head>
<body>
- <table style="width: 100%">
+ []<table style="width: 100%">
<col width="25%">
<col width="25%">
<col width="25%">
@@ -30,8 +30,8 @@
</tr>
<tr>
<td><p>2,0</p></td>
- <td><p>[2,1</p></td>
- <td><p>2,2]</p></td>
+ <td><p>2,1</p></td>
+ <td><p>2,2</p></td>
<td><p>2,3</p></td>
</tr>
<tr>
diff --git a/Editor/tests/tables/removeAdjacentRow09-expected.html b/Editor/tests/tables/removeAdjacentRow09-expected.html
new file mode 100644
index 0000000..087bce4
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentRow09-expected.html
@@ -0,0 +1,42 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <table style="width: 100%">
+ <colgroup>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>0,0</p></td>
+ <td><p>0,1</p></td>
+ <td><p>0,2</p></td>
+ <td><p>0,3</p></td>
+ </tr>
+ <tr>
+ <td><p>1,0</p></td>
+ <td><p>1,1</p></td>
+ <td><p>1,2</p></td>
+ <td><p>1,3</p></td>
+ </tr>
+ <tr>
+ <td><p>2,0</p></td>
+ <td><p>2,1</p></td>
+ <td><p>2,2</p></td>
+ <td><p>2,3</p></td>
+ </tr>
+ <tr>
+ <td><p>3,0</p></td>
+ <td><p>3,1</p></td>
+ <td><p>3,2</p></td>
+ <td><p>3,3</p></td>
+ </tr>
+ </tbody>
+ </table>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneRow02inside-input.html b/Editor/tests/tables/removeAdjacentRow09-input.html
similarity index 89%
copy from Editor/tests/tables/deleteOneRow02inside-input.html
copy to Editor/tests/tables/removeAdjacentRow09-input.html
index d88d8b8..69f7752 100644
--- a/Editor/tests/tables/deleteOneRow02inside-input.html
+++ b/Editor/tests/tables/removeAdjacentRow09-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
@@ -30,8 +30,8 @@
</tr>
<tr>
<td><p>2,0</p></td>
- <td><p>[2,1</p></td>
- <td><p>2,2]</p></td>
+ <td><p>2,1</p></td>
+ <td><p>2,2</p></td>
<td><p>2,3</p></td>
</tr>
<tr>
@@ -46,6 +46,6 @@
<td><p>4,2</p></td>
<td><p>4,3</p></td>
</tr>
- </table>
+ </table>[]
</body>
</html>
diff --git a/Editor/tests/tables/removeAdjacentRow10-expected.html b/Editor/tests/tables/removeAdjacentRow10-expected.html
new file mode 100644
index 0000000..ac57961
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentRow10-expected.html
@@ -0,0 +1,24 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ []
+ <table style="width: 100%">
+ <colgroup>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>0,0</p></td>
+ <td><p>0,1</p></td>
+ <td><p>0,2</p></td>
+ <td><p>0,3</p></td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneRow07-input.html b/Editor/tests/tables/removeAdjacentRow10-input.html
similarity index 80%
copy from Editor/tests/tables/deleteOneRow07-input.html
copy to Editor/tests/tables/removeAdjacentRow10-input.html
index 20fd50c..1a91121 100644
--- a/Editor/tests/tables/deleteOneRow07-input.html
+++ b/Editor/tests/tables/removeAdjacentRow10-input.html
@@ -5,12 +5,13 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
</head>
<body>
+ []
<table style="width: 100%">
<col width="25%">
<col width="25%">
@@ -18,8 +19,8 @@
<col width="25%">
<tr>
<td><p>0,0</p></td>
- <td><p>[0,1</p></td>
- <td><p>0,2]</p></td>
+ <td><p>0,1</p></td>
+ <td><p>0,2</p></td>
<td><p>0,3</p></td>
</tr>
</table>
diff --git a/Editor/tests/tables/removeAdjacentRow11-expected.html b/Editor/tests/tables/removeAdjacentRow11-expected.html
new file mode 100644
index 0000000..cb021f8
--- /dev/null
+++ b/Editor/tests/tables/removeAdjacentRow11-expected.html
@@ -0,0 +1,24 @@
+<html>
+ <head>
+ <link href="../generic.css" rel="stylesheet"/>
+ </head>
+ <body>
+ <table style="width: 100%">
+ <colgroup>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ <col width="25%"/>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td><p>0,0</p></td>
+ <td><p>0,1</p></td>
+ <td><p>0,2</p></td>
+ <td><p>0,3</p></td>
+ </tr>
+ </tbody>
+ </table>
+ []
+ </body>
+</html>
diff --git a/Editor/tests/tables/deleteOneRow07-input.html b/Editor/tests/tables/removeAdjacentRow11-input.html
similarity index 80%
copy from Editor/tests/tables/deleteOneRow07-input.html
copy to Editor/tests/tables/removeAdjacentRow11-input.html
index 20fd50c..75e4f26 100644
--- a/Editor/tests/tables/deleteOneRow07-input.html
+++ b/Editor/tests/tables/removeAdjacentRow11-input.html
@@ -5,7 +5,7 @@
<script>
function performTest()
{
- Tables_deleteOneRow();
+ Tables_removeAdjacentRow();
showSelection();
}
</script>
@@ -18,10 +18,11 @@
<col width="25%">
<tr>
<td><p>0,0</p></td>
- <td><p>[0,1</p></td>
- <td><p>0,2]</p></td>
+ <td><p>0,1</p></td>
+ <td><p>0,2</p></td>
<td><p>0,3</p></td>
</tr>
</table>
+ []
</body>
</html>
diff --git a/Editor/tests/tables/split09a-expected.html b/Editor/tests/tables/split09a-expected.html
index 58c16a2..4526939 100644
--- a/Editor/tests/tables/split09a-expected.html
+++ b/Editor/tests/tables/split09a-expected.html
@@ -23,8 +23,11 @@
<td><p><br/></p></td>
<td><p><br/></p></td>
</tr>
- <tr><td colspan="4" rowspan="2">Nine</td></tr>
- <tr></tr>
+ <tr>
+ <td colspan="4" rowspan="2">Nine</td>
+ </tr>
+ <tr>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/split09b-expected.html b/Editor/tests/tables/split09b-expected.html
index a41780d..594415d 100644
--- a/Editor/tests/tables/split09b-expected.html
+++ b/Editor/tests/tables/split09b-expected.html
@@ -11,8 +11,11 @@
<col width="25%"/>
</colgroup>
<tbody>
- <tr><td colspan="4" rowspan="2">One</td></tr>
- <tr></tr>
+ <tr>
+ <td colspan="4" rowspan="2">One</td>
+ </tr>
+ <tr>
+ </tr>
<tr>
<td>[Nine]</td>
<td><p><br/></p></td>
diff --git a/Editor/tests/tables/split11a-expected.html b/Editor/tests/tables/split11a-expected.html
index d25eb28..fe05858 100644
--- a/Editor/tests/tables/split11a-expected.html
+++ b/Editor/tests/tables/split11a-expected.html
@@ -27,7 +27,8 @@
<td colspan="2" rowspan="2">Nine</td>
<td colspan="2" rowspan="2">Eleven</td>
</tr>
- <tr></tr>
+ <tr>
+ </tr>
</tbody>
</table>
</body>
diff --git a/Editor/tests/tables/split11c-expected.html b/Editor/tests/tables/split11c-expected.html
index 5516442..5318bcf 100644
--- a/Editor/tests/tables/split11c-expected.html
+++ b/Editor/tests/tables/split11c-expected.html
@@ -15,7 +15,8 @@
<td colspan="2" rowspan="2">One</td>
<td colspan="2" rowspan="2">Three</td>
</tr>
- <tr></tr>
+ <tr>
+ </tr>
<tr>
<td colspan="2" rowspan="2">Nine</td>
<td>[Eleven]</td>
diff --git a/Editor/tests/test-structure.html b/Editor/tests/test-structure.html
index fef592c..9188155 100644
--- a/Editor/tests/test-structure.html
+++ b/Editor/tests/test-structure.html
@@ -1,5 +1,22 @@
<!DOCTYPE html>
-<!-- Copyright (c) 2011-2013 UX Productivity Pty Ltd. All rights reserved. -->
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
<html>
<head>
<script type="text/javascript" src="../Outline_js"></script>
diff --git a/Editor/tests/testharness.js b/Editor/tests/testharness.js
index 775ad79..3f7f8e6 100644
--- a/Editor/tests/testharness.js
+++ b/Editor/tests/testharness.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var topArea;
var leftArea;
diff --git a/Editor/tests/testlib.js b/Editor/tests/testlib.js
index 0e20e7a..b2eb47f 100644
--- a/Editor/tests/testlib.js
+++ b/Editor/tests/testlib.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function testHarnessSetup()
{
diff --git a/Editor/tests/text/TextTests.js b/Editor/tests/text/TextTests.js
index 4fcd608..22a8305 100644
--- a/Editor/tests/text/TextTests.js
+++ b/Editor/tests/text/TextTests.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function showRuns()
{
diff --git a/Editor/tests/undo/UndoTests.js b/Editor/tests/undo/UndoTests.js
index 4118caf..6a6203c 100644
--- a/Editor/tests/undo/UndoTests.js
+++ b/Editor/tests/undo/UndoTests.js
@@ -1,16 +1,19 @@
-// Copyright 2011-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
function testUndo(versions,node)
{
diff --git a/Editor/tests/undo/insertFigure01-expected.html b/Editor/tests/undo/insertFigure01-expected.html
index 47f9a59..8c8b293 100644
--- a/Editor/tests/undo/insertFigure01-expected.html
+++ b/Editor/tests/undo/insertFigure01-expected.html
@@ -3,9 +3,12 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
- <body><figure id="item1"/></body>
+ <body>
+ <figure id="item1"/>
+ </body>
==================== Version 2 ====================
<body>
<figure id="item1"/>
diff --git a/Editor/tests/undo/insertFigure02-expected.html b/Editor/tests/undo/insertFigure02-expected.html
index 9937fc5..1e4087f 100644
--- a/Editor/tests/undo/insertFigure02-expected.html
+++ b/Editor/tests/undo/insertFigure02-expected.html
@@ -3,7 +3,8 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
<body>
<figure id="item1">
diff --git a/Editor/tests/undo/insertFigure03-expected.html b/Editor/tests/undo/insertFigure03-expected.html
index 7e3c2cd..cc2b051 100644
--- a/Editor/tests/undo/insertFigure03-expected.html
+++ b/Editor/tests/undo/insertFigure03-expected.html
@@ -3,7 +3,8 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
<body>
<figure id="item1">
diff --git a/Editor/tests/undo/insertFigure04-expected.html b/Editor/tests/undo/insertFigure04-expected.html
index d59dd34..ed5b543 100644
--- a/Editor/tests/undo/insertFigure04-expected.html
+++ b/Editor/tests/undo/insertFigure04-expected.html
@@ -3,26 +3,49 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
- <body><figure id="item1"><img src="first.png" style="width: 100%"/></figure></body>
+ <body>
+ <figure id="item1">
+ <img src="first.png" style="width: 100%"/>
+ </figure>
+ </body>
==================== Version 2 ====================
<body>
- <figure id="item1"><img src="first.png" style="width: 100%"/></figure>
- <figure id="item2"><img src="second.png" style="width: 90%"/></figure>
+ <figure id="item1">
+ <img src="first.png" style="width: 100%"/>
+ </figure>
+ <figure id="item2">
+ <img src="second.png" style="width: 90%"/>
+ </figure>
</body>
==================== Version 3 ====================
<body>
- <figure id="item1"><img src="first.png" style="width: 100%"/></figure>
- <figure id="item3"><img src="third.png" style="width: 80%"/></figure>
- <figure id="item2"><img src="second.png" style="width: 90%"/></figure>
+ <figure id="item1">
+ <img src="first.png" style="width: 100%"/>
+ </figure>
+ <figure id="item3">
+ <img src="third.png" style="width: 80%"/>
+ </figure>
+ <figure id="item2">
+ <img src="second.png" style="width: 90%"/>
+ </figure>
</body>
==================== Version 4 ====================
<body>
- <figure id="item1"><img src="first.png" style="width: 100%"/></figure>
- <figure id="item3"><img src="third.png" style="width: 80%"/></figure>
- <figure id="item2"><img src="second.png" style="width: 90%"/></figure>
- <figure id="item4"><img src="fourth.png" style="width: 70%"/></figure>
+ <figure id="item1">
+ <img src="first.png" style="width: 100%"/>
+ </figure>
+ <figure id="item3">
+ <img src="third.png" style="width: 80%"/>
+ </figure>
+ <figure id="item2">
+ <img src="second.png" style="width: 90%"/>
+ </figure>
+ <figure id="item4">
+ <img src="fourth.png" style="width: 70%"/>
+ </figure>
</body>
===================================================
First undo to version 3: OK
diff --git a/Editor/tests/undo/insertFigure05-expected.html b/Editor/tests/undo/insertFigure05-expected.html
index 6dc9c26..08c19fd 100644
--- a/Editor/tests/undo/insertFigure05-expected.html
+++ b/Editor/tests/undo/insertFigure05-expected.html
@@ -3,7 +3,8 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
<body>
<figure id="item1">
diff --git a/Editor/tests/undo/insertHeading01-expected.html b/Editor/tests/undo/insertHeading01-expected.html
index 8711722..210888c 100644
--- a/Editor/tests/undo/insertHeading01-expected.html
+++ b/Editor/tests/undo/insertHeading01-expected.html
@@ -3,9 +3,12 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
- <body><h1 class="Unnumbered" id="item1">First heading</h1></body>
+ <body>
+ <h1 class="Unnumbered" id="item1">First heading</h1>
+ </body>
==================== Version 2 ====================
<body>
<h1 class="Unnumbered" id="item1">First heading</h1>
diff --git a/Editor/tests/undo/insertHeading02-expected.html b/Editor/tests/undo/insertHeading02-expected.html
index fafe8ca..4c0151c 100644
--- a/Editor/tests/undo/insertHeading02-expected.html
+++ b/Editor/tests/undo/insertHeading02-expected.html
@@ -3,9 +3,12 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
- <body><h1 id="item1">First heading</h1></body>
+ <body>
+ <h1 id="item1">First heading</h1>
+ </body>
==================== Version 2 ====================
<body>
<h1 id="item1">First heading</h1>
diff --git a/Editor/tests/undo/insertTable01-expected.html b/Editor/tests/undo/insertTable01-expected.html
index 63b6def..94a6b6b 100644
--- a/Editor/tests/undo/insertTable01-expected.html
+++ b/Editor/tests/undo/insertTable01-expected.html
@@ -3,9 +3,12 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
- <body><table id="item1" style="width: 100%"/></body>
+ <body>
+ <table id="item1" style="width: 100%"/>
+ </body>
==================== Version 2 ====================
<body>
<table id="item1" style="width: 100%"/>
diff --git a/Editor/tests/undo/insertTable02-expected.html b/Editor/tests/undo/insertTable02-expected.html
index 758e463..dc9a81c 100644
--- a/Editor/tests/undo/insertTable02-expected.html
+++ b/Editor/tests/undo/insertTable02-expected.html
@@ -3,13 +3,18 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
<body>
<table id="item1" style="width: 100%">
<caption class="Unnumbered">First table</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
==================== Version 2 ====================
@@ -17,7 +22,11 @@
<table id="item1" style="width: 100%">
<caption class="Unnumbered">First table</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 90%">
<caption class="Unnumbered">Second table</caption>
@@ -36,7 +45,11 @@
<table id="item1" style="width: 100%">
<caption class="Unnumbered">First table</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 80%">
<caption class="Unnumbered">Third table</caption>
@@ -68,7 +81,11 @@
<table id="item1" style="width: 100%">
<caption class="Unnumbered">First table</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 80%">
<caption class="Unnumbered">Third table</caption>
diff --git a/Editor/tests/undo/insertTable03-expected.html b/Editor/tests/undo/insertTable03-expected.html
index 0380c35..0b41870 100644
--- a/Editor/tests/undo/insertTable03-expected.html
+++ b/Editor/tests/undo/insertTable03-expected.html
@@ -3,13 +3,18 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
<body>
<table id="item1" style="width: 100%">
<caption>First table</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
==================== Version 2 ====================
@@ -17,7 +22,11 @@
<table id="item1" style="width: 100%">
<caption>First table</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 90%">
<caption>Second table</caption>
@@ -36,7 +45,11 @@
<table id="item1" style="width: 100%">
<caption>First table</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 80%">
<caption>Third table</caption>
@@ -68,7 +81,11 @@
<table id="item1" style="width: 100%">
<caption>First table</caption>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 80%">
<caption>Third table</caption>
diff --git a/Editor/tests/undo/insertTable04-expected.html b/Editor/tests/undo/insertTable04-expected.html
index d65ebbf..a759e40 100644
--- a/Editor/tests/undo/insertTable04-expected.html
+++ b/Editor/tests/undo/insertTable04-expected.html
@@ -3,19 +3,28 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
<body>
<table id="item1" style="width: 100%">
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
==================== Version 2 ====================
<body>
<table id="item1" style="width: 100%">
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 90%">
<col width="50%"/>
@@ -32,7 +41,11 @@
<body>
<table id="item1" style="width: 100%">
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 80%">
<col width="33%"/>
@@ -61,7 +74,11 @@
<body>
<table id="item1" style="width: 100%">
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 80%">
<col width="33%"/>
diff --git a/Editor/tests/undo/insertTable05-expected.html b/Editor/tests/undo/insertTable05-expected.html
index a8876e4..2fe5cee 100644
--- a/Editor/tests/undo/insertTable05-expected.html
+++ b/Editor/tests/undo/insertTable05-expected.html
@@ -3,13 +3,18 @@
</head>
<body>
==================== Version 0 ====================
- <body></body>
+ <body>
+ </body>
==================== Version 1 ====================
<body>
<table id="item1" style="width: 100%">
<caption/>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
</body>
==================== Version 2 ====================
@@ -17,7 +22,11 @@
<table id="item1" style="width: 100%">
<caption/>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item2" style="width: 90%">
<caption/>
@@ -36,7 +45,11 @@
<table id="item1" style="width: 100%">
<caption/>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 80%">
<caption/>
@@ -68,7 +81,11 @@
<table id="item1" style="width: 100%">
<caption/>
<col width="100%"/>
- <tbody><tr><td><p><br/></p></td></tr></tbody>
+ <tbody>
+ <tr>
+ <td><p><br/></p></td>
+ </tr>
+ </tbody>
</table>
<table id="item3" style="width: 80%">
<caption/>
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..89fa063
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,7 @@
+Apache Corinthia (incubating)
+Copyright 2014-2015 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This product includes software copyright 2011-2015 UX Productivity Pty Ltd.
diff --git a/consumers/corinthia/.gitignore b/consumers/corinthia/.gitignore
new file mode 100644
index 0000000..8e695ec
--- /dev/null
+++ b/consumers/corinthia/.gitignore
@@ -0,0 +1 @@
+doc
diff --git a/consumers/corinthia/Doxyfile b/consumers/corinthia/Doxyfile
new file mode 100644
index 0000000..7f34338
--- /dev/null
+++ b/consumers/corinthia/Doxyfile
@@ -0,0 +1,2331 @@
+# Doxyfile 1.8.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "My Project"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT =
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is refered to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/consumers/corinthia/res/sample.html b/consumers/corinthia/res/sample.html
new file mode 100644
index 0000000..ef8be70
--- /dev/null
+++ b/consumers/corinthia/res/sample.html
@@ -0,0 +1,395 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <meta name="generator" content="UX Write 2.1.1 (build ad61a0a); iOS 8.2">
+ <meta charset="utf-8">
+ <style>
+body {
+ font-family: Palatino;
+ counter-reset: h1 h2 h3 h4 h5 h6 figure table;
+ margin: 10%;
+ text-align: justify;
+ }
+
+ caption {
+ caption-side: bottom;
+ counter-increment: table;
+ }
+
+ caption.Unnumbered {
+ counter-increment: table 0;
+ }
+
+ caption.Unnumbered::before {
+ content: "";
+ }
+
+ caption::before {
+ content: "Table " counter(table) ": ";
+ }
+
+ h1 {
+ counter-increment: h1;
+ counter-reset: h2 h3 h4 h5 h6;
+ }
+
+ h1::before {
+ content: counter(h1) " ";
+ }
+
+ h2 {
+ counter-increment: h2;
+ counter-reset: h3 h4 h5 h6;
+ }
+
+ h2::before {
+ content: counter(h1) "." counter(h2) " ";
+ }
+
+ h3 {
+ counter-increment: h3;
+ counter-reset: h4 h5 h6;
+ }
+
+ h3::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) " ";
+ }
+
+ h4 {
+ counter-increment: h4;
+ counter-reset: h5 h6;
+ }
+
+ h4::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) " ";
+ }
+
+ h5 {
+ counter-increment: h5;
+ counter-reset: h6;
+ }
+
+ h5::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) " ";
+ }
+
+ h6 {
+ counter-increment: h6;
+ }
+
+ h6::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6) " ";
+ }
+
+ nav.tableofcontents::before {
+ content: "Contents";
+ display: block;
+ font-size: 2em;
+ font-weight: bold;
+ margin-bottom: .67em;
+ margin-top: .67em;
+ }
+
+ p.toc1 {
+ margin-bottom: 6pt;
+ margin-left: 0pt;
+ margin-top: 12pt;
+ }
+
+ p.toc2 {
+ margin-bottom: 6pt;
+ margin-left: 24pt;
+ margin-top: 6pt;
+ }
+
+ p.toc3 {
+ margin-bottom: 6pt;
+ margin-left: 48pt;
+ margin-top: 6pt;
+ }
+
+ table {
+ border-collapse: collapse;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ td > :first-child, th > :first-child {
+ margin-top: 0;
+ }
+
+ td > :last-child, th > :last-child {
+ margin-bottom: 0;
+ }
+
+ td, th {
+ border: 1px solid black;
+ }
+ </style>
+
+ <title></title>
+</head>
+
+<body>
+ <p>Test document</p>
+
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at lorem
+ augue, at molestie risus. Sed bibendum augue metus, sed cursus tortor. Aenean
+ semper consectetur pulvinar. Aliquam ultrices tempus nibh, ut mollis ligula
+ ultrices nec. Curabitur vel eros in mi mattis vulputate in nec lorem. Nam
+ auctor faucibus diam, eget accumsan lorem auctor eu. Maecenas imperdiet
+ tristique nisi. Sed sed metus lacus. In consectetur tempus justo, vitae porta
+ urna dapibus nec. Duis vitae lorem sit amet quam suscipit mollis eget non
+ orci. Praesent porta neque et mauris molestie nec sagittis nulla
+ volutpat.</p>
+
+ <h1 id="item2">Introduction</h1>
+
+ <p>Vivamus nec cursus massa. Aenean hendrerit sagittis volutpat. Donec diam
+ erat, vehicula at ultrices vel, aliquet ac mauris. Nam vitae lectus eu eros
+ sagittis sollicitudin. Mauris consequat, est suscipit feugiat eleifend, leo
+ erat rutrum dui, at volutpat metus metus vitae leo. Fusce dictum tincidunt
+ dignissim. Vestibulum eu est purus, eu aliquam quam. Aenean ultricies ante
+ sit amet libero sodales eu feugiat velit ornare.</p>
+
+ <h2 id="item3">Background</h2>
+
+ <p>Proin facilisis cursus elementum. Proin ac lorem ut odio ultricies
+ vehicula sit amet in diam. Proin ut nunc et nisl tristique sagittis. Aenean
+ aliquet eleifend enim non molestie. Vivamus tincidunt augue nec erat suscipit
+ ullamcorper. Nulla ornare risus odio. Nullam vestibulum tellus ac odio mattis
+ quis sollicitudin arcu interdum. Donec convallis malesuada ultricies. Sed
+ sodales porta commodo. Ut nec fringilla est. Nulla aliquet feugiat orci in
+ lobortis. Duis adipiscing aliquam orci, ac tempus leo posuere id. Nam neque
+ enim, faucibus id luctus ut, blandit eu est. Nullam non convallis mauris.</p>
+
+ <h2 id="item4">Motivation</h2>
+
+ <p>Nunc tincidunt, ante vel hendrerit cursus, lectus quam dapibus ipsum, eget
+ vestibulum odio turpis eleifend augue. Ut pharetra ultricies risus, id
+ gravida risus tincidunt eget. Nam eros massa, condimentum quis aliquet nec,
+ aliquam id enim. Integer diam justo, sagittis at faucibus eget, vestibulum id
+ lectus. Suspendisse pharetra lobortis diam sit amet fermentum. Donec nisl
+ ipsum, faucibus et bibendum a, viverra nec nunc. Cras vel arcu mauris. In hac
+ habitasse platea dictumst.</p>
+
+ <h2 id="item5">Project overview</h2>
+
+ <p>Donec sagittis dui sollicitudin massa congue et mollis nulla cursus.
+ Maecenas eget tempor risus. Nam euismod placerat ante viverra gravida. Mauris
+ nec arcu eget turpis accumsan vestibulum. Phasellus luctus, massa vel laoreet
+ faucibus, nulla tellus luctus ipsum, nec imperdiet lacus urna id diam. In
+ libero lacus, rutrum id rhoncus at, mollis consequat mauris. Ut et lectus
+ nulla, nec sagittis massa. Praesent tortor dui, elementum sed tempor eget,
+ porta vehicula ligula. Fusce aliquam lacus in ipsum tristique
+ pellentesque.</p>
+
+ <table style="width: 60%;" id="item16">
+ <caption>
+ A sample table
+ </caption>
+ <col width="50%">
+ <col width="50%">
+
+ <tbody>
+ <tr>
+ <td>
+ <p>Cell 1,1</p>
+ </td>
+
+ <td>
+ <p>Cell 1,2</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cell 2,1</p>
+ </td>
+
+ <td>
+ <p>Cell 2,2</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cell 3,1</p>
+ </td>
+
+ <td>
+ <p>Cell 3,2</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cell 4,1</p>
+ </td>
+
+ <td>
+ <p>Cell 4,2</p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ <p>In nisi felis, ornare nec feugiat at, sodales posuere nibh. Etiam suscipit
+ congue nunc, at sollicitudin est adipiscing viverra. Aenean sed augue quis
+ sem commodo pretium. Maecenas quis elit urna. Donec non arcu dui. Praesent
+ faucibus ornare purus id dignissim. Quisque dictum viverra orci id lacinia.
+ Etiam mollis egestas tortor, id iaculis augue malesuada non. Sed elementum
+ ornare quam, vel iaculis nibh vulputate facilisis.</p>
+
+ <p>Nunc sit amet ipsum tellus, ut laoreet magna. Phasellus consectetur, velit
+ vitae laoreet posuere, eros diam venenatis ante, quis dignissim turpis turpis
+ at quam. Cras ac justo quis nibh sollicitudin gravida. Vestibulum ac
+ vulputate dui. Suspendisse ac nulla mauris, eget condimentum nulla. Nullam
+ mollis metus sed magna facilisis ac accumsan est facilisis. Pellentesque
+ consequat tincidunt sapien in vehicula.</p>
+
+ <h1 id="item6">Implementation</h1>
+
+ <h2 id="item7">Phase One</h2>
+
+ <p>Phasellus dignissim ultricies mauris placerat molestie. Nunc sed orci nec
+ orci mollis suscipit. Maecenas eget quam non arcu dapibus volutpat. Quisque
+ ac turpis ut libero interdum tristique id in quam. Praesent eros velit,
+ dictum eu auctor ut, lobortis ac sem. Duis ipsum neque, volutpat id blandit
+ sed, tempor a dui. Sed ut magna ligula, et sagittis nunc. Phasellus at
+ eleifend orci. Quisque non nunc ipsum. Curabitur eu erat nec ante suscipit
+ mollis. Fusce dictum laoreet volutpat. Vivamus rutrum luctus mattis.</p>
+
+ <p>Sed augue velit, eleifend sed auctor sed, consectetur quis augue. Nulla
+ consectetur imperdiet quam et elementum. Praesent suscipit magna id diam
+ cursus in faucibus arcu semper. Phasellus pretium, nisl in sagittis viverra,
+ arcu tellus aliquam urna, et scelerisque eros lorem et diam. In ut nunc vel
+ nisi imperdiet mattis quis at massa. Phasellus quis tortor est. Sed ac
+ blandit eros. Curabitur ante mauris, condimentum in tempus sit amet, accumsan
+ ac leo. Ut quis tincidunt nunc. Vestibulum ante ipsum primis in faucibus orci
+ luctus et ultrices posuere cubilia Curae; Curabitur tincidunt, nisl id
+ interdum fringilla, mauris tortor volutpat libero, et consectetur purus magna
+ quis nibh.</p>
+
+ <h2 id="item8">Phase Two</h2>
+
+ <p>Aliquam dapibus tincidunt purus in aliquet. In sed ultricies sapien. Cras
+ risus nulla, ultrices ut vulputate ac, luctus in purus. Maecenas at lorem
+ sem, a vestibulum sem. Donec ante nisl, facilisis vel convallis vel, blandit
+ quis turpis. Sed id erat vitae metus cursus consectetur. Integer ac dapibus
+ dui. Nam mi ante, sollicitudin eu fringilla quis, fringilla nec lorem.
+ Aliquam ut nisi accumsan odio pulvinar euismod quis ac libero. Curabitur sit
+ amet ultrices risus. Class aptent taciti sociosqu ad litora torquent per
+ conubia nostra, per inceptos himenaeos. Nulla eu dui ut est aliquet iaculis
+ accumsan et leo. Donec dignissim lorem non arcu hendrerit vel feugiat quam
+ accumsan. Etiam mollis fermentum mi vel egestas. Cum sociis natoque penatibus
+ et magnis dis parturient montes, nascetur ridiculus mus.</p>
+
+ <p>Ut facilisis leo nec neque tempus a molestie libero consequat. Duis et
+ justo eu lorem accumsan eleifend sed nec quam. Duis a ligula ante. Donec
+ egestas lacus id mi convallis ut ullamcorper lorem consequat. Curabitur quis
+ sapien vel odio sodales consequat. Maecenas eget commodo eros. In hac
+ habitasse platea dictumst. Donec commodo venenatis consequat. Nulla
+ vestibulum adipiscing nulla id adipiscing. Nam congue, enim et lobortis
+ rhoncus, urna purus tempor magna, a eleifend mi nisl eu magna. Vestibulum
+ ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia
+ Curae;</p>
+
+ <h2 id="item9">Phase Three</h2>
+
+ <p>Proin placerat sapien eu odio ornare eu pharetra nunc lacinia. Duis tellus
+ nisl, condimentum eget tristique sit amet, imperdiet id felis. Nunc at lectus
+ non risus tristique sollicitudin. Etiam at tellus vitae velit sagittis
+ aliquam. Vivamus bibendum pellentesque dictum. Ut auctor interdum congue.
+ Cras ultrices sem sed sem convallis viverra.</p>
+
+ <p>Nunc pulvinar, diam quis dictum gravida, nulla augue sodales lectus, id
+ pharetra leo purus nec augue. Cum sociis natoque penatibus et magnis dis
+ parturient montes, nascetur ridiculus mus. Praesent consequat venenatis justo
+ tincidunt semper. Praesent egestas, ipsum id pharetra lobortis, arcu risus
+ viverra dui, nec sollicitudin augue leo et neque. Proin commodo pharetra
+ lacus, vitae lobortis libero posuere in. Vestibulum tellus ante, luctus quis
+ luctus at, laoreet feugiat turpis. Morbi commodo tellus non leo faucibus
+ ornare. Ut volutpat, diam et mollis dignissim, felis ante lobortis nibh, sed
+ ullamcorper nibh nunc sed dolor. Phasellus viverra leo erat, luctus vehicula
+ dui. Mauris quis ipsum mollis odio accumsan consectetur lacinia feugiat
+ risus. Pellentesque habitant morbi tristique senectus et netus et malesuada
+ fames ac turpis egestas. Fusce vel lectus non risus facilisis suscipit vitae
+ vitae velit. Fusce lacinia enim dapibus mauris porta luctus. Vivamus
+ venenatis sodales nunc non porttitor. Sed posuere commodo consectetur.</p>
+
+ <h1 id="item10">Required resources</h1>
+
+ <p>Vestibulum suscipit posuere elementum. Nullam volutpat, sapien at eleifend
+ congue, dolor sapien pulvinar nibh, eu vulputate velit urna quis nisl.
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
+ cubilia Curae; Nunc auctor libero sed metus dictum quis placerat elit
+ varius.</p>
+
+ <h2 id="item11">Equipment</h2>
+
+ <p>Praesent fermentum augue sem. Cum sociis natoque penatibus et magnis dis
+ parturient montes, nascetur ridiculus mus. Fusce non lorem ligula, ac rhoncus
+ odio. Fusce ac magna lectus. Integer iaculis congue quam, sit amet tincidunt
+ orci mattis quis. Maecenas tempor, turpis nec euismod bibendum, orci dui
+ suscipit purus, iaculis mattis nunc magna at dui. Cras non neque tellus.
+ Integer lobortis, elit ac pretium imperdiet, nulla metus tempus nulla, vitae
+ bibendum diam nisl sed tellus. Class aptent taciti sociosqu ad litora
+ torquent per conubia nostra, per inceptos himenaeos.</p>
+
+ <p>Aliquam vehicula magna pharetra tortor pellentesque vestibulum. Vivamus ut
+ ullamcorper ante. Integer eu auctor lorem. Morbi sapien erat, viverra vitae
+ gravida id, bibendum eu augue. Maecenas nec dolor augue. Lorem ipsum dolor
+ sit amet, consectetur adipiscing elit. Donec aliquet dui at odio lacinia
+ placerat. Mauris a ipsum justo, id faucibus risus.</p>
+
+ <p>Sed vitae elit sed lectus varius vehicula. Maecenas pulvinar laoreet
+ metus, quis dignissim ipsum hendrerit fringilla. Quisque in neque sed ipsum
+ eleifend tempor. Etiam at posuere neque. Maecenas dapibus lacus tincidunt
+ neque elementum sed porta mauris luctus. Donec sit amet libero augue, at
+ hendrerit odio. Nulla consectetur, sem a vestibulum viverra, est nisl congue
+ leo, eget consectetur turpis justo et dolor. Fusce mollis mollis dui, eget
+ aliquet enim sollicitudin sed. Proin dictum sollicitudin rutrum. Curabitur
+ lorem risus, tempus ac ultricies id, suscipit ac nisl. Duis ultricies
+ facilisis arcu, vel congue risus tincidunt sit amet.</p>
+
+ <h2 id="item13">Personnel</h2>
+
+ <p>Etiam condimentum neque non dolor faucibus eu commodo nibh sodales.
+ Vivamus tempus est in risus malesuada vitae gravida nulla tristique. Maecenas
+ vitae justo a enim imperdiet euismod. Pellentesque porttitor metus nec enim
+ fermentum accumsan. Duis gravida ultricies aliquet. Etiam a risus turpis, sed
+ consequat arcu. Proin cursus quam non leo rutrum molestie. Ut eu orci ac nisl
+ lobortis porttitor a at massa. Nam id fringilla enim. Aenean pellentesque
+ molestie dui, sed dignissim urna mollis in. Ut ut metus non leo pharetra
+ tempor eu molestie metus. Aliquam iaculis nulla eget nisl ullamcorper vel
+ varius erat pretium.</p>
+
+ <p>Phasellus at magna tortor, eu elementum ligula. Etiam malesuada vehicula
+ elementum. Donec quis blandit dui. Phasellus tincidunt ullamcorper pharetra.
+ Integer egestas elementum egestas. Phasellus porta, neque a ultricies
+ pharetra, elit leo sodales purus, non auctor quam magna sed lectus. In et
+ ligula ipsum. Morbi vehicula auctor dolor cursus elementum. Cras vestibulum,
+ enim quis luctus posuere, metus enim mollis libero, at dictum enim magna eget
+ dolor. Vestibulum sagittis mi ac nibh dignissim placerat. Praesent vehicula
+ facilisis luctus. Donec ultrices, est non convallis lacinia, diam neque
+ blandit est, sed tincidunt felis ante sed dolor. Fusce laoreet justo sed
+ neque congue scelerisque.</p>
+
+ <h1 id="item14">Summary</h1>
+
+ <p>Nulla vitae ipsum orci. Suspendisse potenti. In sagittis quam non augue
+ blandit dapibus. Nulla dignissim viverra ante a egestas. In augue mi, porta
+ sit amet tempus eget, venenatis ac purus. Pellentesque non sapien et quam
+ molestie consectetur at ut magna. Maecenas turpis justo, adipiscing eu
+ tincidunt vulputate, ultricies sit amet magna.</p>
+
+ <p>Maecenas eget felis at massa pellentesque blandit ac eget lectus. Ut sit
+ amet nibh nunc, sit amet consequat massa. Suspendisse sit amet tempor tellus.
+ Vivamus nec lectus metus. Morbi id nibh neque. Pellentesque semper, sapien id
+ suscipit tincidunt, eros velit rhoncus dolor, non sagittis turpis erat vitae
+ velit. Nulla ligula turpis, lacinia non consequat in, lobortis sollicitudin
+ felis. Suspendisse pulvinar est eu felis congue id vehicula est luctus.</p>
+</body>
+</html>
diff --git a/consumers/corinthia/src/CMakeLists.txt b/consumers/corinthia/src/CMakeLists.txt
new file mode 100644
index 0000000..ef4b5ae
--- /dev/null
+++ b/consumers/corinthia/src/CMakeLists.txt
@@ -0,0 +1,87 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+
+###
+## global definitions
+###
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+
+
+
+###
+## group source objects
+###
+set(SOURCES
+ Editor.h
+ Editor.cpp
+ JSInterface.h
+ JSInterface.cpp
+ main.cpp
+ MainWindow.h
+ MainWindow.cpp
+ Toolbar.h
+ Toolbar.cpp)
+#set(UI_SOURCES
+# desktop.ui)
+
+
+
+###
+# Common include for all platform files
+###
+include_directories()
+include_directories(SYSTEM ${INCLUDE_DIRS})
+include_directories(.)
+link_directories(${LIB_DIRS})
+
+
+
+###
+## Qt magic
+###
+set(CMAKE_PREFIX_PATH "/usr/local/opt/qt5")
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOMOC ON)
+
+find_package(Qt5Widgets REQUIRED)
+find_package(Qt5WebKit REQUIRED)
+find_package(Qt5WebKitWidgets REQUIRED)
+include_directories("/usr/local/opt/qt5/include")
+
+qt5_wrap_ui(UI_HEADERS ${UI_SOURCES})
+source_group("Generated UI Headers" FILES ${UI_HEADERS})
+
+
+
+
+###
+# executable (release artifact)
+###
+add_executable(corinthia ${SOURCES} ${UI_HEADERS} ${UI_FILES})
+qt5_use_modules(corinthia Widgets WebKit WebKitWidgets)
+target_link_libraries(corinthia DocFormats ${LIBS})
+source_group(src FILES ${SOURCES})
+set_property(TARGET corinthia PROPERTY FOLDER consumers)
+
+message(CMAKE_SOURCE_DIR " is " ${CMAKE_SOURCE_DIR})
+message(TARGET_FILE_DIR ":corinthia is " $<TARGET_FILE_DIR:corinthia>)
+message(CMAKE_BINARY_DIR " is " ${CMAKE_BINARY_DIR})
+
+add_custom_command(TARGET corinthia PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy_directory
+ ${CMAKE_SOURCE_DIR}/Editor/src ${CMAKE_BINARY_DIR}/share/corinthia/js)
+add_custom_command(TARGET corinthia PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy_directory
+ ${CMAKE_SOURCE_DIR}/consumers/corinthia/res ${CMAKE_BINARY_DIR}/share/corinthia)
diff --git a/consumers/corinthia/src/Editor.cpp b/consumers/corinthia/src/Editor.cpp
new file mode 100644
index 0000000..9cce7b8
--- /dev/null
+++ b/consumers/corinthia/src/Editor.cpp
@@ -0,0 +1,296 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "Editor.h"
+#include "JSInterface.h"
+#include <QWebView>
+#include <QWebFrame>
+#include <QFile>
+#include <QLayout>
+#include <QBoxLayout>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QCoreApplication>
+
+class EditorJSCallbacks : public JSCallbacks
+{
+public:
+ EditorJSCallbacks(Editor *editor) : _editor(editor) {}
+ void debug(const QString &message);
+ void addOutlineItem(const QString &itemId, const QString &type, const QString &title);
+ void updateOutlineItem(const QString &itemId, const QString &title);
+ void removeOutlineItem(const QString &itemId);
+ void outlineUpdated();
+ void setCursor(int x, int y, int width, int height);
+ void setSelectionHandles(int x1, int y1, int height1, int x2, int y2, int height2);
+ void setTableSelection(int x, int y, int width, int height);
+ void setSelectionBounds(int left, int top, int right, int bottom);
+ void clearSelectionHandlesAndCursor();
+ void updateAutoCorrect();
+ void error(const QString &message, const QString &operation);
+//private:
+ Editor *_editor;
+};
+
+class EditorJSEvaluator : public JSEvaluator
+{
+public:
+ EditorJSEvaluator(QWebView *webView, JSCallbacks *callbacks) : _webView(webView), _callbacks(callbacks) {}
+ virtual QString evaluate(const QString &script);
+ virtual JSCallbacks *callbacks() { return _callbacks; }
+private:
+ QWebView *_webView;
+ JSCallbacks *_callbacks;
+};
+
+class EditorPrivate : public QObject
+{
+ Q_OBJECT
+public:
+ EditorPrivate(Editor *editor);
+ virtual ~EditorPrivate();
+ public slots:
+ void webViewloadFinished(bool ok);
+public:
+
+ Editor *_editor;
+ QWebView *_webView;
+ EditorJSCallbacks *_callbacks;
+ EditorJSEvaluator *_evaluator;
+ JSInterface *_js;
+};
+
+
+
+const char *jsSources[] = {
+ "first.js",
+ "ElementTypes.js",
+ "AutoCorrect.js",
+ "ChangeTracking.js",
+ "Clipboard.js",
+ "Cursor.js",
+ "DOM.js",
+ "Editor.js",
+ "Equations.js",
+ "Figures.js",
+ "Formatting.js",
+ "Hierarchy.js",
+ "Input.js",
+ "Lists.js",
+ "Main.js",
+ "Metadata.js",
+ "NodeSet.js",
+ "Outline.js",
+ "Position.js",
+ "PostponedActions.js",
+ "Preview.js",
+ "Range.js",
+ "Scan.js",
+ "Selection.js",
+ "StringBuilder.js",
+ "Styles.js",
+ "Tables.js",
+ "Text.js",
+ "traversal.js",
+ "types.js",
+ "UndoManager.js",
+ "util.js",
+ "Viewport.js",
+ NULL,
+};
+
+
+
+
+void EditorJSCallbacks::debug(const QString &message)
+{
+ qStdOut() << "CB debug \"" << message << "\"" << endl;
+}
+
+void EditorJSCallbacks::addOutlineItem(const QString &itemId, const QString &type, const QString &title)
+{
+ qStdOut() << "CB addOutlineItem " << itemId << " " << type << " \"" << title << "\"" << endl;
+}
+
+void EditorJSCallbacks::updateOutlineItem(const QString &itemId, const QString &title)
+{
+ qStdOut() << "CB updateOutlineItem " << itemId << " \"" << title << "\"" << endl;
+}
+
+void EditorJSCallbacks::removeOutlineItem(const QString &itemId)
+{
+ qStdOut() << "CB removeOutlineItem " << itemId << endl;
+}
+
+void EditorJSCallbacks::outlineUpdated()
+{
+ qStdOut() << "CB outlineUpdated" << endl;
+}
+
+void EditorJSCallbacks::setCursor(int x, int y, int width, int height)
+{
+ qStdOut() << "CB setCursor " << x << " " << y << " " << width << " " << height << endl;
+}
+
+void EditorJSCallbacks::setSelectionHandles(int x1, int y1, int height1, int x2, int y2, int height2)
+{
+ qStdOut() << "CB setSelectionHandles " << x1 << " " << y1 << " " << height1 << " "
+ << x2 << " " << y2 << " " << height2 << endl;
+}
+
+void EditorJSCallbacks::setTableSelection(int x, int y, int width, int height)
+{
+ qStdOut() << "CB setTableSelection" << x << " " << y << " " << width << " " << height << endl;
+}
+
+void EditorJSCallbacks::setSelectionBounds(int left, int top, int right, int bottom)
+{
+ qStdOut() << "CB setSelectionBounds " << left << " " << top << " " << right << " " << bottom << endl;
+}
+
+void EditorJSCallbacks::clearSelectionHandlesAndCursor()
+{
+ qStdOut() << "CB clearSelectionHandlesAndCursor" << endl;
+}
+
+void EditorJSCallbacks::updateAutoCorrect()
+{
+ qStdOut() << "CB updateAutoCorrect" << endl;
+}
+
+void EditorJSCallbacks::error(const QString &message, const QString &operation)
+{
+ qStdOut() << "CB error \"" << message << "\" \"" << operation << "\"" << endl;
+}
+
+QString EditorJSEvaluator::evaluate(const QString &script)
+{
+ QWebFrame *frame = _webView->page()->mainFrame();
+ QVariant result = frame->evaluateJavaScript(script);
+ if (result.userType() != QMetaType::QString)
+ return QString::null;
+ else
+ return result.toString();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+EditorPrivate::EditorPrivate(Editor *editor) : _editor(editor)
+{
+ _webView = new QWebView(editor);
+ _callbacks = new EditorJSCallbacks(editor);
+ _evaluator = new EditorJSEvaluator(_webView,_callbacks);
+ _js = new JSInterface(_evaluator);
+ QObject::connect(_webView,SIGNAL(loadFinished(bool)),this,SLOT(webViewloadFinished(bool)));
+}
+
+EditorPrivate::~EditorPrivate()
+{
+ delete _webView;
+ delete _callbacks;
+ delete _evaluator;
+ delete _js;
+}
+
+void EditorPrivate::webViewloadFinished(bool ok)
+{
+ qStdOut() << "webViewloadFinished: ok = " << ok << endl;
+ if (!ok)
+ return;
+ QWebFrame *frame = _editor->webView()->page()->mainFrame();
+ // frame->evaluateJavaScript("alert('This is a test')");
+
+ QString appPath = QCoreApplication::applicationDirPath();
+ QString baseDir = appPath + "/../share/corinthia/js";
+ baseDir = QUrl::fromLocalFile(baseDir).path();
+ qStdOut() << "js base dir = " << baseDir << endl;
+
+ for (int i = 0; jsSources[i] != NULL; i++) {
+ QString fullPath = baseDir + "/" + QString(jsSources[i]);
+ QFile file(fullPath);
+ if (file.open(QFile::ReadOnly)) {
+ QTextStream stream(&file);
+ QString content = stream.readAll();
+ frame->evaluateJavaScript(content);
+ }
+ else {
+ qStdOut() << "Can't open file " << fullPath << endl;
+ return;
+ }
+ }
+
+ frame->evaluateJavaScript("Main_init()");
+
+ processCallbacks(_evaluator);
+}
+
+Editor::Editor(QWidget *parent, Qt::WindowFlags f) : QWidget(parent,f)
+{
+ _p = new EditorPrivate(this);
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->addWidget(_p->_webView);
+ setLayout(layout);
+}
+
+Editor::~Editor()
+{
+ delete _p;
+}
+
+QWebView *Editor::webView() const
+{
+ return _p->_webView;
+}
+
+JSInterface *Editor::js() const
+{
+ return _p->_js;
+}
+
+#include <Editor.moc>
diff --git a/consumers/corinthia/src/Editor.h b/consumers/corinthia/src/Editor.h
new file mode 100644
index 0000000..117a18d
--- /dev/null
+++ b/consumers/corinthia/src/Editor.h
@@ -0,0 +1,35 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#import <QWidget>
+
+class Editor;
+class EditorPrivate;
+class QWebView;
+class JSInterface;
+
+class Editor : public QWidget
+{
+ Q_OBJECT
+public:
+ Editor(QWidget *parent = 0, Qt::WindowFlags f = 0);
+ virtual ~Editor();
+ QWebView *webView() const;
+ JSInterface *js() const;
+private:
+ EditorPrivate *_p;
+};
diff --git a/consumers/corinthia/src/JSInterface.cpp b/consumers/corinthia/src/JSInterface.cpp
new file mode 100644
index 0000000..f6b549f
--- /dev/null
+++ b/consumers/corinthia/src/JSInterface.cpp
@@ -0,0 +1,1307 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "JSInterface.h"
+#include <QJsonDocument>
+#include <assert.h>
+
+QTextStream& qStdOut()
+{
+ static QTextStream ts( stdout );
+ return ts;
+}
+
+class JSArgs
+{
+public:
+ QString toString() const;
+ JSArgs &operator<<(int value);
+ JSArgs &operator<<(unsigned int value);
+ JSArgs &operator<<(double value);
+ JSArgs &operator<<(bool value);
+ JSArgs &operator<<(const char *value);
+ JSArgs &operator<<(const QString &value);
+ JSArgs &operator<<(const QJsonArray &value);
+ JSArgs &operator<<(const QJsonObject &value);
+ JSArgs &operator<<(const QJsonValue &value);
+ JSArgs &operator<<(const QRect &value);
+ JSArgs &operator<<(const QPoint &value);
+ JSArgs &operator<<(const QSize &value);
+ JSArgs &operator<<(const QMap<QString,QString> map);
+private:
+ QJsonArray _array;
+};
+
+QString JSArgs::toString() const
+{
+ QString argsStr = QJsonDocument(_array).toJson(QJsonDocument::Compact);
+ assert(argsStr.size() >= 2);
+ assert(argsStr[0] == '[');
+ assert(argsStr[argsStr.size()-1] == ']');
+ argsStr.remove(0,1);
+ argsStr.remove(argsStr.size()-1,1);
+ return argsStr;
+}
+
+JSArgs &JSArgs::operator<<(int value)
+{
+ _array.append(value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(unsigned int value)
+{
+ _array.append((double)value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(double value)
+{
+ _array.append(value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(bool value)
+{
+ _array.append(value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const char *value)
+{
+ if (value == NULL)
+ _array.append(QJsonValue::Null);
+ else
+ _array.append(value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const QString &value)
+{
+ if (value.isNull())
+ _array.append(QJsonValue::Null);
+ else
+ _array.append(value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const QJsonArray &value)
+{
+ _array.append(value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const QJsonObject &value)
+{
+ _array.append(value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const QJsonValue &value)
+{
+ _array.append(value);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const QRect &value)
+{
+ QJsonObject obj;
+ obj["x"] = QJsonValue(value.x());
+ obj["y"] = QJsonValue(value.y());
+ obj["width"] = QJsonValue(value.width());
+ obj["height"] = QJsonValue(value.height());
+ _array.append(obj);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const QPoint &value)
+{
+ QJsonObject obj;
+ obj["x"] = QJsonValue(value.x());
+ obj["y"] = QJsonValue(value.y());
+ _array.append(obj);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const QSize &value)
+{
+ QJsonObject obj;
+ obj["width"] = QJsonValue(value.width());
+ obj["height"] = QJsonValue(value.height());
+ _array.append(obj);
+ return *this;
+}
+
+JSArgs &JSArgs::operator<<(const QMap<QString,QString> map)
+{
+ QJsonObject obj;
+ QMapIterator<QString,QString> it(map);
+ while (it.hasNext()) {
+ it.next();
+ QString key = it.key();
+ QString value = it.value();
+ if (value.isNull())
+ obj[key] = QJsonValue::Null;
+ else
+ obj[key] = value;
+ }
+ _array.append(obj);
+ return *this;
+}
+
+void testargs()
+{
+ int intVal = 4294967295;
+ unsigned int uintVal = 4294967295;
+ QMap<QString,QString> map;
+ map["color"] = "red";
+ map["font-size"] = "24";
+ map["font-family"] = "Helvetica";
+ map["background-color"] = QString::null;
+ JSArgs args = JSArgs()
+ << intVal
+ << uintVal
+ << 3.2
+ << true
+ << false
+ << "test"
+ << (char *)NULL
+ << QString("test")
+ << QString::null
+ << QJsonArray()
+ << QJsonObject()
+ << QJsonValue("value")
+ << QRect(1,2,3,4)
+ << QPoint(5,6)
+ << QSize(7,8)
+ << map;
+ qStdOut() << args.toString() << endl;
+}
+
+QRect QRectFromJson(QJsonValue value)
+{
+ if (!value.isObject()) {
+ qStdOut() << "QRectFromJson: value is not an object" << endl;
+ return QRect();
+ }
+
+ QJsonObject obj = value.toObject();
+ QJsonValue x = obj["x"];
+ QJsonValue y = obj["y"];
+ QJsonValue width = obj["width"];
+ QJsonValue height = obj["height"];
+ if (!x.isDouble() || !y.isDouble() || !width.isDouble() || !height.isDouble()) {
+ qStdOut() << "QRectFromJson: invalid value(s)" << endl;
+ return QRect();
+ }
+
+ return QRect(x.toDouble(),y.toDouble(),width.toDouble(),height.toDouble());
+}
+
+QString QRectString(QRect rect)
+{
+ return QString().sprintf("(%d,%d,%d,%d)",rect.x(),rect.y(),rect.width(),rect.height());
+}
+
+void processCallbacks(JSEvaluator *evaluator)
+{
+ JSCallbacks *callbacks = evaluator->callbacks();
+
+ QString messagesStr = evaluator->evaluate("Editor_getBackMessages()");
+ if (messagesStr.isNull()) {
+ qStdOut() << "Editor_getBackMessages failed" << endl;
+ return;
+ }
+
+ // QJsonDocument doc = QJsonDocument::fromVariant(var);
+ QJsonDocument doc = QJsonDocument::fromJson(messagesStr.toUtf8());
+ if (doc.isNull()) {
+ qStdOut() << "JSON parse failed" << endl;
+ return;
+ }
+
+ if (!doc.isArray()) {
+ qStdOut() << "JSON is not an array" << endl;
+ return;
+ }
+
+ qStdOut() << "JSON parse succeeded; top-level is an array with " << doc.array().size() << " items" << endl;
+ QJsonArray topArray = doc.array();
+ for (int i = 0; i < topArray.size(); i++) {
+ QJsonValue val = topArray.at(i);
+ if (!val.isArray()) {
+ qStdOut() << "Entry " << i << " is not an array" << endl;
+ return;
+ }
+ // printf("entry %d: %s\n",i,qcstring(val.toString()));
+ QJsonArray array = val.toArray();
+ if (array.size() < 1) {
+ qStdOut() << "Callback array " << i << " is empty" << endl;
+ return;
+ }
+ if (!array.at(0).isString()) {
+ qStdOut() << "Callback array " << i << " does not start with a string" << endl;
+ return;
+ }
+ QString functionName = array.at(0).toString();
+
+ // if (functionName == "addOutlineItem") {
+ // qStdOut() << "cbName " << i << " = " << functionName << " *************************" << endl;
+ // }
+ // else {
+ // qStdOut() << "cbName " << i << " = " << functionName << endl;
+ // }
+
+ if ((functionName == "debug") &&
+ (array.size() == 2) &&
+ (array.at(1).isString())) {
+ callbacks->debug(array.at(1).toString());
+ }
+ else if ((functionName == "addOutlineItem") &&
+ (array.size() == 4) &&
+ (array.at(1).isString()) &&
+ (array.at(2).isString()) &&
+ ((array.at(3).isString()) || (array.at(3).isNull()))) {
+ callbacks->addOutlineItem(array.at(1).toString(),array.at(2).toString(),array.at(3).toString());
+ }
+ else if ((functionName == "updateOutlineItem") &&
+ (array.size() == 3) &&
+ array.at(1).isString() &&
+ array.at(2).isString()) {
+ callbacks->updateOutlineItem(array.at(1).toString(),array.at(2).toString());
+ }
+ else if ((functionName == "removeOutlineItem") &&
+ (array.size() == 2) &&
+ array.at(1).isString()) {
+ callbacks->removeOutlineItem(array.at(1).toString());
+ }
+ else if ((functionName == "outlineUpdated") &&
+ (array.size() == 1)) {
+ callbacks->outlineUpdated();
+ }
+ else if ((functionName == "setSelectionHandles") &&
+ (array.size() == 7) &&
+ array.at(1).isDouble() &&
+ array.at(2).isDouble() &&
+ array.at(3).isDouble() &&
+ array.at(4).isDouble() &&
+ array.at(5).isDouble() &&
+ array.at(6).isDouble()) {
+ callbacks->setSelectionHandles(array.at(1).toDouble(),
+ array.at(2).toDouble(),
+ array.at(3).toDouble(),
+ array.at(4).toDouble(),
+ array.at(5).toDouble(),
+ array.at(6).toDouble());
+ }
+ else if ((functionName == "setTableSelection") &&
+ (array.size() == 5) &&
+ array.at(1).isDouble() &&
+ array.at(2).isDouble() &&
+ array.at(3).isDouble() &&
+ array.at(4).isDouble()) {
+ callbacks->setTableSelection(array.at(1).toDouble(),
+ array.at(2).toDouble(),
+ array.at(3).toDouble(),
+ array.at(4).toDouble());
+ }
+ else if ((functionName == "setCursor") &&
+ (array.size() == 5) &&
+ array.at(1).isDouble() &&
+ array.at(2).isDouble() &&
+ array.at(3).isDouble() &&
+ array.at(4).isDouble()) {
+ callbacks->setCursor(array.at(1).toDouble(),
+ array.at(2).toDouble(),
+ array.at(3).toDouble(),
+ array.at(4).toDouble());
+ }
+ else if ((functionName == "clearSelectionHandlesAndCursor") &&
+ (array.size() == 1)) {
+ callbacks->clearSelectionHandlesAndCursor();
+ }
+ else if ((functionName == "setSelectionBounds") &&
+ (array.size() == 5) &&
+ array.at(1).isDouble() &&
+ array.at(2).isDouble() &&
+ array.at(3).isDouble() &&
+ array.at(4).isDouble()) {
+ callbacks->setSelectionBounds(array.at(1).toDouble(),
+ array.at(2).toDouble(),
+ array.at(3).toDouble(),
+ array.at(4).toDouble());
+ }
+ else if ((functionName == "updateAutoCorrect") &&
+ (array.size() == 1)) {
+ callbacks->updateAutoCorrect();
+ }
+ else if ((functionName == "error") &&
+ (array.size() == 3) &&
+ array.at(1).isString() &&
+ array.at(2).isString()) {
+ callbacks->error(array.at(1).toString(),array.at(2).toString());
+ }
+ else {
+ qStdOut() << "INVALID CALLBACK OR ARGS: " << functionName << endl;
+ }
+ }
+}
+
+QJsonValue evaljsStr(JSEvaluator *ev, const QString &functionName, const QString &argsStr)
+{
+ QString script;
+ QTextStream stream(&script);
+ stream << "Main_execute(function() { return JSON.stringify({ result: ";
+ stream << functionName << "(";
+ stream << argsStr;
+ stream << ")}); });";
+
+ qStdOut() << "EVALUATE: " << script << endl;
+
+ QString resultStr = ev->evaluate(script);
+ qStdOut() << "RESULT: " << resultStr << endl;
+ processCallbacks(ev);
+ if (resultStr.isNull())
+ return QJsonValue(QJsonValue::Null);
+
+ QJsonDocument doc = QJsonDocument::fromJson(resultStr.toUtf8());
+ if (!doc.isObject()) {
+ ev->callbacks()->error("Error parsing returned JSON","evaluate");
+ return QJsonValue(QJsonValue::Null);
+ }
+
+ QJsonObject obj = doc.object();
+ if (!obj.contains("result")) {
+ return QJsonValue(QJsonValue::Null);
+ // ev->callbacks()->error("Returned JSON does not contain a result","evaluate");
+ // return QJsonValue(QJsonValue::Null);
+ }
+
+ return obj["result"];
+}
+
+QJsonValue evaljs(JSEvaluator *ev, const QString &functionName, const JSArgs &args)
+{
+ return evaljsStr(ev,functionName,args.toString());
+}
+
+// Functions implemented in AutoCorrect.js
+
+void JSAutoCorrect::correctPrecedingWord(int numChars, const QString &replacement, bool confirmed)
+{
+ JSArgs args = JSArgs() << numChars << replacement << confirmed;
+ evaljs(_evaluator,"AutoCorrect_correctPrecedingWord",args);
+}
+
+QJsonObject JSAutoCorrect::getCorrection()
+{
+ QJsonValue result = evaljs(_evaluator,"AutoCorrect_getCorrection",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+QJsonObject JSAutoCorrect::getCorrectionCoords()
+{
+ QJsonValue result = evaljs(_evaluator,"AutoCorrect_getCorrectionCoords",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSAutoCorrect::acceptCorrection()
+{
+ evaljs(_evaluator,"AutoCorrect_acceptCorrection",JSArgs());
+}
+
+void JSAutoCorrect::replaceCorrection(const QString &replacement)
+{
+ JSArgs args = JSArgs() << replacement;
+ evaljs(_evaluator,"AutoCorrect_replaceCorrection",args);
+}
+
+// Functions implemented in ChangeTracking.js
+
+bool JSChangeTracking::showChanges()
+{
+ QJsonValue result = evaljs(_evaluator,"ChangeTracking_showChanges",JSArgs());
+ return result.isBool() ? result.toBool() : false;
+}
+
+bool JSChangeTracking::trackChanges()
+{
+ QJsonValue result = evaljs(_evaluator,"ChangeTracking_trackChanges",JSArgs());
+ return result.isBool() ? result.toBool() : false;
+}
+
+void JSChangeTracking::setShowChanges(bool showChanges)
+{
+ JSArgs args = JSArgs() << showChanges;
+ evaljs(_evaluator,"ChangeTracking_setShowChanges",args);
+}
+
+void JSChangeTracking::setTrackChanges(bool trackChanges)
+{
+ JSArgs args = JSArgs() << trackChanges;
+ evaljs(_evaluator,"ChangeTracking_setTrackChanges",args);
+}
+
+// Functions implemented in Clipboard.js
+
+QJsonObject JSClipboard::clipboardCut()
+{
+ QJsonValue result = evaljs(_evaluator,"Clipboard_cut",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+QJsonObject JSClipboard::clipboardCopy()
+{
+ QJsonValue result = evaljs(_evaluator,"Clipboard_copy",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSClipboard::pasteHTML(const QString &html)
+{
+ JSArgs args = JSArgs() << html;
+ evaljs(_evaluator,"Clipboard_pasteHTML",args);
+}
+
+void JSClipboard::pasteText(const QString &text)
+{
+ JSArgs args = JSArgs() << text;
+ evaljs(_evaluator,"Clipboard_pasteText",args);
+}
+
+// Functions implemented in Cursor.js
+
+
+QString JSCursor::positionCursor(int x, int y, bool wordBoundary)
+{
+ JSArgs args = JSArgs() << x << y << wordBoundary;
+ QJsonValue result = evaljs(_evaluator,"Cursor_positionCursor",args);
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QRect JSCursor::getCursorPosition()
+{
+ QJsonValue result = evaljs(_evaluator,"Cursor_getCursorPosition",JSArgs());
+ return QRectFromJson(result);
+}
+
+void JSCursor::moveLeft()
+{
+ evaljs(_evaluator,"Cursor_moveLeft",JSArgs());
+}
+
+void JSCursor::moveRight()
+{
+ evaljs(_evaluator,"Cursor_moveRight",JSArgs());
+}
+
+void JSCursor::moveToStartOfDocument()
+{
+ evaljs(_evaluator,"Cursor_moveToStartOfDocument",JSArgs());
+}
+
+void JSCursor::moveToEndOfDocument()
+{
+ evaljs(_evaluator,"Cursor_moveToEndOfDocument",JSArgs());
+}
+
+void JSCursor::insertReference(const QString &itemId)
+{
+ JSArgs args = JSArgs() << itemId;
+ evaljs(_evaluator,"Cursor_insertReference",args);
+}
+
+void JSCursor::insertLink(const QString &text, const QString &url)
+{
+ JSArgs args = JSArgs() << text << url;
+ evaljs(_evaluator,"Cursor_insertLink",args);
+}
+
+void JSCursor::insertCharacter(unsigned short character, bool allowInvalidPos)
+{
+ JSArgs args = JSArgs() << QString(character) << allowInvalidPos;
+ evaljs(_evaluator,"Cursor_insertCharacter",args);
+}
+
+void JSCursor::deleteCharacter()
+{
+ evaljs(_evaluator,"Cursor_deleteCharacter",JSArgs());
+}
+
+void JSCursor::enterPressed()
+{
+ evaljs(_evaluator,"Cursor_enterPressed",JSArgs());
+}
+
+QString JSCursor::getPrecedingWord()
+{
+ QJsonValue result = evaljs(_evaluator,"Cursor_getPrecedingWord",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QJsonObject JSCursor::getLinkProperties()
+{
+ QJsonValue result = evaljs(_evaluator,"Cursor_getLinkProperties",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSCursor::setLinkProperties(QJsonObject properties)
+{
+ JSArgs args = JSArgs() << properties;
+ evaljs(_evaluator,"Cursor_setLinkProperties",args);
+}
+
+void JSCursor::setReferenceTarget(const QString &itemId)
+{
+ JSArgs args = JSArgs() << itemId;
+ evaljs(_evaluator,"Cursor_setReferenceTarget",args);
+}
+
+void JSCursor::insertFootnote(const QString &content)
+{
+ JSArgs args = JSArgs() << content;
+ evaljs(_evaluator,"Cursor_insertFootnote",args);
+}
+
+void JSCursor::insertEndnote(const QString &content)
+{
+ JSArgs args = JSArgs() << content;
+ evaljs(_evaluator,"Cursor_insertEndnote",args);
+}
+
+// Functions implemented in Equations.js
+
+void JSEquations::insertEquation()
+{
+ evaljs(_evaluator,"Equations_insertEquation",JSArgs());
+}
+
+// Functions implemented in Figures.js
+
+void JSFigures::insertFigure(const QString &filename, const QString &width,
+ bool numbered, const QString &caption)
+{
+ JSArgs args = JSArgs() << filename << width << numbered << caption;
+ evaljs(_evaluator,"Figures_insertFigure",args);
+}
+
+QString JSFigures::getSelectedFigureId()
+{
+ QJsonValue result = evaljs(_evaluator,"Figures_getSelectedFigureId",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QJsonObject JSFigures::getProperties(const QString &itemId)
+{
+ JSArgs args = JSArgs() << itemId;
+ QJsonValue result = evaljs(_evaluator,"Figures_getProperties",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSFigures::setProperties(const QString &itemId, const QString &width, const QString &src)
+{
+ JSArgs args = JSArgs() << itemId << width << src;
+ evaljs(_evaluator,"Figures_setProperties",args);
+}
+
+QJsonObject JSFigures::getGeometry(const QString &itemId)
+{
+ JSArgs args = JSArgs() << itemId;
+ QJsonValue result = evaljs(_evaluator,"Figures_getGeometry",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+// Functions implemented in Formatting.js
+
+QJsonObject JSFormatting::getFormatting()
+{
+ QJsonValue result = evaljs(_evaluator,"Formatting_getFormatting",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSFormatting::applyFormattingChanges(const QString &style, QJsonObject properties)
+{
+ JSArgs args = JSArgs() << style << properties;
+ evaljs(_evaluator,"Formatting_applyFormattingChanges",args);
+}
+
+// Functions implemented in Input.js
+
+void JSInput::removePosition(int posId)
+{
+ JSArgs args = JSArgs() << posId;
+ evaljs(_evaluator,"Input_removePosition",args);
+}
+
+QString JSInput::textInRange(int startId, int startAdjust, int endId, int endAdjust)
+{
+ JSArgs args = JSArgs() << startId << startAdjust << endId << endAdjust;
+ QJsonValue result = evaljs(_evaluator,"Input_textInRange",args);
+ return result.isString() ? result.toString() : QString::null;
+}
+
+void JSInput::replaceRange(int startId, int endId, const QString &text)
+{
+ JSArgs args = JSArgs() << startId << endId << text;
+ evaljs(_evaluator,"Input_replaceRange",args);
+}
+
+QJsonObject JSInput::selectedTextRange()
+{
+ QJsonValue result = evaljs(_evaluator,"Input_selectedTextRange",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSInput::setSelectedTextRange(int startId, int endId)
+{
+ JSArgs args = JSArgs() << startId << endId;
+ evaljs(_evaluator,"Input_setSelectedTextRange",args);
+}
+
+QJsonObject JSInput::markedTextRange()
+{
+ QJsonValue result = evaljs(_evaluator,"Input_markedTextRange",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSInput::setMarkedText(const QString &text, int startOffset, int endOffset)
+{
+ JSArgs args = JSArgs() << text << startOffset << endOffset;
+ evaljs(_evaluator,"Input_setMarkedText",args);
+}
+
+void JSInput::unmarkText()
+{
+ evaljs(_evaluator,"Input_unmarkText",JSArgs());
+}
+
+bool JSInput::forwardSelectionAffinity()
+{
+ QJsonValue result = evaljs(_evaluator,"Input_forwardSelectionAffinity",JSArgs());
+ return result.isBool() ? result.toBool() : false;
+}
+
+void JSInput::setForwardSelectionAffinity(bool forwardSelectionAffinity)
+{
+ JSArgs args = JSArgs() << forwardSelectionAffinity;
+ evaljs(_evaluator,"Input_setForwardSelectionAffinity",args);
+}
+
+int JSInput::positionFromPositionOffset(int posId, int offset)
+{
+ JSArgs args = JSArgs() << posId << offset;
+ QJsonValue result = evaljs(_evaluator,"Input_positionFromPositionOffset",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+int JSInput::positionFromPositionInDirectionOffset(int posId, const QString &direction, int offset)
+{
+ JSArgs args = JSArgs() << posId << direction << offset;
+ QJsonValue result = evaljs(_evaluator,"Input_positionFromPositionInDirectionOffset",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+int JSInput::comparePositionToPosition(int positionId, int otherId)
+{
+ JSArgs args = JSArgs() << positionId << otherId;
+ QJsonValue result = evaljs(_evaluator,"Input_comparePositionToPosition",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+int JSInput::offsetFromPositionToPosition(int fromPosition, int toPosition)
+{
+ JSArgs args = JSArgs() << fromPosition << toPosition;
+ QJsonValue result = evaljs(_evaluator,"Input_offsetFromPositionToPosition",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+int JSInput::positionWithinRangeFarthestInDirection(int startId, int endId, const QString &direction)
+{
+ JSArgs args = JSArgs() << startId << endId << direction;
+ QJsonValue result = evaljs(_evaluator,"Input_positionWithinRangeFarthestInDirection",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+QJsonObject JSInput::characterRangeByExtendingPositionInDirection(int positionId, const QString &direction)
+{
+ JSArgs args = JSArgs() << positionId << direction;
+ QJsonValue result = evaljs(_evaluator,"Input_characterRangeByExtendingPositionInDirection",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+QJsonObject JSInput::firstRectForRange(int startId, int endId)
+{
+ JSArgs args = JSArgs() << startId << endId;
+ QJsonValue result = evaljs(_evaluator,"Input_firstRectForRange",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+QJsonObject JSInput::caretRectForPosition(int posId)
+{
+ JSArgs args = JSArgs() << posId;
+ QJsonValue result = evaljs(_evaluator,"Input_caretRectForPosition",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+int JSInput::closestPositionToPoint(int x, int y)
+{
+ JSArgs args = JSArgs() << x << y;
+ QJsonValue result = evaljs(_evaluator,"Input_closestPositionToPoint",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+int JSInput::closestPositionToPointWithinRange(int x, int y, int startId, int endId)
+{
+ JSArgs args = JSArgs() << x << y << startId << endId;
+ QJsonValue result = evaljs(_evaluator,"Input_closestPositionToPointWithinRange",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+QJsonObject JSInput::characterRangeAtPoint(int x, int y)
+{
+ JSArgs args = JSArgs() << x << y;
+ QJsonValue result = evaljs(_evaluator,"Input_characterRangeAtPoint",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+int JSInput::positionWithinRangeAtCharacterOffset(int startId, int endId, int offset)
+{
+ JSArgs args = JSArgs() << startId << endId << offset;
+ QJsonValue result = evaljs(_evaluator,"Input_positionWithinRangeAtCharacterOffset",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+int JSInput::characterOffsetOfPositionWithinRange(int positionId, int startId, int endId)
+{
+ JSArgs args = JSArgs() << positionId << startId << endId;
+ QJsonValue result = evaljs(_evaluator,"Input_characterOffsetOfPositionWithinRange",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+bool JSInput::isPositionAtBoundaryGranularityInDirection(int posId, const QString &granularity,
+ const QString &direction)
+{
+ JSArgs args = JSArgs() << posId << granularity << direction;
+ QJsonValue result = evaljs(_evaluator,"Input_isPositionAtBoundaryGranularityInDirection",args);
+ return result.isBool() ? result.toBool() : false;
+}
+
+bool JSInput::isPositionWithinTextUnitInDirection(int posId, const QString &granularity,
+ const QString &direction)
+{
+ JSArgs args = JSArgs() << posId << granularity << direction;
+ QJsonValue result = evaljs(_evaluator,"Input_isPositionWithinTextUnitInDirection",args);
+ return result.isBool() ? result.toBool() : false;
+}
+
+int JSInput::positionFromPositionToBoundaryInDirection(int posId, const QString &granularity,
+ const QString &direction)
+{
+ JSArgs args = JSArgs() << posId << granularity << direction;
+ QJsonValue result = evaljs(_evaluator,"Input_positionFromPositionToBoundaryInDirection",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+QJsonObject JSInput::rangeEnclosingPositionWithGranularityInDirection(int posId,
+ const QString &granularity,
+ const QString &direction)
+{
+ JSArgs args = JSArgs() << posId << granularity << direction;
+ QJsonValue result = evaljs(_evaluator,"Input_rangeEnclosingPositionWithGranularityInDirection",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+// Functions implemented in Lists.js
+
+void JSLists::increaseIndent()
+{
+ evaljs(_evaluator,"Lists_increaseIndent",JSArgs());
+}
+
+void JSLists::decreaseIndent()
+{
+ evaljs(_evaluator,"Lists_decreaseIndent",JSArgs());
+}
+
+void JSLists::clearList()
+{
+ evaljs(_evaluator,"Lists_clearList",JSArgs());
+}
+
+void JSLists::setUnorderedList()
+{
+ evaljs(_evaluator,"Lists_setUnorderedList",JSArgs());
+}
+
+void JSLists::setOrderedList()
+{
+ evaljs(_evaluator,"Lists_setOrderedList",JSArgs());
+}
+
+// Functions implemented in Main.js
+
+QString JSMain::getLanguage()
+{
+ QJsonValue result = evaljs(_evaluator,"Main_getLanguage",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+void JSMain::setLanguage(const QString &language)
+{
+ JSArgs args = JSArgs() << language;
+ evaljs(_evaluator,"Main_setLanguage",args);
+}
+
+QString JSMain::setGenerator(const QString &generator)
+{
+ JSArgs args = JSArgs() << generator;
+ QJsonValue result = evaljs(_evaluator,"Main_setGenerator",args);
+ return result.isString() ? result.toString() : QString::null;
+}
+
+bool JSMain::prepareForSave()
+{
+ QJsonValue result = evaljs(_evaluator,"Main_prepareForSave",JSArgs());
+ return result.isBool() ? result.toBool() : false;
+}
+
+QString JSMain::getHTML()
+{
+ QJsonValue result = evaljs(_evaluator,"Main_getHTML",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+bool JSMain::isEmptyDocument()
+{
+ QJsonValue result = evaljs(_evaluator,"Main_isEmptyDocument",JSArgs());
+ return result.isBool() ? result.toBool() : false;
+}
+
+// Functions implemented in Metadata.js
+
+QJsonObject JSMetadata::getMetadata()
+{
+ QJsonValue result = evaljs(_evaluator,"Metadata_getMetadata",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSMetadata::setMetadata(const QJsonObject &metadata)
+{
+ JSArgs args = JSArgs() << metadata;
+ evaljs(_evaluator,"Metadata_setMetadata",args);
+}
+
+// Functions implemented in Outline.js
+
+QJsonObject JSOutline::getOutline()
+{
+ QJsonValue result = evaljs(_evaluator,"Outline_getOutline",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSOutline::moveSection(const QString §ionId, const QString &parentId, const QString &nextId)
+{
+ JSArgs args = JSArgs() << sectionId << parentId << nextId;
+ evaljs(_evaluator,"Outline_moveSection",args);
+}
+
+void JSOutline::deleteItem(const QString &itemId)
+{
+ JSArgs args = JSArgs() << itemId;
+ evaljs(_evaluator,"Outline_deleteItem",args);
+}
+
+void JSOutline::goToItem(const QString &itemId)
+{
+ JSArgs args = JSArgs() << itemId;
+ evaljs(_evaluator,"Outline_goToItem",args);
+}
+
+void JSOutline::scheduleUpdateStructure()
+{
+ evaljs(_evaluator,"Outline_scheduleUpdateStructure",JSArgs());
+}
+
+void JSOutline::setNumbered(const QString &itemId, bool numbered)
+{
+ JSArgs args = JSArgs() << itemId << numbered;
+ evaljs(_evaluator,"Outline_setNumbered",args);
+}
+
+void JSOutline::setTitle(const QString &itemId, const QString &title)
+{
+ JSArgs args = JSArgs() << itemId << title;
+ evaljs(_evaluator,"Outline_setTitle",args);
+}
+
+void JSOutline::insertTableOfContents()
+{
+ evaljs(_evaluator,"Outline_insertTableOfContents",JSArgs());
+}
+
+void JSOutline::insertListOfFigures()
+{
+ evaljs(_evaluator,"Outline_insertListOfFigures",JSArgs());
+}
+
+void JSOutline::insertListOfTables()
+{
+ evaljs(_evaluator,"Outline_insertListOfTables",JSArgs());
+}
+
+void JSOutline::setPrintMode(bool printMode)
+{
+ JSArgs args = JSArgs() << printMode;
+ evaljs(_evaluator,"Outline_setPrintMode",args);
+}
+
+QJsonObject JSOutline::examinePrintLayout(int pageHeight)
+{
+ JSArgs args = JSArgs() << pageHeight;
+ QJsonValue result = evaljs(_evaluator,"Outline_examinePrintLayout",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+bool JSOutline::detectSectionNumbering()
+{
+ QJsonValue result = evaljs(_evaluator,"Outline_detectSectionNumbering",JSArgs());
+ return result.isBool() ? result.toBool() : false;
+}
+
+QJsonObject JSOutline::findUsedStyles()
+{
+ QJsonValue result = evaljs(_evaluator,"Outline_findUsedStyles",JSArgs());
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+// Functions implemented in Preview.js
+
+void JSPreview::showForStyle(const QString &styleId, const QString &uiName, const QString &title)
+{
+ JSArgs args = JSArgs() << styleId << uiName << title;
+ evaljs(_evaluator,"Preview_showForStyle",args);
+ // TODO
+}
+
+// Functions implemented in Scan.js
+
+void JSScan::reset()
+{
+ evaljs(_evaluator,"Scan_reset",JSArgs());
+}
+
+EDScanParagraph *JSScan::next()
+{
+ // TODO
+ return NULL;
+}
+
+int JSScan::addMatch(int start, int end)
+{
+ JSArgs args = JSArgs() << start << end;
+ QJsonValue result = evaljs(_evaluator,"Scan_addMatch",args);
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+void JSScan::showMatch(int matchId)
+{
+ JSArgs args = JSArgs() << matchId;
+ evaljs(_evaluator,"Scan_showMatch",args);
+}
+
+void JSScan::replaceMatch(int matchId, const QString &text)
+{
+ JSArgs args = JSArgs() << matchId << text;
+ evaljs(_evaluator,"Scan_replaceMatch",args);
+}
+
+void JSScan::removeMatch(int matchId)
+{
+ JSArgs args = JSArgs() << matchId;
+ evaljs(_evaluator,"Scan_removeMatch",args);
+}
+
+void JSScan::goToMatch(int matchId)
+{
+ JSArgs args = JSArgs() << matchId;
+ evaljs(_evaluator,"Scan_goToMatch",args);
+}
+
+// Functions implemented in Selection.js
+
+void JSSelection::update()
+{
+ evaljs(_evaluator,"Selection_update",JSArgs());
+}
+
+void JSSelection::selectAll()
+{
+ evaljs(_evaluator,"Selection_selectAll",JSArgs());
+}
+
+void JSSelection::selectParagraph()
+{
+ evaljs(_evaluator,"Selection_selectParagraph",JSArgs());
+}
+
+void JSSelection::selectWordAtCursor()
+{
+ evaljs(_evaluator,"Selection_selectWordAtCursor",JSArgs());
+}
+
+QString JSSelection::dragSelectionBegin(int x, int y, bool selectWord)
+{
+ JSArgs args = JSArgs() << x << y << selectWord;
+ QJsonValue result = evaljs(_evaluator,"Selection_dragSelectionBegin",args);
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QString JSSelection::dragSelectionUpdate(int x, int y, bool selectWord)
+{
+ JSArgs args = JSArgs() << x << y << selectWord;
+ QJsonValue result = evaljs(_evaluator,"Selection_dragSelectionUpdate",args);
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QString JSSelection::moveStartLeft()
+{
+ QJsonValue result = evaljs(_evaluator,"Selection_moveStartLeft",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QString JSSelection::moveStartRight()
+{
+ QJsonValue result = evaljs(_evaluator,"Selection_moveStartRight",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QString JSSelection::moveEndLeft()
+{
+ QJsonValue result = evaljs(_evaluator,"Selection_moveEndLeft",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QString JSSelection::moveEndRight()
+{
+ QJsonValue result = evaljs(_evaluator,"Selection_moveEndRight",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+void JSSelection::setSelectionStartAtCoords(int x, int y)
+{
+ JSArgs args = JSArgs() << x << y;
+ evaljs(_evaluator,"Selection_setSelectionStartAtCoords",args);
+}
+
+void JSSelection::setSelectionEndAtCoords(int x, int y)
+{
+ JSArgs args = JSArgs() << x << y;
+ evaljs(_evaluator,"Selection_setSelectionEndAtCoords",args);
+}
+
+void JSSelection::setTableSelectionEdgeAtCoords(const QString &edge, int x, int y)
+{
+ JSArgs args = JSArgs() << edge << x << y;
+ evaljs(_evaluator,"Selection_setTableSelectionEdgeAtCoords",args);
+}
+
+void JSSelection::print()
+{
+ evaljs(_evaluator,"Selection_print",JSArgs());
+}
+
+// Functions implemented in Styles.js
+
+QString JSStyles::getCSSText()
+{
+ QJsonValue result = evaljs(_evaluator,"Styles_getCSSText",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+void JSStyles::setCSSText(const QString &cssText, const QJsonObject &rules)
+{
+ JSArgs args = JSArgs() << cssText << rules;
+ evaljs(_evaluator,"Styles_setCSSText",args);
+}
+
+QString JSStyles::paragraphClass()
+{
+ QJsonValue result = evaljs(_evaluator,"Styles_getParagraphClass",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+void JSStyles::setParagraphClass(const QString ¶graphClass)
+{
+ JSArgs args = JSArgs() << paragraphClass;
+ evaljs(_evaluator,"Styles_setParagraphClass",args);
+}
+
+// Functions implemented in Tables.js
+
+void JSTables::insertTable(int rows, int cols, const QString &width, bool numbered,
+ const QString &caption, const QString &className)
+{
+ JSArgs args = JSArgs() << rows << cols << width << numbered << caption << className;
+ evaljs(_evaluator,"Tables_insertTable",args);
+}
+
+void JSTables::addAdjacentRow()
+{
+ evaljs(_evaluator,"Tables_addAdjacentRow",JSArgs());
+}
+
+void JSTables::addAdjacentColumn()
+{
+ evaljs(_evaluator,"Tables_addAdjacentColumn",JSArgs());
+}
+
+void JSTables::removeAdjacentRow()
+{
+ evaljs(_evaluator,"Tables_removeAdjacentRow",JSArgs());
+}
+
+void JSTables::removeAdjacentColumn()
+{
+ evaljs(_evaluator,"Tables_removeAdjacentColumn",JSArgs());
+}
+
+void JSTables::clearCells()
+{
+ evaljs(_evaluator,"Tables_clearCells",JSArgs());
+}
+
+void JSTables::mergeCells()
+{
+ evaljs(_evaluator,"Tables_mergeCells",JSArgs());
+}
+
+void JSTables::splitSelection()
+{
+ evaljs(_evaluator,"Tables_splitSelection",JSArgs());
+}
+
+QString JSTables::getSelectedTableId()
+{
+ QJsonValue result = evaljs(_evaluator,"Tables_getSelectedTableId",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+QJsonObject JSTables::getProperties(const QString &itemId)
+{
+ JSArgs args = JSArgs() << itemId;
+ QJsonValue result = evaljs(_evaluator,"Tables_getProperties",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+void JSTables::setProperties(const QString &itemId, const QString &width)
+{
+ JSArgs args = JSArgs() << itemId << width;
+ evaljs(_evaluator,"Tables_setProperties",args);
+}
+
+void JSTables::setColWidths(const QString &itemId, const QJsonArray &colWidths)
+{
+ JSArgs args = JSArgs() << itemId << colWidths;
+ evaljs(_evaluator,"Tables_setColWidths",args);
+}
+
+QJsonObject JSTables::getGeometry(const QString &itemId)
+{
+ JSArgs args = JSArgs() << itemId;
+ QJsonValue result = evaljs(_evaluator,"Tables_getGeometry",args);
+ return result.isObject() ? result.toObject() : QJsonObject();
+}
+
+// Functions implemented in UndoManager.js
+
+int JSUndoManager::getLength()
+{
+ QJsonValue result = evaljs(_evaluator,"UndoManager_getLength",JSArgs());
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+int JSUndoManager::getIndex()
+{
+ QJsonValue result = evaljs(_evaluator,"UndoManager_getIndex",JSArgs());
+ return result.isDouble() ? result.toDouble() : 0;
+}
+
+void JSUndoManager::setIndex(int index)
+{
+ JSArgs args = JSArgs() << index;
+ evaljs(_evaluator,"UndoManager_setIndex",args);
+}
+
+void JSUndoManager::undo()
+{
+ evaljs(_evaluator,"UndoManager_undo",JSArgs());
+}
+
+void JSUndoManager::redo()
+{
+ evaljs(_evaluator,"UndoManager_redo",JSArgs());
+}
+
+void JSUndoManager::newGroup(const QString &name)
+{
+ JSArgs args = JSArgs() << name;
+ evaljs(_evaluator,"UndoManager_newGroup",args);
+}
+
+QString JSUndoManager::groupType()
+{
+ QJsonValue result = evaljs(_evaluator,"UndoManager_groupType",JSArgs());
+ return result.isString() ? result.toString() : QString::null;
+}
+
+// Functions implemented in Viewport.js
+
+void JSViewport::setViewportWidth(int width)
+{
+ JSArgs args = JSArgs() << width;
+ evaljs(_evaluator,"Viewport_setViewportWidth",args);
+}
+
+void JSViewport::setTextScale(int textScale)
+{
+ JSArgs args = JSArgs() << textScale;
+ evaljs(_evaluator,"Viewport_setTextScale",args);
+}
+
+// All modules
+
+JSInterface::JSInterface(JSEvaluator *evaluator)
+: autoCorrect(evaluator),
+ changeTracking(evaluator),
+ clipboard(evaluator),
+ cursor(evaluator),
+ equations(evaluator),
+ figures(evaluator),
+ formatting(evaluator),
+ input(evaluator),
+ lists(evaluator),
+ main(evaluator),
+ metadata(evaluator),
+ outline(evaluator),
+ preview(evaluator),
+ scan(evaluator),
+ selection(evaluator),
+ styles(evaluator),
+ tables(evaluator),
+ undoManager(evaluator),
+ viewport(evaluator)
+{
+}
diff --git a/consumers/corinthia/src/JSInterface.h b/consumers/corinthia/src/JSInterface.h
new file mode 100644
index 0000000..8cb9e85
--- /dev/null
+++ b/consumers/corinthia/src/JSInterface.h
@@ -0,0 +1,478 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include <QString>
+#include <QRect>
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QTextStream>
+
+/**
+ * \file JSInterface.h
+ *
+ * C++ interface to the JavaScript editor library
+ *
+ * All of the core editing operations for Corinthia are implemented in the Editor library, which is
+ * written in JavaScript. This library can be used either from within a web browser, or, in the case
+ * of the Qt application, from an embedded web view. For this app, we use a QWebView instance which
+ * maintains the in-memory DOM tree of the document, and has injected into it all of the javascript
+ * code that is part of the editor library.
+ *
+ * The source code of the Editor library lives in (repository-root)/Editor/src. During build of the
+ * Qt app, all the javascript files are copied into (build-dir)/share/corinthia/js. If you wish to
+ * make changes to the javascript code, you should modify the files in the former location, as the
+ * latter files will be overwritten on every build.
+ *
+ * The purpose of JSInterface.h and JSInterface.cpp is to provide a C++ wrapper over this. All of
+ * the methods defined in the classes below (with the exception of callbacks) ultimately result in a
+ * call to QWebFrame's evaluateJavaScript() method. See the documentation for JSInterface.cpp for
+ * details.
+ *
+ * The editor library is divided into *modules*, each of which implements a specific aspect of
+ * editing functionality. For example, the Cursor module contains methods for moving the cursor
+ * around the document, and inserting or deleting text at the current cursor position. Similarly,
+ * the Tables module contains methods for inserting, deleting, and modifying tables. A separate C++
+ * class is defined for each module, and an instance of each class is maintained by the "container"
+ * class, JSInterface. When using the code here, you should do so via a JSInterface instance.
+ */
+
+#define JS_MODULE_COMMON(className) \
+Q_DISABLE_COPY(className) \
+public: \
+className(JSEvaluator *evaluator) : JSModule(evaluator) {}
+
+QTextStream& qStdOut();
+QString QRectString(QRect rect);
+
+/**
+ * Callback interface
+ *
+ * While the module classes are for making calls from C++ to JavaScript, the JSCallbacks abstract
+ * class is for responding to requests from JavaScript to invoke C++ code. This is declared here as
+ * an abstract class (that is, with all methods virtual and no implementations provided) to avoid
+ * dependencies between the code in this file and other parts of the application. The
+ * EditorJSCallbacks class in Editor.cpp provides a concrete implementation of this, which is where
+ * the actual callback functions are implemented.
+ *
+ * Callbacks are always invoked *after* the execution of a particular editor library API function,
+ * not during. The reason for this design design in the library was to enable support for web view
+ * classes that did not provide native support for callbacks (as was the case for iOS, at least at
+ * the time the library was originally written).
+ *
+ * The way that callbacks are invoked is that after each editor API call, a query is performed for a
+ * list of pending callback messages. The evaluation logic iterates through these and invokes the
+ * appropriate callback method for each. For this reason, callbacks method are all 'void' - they
+ * never return a value. Callbacks are for notification purposes only - typically telling the
+ * application to update the UI in some manner.
+ */
+class JSCallbacks
+{
+public:
+ virtual ~JSCallbacks() {}
+ virtual void debug(const QString &message) = 0;
+ virtual void addOutlineItem(const QString &itemId, const QString &type, const QString &title) = 0;
+ virtual void updateOutlineItem(const QString &itemId, const QString &title) = 0;
+ virtual void removeOutlineItem(const QString &itemId) = 0;
+ virtual void outlineUpdated() = 0;
+ virtual void setCursor(int x, int y, int width, int height) = 0;
+ virtual void setSelectionHandles(int x1, int y1, int height1, int x2, int y2, int height2) = 0;
+ virtual void setTableSelection(int x, int y, int width, int height) = 0;
+ virtual void setSelectionBounds(int left, int top, int right, int bottom) = 0;
+ virtual void clearSelectionHandlesAndCursor() = 0;
+ virtual void updateAutoCorrect() = 0;
+ virtual void error(const QString &message, const QString &operation) = 0;
+};
+
+/**
+ * The JSEvaluator abstract class provides an evaluate() method which is called (indirectly) by all
+ * of the individual module methods. As with JSCallbacks, it is defined as abstract to avoid a
+ * dependency on the code outside of this file. The EditorJSEvaluator class in Editor.cpp provides a
+ * concrete implementation of this; its evaluate() method simply calls through to the
+ * evaluateJavaScript() method of QWebView.
+ *
+ * JSEvaluator also has a callbacks() method, which must return an instance of JSCallbacks. This
+ * makes JSEvaluator the "central point of contact" between the JavaScript interface and the rest of
+ * the application, in that it provides the necessary access to call *in* to javascript, and to
+ * respond (via callbacks) to calls *out* of javascript. Upon initialisation of a document window,
+ * concrete implementations of both JSCallbacks and JSEvaluator are created, the latter maintaining
+ * a reference to the former. See EditorPrivate::EditorPrivate() for where ths is actually done.
+ */
+class JSEvaluator
+{
+public:
+ virtual ~JSEvaluator() {}
+ virtual QString evaluate(const QString &script) = 0;
+ virtual JSCallbacks *callbacks() = 0;
+};
+
+class JSAutoCorrect;
+class JSChangeTracking;
+class JSClipboard;
+class JSCursor;
+class JSEquations;
+class JSFigures;
+class JSFormatting;
+class JSInput;
+class JSLists;
+class JSMain;
+class JSMetadata;
+class JSOutline;
+class JSPreview;
+class JSScan;
+class JSSelection;
+class JSStyles;
+class JSTables;
+class JSUndoManager;
+class JSViewport;
+class EDScanParagraph;
+
+class JSError
+{
+public:
+ const QString &type() { return _type; }
+ const QString &message() { return _message; }
+ const QString &operation() { return _operation; }
+ const QString &html() { return _html; }
+
+private:
+
+ QString _type;
+ QString _message;
+ QString _operation;
+ QString _html;
+};
+
+class JSModule
+{
+ Q_DISABLE_COPY(JSModule)
+public:
+ JSModule(JSEvaluator *evaluator) : _evaluator(evaluator) {};
+protected:
+ JSEvaluator *_evaluator;
+};
+
+// Functions implemented in AutoCorrect.js
+
+class JSAutoCorrect : public JSModule
+{
+ JS_MODULE_COMMON(JSAutoCorrect)
+ void correctPrecedingWord(int numChars, const QString &replacement, bool confirmed);
+ QJsonObject getCorrection();
+ QJsonObject getCorrectionCoords();
+ void acceptCorrection();
+ void replaceCorrection(const QString &replacement);
+};
+
+// Functions implemented in ChangeTracking.js
+
+class JSChangeTracking : public JSModule
+{
+ JS_MODULE_COMMON(JSChangeTracking)
+ bool showChanges();
+ bool trackChanges();
+ void setShowChanges(bool showChanges);
+ void setTrackChanges(bool trackChanges);
+};
+
+// Functions implemented in Clipboard.js
+
+class JSClipboard : public JSModule
+{
+ JS_MODULE_COMMON(JSClipboard)
+ QJsonObject clipboardCut();
+ QJsonObject clipboardCopy();
+ void pasteHTML(const QString &html);
+ void pasteText(const QString &text);
+};
+
+// Functions implemented in Cursor.js
+
+class JSCursor : public JSModule
+{
+ JS_MODULE_COMMON(JSCursor)
+ QString positionCursor(int x, int y, bool wordBoundary);
+ QRect getCursorPosition();
+ void moveLeft();
+ void moveRight();
+ void moveToStartOfDocument();
+ void moveToEndOfDocument();
+ void insertReference(const QString &itemId);
+ void insertLink(const QString &text, const QString &url);
+ void insertCharacter(unsigned short character, bool allowInvalidPos);
+ void deleteCharacter();
+ void enterPressed();
+ QString getPrecedingWord();
+ QJsonObject getLinkProperties();
+ void setLinkProperties(QJsonObject properties);
+ void setReferenceTarget(const QString &itemId);
+ void insertFootnote(const QString &content);
+ void insertEndnote(const QString &content);
+};
+
+// Functions implemented in Equations.js
+
+class JSEquations : public JSModule
+{
+ JS_MODULE_COMMON(JSEquations)
+ void insertEquation();
+};
+
+// Functions implemented in Figures.js
+
+class JSFigures : public JSModule
+{
+ JS_MODULE_COMMON(JSFigures)
+ void insertFigure(const QString &filename, const QString &width,
+ bool numbered, const QString &caption);
+ QString getSelectedFigureId();
+ QJsonObject getProperties(const QString &itemId);
+ void setProperties(const QString &itemId, const QString &width, const QString &src);
+ QJsonObject getGeometry(const QString &itemId);
+};
+
+// Functions implemented in Formatting.js
+
+class JSFormatting : public JSModule
+{
+ JS_MODULE_COMMON(JSFormatting)
+ QJsonObject getFormatting();
+ void applyFormattingChanges(const QString &style, QJsonObject properties);
+};
+
+// Functions implemented in Input.js
+
+class JSInput : public JSModule
+{
+ JS_MODULE_COMMON(JSInput)
+ void removePosition(int posId);
+
+ QString textInRange(int startId, int startAdjust, int endId, int endAdjust);
+ void replaceRange(int startId, int endId, const QString &text);
+ QJsonObject selectedTextRange();
+ void setSelectedTextRange(int startId, int endId);
+ QJsonObject markedTextRange();
+ void setMarkedText(const QString &text, int startOffset, int endOffset);
+ void unmarkText();
+ bool forwardSelectionAffinity();
+ void setForwardSelectionAffinity(bool forwardSelectionAffinity);
+ int positionFromPositionOffset(int posId, int offset);
+ int positionFromPositionInDirectionOffset(int posId, const QString &direction, int offset);
+ int comparePositionToPosition(int positionId, int otherId);
+ int offsetFromPositionToPosition(int fromPosition, int toPosition);
+ int positionWithinRangeFarthestInDirection(int startId, int endId, const QString &direction);
+ QJsonObject characterRangeByExtendingPositionInDirection(int positionId, const QString &direction);
+ QJsonObject firstRectForRange(int startId, int endId);
+ QJsonObject caretRectForPosition(int posId);
+ int closestPositionToPoint(int x, int y);
+ int closestPositionToPointWithinRange(int x, int y, int startId, int endId);
+ QJsonObject characterRangeAtPoint(int x, int y);
+ int positionWithinRangeAtCharacterOffset(int startId, int endId, int offset);
+ int characterOffsetOfPositionWithinRange(int positionId, int startId, int endId);
+
+ bool isPositionAtBoundaryGranularityInDirection(int posId, const QString &granularity,
+ const QString &direction);
+ bool isPositionWithinTextUnitInDirection(int posId, const QString &granularity,
+ const QString &direction);
+ int positionFromPositionToBoundaryInDirection(int posId, const QString &granularity,
+ const QString &direction);
+ QJsonObject rangeEnclosingPositionWithGranularityInDirection(int posId,
+ const QString &granularity,
+ const QString &direction);
+};
+
+// Functions implemented in Lists.js
+
+class JSLists : public JSModule
+{
+ JS_MODULE_COMMON(JSLists)
+ void increaseIndent();
+ void decreaseIndent();
+ void clearList();
+ void setUnorderedList();
+ void setOrderedList();
+};
+
+// Functions implemented in Main.js
+
+class JSMain : public JSModule
+{
+ JS_MODULE_COMMON(JSMain)
+ QString getLanguage();
+ void setLanguage(const QString &language);
+ QString setGenerator(const QString &generator);
+ bool prepareForSave();
+ QString getHTML();
+ bool isEmptyDocument();
+};
+
+// Functions implemented in Metadata.js
+
+class JSMetadata : public JSModule
+{
+ JS_MODULE_COMMON(JSMetadata)
+ QJsonObject getMetadata();
+ void setMetadata(const QJsonObject &metadata);
+};
+
+// Functions implemented in Outline.js
+
+class JSOutline : public JSModule
+{
+ JS_MODULE_COMMON(JSOutline)
+ QJsonObject getOutline();
+ void moveSection(const QString §ionId, const QString &parentId, const QString &nextId);
+ void deleteItem(const QString &itemId);
+ void goToItem(const QString &itemId);
+ void scheduleUpdateStructure();
+ void setNumbered(const QString &itemId, bool numbered);
+ void setTitle(const QString &itemId, const QString &title);
+ void insertTableOfContents();
+ void insertListOfFigures();
+ void insertListOfTables();
+ void setPrintMode(bool printMode);
+ QJsonObject examinePrintLayout(int pageHeight);
+ bool detectSectionNumbering();
+ QJsonObject findUsedStyles();
+};
+
+// Functions implemented in Preview.js
+
+class JSPreview : public JSModule
+{
+ JS_MODULE_COMMON(JSPreview)
+ void showForStyle(const QString &styleId, const QString &uiName, const QString &title);
+};
+
+// Functions implemented in Scan.js
+
+class JSScan : public JSModule
+{
+ JS_MODULE_COMMON(JSScan)
+ void reset();
+ EDScanParagraph *next();
+ int addMatch(int start, int end);
+ void showMatch(int matchId);
+ void replaceMatch(int matchId, const QString &text);
+ void removeMatch(int matchId);
+ void goToMatch(int matchId);
+};
+
+// Functions implemented in Selection.js
+
+class JSSelection : public JSModule
+{
+ JS_MODULE_COMMON(JSSelection)
+ void update();
+ void selectAll();
+ void selectParagraph();
+ void selectWordAtCursor();
+ QString dragSelectionBegin(int x, int y, bool selectWord);
+ QString dragSelectionUpdate(int x, int y, bool selectWord);
+ QString moveStartLeft();
+ QString moveStartRight();
+ QString moveEndLeft();
+ QString moveEndRight();
+ void setSelectionStartAtCoords(int x, int y);
+ void setSelectionEndAtCoords(int x, int y);
+ void setTableSelectionEdgeAtCoords(const QString &edge, int x, int y);
+ void print();
+};
+
+// Functions implemented in Styles.js
+
+class JSStyles : public JSModule
+{
+ JS_MODULE_COMMON(JSStyles)
+ QString getCSSText();
+ void setCSSText(const QString &cssText, const QJsonObject &rules);
+ QString paragraphClass();
+ void setParagraphClass(const QString ¶graphClass);
+};
+
+// Functions implemented in Tables.js
+
+class JSTables : public JSModule
+{
+ JS_MODULE_COMMON(JSTables)
+ void insertTable(int rows, int cols, const QString &width, bool numbered,
+ const QString &caption, const QString &className);
+ void addAdjacentRow();
+ void addAdjacentColumn();
+ void removeAdjacentRow();
+ void removeAdjacentColumn();
+ void clearCells();
+ void mergeCells();
+ void splitSelection();
+ QString getSelectedTableId();
+ QJsonObject getProperties(const QString &itemId);
+ void setProperties(const QString &itemId, const QString &width);
+ void setColWidths(const QString &itemId, const QJsonArray &colWidths);
+ QJsonObject getGeometry(const QString &itemId);
+};
+
+// Functions implemented in UndoManager.js
+
+class JSUndoManager : public JSModule
+{
+ JS_MODULE_COMMON(JSUndoManager)
+ int getLength();
+ int getIndex();
+ void setIndex(int index);
+ void undo();
+ void redo();
+ void newGroup(const QString &name);
+ QString groupType();
+};
+
+// Functions implemented in Viewport.js
+
+class JSViewport : public JSModule
+{
+ JS_MODULE_COMMON(JSViewport)
+ void setViewportWidth(int width);
+ void setTextScale(int textScale);
+};
+
+// All modules
+
+class JSInterface
+{
+ Q_DISABLE_COPY(JSInterface)
+public:
+ JSInterface(JSEvaluator *evaluator);
+ JSAutoCorrect autoCorrect;
+ JSChangeTracking changeTracking;
+ JSClipboard clipboard;
+ JSCursor cursor;
+ JSEquations equations;
+ JSFigures figures;
+ JSFormatting formatting;
+ JSInput input;
+ JSLists lists;
+ JSMain main;
+ JSMetadata metadata;
+ JSOutline outline;
+ JSPreview preview;
+ JSScan scan;
+ JSSelection selection;
+ JSStyles styles;
+ JSTables tables;
+ JSUndoManager undoManager;
+ JSViewport viewport;
+};
+
+void processCallbacks(JSEvaluator *evaluator);
diff --git a/consumers/corinthia/src/MainWindow.cpp b/consumers/corinthia/src/MainWindow.cpp
new file mode 100644
index 0000000..cb2a280
--- /dev/null
+++ b/consumers/corinthia/src/MainWindow.cpp
@@ -0,0 +1,101 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "MainWindow.h"
+#include <QWebView.h>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QCoreApplication>
+#include "Editor.h"
+#include "JSInterface.h"
+#include "Toolbar.h"
+
+MainWindow::MainWindow(QApplication *app) : QWidget(0)
+{
+ _app = app;
+ _toolbar = new Toolbar(this);
+ _editor = new Editor(this);
+ QVBoxLayout *vlayout = new QVBoxLayout();
+ this->setLayout(vlayout);
+ vlayout->addWidget(_toolbar);
+ vlayout->addWidget(_editor);
+ vlayout->setSpacing(0);
+ vlayout->setContentsMargins(4,4,4,4);
+
+ QObject::connect(_toolbar->tableButton(),SIGNAL(clicked()),this,SLOT(insertTable()));
+ QObject::connect(_toolbar->linkButton(),SIGNAL(clicked()),this,SLOT(insertLink()));
+ QObject::connect(_toolbar->characterButton(),SIGNAL(clicked()),this,SLOT(insertCharacter()));
+ QObject::connect(_toolbar->backspaceButton(),SIGNAL(clicked()),this,SLOT(backspace()));
+ QObject::connect(_toolbar->leftButton(),SIGNAL(clicked()),this,SLOT(moveLeft()));
+ QObject::connect(_toolbar->rightButton(),SIGNAL(clicked()),this,SLOT(moveRight()));
+ QObject::connect(_toolbar->undoButton(),SIGNAL(clicked()),this,SLOT(undo()));
+ QObject::connect(_toolbar->redoButton(),SIGNAL(clicked()),this,SLOT(redo()));
+
+ QString appPath = QCoreApplication::applicationDirPath();
+ QString docPath = appPath + "/../share/corinthia/sample.html";
+ QUrl url = QUrl::fromLocalFile(docPath);
+ qStdOut() << "sample document url = " << url.toString() << endl;
+ _editor->webView()->load(url);
+}
+
+MainWindow::~MainWindow()
+{
+ delete _toolbar;
+ delete _editor;
+}
+
+void MainWindow::insertTable()
+{
+ _editor->js()->tables.insertTable(4,3,"50%",true,"Table caption",QString::null);
+}
+
+void MainWindow::insertLink()
+{
+ _editor->js()->cursor.insertLink("Corinthia website","http://corinthia.incubator.apache.org");
+}
+
+void MainWindow::insertCharacter()
+{
+ _editor->js()->cursor.insertCharacter('X',true);
+}
+
+void MainWindow::backspace()
+{
+ _editor->js()->cursor.deleteCharacter();
+}
+
+void MainWindow::moveLeft()
+{
+ _editor->js()->cursor.moveLeft();
+}
+
+void MainWindow::moveRight()
+{
+ _editor->js()->cursor.moveRight();
+}
+
+void MainWindow::undo()
+{
+ _editor->js()->undoManager.undo();
+}
+
+void MainWindow::redo()
+{
+ _editor->js()->undoManager.redo();
+}
+
+//#include <MainWindow.moc>
diff --git a/consumers/corinthia/src/MainWindow.h b/consumers/corinthia/src/MainWindow.h
new file mode 100644
index 0000000..0a2693b
--- /dev/null
+++ b/consumers/corinthia/src/MainWindow.h
@@ -0,0 +1,42 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include <QWidget>
+
+class Toolbar;
+class Editor;
+
+class MainWindow : public QWidget
+{
+ Q_OBJECT
+public:
+ MainWindow(QApplication *app);
+ ~MainWindow();
+ public slots:
+ void insertTable();
+ void insertLink();
+ void insertCharacter();
+ void backspace();
+ void moveLeft();
+ void moveRight();
+ void undo();
+ void redo();
+private:
+ QApplication *_app;
+ Toolbar *_toolbar;
+ Editor *_editor;
+};
diff --git a/consumers/corinthia/src/Toolbar.cpp b/consumers/corinthia/src/Toolbar.cpp
new file mode 100644
index 0000000..4a6faf6
--- /dev/null
+++ b/consumers/corinthia/src/Toolbar.cpp
@@ -0,0 +1,50 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "Toolbar.h"
+#include <QPushButton>
+#include <QHBoxLayout>
+
+Toolbar::Toolbar(QWidget *parent) : QWidget(parent)
+{
+ _tableButton = new QPushButton("Insert table",0);
+ _linkButton = new QPushButton("Insert link",0);
+ _characterButton = new QPushButton("Insert character",0);
+ _backspaceButton = new QPushButton("Backspace",0);
+ _leftButton = new QPushButton("Move left",0);
+ _rightButton = new QPushButton("Move right",0);
+ _undoButton = new QPushButton("Undo",0);
+ _redoButton = new QPushButton("Redo",0);
+
+ _layout = new QHBoxLayout();
+ this->setLayout(_layout);
+
+ _layout->addWidget(_tableButton);
+ _layout->addWidget(_linkButton);
+ _layout->addWidget(_characterButton);
+ _layout->addWidget(_backspaceButton);
+ _layout->addWidget(_leftButton);
+ _layout->addWidget(_rightButton);
+ _layout->addWidget(_undoButton);
+ _layout->addWidget(_redoButton);
+ _layout->setSpacing(4);
+ _layout->setContentsMargins(0,0,0,0);
+}
+
+Toolbar::~Toolbar()
+{
+}
diff --git a/consumers/corinthia/src/Toolbar.h b/consumers/corinthia/src/Toolbar.h
new file mode 100644
index 0000000..207eafc
--- /dev/null
+++ b/consumers/corinthia/src/Toolbar.h
@@ -0,0 +1,49 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include <QWidget>
+
+class QPushButton;
+class QHBoxLayout;
+
+class Toolbar : public QWidget
+{
+ Q_OBJECT
+public:
+ Toolbar(QWidget *parent = 0);
+ ~Toolbar();
+
+ QPushButton *tableButton() { return _tableButton; }
+ QPushButton *linkButton() { return _linkButton; }
+ QPushButton *characterButton() { return _characterButton; }
+ QPushButton *backspaceButton() { return _backspaceButton; }
+ QPushButton *leftButton() { return _leftButton; }
+ QPushButton *rightButton() { return _rightButton; }
+ QPushButton *undoButton() { return _undoButton; }
+ QPushButton *redoButton() { return _redoButton; }
+
+private:
+ QPushButton *_tableButton;
+ QPushButton *_linkButton;
+ QPushButton *_characterButton;
+ QPushButton *_backspaceButton;
+ QPushButton *_leftButton;
+ QPushButton *_rightButton;
+ QPushButton *_undoButton;
+ QPushButton *_redoButton;
+ QHBoxLayout *_layout;
+};
diff --git a/consumers/corinthia/src/main.cpp b/consumers/corinthia/src/main.cpp
new file mode 100644
index 0000000..f17f506
--- /dev/null
+++ b/consumers/corinthia/src/main.cpp
@@ -0,0 +1,27 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include <QApplication>
+#include "MainWindow.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication *app = new QApplication(argc, argv);
+ MainWindow *window = new MainWindow(app);
+ window->show();
+ return app->exec();
+}
diff --git a/consumers/dfconvert/src/CMakeLists.txt b/consumers/dfconvert/src/CMakeLists.txt
index 8b18959..595fe21 100644
--- a/consumers/dfconvert/src/CMakeLists.txt
+++ b/consumers/dfconvert/src/CMakeLists.txt
@@ -16,7 +16,6 @@
###
## global definitions
###
-cmake_minimum_required(VERSION 2.8)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
diff --git a/consumers/dfconvert/src/main.c b/consumers/dfconvert/src/main.c
index b2bacb3..7295691 100644
--- a/consumers/dfconvert/src/main.c
+++ b/consumers/dfconvert/src/main.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include <DocFormats/DocFormats.h>
@@ -42,6 +45,8 @@
"\n"
" Create a new Word document from a HTML file. The Word document must\n"
" not already exist.\n"
+ "\n"
+ "dfconvert does not yet convert odf or latex files.\n"
"\n");
}
@@ -65,7 +70,7 @@
return 0;
}
- fprintf(stderr,"%s\n",DFErrorMessage(&error));
+ fprintf(stderr,"Error: %s\n",DFErrorMessage(&error));
DFErrorRelease(error);
return 1;
}
diff --git a/consumers/dftest/src/CMakeLists.txt b/consumers/dftest/src/CMakeLists.txt
index 4a2a58c..738e9b1 100644
--- a/consumers/dftest/src/CMakeLists.txt
+++ b/consumers/dftest/src/CMakeLists.txt
@@ -16,7 +16,6 @@
###
## global definitions
###
-cmake_minimum_required(VERSION 2.8)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
diff --git a/consumers/dftest/src/main.c b/consumers/dftest/src/main.c
index b3fd6b0..2621b89 100644
--- a/consumers/dftest/src/main.c
+++ b/consumers/dftest/src/main.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "DFUnitTest.h"
@@ -90,7 +93,7 @@
for (int i = 0; lines[i]; i++) {
if (!DFStringIsWhitespace(lines[i]) && strncmp(lines[i],"//",2)) {
if (command == NULL)
- command = strdup(lines[i]);
+ command = xstrdup(lines[i]);
count++;
}
}
@@ -112,7 +115,7 @@
const char *closebr = strrchr(command,')');
if ((openbr == NULL) && (closebr == NULL)) {
- DFArray *array = DFArrayNew((DFCopyFunction)strdup,free);
+ DFArray *array = DFArrayNew((DFCopyFunction)xstrdup,free);
DFArrayAppend(array,(void *)command);
const char **result = DFStringArrayFlatten(array);
DFArrayRelease(array);
@@ -137,7 +140,7 @@
char *arguments = DFSubstring(command,openpos+1,closepos);
const char **components = DFStringSplit(arguments,",",0);
- DFArray *array = DFArrayNew((DFCopyFunction)strdup,free);
+ DFArray *array = DFArrayNew((DFCopyFunction)xstrdup,free);
DFArrayAppend(array,name);
for (int i = 0; components[i]; i++) {
char *trimmed = DFStringTrimWhitespace(components[i]);
@@ -275,7 +278,7 @@
void runTests(int argc, const char **argv, int diff)
{
- DFArray *tests = DFArrayNew((DFCopyFunction)strdup,(DFFreeFunction)free);
+ DFArray *tests = DFArrayNew((DFCopyFunction)xstrdup,(DFFreeFunction)free);
for (int i = 0; i < argc; i++) {
const char *path = argv[i];
if (!DFFileExists(path)) {
diff --git a/consumers/dfutil/src/CMakeLists.txt b/consumers/dfutil/src/CMakeLists.txt
index 6847569..0ed75db 100644
--- a/consumers/dfutil/src/CMakeLists.txt
+++ b/consumers/dfutil/src/CMakeLists.txt
@@ -16,7 +16,6 @@
###
## global definitions
###
-cmake_minimum_required(VERSION 2.8)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
diff --git a/consumers/dfutil/src/Commands.c b/consumers/dfutil/src/Commands.c
index 530acd2..7ec5827 100644
--- a/consumers/dfutil/src/Commands.c
+++ b/consumers/dfutil/src/Commands.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "Commands.h"
@@ -53,7 +56,7 @@
DFBuffer *buffer = readData(filename,error);
if (buffer == NULL)
return NULL;
- char *result = strdup(buffer->data);
+ char *result = xstrdup(buffer->data);
DFBufferRelease(buffer);
return result;
}
@@ -123,6 +126,34 @@
return ok;
}
+static int prettyPrintODFFile(const char *filename, DFError **error)
+{
+ int ok = 0;
+ char *odf = NULL;
+ DFStorage *storage = NULL;
+
+ storage = DFStorageOpenZip(filename,error);
+
+ if (storage == NULL) {
+ DFErrorFormat(error,"%s: %s",filename,DFErrorMessage(error));
+ goto end;
+ }
+ /*
+ odf = ODF_toPlain(storage,NULL);
+ printf("%s",odt);
+ */
+ printf("ODF file support has not been implemented yet.\n");
+ ok = 1;
+
+end:
+ free(odf);
+ DFStorageRelease(storage);
+ return ok;
+
+}
+
+
+
int prettyPrintFile(const char *filename, DFError **error)
{
int ok;
@@ -133,6 +164,8 @@
ok = prettyPrintXMLFile(filename,1,error);
else if (DFStringEqualsCI(extension,"docx"))
ok = prettyPrintWordFile(filename,error);
+ else if (DFStringEqualsCI(extension,"odt"))
+ ok = prettyPrintODFFile(filename,error);
else {
DFErrorFormat(error,"Unknown file type");
ok = 0;
@@ -174,7 +207,7 @@
if (inStr == NULL)
return 0;
- char *inPath = fromStdin ? strdup(".") : DFPathDirName(inFilename);
+ char *inPath = fromStdin ? xstrdup(".") : DFPathDirName(inFilename);
int ok = fromPlain2(inStr,inPath,outFilename,error);
free(inPath);
free(inStr);
@@ -296,7 +329,7 @@
return 0;
}
free(value);
- value = strdup(DFHashTableLookup(package->items,name));
+ value = xstrdup(DFHashTableLookup(package->items,name));
if (value == NULL) {
DFErrorFormat(error,"%s: Item %s not found",filename,itemPath);
TextPackageRelease(package);
@@ -341,7 +374,7 @@
void parseContent(const char *content)
{
DFArray *parts = CSSParseContent(content);
- printf("parts.count = %lu\n",DFArrayCount(parts));
+ printf("parts.count = %zu\n",DFArrayCount(parts));
for (size_t i = 0; i < DFArrayCount(parts); i++) {
ContentPart *part = DFArrayItemAt(parts,i);
char *quotedValue = DFQuote(part->value);
diff --git a/consumers/dfutil/src/Commands.h b/consumers/dfutil/src/Commands.h
index 69b8912..93114a3 100644
--- a/consumers/dfutil/src/Commands.h
+++ b/consumers/dfutil/src/Commands.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef dfutil_Commands_h
#define dfutil_Commands_h
diff --git a/consumers/dfutil/src/FunctionTests.h b/consumers/dfutil/src/FunctionTests.h
index f5a3238..5f2ee23 100644
--- a/consumers/dfutil/src/FunctionTests.h
+++ b/consumers/dfutil/src/FunctionTests.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef dfutil_FunctionTests_h
#define dfutil_FunctionTests_h
diff --git a/consumers/dfutil/src/FunctionTests.m b/consumers/dfutil/src/FunctionTests.m
index f458cc3..037ac45 100644
--- a/consumers/dfutil/src/FunctionTests.m
+++ b/consumers/dfutil/src/FunctionTests.m
@@ -1,18 +1,22 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#import <Foundation/Foundation.h>
+#include "DFPlatform.h"
#include "FunctionTests.h"
#include "DFString.h"
#include "DFFilesystem.h"
diff --git a/consumers/dfutil/src/StringTests.h b/consumers/dfutil/src/StringTests.h
index d864035..7971147 100644
--- a/consumers/dfutil/src/StringTests.h
+++ b/consumers/dfutil/src/StringTests.h
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#ifndef dfutil_StringTests_h
#define dfutil_StringTests_h
diff --git a/consumers/dfutil/src/StringTests.m b/consumers/dfutil/src/StringTests.m
index 7e16c51..aca2524 100644
--- a/consumers/dfutil/src/StringTests.m
+++ b/consumers/dfutil/src/StringTests.m
@@ -1,18 +1,22 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#import <Foundation/Foundation.h>
+#include "DFPlatform.h"
#include "StringTests.h"
#include "DFString.h"
diff --git a/consumers/dfutil/src/dfutil-Prefix.pch b/consumers/dfutil/src/dfutil-Prefix.pch
deleted file mode 100644
index a0d2737..0000000
--- a/consumers/dfutil/src/dfutil-Prefix.pch
+++ /dev/null
@@ -1,7 +0,0 @@
-//
-// Prefix header for all source files of the 'dom' target in the 'dom' project
-//
-
-#ifdef __OBJC__
- #import <Foundation/Foundation.h>
-#endif
diff --git a/consumers/dfutil/src/main.c b/consumers/dfutil/src/main.c
index fed55ab..c3b1ba5 100644
--- a/consumers/dfutil/src/main.c
+++ b/consumers/dfutil/src/main.c
@@ -1,16 +1,19 @@
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
#include "DFPlatform.h"
#include "Commands.h"
diff --git a/consumers/dfwebserver/.gitignore b/consumers/dfwebserver/.gitignore
new file mode 100644
index 0000000..3cd6f04
--- /dev/null
+++ b/consumers/dfwebserver/.gitignore
@@ -0,0 +1,2 @@
+pool
+uploads
\ No newline at end of file
diff --git a/consumers/dfwebserver/assets/input.docx b/consumers/dfwebserver/assets/input.docx
new file mode 100644
index 0000000..9de8bc3
--- /dev/null
+++ b/consumers/dfwebserver/assets/input.docx
Binary files differ
diff --git a/consumers/dfwebserver/examples/node/server/.gitignore b/consumers/dfwebserver/examples/node/server/.gitignore
new file mode 100644
index 0000000..b512c09
--- /dev/null
+++ b/consumers/dfwebserver/examples/node/server/.gitignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/consumers/dfwebserver/examples/node/server/package.json b/consumers/dfwebserver/examples/node/server/package.json
new file mode 100644
index 0000000..215730a
--- /dev/null
+++ b/consumers/dfwebserver/examples/node/server/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "server_example",
+ "version": "1.0.0",
+ "description": "",
+ "main": "server.js",
+ "dependencies": {
+ "express": "^4.12.3",
+ "multer": "^0.1.8"
+ },
+ "devDependencies": {},
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "start": "node server.js"
+ },
+ "author": "",
+ "license": "apache2"
+}
diff --git a/consumers/dfwebserver/examples/node/server/server.js b/consumers/dfwebserver/examples/node/server/server.js
new file mode 100644
index 0000000..ec79dfc
--- /dev/null
+++ b/consumers/dfwebserver/examples/node/server/server.js
@@ -0,0 +1,105 @@
+var express = require('express'),
+ multer = require('multer')
+
+var path = require('path');
+var fs = require('fs');
+
+var docformats = require('../../../node/src/docformats');
+docformats.options.binaryPath = path.resolve('../../../../../build/bin');
+
+
+var app = express();
+
+var dfwebserver = path.resolve(__dirname, '../../..');
+var web = path.resolve(__dirname, '../../../../web');
+
+app.get('/upload', function(req, res){
+ res.send('<html><head></head><body>\
+ <form method="POST" enctype="multipart/form-data">\
+ <input type="file" name="filefield"><br />\
+ <input type="submit">\
+ </form>\
+ </body></html>');
+});
+
+var multerOptions = {
+ dest: path.resolve(dfwebserver, 'uploads/'),
+ rename: function (fieldname, filename) {
+ return filename;
+ }
+};
+
+app.post('/upload',[ multer(multerOptions), function(req, res){
+ console.log(req.body) // form fields
+ console.log(req.files) // form files
+ //res.json(req.files).status(204).end()
+
+ res.send('<html><head></head><body>\
+ <a href="/get/' + req.files.filefield.name + '/">Navigate to this link to run dfconvert GET in the server\
+ </a>\
+ </body></html>');
+}]);
+
+
+function getInput(id) {
+ return path.resolve(dfwebserver, 'uploads', id);
+}
+
+function getOutput(id) {
+ var folder = path.resolve(dfwebserver, 'pool', id)
+ var parsed = path.parse(folder);
+
+ return path.resolve(folder, parsed.name + '.html');
+}
+
+function getDynamicResource(id, resource) {
+ var folder = path.resolve(dfwebserver, 'pool', id)
+
+ return path.resolve(folder, resource);
+}
+
+function getStaticResource(resource) {
+ return path.resolve(web, 'client', resource);
+}
+
+function sendFile(res, filename) {
+ if (fs.existsSync(filename)) {
+ res.sendFile(filename);
+ } else {
+ res.status(404).end(); // Not Found
+ }
+}
+
+
+app.get('/get/:id', function(req, res){
+ var input = getInput(req.params.id);
+ var abstract = getOutput(req.params.id);
+
+ try {
+ // This is required because DocFormat API throw an error
+ // when abstract is present in the filesystem
+ fs.unlinkSync(abstract);
+ } catch (ex) {
+ // do nothing
+ }
+ docformats.get(input, abstract);
+ sendFile(res, abstract);
+});
+
+app.get('/get/:id/*', function(req, res){
+ var staticResource = getStaticResource(req.params[0]);
+ var dynamicResource = getDynamicResource(req.params.id, req.params[0]);
+
+ if (fs.existsSync(staticResource)) {
+ res.sendFile(staticResource);
+ } else {
+ sendFile(res, dynamicResource);
+ }
+});
+
+
+
+app.listen(process.env.PORT || 8080);
+
+
+
diff --git a/consumers/dfwebserver/examples/node/simple.js b/consumers/dfwebserver/examples/node/simple.js
new file mode 100644
index 0000000..4b2b0cf
--- /dev/null
+++ b/consumers/dfwebserver/examples/node/simple.js
@@ -0,0 +1,10 @@
+var docformats = require('../../node/src/docformats');
+var path = require("path");
+
+docformats.options.binaryPath = path.resolve('../../../../build/bin');
+
+var input = path.resolve('../../assets/input.docx');
+var abstract = path.resolve('../../pool/input.docx/input.html');
+
+var status = docformats.get(input, abstract);
+console.log(status);
\ No newline at end of file
diff --git a/consumers/dfwebserver/node/.gitignore b/consumers/dfwebserver/node/.gitignore
new file mode 100644
index 0000000..2f6141d
--- /dev/null
+++ b/consumers/dfwebserver/node/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+npm-debug.log
+.DS_Store
\ No newline at end of file
diff --git a/consumers/dfwebserver/node/.npmignore b/consumers/dfwebserver/node/.npmignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/consumers/dfwebserver/node/.npmignore
diff --git a/consumers/dfwebserver/node/LICENSE b/consumers/dfwebserver/node/LICENSE
new file mode 100644
index 0000000..90705e0
--- /dev/null
+++ b/consumers/dfwebserver/node/LICENSE
@@ -0,0 +1,16 @@
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
\ No newline at end of file
diff --git a/consumers/dfwebserver/node/package.json b/consumers/dfwebserver/node/package.json
new file mode 100644
index 0000000..5a3746b
--- /dev/null
+++ b/consumers/dfwebserver/node/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "docformats",
+ "version": "0.0.2",
+ "description": "Wrapper for DocFormats API",
+ "main": "src/docformats.js",
+ "dependencies": {
+ "mkdirp": "^0.5.0"
+ },
+ "devDependencies": {},
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "franzdecopenhague",
+ "license": "apache2"
+}
+
diff --git a/consumers/dfwebserver/node/src/docformats.js b/consumers/dfwebserver/node/src/docformats.js
new file mode 100644
index 0000000..f94a751
--- /dev/null
+++ b/consumers/dfwebserver/node/src/docformats.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var path = require('path');
+var exec = require('child_process').execFileSync;
+var mkdirp = require("mkdirp").sync;
+
+var df = exports;
+
+df.options = {binaryPath : null};
+
+df.get = function (input, abstract) {
+ try {
+ var cmd = null;
+ if (df.options.binaryPath === undefined || df.options.binaryPath === null) {
+ cmd = 'dfconvert';
+ } else {
+ cmd = path.join(df.options.binaryPath, 'dfconvert');
+ }
+ console.log(cmd + " get " + input + " " + abstract + "");
+ mkdirp(path.dirname(abstract));
+ exec(cmd, ['get', input, abstract]);
+ } catch (ex) {
+ console.log(ex);
+ return false;
+ }
+ return true;
+};
\ No newline at end of file
diff --git a/consumers/dfwebserver/pool/sample.docx/sample.html b/consumers/dfwebserver/pool/sample.docx/sample.html
new file mode 100644
index 0000000..c7a584a
--- /dev/null
+++ b/consumers/dfwebserver/pool/sample.docx/sample.html
@@ -0,0 +1,1130 @@
+<!DOCTYPE html>
+
+<html lang="en-AU">
+<head>
+ <meta charset="utf-8">
+ <meta name="generator" content="UX Write 2.0.2 (build 4b4faea); iOS 7.1">
+
+ <title></title>
+ <style>
+blockquote {
+ font-style: italic;
+ }
+
+ body {
+ counter-reset: h1 h2 h3 h4 h5 h6 figure table;
+ font-family: Palatino;
+ xmargin: 10%;
+ text-align: justify;
+ }
+
+ caption {
+ caption-side: bottom;
+ counter-increment: table;
+ }
+
+ caption.Unnumbered {
+ counter-increment: table 0;
+ }
+
+ caption.Unnumbered::before, figcaption.Unnumbered::before {
+ content: "";
+ }
+
+ caption::before {
+ content: "Table " counter(table) ": ";
+ }
+
+ figcaption {
+ counter-increment: figure;
+ }
+
+ figcaption.Unnumbered {
+ counter-increment: figure 0;
+ }
+
+ figcaption::before {
+ content: "Figure " counter(figure) ": ";
+ }
+
+ figure {
+ margin-bottom: 12pt;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 12pt;
+ text-align: center;
+ }
+
+ h1 {
+ counter-increment: h1;
+ counter-reset: h2 h3 h4 h5 h6;
+ }
+
+ h1.Unnumbered, h2.Unnumbered, h3.Unnumbered, h4.Unnumbered, h5.Unnumbered, h6.Unnumbered {
+ }
+
+ h1::before {
+ content: counter(h1) " ";
+ }
+
+ h2 {
+ color: #585958;
+ counter-increment: h2;
+ counter-reset: h3 h4 h5 h6;
+ }
+
+ h2::before {
+ content: counter(h1) "." counter(h2) " ";
+ }
+
+ h3 {
+ counter-increment: h3;
+ counter-reset: h4 h5 h6;
+ }
+
+ h3::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) " ";
+ }
+
+ h4 {
+ counter-increment: h4;
+ counter-reset: h5 h6;
+ }
+
+ h4::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) " ";
+ }
+
+ h5 {
+ counter-increment: h5;
+ counter-reset: h6;
+ }
+
+ h5::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) " ";
+ }
+
+ h6 {
+ counter-increment: h6;
+ }
+
+ h6::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6) " ";
+ }
+
+ nav.listoffigures::before {
+ content: "List of Figures";
+ display: block;
+ font-size: 2em;
+ font-weight: bold;
+ margin-bottom: .67em;
+ margin-top: .67em;
+ }
+
+ nav.listoftables::before {
+ content: "List of Tables";
+ display: block;
+ font-size: 2em;
+ font-weight: bold;
+ margin-bottom: .67em;
+ margin-top: .67em;
+ }
+
+ nav.tableofcontents::before {
+ content: "Contents";
+ display: block;
+ font-size: 2em;
+ font-weight: bold;
+ margin-bottom: .67em;
+ margin-top: .67em;
+ }
+
+ p {
+ line-height: 166%;
+ }
+
+ p.abstract {
+ font-style: italic;
+ margin-left: 20%;
+ margin-right: 20%;
+ }
+
+ p.author {
+ font-size: 18pt;
+ text-align: center;
+ }
+
+ p.NoSpacing {
+ margin: 0%;
+ }
+
+ p.SpecialNote {
+ color: red;
+ font-weight: bold;
+ text-align: center;
+ }
+
+ p.Tip {
+ background-color: #eeeeee;
+ border: hidden;
+ border-radius: 10px;
+ margin-left: 5%;
+ margin-right: 5%;
+ padding: 10pt;
+ }
+
+ p.Title {
+ font-size: 36pt;
+ font-weight: bold;
+ margin-bottom: 24pt;
+ text-align: center;
+ text-decoration: underline;
+ }
+
+ p.toc1 {
+ margin-bottom: 6pt;
+ margin-left: 0pt;
+ margin-top: 12pt;
+ }
+
+ p.toc2 {
+ margin-bottom: 6pt;
+ margin-left: 24pt;
+ margin-top: 6pt;
+ }
+
+ p.toc3 {
+ margin-bottom: 6pt;
+ margin-left: 48pt;
+ margin-top: 6pt;
+ }
+
+ table {
+ border-collapse: collapse;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ td > :first-child, th > :first-child {
+ margin-top: 0;
+ }
+
+ td > :last-child, th > :last-child {
+ margin-bottom: 0;
+ }
+
+ td, th {
+ border: 1px solid black;
+ }
+ </style>
+</head>
+
+<body>
+
+ <h1 id="item9">Introduction</h1>
+
+ <p>UX Write is designed for long-form, professional writing tasks such as
+ reports, research papers, theses, and books. With an emphasis on technical
+ and academic writing, it provides tools to work with the <i>content</i> and
+ <i>structure</i> of your document separately from its <i>presentation</i>.
+ The latter is controlled by <i>styles</i>, such as headings, normal
+ paragraphs, and the document title.</p>
+
+ <h2 id="item19">What you see is what you mean</h2>
+
+ <p>The design philosophy of UX Write is “what you see is what you mean”, or
+ WYSIWYM. By separating content from presentation, and making the logical
+ structure of documents explicit, it is possible for the layout and rendering
+ of text to adapt to the output medium. This means your documents look just as
+ good on a 30“ desktop monitor as they do on a 7” tablet or the printed
+ page.</p>
+
+ <p>The structure of your document — such as the hierarchy of section headings
+ — also enables other useful features. A table of contents is generated
+ automatically, without you having to manually update text or page numbers.
+ Cross-references can be added and kept up-to-date as section numbers change.
+ The outline view, accessible from the toolbar, displays all the sections,
+ figures, and tables in your document, allowing you to navigate around
+ easily.</p>
+
+ <p>A contrasting approach is “what you see is what you get”, or WYSIWYG,
+ supported by programs like Microsoft Word and Pages. This attempts to
+ replicate the precise layout of a printed page on screen during editing,
+ regardless of whether you're using a desktop computer or a mobile phone.
+ While useful for some purposes, we believe it's the wrong approach for a
+ mobile word processor. UX Write is unapologetically WYSIWYM, and is optimised
+ for readability and ease-of-use across both iPhone and iPad.</p>
+
+ <p class="Tip">If you've got this document open for editing, take a moment
+ now to explore the document outline (third toolbar button from right). Try
+ adjusting the text size in the “Look & feel” section of the settings menu
+ (second from right) to suit your reading preferences. Rotate your screen and
+ watch as the text reflows.</p>
+
+ <h2 id="item17">File formats</h2>
+
+ <p>The native file format of UX Write is HTML — the language of the web. You
+ can view HTML documents on any device or operating system out there, and
+ publish online without any need for file conversion. If you open a Microsoft
+ Word document, it is temporarily converted to HTML for editing, and then
+ saved back again afterwards. Any parts of the document that could not be
+ converted, such as embedded spreadsheets, are preserved in the original Word
+ document.</p>
+
+ <h1 id="item8">Basic features</h1>
+
+ <h2 id="item11">Accessing your Documents</h2>
+
+ <p>You can store your documents on your device only — under
+ “My iPad” or “My iPhone” — or sync them with a cloud service such as Dropbox.
+ In the former case, you can transfer files to your computer using <a href=
+ "http://support.apple.com/kb/HT4094">iTunes file sharing</a>, and in the
+ latter case you can either access your files through the respective service's
+ website, or by installing the service's software on your computer. Box,
+ Dropbox, Google Drive, and Microsoft OneDrive all have clients available for
+ Windows and Mac which you can install for free.</p>
+
+ <p>File synchronisation happens automatically. Whenever a
+ document is saved, it is uploaded in the background, while you continue
+ working. If you have your computer set up for syncing, you will usually see
+ these changes appear within a few seconds. Within UX Write, you can check for
+ updates to existing documents using the refresh button.</p>
+
+ <p>If you're working offline, you can still add and change documents in any
+ of the Box, Dropbox, Google Drive, OneDrive or WebDAV locations you have set
+ up. When you have an Internet connection available again, just launch UX
+ Write, and it will attempt to upload the documents. To move, copy, or delete
+ documents, simply tap the “Edit” button in the file browser.</p>
+
+ <p class="Tip"><b>Tip:</b> We recommend creating and storing all your
+ documents on Dropbox, because it keeps backup copies of every version
+ uploaded for 30 days. You can view and recover old versions of your document
+ if the need arises — see Section <a href="#item10">4.1</a>.</p>
+
+ <h2 id="item4">Editing</h2>
+
+ <p>Text editing works in much the same way as in any other iOS app, but with
+ a few enhancements:</p>
+
+ <ul>
+ <li>
+ <p>An extra row of keys above the keyboard provides access to common
+ punctuation symbols</p>
+ </li>
+
+ <li>
+ <p>The two leftmost keys let you move the cursor or select text by
+ holding them down to bring up a virtual trackpad. Swipe with one finger
+ to move slowly, and two fingers to move faster.</p>
+ </li>
+
+ <li>
+ <p>The formatting key, when held down, replaces the other top-row keys
+ with keys for basic formatting options like bold, italic, and lists</p>
+ </li>
+
+ <li>
+ <p>The autocorrect key allows you to confirm or revert the latest
+ autocorrect replacement (see Section <a href="#item2">2.5</a> for more
+ details)</p>
+ </li>
+
+ <li>
+ <p>You can triple-tap anywhere in the text to select the whole
+ paragraph</p>
+ </li>
+ </ul>
+
+ <p>Note: The keyboard extensions are only available on the iPad.</p>
+
+ <p>UX Write also includes full support for external bluetooth keyboards, and
+ supports all of the standard keyboard shortcuts:</p>
+
+ <table style="width: 100%;" id="item7">
+ <caption>
+ Keyboard shortcuts
+ </caption>
+
+ <colgroup>
+ <col width="50%">
+ <col width="50%">
+ </colgroup>
+
+ <tbody>
+ <tr>
+ <td>
+ <p>Cmd-B</p>
+ </td>
+
+ <td>
+ <p>Bold</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-I</p>
+ </td>
+
+ <td>
+ <p>Italic</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-U</p>
+ </td>
+
+ <td>
+ <p>Underline</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-X</p>
+ </td>
+
+ <td>
+ <p>Cut</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-C</p>
+ </td>
+
+ <td>
+ <p>Copy</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-V</p>
+ </td>
+
+ <td>
+ <p>Paste</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-A</p>
+ </td>
+
+ <td>
+ <p>Select all</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Option-Left/Right</p>
+ </td>
+
+ <td>
+ <p>Move back or forward one word</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Option-Up/Down</p>
+ </td>
+
+ <td>
+ <p>Move up or down one paragraph</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-Left/Right</p>
+ </td>
+
+ <td>
+ <p>Move to start or end of line</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-Up/Down</p>
+ </td>
+
+ <td>
+ <p>Move to start of end of document</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Shift-Arrow key (+ Cmd or Option)</p>
+ </td>
+
+ <td>
+ <p>Any of the above, but for selection</p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ <h2 id="item5">Styles</h2>
+
+ <p>All formatting in UX Write, with the exception of
+ bold, italic, underline and lists, is controlled using <i>styles</i> —
+ such as headings and normal paragraphs. A style serves two purposes:</p>
+
+ <ol>
+ <li>
+ <p>It determines the <i>formatting</i> of the text, such
+ as the font, colour, and paragraph alignment. When a style is modified,
+ all text associated with that style automatically adopts the new
+ formatting, making it easy to ensure consistent presentation throughout
+ your document.</p>
+ </li>
+
+ <li>
+ <p>It indicates the <i>purpose</i> of a piece of text,
+ such as a heading or title. UX Write uses this information for various
+ purposes, such as building a table of contents, displaying the outline
+ view, and determining the possible targets for cross-references.</p>
+ </li>
+ </ol>
+
+ <p>UX Write Basic Edition provides a plain set of built-in styles for
+ headings, block quotes, a document title, and normal text. UX Write
+ Professional Edition allows you to modify the appearance of these built-in
+ styles, as well as create your own; see Section <a href=
+ "#item29">3.1</a> for details.</p>
+
+ <h2 id="item6">Auto correct</h2>
+
+ <p>Automatic correction of typing mistakes can sometimes lead to unexpected
+ results, since no piece of software can accurately guess what you meant to
+ type in every case. When UX Write makes a correction, it highlights it in
+ green, and gives you the opportunity to confirm whether or not it has made
+ the right replacement.</p>
+
+ <p>Tapping on a highlighted word brings up a menu that allows you to accept
+ the correction, revert to the original, or bring up a list of more
+ suggestions, with the option to add the word to the custom dictionary. Any
+ substitutions you explicitly accept are remembered by UX Write, and will
+ occur automatically the next time you make the same typing mistake. You can
+ access the custom dictionary and list of automatic substitutions via the
+ settings menu.</p>
+
+ <h2 id="item2">Outline Navigation</h2>
+
+ <p>You can use the outline view — the third toolbar button
+ from the right — to view the structure of your document and quickly jump
+ between sections. This is particularly useful for large documents, where
+ scrolling would be a hassle.</p>
+
+ <p>The outline view is based on the headings, figures, and
+ tables in your document. For headings to be included, you must mark them as
+ such using the formatting menu. Tables and figures are always included. As
+ you modify your document by adding, removing, or changing content, the
+ outline is automatically kept up-to-date. UX Write Professional Edition also
+ allows you to edit the outline — see Section <a href="#item30">3.4</a> for
+ details.</p>
+
+ <p>In landscape mode on the iPad, you can “pin” the outline to
+ the left of your screen, and it will be displayed alongside your document. To
+ pin or unpin it, use the button at the top of the outline. To hide the
+ outline when it is pinned, press the 'X' button.</p>
+
+ <p>The outline view corresponds directly to what in the table
+ of contents, list of figures, and list of tables, if you have added any of
+ these to your document. See Section <a href="#item32">3.9</a> for
+ details.</p>
+
+ <h1 id="item27">Professional features</h1>
+
+ <p>This section describes features that are only available in
+ UX Write Professional Edition. You can upgrade to this by either purchasing
+ it outright, or by subscribing on a monthly basis. Go to the settings menu
+ and select “View upgrade options” to see details.</p>
+
+ <h2 id="item29">Styles</h2>
+
+ <p>Styles, introduced in Section <a href=
+ "#item5">2.3</a>, define both the formatting and purpose of text in your
+ document. Heading styles, for instance, denote the document outline, and are
+ used for constructing the table of contents. Each style can have different
+ formatting properties, such as fonts, colours, margins, paragraph alignment,
+ borders, and more.</p>
+
+ <p>Using styles enables you to achieve consistent formatting
+ throughout your entire document. Instead of manually changing formatting on a
+ case-by-case basis — as many other word processors encourage you to do — you
+ adjust a style once and it applies to all text in the document associated
+ with the style. This is useful for ensuring your document complies with
+ requirements from your organisation or publisher.</p>
+
+ <p>UX Write provides a number of built-in styles, based on
+ those present in HTML. There are six levels of headings, in addition
+ to normal paragraphs and block quotes. You can change the way any of
+ these are formatted, and also add your own custom styles for specific
+ purposes. For example, this document contains a “Tip” style, which appears as
+ a light-grey box with rounded corners, and left and right margins that place
+ it in the center of the page.</p>
+
+ <p>To manage styles, go to the formatting menu, and select
+ “Edit Styles”. This will bring up the style manager, with a list of styles on
+ the left, and formatting properties on either the top or right of the screen
+ (depending on your screen orientation).</p>
+
+ <p>To edit an existing style, simply select it in the list, and change any of
+ the formatting properties. You will see a preview displayed below the
+ controls that shows an example piece of text as it would be displayed in the
+ document.</p>
+
+ <p>To add a new style, scroll down to the bottom of the list and tap next to
+ the green '+' button. Type in your style name and press enter. You can now
+ set up the formatting for this style, and subsequently select it from the
+ formatting menu in the editor.</p>
+
+ <p>Direct formatting is still available if you want it, via
+ the item near the bottom of the formatting menu. This gives you the same
+ properties as are available in the style editor, but the changes only apply
+ to the current selection.</p>
+
+ <p>Styles you create in UX Write are compatible with Word, and
+ you can also edit and use the styles in Word itself.</p>
+
+ <p class="Tip"><b>Tip:</b> If you want to re-use your styles with multiple
+ documents, you can set up a template for creating new documents. See Section
+ <a href="#item15">3.13</a> for details.</p>
+
+ <h2 id="item39">Formatting</h2>
+
+ <p>There are two ways to adjust formatting:</p>
+
+ <ul>
+ <li>
+ <p><b>Styles.</b> You can select these from the formatting
+ menu; they apply at the paragraph level. Generally, you should use styles
+ to control formatting, as this provides structural information about the
+ document (in the case of headings), and allows you to easily change
+ formatting throughout the whole document for any given style.</p>
+ </li>
+
+ <li>
+ <p><b>Direct formatting.</b> You can also select this from
+ the formatting menu; this is intended for “one-off” cases where you wish
+ to format a particular piece of text without defining a style, such as
+ highlighting something important. You have access to all the same
+ formatting options as you do for styles. Direct formatting corresponds to
+ what you would see in the toolbar of Microsoft Word; we've deliberately
+ de-emphasised it in the user interface to encourage the use of
+ styles.</p>
+ </li>
+ </ul>
+
+ <p>All of the formatting properties directly correspond to
+ those of CSS (Cascading Style Sheets), the web standard used in conjunction
+ with HTML. In most cases, the CSS formatting properties UX Write supports can
+ also be translated directly to those of Microsoft Word; the main exception is
+ that Word has a slightly different way of handling paragraph borders and
+ margins.</p>
+
+ <p>Formatting properties are divided into two categories:
+ <i>text</i> and <i>paragraph</i>. Text properties, in the case of direct
+ formatting, can be applied to only a portion of a paragraph. The rest apply
+ to the paragraph as a whole.</p>
+
+ <h2 id="item26">Document structure</h2>
+
+ <p>Most formal documents like reports and books are divided
+ into multiple levels of <b>sections</b>, with <b>cross-references</b> between
+ them, and a <b>table of contents</b> at the front. Styles are key to
+ achieving this, because the program needs to be told which pieces of text are
+ headings — it can't simply guess that “18 point bold” means a second-level
+ heading. By using styles to mark all your headings, you can take advantage of
+ the following features:</p>
+
+ <ul>
+ <li>
+ <p>Table of contents (Insert menu)</p>
+ </li>
+
+ <li>
+ <p>Cross-references (Insert menu)</p>
+ </li>
+
+ <li>
+ <p>Automatic numbering</p>
+ </li>
+
+ <li>
+ <p>Outline editor (Outline button on toolbar)</p>
+ </li>
+ </ul>
+
+ <p>Whenever a section number changes as a result of changes
+ earlier in the document, its number is automatically updated, as are those of
+ all references that point to it, and the table of contents. The same is true
+ of figures and tables. When you print or generate a PDF, page numbers are
+ automatically calculated for you and included in the table of contents.</p>
+
+ <h2 id="item30">Outline editing</h2>
+
+ <p>You can rearrange and delete sections in the outline by
+ pressing the “Edit button”. To change the order of sections, tap and drag the
+ section name to your desired position. To delete an item, just press the red
+ button on the left, and confirm by pressing the “Delete” button that appears.
+ All changes you make in the outline editor are immediately reflected in the
+ document, including updates to numbering.</p>
+
+ <h2 id="item35">Find and replace</h2>
+
+ <p>On iPad, a search bar is visible at the top of the screen,
+ and you can just type in your search term and hit enter. Tap the down arrow
+ to view options, including replacement text. On iPhone, the search bar and
+ options are accessible via the settings menu.</p>
+
+ <p>By default, searching will look for the exact text you have
+ entered, with case sensitivity determined by whether you have selected that
+ option. Alternatively, you can search and replace text using <i>regular
+ expressions</i>, which allow you to enter patterns that can match multiple
+ snippets of text. Regular expression support is mainly intended for advanced
+ users, such as programmers, who are already familiar with the concept. If you
+ would like to learn more, we recommend the tutorial at at <a href=
+ "http://regexone.com">regexone.com</a>.</p>
+
+ <h2 id="item36">Spell checking</h2>
+
+ <p>The spell checking option will search through your document
+ and highlight any instances of words it finds which are not in the system or
+ custom dictionaries.</p>
+
+ <p>The language used is determined by the following three
+ settings, in order:</p>
+
+ <ul>
+ <li>
+ <p>Language for the current document (Settings > This
+ Document > Language)</p>
+ </li>
+
+ <li>
+ <p>Default language for UX Write (Settings >
+ Application > Language)</p>
+ </li>
+
+ <li>
+ <p>System language (set in the Settings app of your iPad
+ or iPhone)</p>
+ </li>
+ </ul>
+
+ <p>There is currently no support for handling multiple
+ languages in a single document. The set of languages available for spell
+ checking is determined by the built-in dictionaries provided by the operating
+ system, which as of 7.1 are:</p>
+
+ <ul>
+ <li>
+ <p class="NoSpacing">Danish</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Dutch</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">English (Australia)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">English (Canada)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">English (United Kingdom)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">English (United States)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">French</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">German</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Italian</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Portuguese (Brazil)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Portuguese (Portugal)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Russian</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Spanish</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Swedish</p>
+ </li>
+ </ul>
+
+ <h2 id="item37">Word count</h2>
+
+ <p>You can view the word count for your document from the
+ settings menu. This also includes the total number of characters and
+ paragraphs.</p>
+
+ <h2 id="item31">Automatic numbering</h2>
+
+ <p>UX Write can assign numbers to all headings, figures, and
+ tables automatically. For headings, you can turn this on using the “Heading
+ numbering” option in the settings menu. For figures and tables, you can set
+ this on an individual basis either at insertion time, or by tapping on the
+ item and selecting “Figure” or “Table” in the popup menu.</p>
+
+ <p>Numbering is updated automatically as the document changes.
+ If you add or remove a heading, change it's nesting level (e.g.
+ from Heading 2 to Heading 1), or move sections around using the outline
+ editor, the numbers will be updated to reflect the changes. The same is also
+ true for figures and tables.</p>
+
+ <p>All cross-references, plus the table of contents, list of
+ figures, and list of tables (if present) are also kept up to date whenever
+ the numbers change. This ensures that you never have out-of-date references
+ and you don't have to remember to manually update other parts of the
+ document. </p>
+
+ <h2 id="item32">Table of contents</h2>
+
+ <p>While it's possible to manually create a table of contents
+ in any word processor, doing so is tedious, particularly when keeping all the
+ section titles and page numbers up to date. In UX Write, inserting a table of
+ contents causes it to be constructed automatically based on the headings,
+ just like the outline view described in Section <a href=
+ "#item30">3.4</a>. And like automatic numbering and the outline view, every
+ time you add or remove a section, or change its title, the table of contents
+ automatically updates to reflect the change.</p>
+
+ <p>Page numbers are <i>not</i> displayed in the table of
+ contents during editing or when saving as a HTML file, as neither has any
+ concept of distinct pages. When you print or export to PDF, the correct page
+ numbers will be filled in for you. There's no need to do this manually.</p>
+
+ <p>You can also insert a list of figures or list of tables,
+ which work similarly to the table of contents. The text shown in these comes
+ from the captions, with the numbers shown in the same way as section numbers.
+ As with the table of contents, these are always kept in sync with the rest of
+ document.</p>
+
+ <p>If your document is in HTML format, the table of contents,
+ list of figures, and list of tables will appear as links that can be clicked
+ to jump to the appropriate section when viewed in a web browser.</p>
+
+ <h2 id="item1">Cross-references</h2>
+
+ <p>You can insert a cross-reference to any section heading,
+ figure, or table in your document. When you select this option from the
+ insert menu, you'll see a document outline (the same as in the outline view),
+ and can select a target of the cross-reference.</p>
+
+ <p>References appear as hyperlinks in the document. When you
+ tap on one, you'll have the option to either go to the target of the
+ reference, or change it to point to a different section, figure, or
+ table.</p>
+
+ <p>If your reference is to a numbered heading, figure, or
+ table, the number will be updated whenever that of its target changes. If the
+ target is not numbered, the reference will contain the text instead, and will
+ also update whenever the text changes.</p>
+
+ <h2 id="item3">Footnotes and endnotes</h2>
+
+ <p>Because UX Write uses a continuous layout for editing, in
+ which the document is not divided into separate pages, footnotes are
+ displayed inline with the text<span class="footnote">A footnote looks like
+ this</span>. For consistency, and to avoid the need to jump back and forth
+ between the content and the end of the document, endnotes are handled in the
+ same way<span class="endnote">An endnote looks like this</span>.</p>
+
+ <p>HTML does not have any explicit support for either
+ footnotes or endnotes, in the sense that there is no <footnote> element
+ that can clearly indicate its purpose. UX Write uses <span> elements
+ with a class of “footnote” or “endnote” to represent these.</p>
+
+ <p>Microsoft Word documents <i>do</i> have explicit support
+ for both, so when editing a .docx file, UX Write will save them in the
+ appropriate format. When you open the document in Word, you'll see footnotes
+ at the bottom of the page, and endnotes at the end of the document.</p>
+
+ <p>To have footnotes and endnotes appear in their correct
+ positions in a print or PDF output, you must use the LaTeX typesetting option
+ (see Section <a href="#item23">3.12</a>). WebKit does not have the
+ capabilities to support pagination features.</p>
+
+ <h2 id="item23">Printing and PDF export</h2>
+
+ <p>Two different typesetting systems are supported for
+ producing print and PDF output. You can choose between these using the
+ “Typesetting” option under the settings menu:</p>
+
+ <ul>
+ <li>
+ <p><b>WebKit</b> (recommended). Safari's layout engine,
+ optimised for on-screen rendering of HTML content.</p>
+
+ <p>This is the layout engine used for displaying your
+ documents during editing, and the PDF files it generates match exactly
+ the formatting you see on screen; though line breaks will be different
+ for the printed page.</p>
+ </li>
+
+ <li>
+ <p><b>LaTeX</b> (new). The de-facto standard in many
+ scientific disciplines, optimised for high-quality typography and
+ paginated output.</p>
+
+ <p>Support for LaTeX is new in 2.0. Currently, only
+ limited formatting options are supported, and English is the only
+ supported language. We'll be improving this throughout the 2.x release
+ cycle, with support for other languages and many other features, such as
+ equations, bibliographies, and headers/footers.</p>
+ </li>
+ </ul>
+
+ <p>Of these two, only LaTeX is capable of correctly
+ typesetting footnotes and endnotes, as well as other pagination-dependent
+ features we'll be adding in the future. If you print or export to PDF using
+ WebKit, footnotes and endnotes will appear inline with the text, as they do
+ during editing.</p>
+
+ <h2 id="item15">Creating Templates</h2>
+
+ <p>Often you'll want to create a series of documents which all have a
+ consistent look and feel, based on styles that you have set up, as described
+ in Section <a href="#item29">3.1</a>. While UX Write does not have a “proper”
+ template feature (yet), you can get the same effect by creating a normal
+ document with your desired settings, and treating that as a starting point
+ for new documents.</p>
+
+ <p>To create a template:</p>
+
+ <ol>
+ <li>
+ <p>Create a new document, calling it “My template” (or whatever you
+ like)</p>
+ </li>
+
+ <li>
+ <p>Open the document and use the style manager to change the default
+ fonts, colours, and other formatting properties that you want</p>
+ </li>
+
+ <li>
+ <p>Create any custom styles that you will use regularly — e.g. “Title” or
+ “Abstract”</p>
+ </li>
+ </ol>
+
+ <p>To create a new document based on a template:</p>
+
+ <ol>
+ <li>
+ <p>Tap and hold on the template document in the file manager</p>
+ </li>
+
+ <li>
+ <p>Select “Duplicate”</p>
+ </li>
+
+ <li>
+ <p>Type in the name for your new document</p>
+ </li>
+
+ <li>
+ <p>Open the new document and start writing</p>
+ </li>
+ </ol>
+
+ <p>We'll be adding a more sophisticated mechanism for browsing and previewing
+ template files, along with a few nice samples, in a future update.</p>
+
+ <h1 id="item13">Common Tasks</h1>
+
+ <h2 id="item10">Dropbox Versioning</h2>
+
+ <p>One of the best features of Dropbox is that it automatically keeps old
+ versions of every file that's uploaded to it. It's always been possible to
+ log into the Dropbox website and access these old versions via their web
+ interface, but now you can do it directly from within UX Write itself.</p>
+
+ <p>If you ever need to recover an older version of a document, simply tap and
+ hold on it in the file browser, and select “Versions” in the popup menu. You
+ can then browse through all the versions that Dropbox has kept, and restore
+ the one you want. UX Write autosaves every three minutes, so if you're
+ connected to the Internet while you're working, you'll have regular snapshots
+ of your documents.<b></b></p>
+
+ <h2 id="item12">Converting from HTML to docx</h2>
+
+ <p>If you've upgraded from a previous version of UX Write and wish to convert
+ your HTML documents to .docx so they can be used with Microsoft Word, you can
+ do so as follows:</p>
+
+ <ul>
+ <li>
+ <p>Tap and hold on the document in the file browser</p>
+ </li>
+
+ <li>
+ <p>Select <b>Convert to</b> <b>docx</b></p>
+ </li>
+ </ul>
+
+ <p>Note that due to differences between the two file formats, there may be
+ some loss of formatting during the transition — for example, the rounded
+ borders used in the “Tip” style in this document can't be represented in
+ docx. For this reason, the original HTML file will be kept as a backup.</p>
+
+ <h1 id="item16">Troubleshooting</h1>
+
+ <h2 id="item18">Reporting Bugs</h2>
+
+ <p>If you encounter a crash in UX Write, you will be asked if you would like
+ to submit a bug report. This report includes a crash log indicating exactly
+ where in the program the problem occurred, as well as a redacted copy of your
+ document in which all text and images have been removed. An email window will
+ appear where you can add comments about what happened, and the bug report
+ will be sent to us when you hit “Send”. You can CC yourself a copy for
+ reference if you like.</p>
+
+ <p><b>If we can't reproduce it, we can't fix it.</b> Many people send in bug
+ reports containing just the crash log. Often, we can to determine from this
+ what went wrong, but this isn't always the case. To increase the chances of
+ us being able to fix the problem, try to provide a detailed description of
+ what you were doing right before the crash occurred.</p>
+
+ <p>The best bug reports provide a clear set of steps that explain how to
+ reproduce the problem. During beta testing of 2.0, one particularly helpful
+ person even used iPad screen recording software to make a video demonstrating
+ how to trigger a bug, edited the video in iMovie, and added an audio track
+ with narration to explain what was going on. You certainly don't have to go
+ to this much effort, but a few simple instructions in your email which
+ explain how to reliably reproduce a problem will help a lot.</p>
+
+ <p>If you encounter any other issues that do not involve a crash, such as
+ formatting inconsistencies or strange user interface behaviour, just select
+ the <b>Submit bug report</b> option from the settings menu and send us a
+ note. Remember, the more information, the better.</p>
+
+ <p>The app store does not provide developers with any way to directly respond
+ to bug reports included in reviews. You can say whatever you want, but
+ <b>please also let us know about your problem</b> in case we need to ask you
+ for more information in order to fix it.</p>
+
+ <h2 id="item14">Purchase and Subscription</h2>
+
+ <p>Every time you install something from the app store, iOS
+ includes a <i>receipt file</i> which is accessible to the app. This file
+ includes information about the version number of the app that you originally
+ downloaded, as well as any in-app payments you have made. UX Write looks at
+ this file to determine whether or not to enable the features in the
+ professional edition.</p>
+
+ <p>If you buy a new iPad or iPhone and install UX Write on it
+ via iTunes, this receipt file might not be present. If you have purchased or
+ subscribed to the app, it's necessary for UX Write to request a copy of the
+ receipt file from the app store so it can verify your upgrade status. You can
+ do this either from the intro screen shown at first launch, or by selecting
+ “Reactivate existing upgrade” from the settings menu.</p>
+
+ <p>If you originally purchased UX Write prior to the release
+ of version 2.0 (when it was a paid-only app), you should automatically have
+ access to the professional edition. The way UX Write determines this is by
+ looking at the receipt file and checking what the version number of the app
+ was at the time of your purchase. So if you see the app running as basic
+ edition, select “Reactivate existing upgrade” from the settings menu.</p>
+
+ <p>If you have any problems with upgrades or payments,
+ <a href="http://www.uxproductivity.com/support">please contact us</a>.</p>
+
+ <h2 id="item20">The Field Update Problem</h2>
+
+ <p>If you open a .docx file in Word after editing it in UX Write, you'll see
+ the following message:</p>
+
+ <blockquote>
+ “This document contains fields that may refer to other files. Do you want
+ to update the fields in this document?”
+ </blockquote>
+
+ <p>When you see this message, just click <b>Yes</b> (or press the <b>Y</b>
+ key).</p>
+
+ <p>Sadly, this is a symptom of a design flaw in Word, and is something only
+ Microsoft can fix. Unlike UX Write, Word does not keep the table of contents,
+ cross references, or figure/table numbers (all collectively known as
+ <b>Fields</b>) up to date automatically. Instead, it forces you to manually
+ tell it when it to update the fields after you have made changes to your
+ document.</p>
+
+ <p>Despite the fact that UX Write never actually produces fields that refer
+ to other files, this message is still displayed in every version of Word that
+ we have tested with, including Word 2013. The only way we could prevent such
+ a dialog from appearing is to store a setting in the document that tells Word
+ that there is no need to update the fields — but this would simply leave you
+ with an invalid table of contents and incorrect cross-references. While we've
+ done our best to ensure that UX Write provides the best user experience
+ within the app itself, we're not able to fix Word.</p>
+
+ <h2 id="item22">Opening .doc files</h2>
+
+ <p>Microsoft Word has used a number of different file formats over the years,
+ and UX Write only supports the most recent version, .docx, which is a modern,
+ XML-based, well-documented open standard. The older .doc format is a
+ proprietary and very complex binary file format that would take a minimum of
+ six months to support. We've decided that time is better spent on other
+ useful features instead.</p>
+
+ <p>If you have a .doc file that you wish to edit in UX Write, you can convert
+ it to .docx by opening it in any recent version of Word (2007 and later), and
+ using “Save as” to convert it to docx. Doing so will maintain all of the
+ content and formatting, and provide exactly the same experience when working
+ with the document in Word itself. You will then have your document in a much
+ more portable format, and be able to edit it in Word, UX Write, and other
+ word processors such as LibreOffice.</p>
+
+ <h1 id="item28">More information</h1>
+
+ <p>If you have a question that isn't answered here, check out
+ our <a href="http://www.uxproductivity.com/support">support website</a> for
+ more info. We also maintain a <a href=
+ "http://blog.uxproductivity.com">blog</a> discussing the development of the
+ app and new features that are in the works. Many of our posts discuss various
+ questions people have had about UX Write and may provide you with a deeper
+ understanding of why certain aspects of the app are the way they are.</p>
+
+ <p>We value any feedback you have about the app, and you can
+ send it to us any time via the option on the settings menu. We receive a
+ <i>lot</i> of email, and can't guarantee to respond individually or add every
+ requested feature, but we certainly take into account your feedback when
+ deciding on priorities for future updates.</p>
+</body>
+</html>
diff --git a/consumers/dfwebserver/python/input.docx b/consumers/dfwebserver/python/input.docx
new file mode 100644
index 0000000..9de8bc3
--- /dev/null
+++ b/consumers/dfwebserver/python/input.docx
Binary files differ
diff --git a/consumers/dfwebserver/python/makefile b/consumers/dfwebserver/python/makefile
new file mode 100644
index 0000000..b3546c3
--- /dev/null
+++ b/consumers/dfwebserver/python/makefile
@@ -0,0 +1,48 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+#build
+# make
+
+#install
+# sudo python setup.py install
+
+#unistall
+# sudo python setup.py install --record files.txt
+# cat files.txt | sudo xargs rm -rf
+
+#develoment build
+# make clean dev
+# python test.py
+
+LDFLAGS ?= ""
+CFLAGS ?= ""
+
+.PHONY: default build_ext clean
+
+default: build_ext
+
+dev:
+ CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) python setup.py build_ext --inplace --debug
+
+build_ext:
+ CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) python setup.py build_ext --debug
+
+clean:
+ - rm -rf build
+ - rm -rf consumers
+ - rm -f output*.html
+ - rm -f output*.docx
+ - rm -f dummy*.docx
+ - find ./ -name '*.so' -delete
diff --git a/consumers/dfwebserver/python/other.html b/consumers/dfwebserver/python/other.html
new file mode 100644
index 0000000..14778ef
--- /dev/null
+++ b/consumers/dfwebserver/python/other.html
@@ -0,0 +1 @@
+<begin>text</begin>
\ No newline at end of file
diff --git a/consumers/dfwebserver/python/setup.py b/consumers/dfwebserver/python/setup.py
new file mode 100644
index 0000000..8675b22
--- /dev/null
+++ b/consumers/dfwebserver/python/setup.py
@@ -0,0 +1,64 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from distutils.core import setup, Extension
+
+# define the extension module
+dfutil_module = Extension('dfutil',
+ sources=['src/dfutil.c', '../../consumers/dfutil/src/Commands.c'],
+ libraries = ['DocFormats', 'xml2'],
+ extra_compile_args = ['-std=c99'],
+ library_dirs = ['../../build/lib'],
+ include_dirs = [
+ '../../DocFormats/api/headers',
+ '../../DocFormats/core/src/common',
+ '../../DocFormats/core/src/css',
+ '../../DocFormats/core/src/html',
+ '../../DocFormats/core/src/lib',
+ '../../DocFormats/core/src/names',
+ '../../DocFormats/core/src/xml',
+ '../../DocFormats/core/tests/common',
+ '../../DocFormats/core/tests/html',
+ '../../DocFormats/filters/latex/src',
+ '../../DocFormats/filters/ooxml/src/common',
+ '../../DocFormats/filters/ooxml/src/word',
+ '../../DocFormats/filters/ooxml/tests/word',
+ '../../DocFormats/headers',
+ ]
+)
+
+dfconvert_module = Extension('dfconvert',
+ sources=['src/dfconvert.c'],
+ libraries = ['DocFormats', 'xml2', 'SDL2', 'SDL_image'],
+ extra_compile_args = ['-std=c99'],
+ library_dirs = ['../../build/lib'],
+ include_dirs = [
+ '../../DocFormats/api/headers',
+ '../../DocFormats/core/src/common',
+ '../../DocFormats/core/src/css',
+ '../../DocFormats/core/src/html',
+ '../../DocFormats/core/src/lib',
+ '../../DocFormats/core/src/names',
+ '../../DocFormats/core/src/xml',
+ '../../DocFormats/core/tests/common',
+ '../../DocFormats/core/tests/html',
+ '../../DocFormats/filters/latex/src',
+ '../../DocFormats/filters/ooxml/src/common',
+ '../../DocFormats/filters/ooxml/src/word',
+ '../../DocFormats/filters/ooxml/tests/word',
+ '../../DocFormats/headers',
+ ]
+)
+
+# run the setup
+setup(ext_modules=[dfutil_module, dfconvert_module])
diff --git a/consumers/dfwebserver/python/src/dfconvert.c b/consumers/dfwebserver/python/src/dfconvert.c
new file mode 100644
index 0000000..b284222
--- /dev/null
+++ b/consumers/dfwebserver/python/src/dfconvert.c
@@ -0,0 +1,108 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include <Python.h>
+
+typedef struct DFError DFError;
+void DFErrorRelease(DFError *error);
+const char *DFErrorMessage(DFError **error);
+
+// Abstraction level 1
+
+int DFGetFile(const char *concrete, const char *abstract, DFError **error);
+int DFPutFile(const char *concrete, const char *abstract, DFError **error);
+int DFCreateFile(const char *concrete, const char *abstract, DFError **error);
+
+
+static PyObject* get_func(PyObject* self, PyObject* args)
+{
+ DFError *error = NULL;
+
+ char * concrete = NULL;
+ char * abstract = NULL;
+
+ if (!PyArg_ParseTuple(args, "ss", &concrete, &abstract)) {
+ return NULL;
+ }
+
+ if (DFGetFile(concrete, abstract, &error)) {
+ Py_RETURN_TRUE;
+ }
+
+ fprintf(stderr,"%s\n",DFErrorMessage(&error));
+ DFErrorRelease(error);
+ Py_RETURN_FALSE;
+}
+
+static PyObject* put_func(PyObject* self, PyObject* args)
+{
+ DFError *error = NULL;
+
+ char * concrete = NULL;
+ char * abstract = NULL;
+
+ if (!PyArg_ParseTuple(args, "ss", &concrete, &abstract)) {
+ return NULL;
+ }
+
+ if (DFPutFile(concrete, abstract, &error)) {
+ Py_RETURN_TRUE;
+ }
+
+ fprintf(stderr,"%s\n",DFErrorMessage(&error));
+ DFErrorRelease(error);
+ Py_RETURN_FALSE;
+}
+
+static PyObject* create_func(PyObject* self, PyObject* args)
+{
+ DFError *error = NULL;
+
+ char * concrete = NULL;
+ char * abstract = NULL;
+
+ if (!PyArg_ParseTuple(args, "ss", &concrete, &abstract)) {
+ return NULL;
+ }
+
+ if (DFCreateFile(concrete, abstract, &error)) {
+ Py_RETURN_TRUE;
+ }
+
+ fprintf(stderr,"%s\n",DFErrorMessage(&error));
+ DFErrorRelease(error);
+ Py_RETURN_FALSE;
+}
+
+
+/* define functions in module */
+static PyMethodDef dfconvertMethods[] =
+{
+ {"get", get_func, METH_VARARGS, "Create a new HTML file from input document"},
+ {"put", put_func, METH_VARARGS, "Update an existing Word document based on a modified HTML file."},
+ {"create", create_func, METH_VARARGS, "Create a new Word document from a HTML file. The Word document must not already exist."},
+ {NULL, NULL, 0, NULL}
+};
+
+
+/* module initialization */
+PyMODINIT_FUNC
+
+initdfconvert(void)
+{
+ (void) Py_InitModule("dfconvert", dfconvertMethods);
+}
diff --git a/consumers/dfwebserver/python/src/dfutil.c b/consumers/dfwebserver/python/src/dfutil.c
new file mode 100644
index 0000000..9e7b689
--- /dev/null
+++ b/consumers/dfwebserver/python/src/dfutil.c
@@ -0,0 +1,64 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include <Python.h>
+
+typedef struct DFError DFError;
+void DFErrorRelease(DFError *error);
+const char *DFErrorMessage(DFError **error);
+
+int normalizeFile(const char *filename, DFError **error);
+
+static PyObject* normalize_func(PyObject* self, PyObject* args)
+{
+ DFError *dferr = NULL;
+
+ char * filename = NULL;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ /* if the above function returns -1, an appropriate Python exception will
+ * have been set, and the function simply returns NULL
+ */
+ }
+
+ if (filename!=NULL) {
+ if (1 == normalizeFile(filename, &dferr)) {
+ Py_RETURN_TRUE;
+ }
+ fprintf(stderr,"%s\n",DFErrorMessage(&dferr));
+ DFErrorRelease(dferr);
+ }
+
+ Py_RETURN_FALSE;
+}
+
+
+/* define functions in module */
+static PyMethodDef dfutilMethods[] =
+{
+ {"normalize", normalize_func, METH_VARARGS, "evaluate the sine"},
+ {NULL, NULL, 0, NULL}
+};
+
+/* module initialization */
+PyMODINIT_FUNC
+
+initdfutil(void)
+{
+ (void) Py_InitModule("dfutil", dfutilMethods);
+}
diff --git a/consumers/dfwebserver/python/test.py b/consumers/dfwebserver/python/test.py
new file mode 100644
index 0000000..213ee2b
--- /dev/null
+++ b/consumers/dfwebserver/python/test.py
@@ -0,0 +1,42 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# To test:
+#
+# make clean dev
+# python test.py
+
+import unittest
+
+import dfutil
+import dfconvert
+import shutil
+
+
+class MyTest(unittest.TestCase):
+ def test(self):
+
+ self.assertTrue(dfutil.normalize("other.html"))
+
+ self.assertTrue(dfconvert.get("input.docx", "output.html"))
+
+ shutil.copyfile("input.docx", "dummy.docx");
+
+ self.assertTrue(dfconvert.put("dummy.docx", "output.html"))
+
+ self.assertTrue(dfconvert.create("output.docx", "output.html"))
+
+
+if __name__ == '__main__':
+ unittest.main()
+
diff --git a/consumers/dfwebserver/python/testSubprocess.py b/consumers/dfwebserver/python/testSubprocess.py
new file mode 100644
index 0000000..e3bcfa6
--- /dev/null
+++ b/consumers/dfwebserver/python/testSubprocess.py
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import threading
+import time
+
+import dfconvert
+
+exitFlag = 0
+
+class dfconvertThread (threading.Thread):
+ def __init__(self, threadID, name, input, abstract):
+ threading.Thread.__init__(self)
+ self.threadID = threadID
+ self.name = name
+ self.input = input
+ self.abstract = abstract
+ def run(self):
+ print "Starting " + self.name
+ if exitFlag:
+ thread.exit()
+ status = dfconvert.get(self.input, self.abstract);
+ print "%s: %s status:%s" % (self.name, time.ctime(time.time()), status)
+ print "Exiting " + self.name
+
+# Create new threads
+thread1 = dfconvertThread(1, "Thread-1", "input.docx", "output1.html")
+thread2 = dfconvertThread(2, "Thread-2", "input.docx", "output2.html")
+thread3 = dfconvertThread(3, "Thread-3", "input.docx", "output3.html")
+thread4 = dfconvertThread(4, "Thread-4", "input.docx", "output4.html")
+thread5 = dfconvertThread(5, "Thread-5", "input.docx", "output5.html")
+
+# Start new Threads
+thread1.start()
+thread2.start()
+thread3.start()
+thread4.start()
+thread5.start()
+
+print "Exiting Main Thread"
\ No newline at end of file
diff --git a/consumers/dfwebserver/src/dfconvert.c b/consumers/dfwebserver/src/dfconvert.c
new file mode 100644
index 0000000..99698fc
--- /dev/null
+++ b/consumers/dfwebserver/src/dfconvert.c
@@ -0,0 +1,91 @@
+#include <Python.h>
+
+typedef struct DFError DFError;
+void DFErrorRelease(DFError *error);
+const char *DFErrorMessage(DFError **error);
+
+// Abstraction level 1
+
+int DFGetFile(const char *concrete, const char *abstract, DFError **error);
+int DFPutFile(const char *concrete, const char *abstract, DFError **error);
+int DFCreateFile(const char *concrete, const char *abstract, DFError **error);
+
+
+static PyObject* get_func(PyObject* self, PyObject* args)
+{
+ DFError *error = NULL;
+
+ char * concrete = NULL;
+ char * abstract = NULL;
+
+ if (!PyArg_ParseTuple(args, "ss", &concrete, &abstract)) {
+ return NULL;
+ }
+
+ if (DFGetFile(concrete, abstract, &error)) {
+ Py_RETURN_TRUE;
+ }
+
+ fprintf(stderr,"%s\n",DFErrorMessage(&error));
+ DFErrorRelease(error);
+ Py_RETURN_FALSE;
+}
+
+static PyObject* put_func(PyObject* self, PyObject* args)
+{
+ DFError *error = NULL;
+
+ char * concrete = NULL;
+ char * abstract = NULL;
+
+ if (!PyArg_ParseTuple(args, "ss", &concrete, &abstract)) {
+ return NULL;
+ }
+
+ if (DFPutFile(concrete, abstract, &error)) {
+ Py_RETURN_TRUE;
+ }
+
+ fprintf(stderr,"%s\n",DFErrorMessage(&error));
+ DFErrorRelease(error);
+ Py_RETURN_FALSE;
+}
+
+static PyObject* create_func(PyObject* self, PyObject* args)
+{
+ DFError *error = NULL;
+
+ char * concrete = NULL;
+ char * abstract = NULL;
+
+ if (!PyArg_ParseTuple(args, "ss", &concrete, &abstract)) {
+ return NULL;
+ }
+
+ if (DFCreateFile(concrete, abstract, &error)) {
+ Py_RETURN_TRUE;
+ }
+
+ fprintf(stderr,"%s\n",DFErrorMessage(&error));
+ DFErrorRelease(error);
+ Py_RETURN_FALSE;
+}
+
+
+/* define functions in module */
+static PyMethodDef dfconvertMethods[] =
+{
+ {"get", get_func, METH_VARARGS, "Create a new HTML file from input document"},
+ {"put", put_func, METH_VARARGS, "Update an existing Word document based on a modified HTML file."},
+ {"create", create_func, METH_VARARGS, "Create a new Word document from a HTML file. The Word document must not already exist."},
+ {NULL, NULL, 0, NULL}
+};
+
+
+/* module initialization */
+PyMODINIT_FUNC
+
+initdfconvert(void)
+{
+ (void) Py_InitModule("dfconvert", dfconvertMethods);
+}
diff --git a/consumers/dfwebserver/src/dfutil.c b/consumers/dfwebserver/src/dfutil.c
new file mode 100644
index 0000000..8c50aa9
--- /dev/null
+++ b/consumers/dfwebserver/src/dfutil.c
@@ -0,0 +1,47 @@
+#include <Python.h>
+
+typedef struct DFError DFError;
+void DFErrorRelease(DFError *error);
+const char *DFErrorMessage(DFError **error);
+
+int normalizeFile(const char *filename, DFError **error);
+
+static PyObject* normalize_func(PyObject* self, PyObject* args)
+{
+ DFError *dferr = NULL;
+
+ char * filename = NULL;
+
+ if (!PyArg_ParseTuple(args, "s", &filename)) {
+ return NULL;
+ /* if the above function returns -1, an appropriate Python exception will
+ * have been set, and the function simply returns NULL
+ */
+ }
+
+ if (filename!=NULL) {
+ if (1 == normalizeFile(filename, &dferr)) {
+ Py_RETURN_TRUE;
+ }
+ fprintf(stderr,"%s\n",DFErrorMessage(&dferr));
+ DFErrorRelease(dferr);
+ }
+
+ Py_RETURN_FALSE;
+}
+
+
+/* define functions in module */
+static PyMethodDef dfutilMethods[] =
+{
+ {"normalize", normalize_func, METH_VARARGS, "evaluate the sine"},
+ {NULL, NULL, 0, NULL}
+};
+
+/* module initialization */
+PyMODINIT_FUNC
+
+initdfutil(void)
+{
+ (void) Py_InitModule("dfutil", dfutilMethods);
+}
diff --git a/consumers/dfwebserver/web/WARNING_EXPERIMENTAL b/consumers/dfwebserver/web/WARNING_EXPERIMENTAL
new file mode 100644
index 0000000..ea6861f
--- /dev/null
+++ b/consumers/dfwebserver/web/WARNING_EXPERIMENTAL
@@ -0,0 +1,7 @@
+The code in this directory is just meant to give proof of concept, and do NOT adhere to the normal apache Policy.
+
+Remark we use third party software here, that are not and will not be part of a corinthia release.
+
+This directory is not being build with the standard corinthia build.
+
+
diff --git a/consumers/dfwebserver/web/client/index.html b/consumers/dfwebserver/web/client/index.html
new file mode 100644
index 0000000..4b983f6
--- /dev/null
+++ b/consumers/dfwebserver/web/client/index.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <script src="../../../web/client/ui.js"></script>
+ <script src="../../../web/client/uxeditor.js"></script>
+ <script src="../../../web/client/interface.js"></script>
+</head>
+<script>
+ var core = null;
+ var iface = null;
+
+ function init() {
+ var element = document.getElementById("_editor");
+ core = new UXEditor(element);
+ iface = new UXInterface(core);
+ iface.setup(function() {
+ console.log("iface setup complete");
+ },
+ "",
+ "/Editor/src", "/consumers/web/client");
+ }
+
+ function doDummyGet() {
+ document.getElementById("_content").src = "/consumers/dfwebserver/pool/sample.docx/sample.html";
+
+ }
+</script>
+<style>
+ html,
+ body {
+ width: 100%;
+ height: 100%;
+ }
+ body {
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+ padding-top: 64px;
+ }
+ div.toolbar {
+ padding: 0;
+ border: none;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ height: 50px;
+ background-color: #eee;
+ xvisibility: hidden;
+ }
+ div.toolbar2 {
+ border: none;
+ position: absolute;
+ top: 50px;
+ left: 0px;
+ width: 100%;
+ height: 14px;
+ background-color: #ddd;
+ xvisibility: hidden;
+ text-align: center;
+ }
+
+ iframe.contentframe {
+ border: none;
+ }
+ div#_contentWrapper {
+ border: none;
+ }
+</style>
+
+<body onload="init()">
+
+ <div class="toolbar" id="_toolbar">
+ </div>
+ <div class="toolbar2" id="_toolbar2">
+ <a href="javascript:doDummyGet();">GET</a>
+ </div>
+ <div style="border: 1px solid black; display: none">
+ Formatting
+ <pre id="_formatting" style="background-color: #eee">
+</pre>
+ </div>
+
+ <div id="_editor"></div>
+
+
+</body>
+
+</html>
diff --git a/consumers/web/WARNING_EXPERIMENTAL b/consumers/web/WARNING_EXPERIMENTAL
new file mode 100644
index 0000000..ea6861f
--- /dev/null
+++ b/consumers/web/WARNING_EXPERIMENTAL
@@ -0,0 +1,7 @@
+The code in this directory is just meant to give proof of concept, and do NOT adhere to the normal apache Policy.
+
+Remark we use third party software here, that are not and will not be part of a corinthia release.
+
+This directory is not being build with the standard corinthia build.
+
+
diff --git a/consumers/web/client/builtin.css b/consumers/web/client/builtin.css
new file mode 100644
index 0000000..fd6e6b6
--- /dev/null
+++ b/consumers/web/client/builtin.css
@@ -0,0 +1,36 @@
+.uxwrite-autocorrect { background-color: #c0ffc0; }
+.uxwrite-selection { background-color: rgb(201,221,238); }
+.uxwrite-spelling { background-color: rgb(255,128,128); }
+.uxwrite-match { background-color: rgb(255,255,0); }
+
+span.footnote::before {
+ content: " [ ";
+ color: #157efb;
+ font-weight: bold;
+}
+
+span.footnote::after {
+ content: " ] ";
+ color: #157efb;
+ font-weight: bold;
+}
+
+span.footnote {
+ color: #606060;
+}
+
+span.endnote::before {
+ content: " [ ";
+ color: #ca1cff;
+ font-weight: bold;
+}
+
+span.endnote::after {
+ content: " ] ";
+ color: #ca1cff;
+ font-weight: bold;
+}
+
+span.endnote {
+ color: #606060;
+}
diff --git a/consumers/web/client/images/bold-on.png b/consumers/web/client/images/bold-on.png
new file mode 100644
index 0000000..b06b225
--- /dev/null
+++ b/consumers/web/client/images/bold-on.png
Binary files differ
diff --git a/consumers/web/client/images/bold.png b/consumers/web/client/images/bold.png
new file mode 100644
index 0000000..7e68024
--- /dev/null
+++ b/consumers/web/client/images/bold.png
Binary files differ
diff --git a/consumers/web/client/images/indent.png b/consumers/web/client/images/indent.png
new file mode 100644
index 0000000..904a6aa
--- /dev/null
+++ b/consumers/web/client/images/indent.png
Binary files differ
diff --git a/consumers/web/client/images/italic-on.png b/consumers/web/client/images/italic-on.png
new file mode 100644
index 0000000..696047a
--- /dev/null
+++ b/consumers/web/client/images/italic-on.png
Binary files differ
diff --git a/consumers/web/client/images/italic.png b/consumers/web/client/images/italic.png
new file mode 100644
index 0000000..93ca99b
--- /dev/null
+++ b/consumers/web/client/images/italic.png
Binary files differ
diff --git a/consumers/web/client/images/list-none-on.png b/consumers/web/client/images/list-none-on.png
new file mode 100644
index 0000000..b4022fc
--- /dev/null
+++ b/consumers/web/client/images/list-none-on.png
Binary files differ
diff --git a/consumers/web/client/images/list-none.png b/consumers/web/client/images/list-none.png
new file mode 100644
index 0000000..09b2555
--- /dev/null
+++ b/consumers/web/client/images/list-none.png
Binary files differ
diff --git a/consumers/web/client/images/list-ol-on.png b/consumers/web/client/images/list-ol-on.png
new file mode 100644
index 0000000..01e44f3
--- /dev/null
+++ b/consumers/web/client/images/list-ol-on.png
Binary files differ
diff --git a/consumers/web/client/images/list-ol.png b/consumers/web/client/images/list-ol.png
new file mode 100644
index 0000000..7555fbd
--- /dev/null
+++ b/consumers/web/client/images/list-ol.png
Binary files differ
diff --git a/consumers/web/client/images/list-ul-on.png b/consumers/web/client/images/list-ul-on.png
new file mode 100644
index 0000000..a034288
--- /dev/null
+++ b/consumers/web/client/images/list-ul-on.png
Binary files differ
diff --git a/consumers/web/client/images/list-ul.png b/consumers/web/client/images/list-ul.png
new file mode 100644
index 0000000..22d6e50
--- /dev/null
+++ b/consumers/web/client/images/list-ul.png
Binary files differ
diff --git a/consumers/web/client/images/outdent.png b/consumers/web/client/images/outdent.png
new file mode 100644
index 0000000..582af61
--- /dev/null
+++ b/consumers/web/client/images/outdent.png
Binary files differ
diff --git a/consumers/web/client/images/underline-on.png b/consumers/web/client/images/underline-on.png
new file mode 100644
index 0000000..250268a
--- /dev/null
+++ b/consumers/web/client/images/underline-on.png
Binary files differ
diff --git a/consumers/web/client/images/underline.png b/consumers/web/client/images/underline.png
new file mode 100644
index 0000000..9e0564c
--- /dev/null
+++ b/consumers/web/client/images/underline.png
Binary files differ
diff --git a/consumers/web/client/index.html b/consumers/web/client/index.html
new file mode 100644
index 0000000..175cec7
--- /dev/null
+++ b/consumers/web/client/index.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="ui.js"></script>
+ <script src="uxeditor.js"></script>
+ <script src="interface.js"></script>
+</head>
+<script>
+var core = null;
+var iface = null;
+
+function init()
+{
+ var element = document.getElementById("_editor");
+ core = new UXEditor(element);
+ iface = new UXInterface(core);
+ iface.setup(function() {
+ console.log("iface setup complete");
+ }, "sample.html", "../../../Editor/src", ".");
+// core.callbacks = iface.callbacks;
+// core.setup(function() {
+// core.op.cursor.test(3,4,5);
+// });
+}
+</script>
+<style>
+html, body { width: 100%; height: 100%; }
+
+body {
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+ padding-top: 64px;
+}
+
+div.toolbar {
+ border: none;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ height: 64px;
+ background-color: #eee;
+ xvisibility: hidden;
+}
+
+iframe.contentframe {
+ border: none;
+}
+
+div#_contentWrapper {
+ border: none;
+}
+</style>
+<body onload="init()">
+
+<div class="toolbar" id="_toolbar">
+ <!--
+ <span id="_btnBold">Bold</span>
+ |
+ <span id="_btnItalic">Italic</span>
+ |
+ <span id="_btnUnderline">Underline</span>
+ |
+ <span id="_btnListNone">No list</span>
+ |
+ <span id="_btnListUL">UL</span>
+ |
+ <span id="_btnListOL">OL</span>
+ |
+ <span id="_btnListOutdent">Outdent</span>
+ |
+ <span id="_btnListIndent">Indent</span>
+ |
+ -->
+</div>
+<div style="border: 1px solid black; display: none">
+Formatting
+<pre id="_formatting" style="background-color: #eee">
+</pre>
+</div>
+
+<div id="_editor"></div>
+
+
+</body>
+</html>
diff --git a/consumers/web/client/interface.js b/consumers/web/client/interface.js
new file mode 100644
index 0000000..ec2deb2
--- /dev/null
+++ b/consumers/web/client/interface.js
@@ -0,0 +1,371 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+function UXInterface(core)
+{
+ var self = this;
+ var elemFormatting = document.getElementById("_formatting");
+ var setupDone = false;
+ var callbacks = null;
+ var lastReceivedFormatting = {};
+ var formatting = {};
+ var cursorDiv = null;
+ var dragging = false;
+ var buttons = {};
+
+ function hideCursor()
+ {
+ if (cursorDiv != null) {
+ core.cdoc.body.removeChild(cursorDiv);
+ cursorDiv = null;
+ }
+ }
+
+ function hideOverlaysWhileExecuting(fun)
+ {
+ if (cursorDiv != null)
+ cursorDiv.style.visibility = "hidden";
+ try {
+ return fun();
+ }
+ finally {
+ if (cursorDiv != null)
+ cursorDiv.style.visibility = "visible";
+ }
+ }
+
+ // DOM event handlers
+ function mouseDown(event)
+ {
+ var x = event.clientX;
+ var y = event.clientY;
+
+ var targetClass = event.target.getAttribute("class");
+ console.log("mouseDown "+event.clientX+", "+event.clientY+", class "+targetClass);
+ console.log("body height = "+core.cdoc.body.getBoundingClientRect().height);
+
+ dragging = true;
+ hideOverlaysWhileExecuting(function() {
+ core.op.selection.dragSelectionBegin(x,y,false);
+ });
+
+ updateFormatting();
+ event.preventDefault();
+ }
+
+ function mouseUp(event)
+ {
+ dragging = false;
+ updateFormatting();
+ event.preventDefault();
+ }
+
+ function mouseMove(event)
+ {
+ if (dragging) {
+ core.op.selection.dragSelectionUpdate(event.clientX,event.clientY,false);
+ updateFormatting();
+ }
+ event.preventDefault();
+ }
+
+
+ function keyDown(event)
+ {
+ if (event.keyCode == 13) {
+ core.op.cursor.enterPressed();
+ updateFormatting();
+ event.preventDefault();
+ }
+ else if (event.keyCode == 8) {
+ core.op.cursor.deleteCharacter();
+ updateFormatting();
+ event.preventDefault();
+ }
+ }
+
+ function keyUp(event)
+ {
+ if ((event.keyCode == 13) || (event.keyCode == 8))
+ event.preventDefault();
+ }
+
+ function keyPress(event)
+ {
+ core.op.cursor.insertCharacter(String.fromCharCode(event.charCode));
+ updateFormatting();
+ event.preventDefault();
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ function markFormattingDirty()
+ {
+ var changes = {};
+ for (var key in formatting)
+ changes[key] = formatting[key];
+
+ // When calling updateFormatting(), we have to ensure that any properties we
+ // wish to clear are present in the object, but set to null. While the following
+ // code might appear to do nothing, what it's actually searching for are missing
+ // properties, which it explicitly adds as null.
+ for (var key in lastReceivedFormatting) {
+ console.log("lastReceivedFormatting["+JSON.stringify(key)+"] = "+
+ JSON.stringify(lastReceivedFormatting[key]));
+ if (changes[key] == null)
+ changes[key] = null;
+ }
+
+ console.log("caling applyFormattingChanges: "+JSON.stringify(changes));
+ core.op.formatting.applyFormattingChanges(null,changes);
+ updateFormatting();
+ }
+
+ function toggleBold()
+ {
+ console.log("toggleBold()");
+ if (formatting["font-weight"] != null)
+ delete formatting["font-weight"];
+ else
+ formatting["font-weight"] = "bold";
+ markFormattingDirty();
+ }
+
+ function toggleItalic()
+ {
+ console.log("toggleItalic()");
+ if (formatting["font-style"] != null)
+ delete formatting["font-style"];
+ else
+ formatting["font-style"] = "italic";
+ markFormattingDirty();
+ }
+
+ function toggleUnderline()
+ {
+ console.log("toggleUnderline()");
+ if (formatting["text-decoration"] != null)
+ delete formatting["text-decoration"];
+ else
+ formatting["text-decoration"] = "underline";
+ markFormattingDirty();
+ }
+
+ function pressListUL()
+ {
+ if (formatting["-uxwrite-in-ul"] != null)
+ core.op.lists.clearList();
+ else
+ core.op.lists.setUnorderedList();
+ markFormattingDirty();
+ }
+
+ function pressListOL()
+ {
+ if (formatting["-uxwrite-in-ol"] != null)
+ core.op.lists.clearList();
+ else
+ core.op.lists.setOrderedList();
+ markFormattingDirty();
+ }
+
+ function pressListOutdent()
+ {
+ core.op.lists.decreaseIndent();
+ markFormattingDirty();
+ }
+
+ function pressListIndent()
+ {
+ var inUL = formatting["-uxwrite-in-ul"];
+ var inOL = formatting["-uxwrite-in-ol"];
+ if (!inUL && !inOL)
+ core.op.lists.setUnorderedList();
+ else
+ core.op.lists.increaseIndent();
+ markFormattingDirty();
+ }
+
+
+
+
+
+ function retrieveStyles()
+ {
+ console.log("retrieveStyles: this = "+this.constructor.name);
+ console.log("retrieveStyles: self = "+self.constructor.name);
+ }
+
+ function updateOutline()
+ {
+ }
+
+ function shallowCopy(object)
+ {
+ var result = {};
+ for (var key in object)
+ result[key] = object[key];
+ return result;
+ }
+
+ function updateFormatting()
+ {
+ console.log("updateFormatting()");
+ lastReceivedFormatting = core.op.formatting.getFormatting();
+ formatting = shallowCopy(lastReceivedFormatting);
+ console.log("formatting = "+JSON.stringify(formatting));
+ while (elemFormatting.firstChild != null)
+ elemFormatting.removeChild(elemFormatting.firstChild);
+ for (var key in formatting) {
+ var str = key+" = "+formatting[key];
+ elemFormatting.appendChild(document.createTextNode(str+"\n"));
+ }
+
+ var inUL = formatting["-uxwrite-in-ul"];
+ var inOL = formatting["-uxwrite-in-ol"];
+
+ buttons.bold.setValue(formatting["font-weight"] != null);
+ buttons.italic.setValue(formatting["font-style"] != null);
+ buttons.underline.setValue(formatting["text-decoration"] != null);
+ buttons.listUL.setValue(inUL);
+ buttons.listOL.setValue(inOL);
+ }
+
+ function setup(completion, iframeSrc, editorSrc, resources)
+ {
+ var toolbar = document.getElementById("_toolbar");
+
+ buttons.bold = new Button(resources + "/images/bold");
+ buttons.italic = new Button(resources + "/images/italic");
+ buttons.underline = new Button(resources + "/images/underline");
+ buttons.listUL = new Button(resources + "/images/list-ul");
+ buttons.listOL = new Button(resources + "/images/list-ol");
+ buttons.listOutdent = new Button(resources + "/images/outdent");
+ buttons.listIndent = new Button(resources + "/images/indent");
+
+ toolbar.appendChild(buttons.bold.element);
+ toolbar.appendChild(buttons.italic.element);
+ toolbar.appendChild(buttons.underline.element);
+ toolbar.appendChild(buttons.listUL.element);
+ toolbar.appendChild(buttons.listOL.element);
+ toolbar.appendChild(buttons.listOutdent.element);
+ toolbar.appendChild(buttons.listIndent.element);
+
+ core.callbacks = callbacks;
+ core.setup(function() {
+ setupDone = true;
+
+ retrieveStyles();
+ updateOutline();
+ updateFormatting();
+
+ buttons.bold.onMouseDown = toggleBold;
+ buttons.italic.onMouseDown = toggleItalic;
+ buttons.underline.onMouseDown = toggleUnderline;
+ buttons.listUL.onMouseDown = pressListUL;
+ buttons.listOL.onMouseDown = pressListOL;
+ buttons.listOutdent.onMouseDown = pressListOutdent;
+ buttons.listIndent.onMouseDown = pressListIndent;
+
+ core.cdoc.documentElement.addEventListener("mousedown",mouseDown,true);
+ core.cdoc.documentElement.addEventListener("mouseup",mouseUp,true);
+ core.cdoc.documentElement.addEventListener("mousemove",mouseMove,true);
+
+ document.body.addEventListener("keydown",keyDown,true);
+ document.body.addEventListener("keyup",keyUp,true);
+ document.body.addEventListener("keypress",keyPress,true);
+
+ if (completion != null)
+ completion();
+ }, iframeSrc, editorSrc, resources);
+ }
+
+ callbacks = {
+ debug: function(str) {
+ console.log("cb debug("+JSON.stringify(str)+")");
+ },
+ error: function(error,type) {
+ console.log("cb error("+JSON.stringify(error)+","+
+ JSON.stringify(type)+")");
+ },
+ addOutlineItem: function(itemId,type,title) {
+ console.log("cb addOutlineItem("+JSON.stringify(itemId)+","+
+ JSON.stringify(type)+","+
+ JSON.stringify(title)+")");
+ },
+ updateOutlineItem: function(itemId,title) {
+ console.log("cb updateOutlineItem("+JSON.stringify(itemId)+","+
+ JSON.stringify(title)+")");
+ },
+ removeOutlineItem: function(itemId) {
+ console.log("cb removeOutlineItem("+JSON.stringify(itemId)+")");
+ },
+ outlineUpdated: function() {
+ console.log("cb outlineUpdated()");
+ },
+ setCursor: function(x,y,width,height) {
+ console.log("cb setCursor("+x+","+y+","+width+","+height+")");
+
+
+ if (cursorDiv == null) {
+ cursorDiv = document.createElement("div");
+ core.cdoc.body.appendChild(cursorDiv);
+ }
+
+ var iframeRect = core.iframe.getBoundingClientRect();
+ cursorDiv.style.display = "block";
+ cursorDiv.style.position = "absolute";
+ cursorDiv.style.backgroundColor = "blue";
+ cursorDiv.style.left = x+"px";
+ cursorDiv.style.top = y+"px";
+ cursorDiv.style.width = width+"px";
+ cursorDiv.style.height = height+"px";
+ cursorDiv.setAttribute("class","cursor");
+ },
+ setSelectionHandles: function(x1,y1,height1,x2,y2,height2) {
+ console.log("cb setSelectionHandles("+x1+","+y1+","+height1+","+
+ x2+","+y2+","+height2+")");
+ hideCursor();
+ },
+ setTableSelection: function(x,y,width,height) {
+ console.log("cb setTableSelection("+x+","+y+","+width+","+height+")");
+ hideCursor();
+ },
+ setSelectionBounds: function(left,top,right,bottom) {
+ console.log("cb setSelectionBounds("+left+","+top+","+right+","+bottom+")");
+ },
+ clearSelectionHandlesAndCursor: function() {
+ console.log("cb clearSelectionHandlesAndCursor()");
+ hideCursor();
+ },
+ updateAutoCorrect: function() {
+ console.log("cb updateAutoCorrect()");
+ },
+ };
+
+ this.setup = setup;
+}
diff --git a/consumers/web/client/sample.html b/consumers/web/client/sample.html
new file mode 100644
index 0000000..c7a584a
--- /dev/null
+++ b/consumers/web/client/sample.html
@@ -0,0 +1,1130 @@
+<!DOCTYPE html>
+
+<html lang="en-AU">
+<head>
+ <meta charset="utf-8">
+ <meta name="generator" content="UX Write 2.0.2 (build 4b4faea); iOS 7.1">
+
+ <title></title>
+ <style>
+blockquote {
+ font-style: italic;
+ }
+
+ body {
+ counter-reset: h1 h2 h3 h4 h5 h6 figure table;
+ font-family: Palatino;
+ xmargin: 10%;
+ text-align: justify;
+ }
+
+ caption {
+ caption-side: bottom;
+ counter-increment: table;
+ }
+
+ caption.Unnumbered {
+ counter-increment: table 0;
+ }
+
+ caption.Unnumbered::before, figcaption.Unnumbered::before {
+ content: "";
+ }
+
+ caption::before {
+ content: "Table " counter(table) ": ";
+ }
+
+ figcaption {
+ counter-increment: figure;
+ }
+
+ figcaption.Unnumbered {
+ counter-increment: figure 0;
+ }
+
+ figcaption::before {
+ content: "Figure " counter(figure) ": ";
+ }
+
+ figure {
+ margin-bottom: 12pt;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 12pt;
+ text-align: center;
+ }
+
+ h1 {
+ counter-increment: h1;
+ counter-reset: h2 h3 h4 h5 h6;
+ }
+
+ h1.Unnumbered, h2.Unnumbered, h3.Unnumbered, h4.Unnumbered, h5.Unnumbered, h6.Unnumbered {
+ }
+
+ h1::before {
+ content: counter(h1) " ";
+ }
+
+ h2 {
+ color: #585958;
+ counter-increment: h2;
+ counter-reset: h3 h4 h5 h6;
+ }
+
+ h2::before {
+ content: counter(h1) "." counter(h2) " ";
+ }
+
+ h3 {
+ counter-increment: h3;
+ counter-reset: h4 h5 h6;
+ }
+
+ h3::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) " ";
+ }
+
+ h4 {
+ counter-increment: h4;
+ counter-reset: h5 h6;
+ }
+
+ h4::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) " ";
+ }
+
+ h5 {
+ counter-increment: h5;
+ counter-reset: h6;
+ }
+
+ h5::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) " ";
+ }
+
+ h6 {
+ counter-increment: h6;
+ }
+
+ h6::before {
+ content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6) " ";
+ }
+
+ nav.listoffigures::before {
+ content: "List of Figures";
+ display: block;
+ font-size: 2em;
+ font-weight: bold;
+ margin-bottom: .67em;
+ margin-top: .67em;
+ }
+
+ nav.listoftables::before {
+ content: "List of Tables";
+ display: block;
+ font-size: 2em;
+ font-weight: bold;
+ margin-bottom: .67em;
+ margin-top: .67em;
+ }
+
+ nav.tableofcontents::before {
+ content: "Contents";
+ display: block;
+ font-size: 2em;
+ font-weight: bold;
+ margin-bottom: .67em;
+ margin-top: .67em;
+ }
+
+ p {
+ line-height: 166%;
+ }
+
+ p.abstract {
+ font-style: italic;
+ margin-left: 20%;
+ margin-right: 20%;
+ }
+
+ p.author {
+ font-size: 18pt;
+ text-align: center;
+ }
+
+ p.NoSpacing {
+ margin: 0%;
+ }
+
+ p.SpecialNote {
+ color: red;
+ font-weight: bold;
+ text-align: center;
+ }
+
+ p.Tip {
+ background-color: #eeeeee;
+ border: hidden;
+ border-radius: 10px;
+ margin-left: 5%;
+ margin-right: 5%;
+ padding: 10pt;
+ }
+
+ p.Title {
+ font-size: 36pt;
+ font-weight: bold;
+ margin-bottom: 24pt;
+ text-align: center;
+ text-decoration: underline;
+ }
+
+ p.toc1 {
+ margin-bottom: 6pt;
+ margin-left: 0pt;
+ margin-top: 12pt;
+ }
+
+ p.toc2 {
+ margin-bottom: 6pt;
+ margin-left: 24pt;
+ margin-top: 6pt;
+ }
+
+ p.toc3 {
+ margin-bottom: 6pt;
+ margin-left: 48pt;
+ margin-top: 6pt;
+ }
+
+ table {
+ border-collapse: collapse;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ td > :first-child, th > :first-child {
+ margin-top: 0;
+ }
+
+ td > :last-child, th > :last-child {
+ margin-bottom: 0;
+ }
+
+ td, th {
+ border: 1px solid black;
+ }
+ </style>
+</head>
+
+<body>
+
+ <h1 id="item9">Introduction</h1>
+
+ <p>UX Write is designed for long-form, professional writing tasks such as
+ reports, research papers, theses, and books. With an emphasis on technical
+ and academic writing, it provides tools to work with the <i>content</i> and
+ <i>structure</i> of your document separately from its <i>presentation</i>.
+ The latter is controlled by <i>styles</i>, such as headings, normal
+ paragraphs, and the document title.</p>
+
+ <h2 id="item19">What you see is what you mean</h2>
+
+ <p>The design philosophy of UX Write is “what you see is what you mean”, or
+ WYSIWYM. By separating content from presentation, and making the logical
+ structure of documents explicit, it is possible for the layout and rendering
+ of text to adapt to the output medium. This means your documents look just as
+ good on a 30“ desktop monitor as they do on a 7” tablet or the printed
+ page.</p>
+
+ <p>The structure of your document — such as the hierarchy of section headings
+ — also enables other useful features. A table of contents is generated
+ automatically, without you having to manually update text or page numbers.
+ Cross-references can be added and kept up-to-date as section numbers change.
+ The outline view, accessible from the toolbar, displays all the sections,
+ figures, and tables in your document, allowing you to navigate around
+ easily.</p>
+
+ <p>A contrasting approach is “what you see is what you get”, or WYSIWYG,
+ supported by programs like Microsoft Word and Pages. This attempts to
+ replicate the precise layout of a printed page on screen during editing,
+ regardless of whether you're using a desktop computer or a mobile phone.
+ While useful for some purposes, we believe it's the wrong approach for a
+ mobile word processor. UX Write is unapologetically WYSIWYM, and is optimised
+ for readability and ease-of-use across both iPhone and iPad.</p>
+
+ <p class="Tip">If you've got this document open for editing, take a moment
+ now to explore the document outline (third toolbar button from right). Try
+ adjusting the text size in the “Look & feel” section of the settings menu
+ (second from right) to suit your reading preferences. Rotate your screen and
+ watch as the text reflows.</p>
+
+ <h2 id="item17">File formats</h2>
+
+ <p>The native file format of UX Write is HTML — the language of the web. You
+ can view HTML documents on any device or operating system out there, and
+ publish online without any need for file conversion. If you open a Microsoft
+ Word document, it is temporarily converted to HTML for editing, and then
+ saved back again afterwards. Any parts of the document that could not be
+ converted, such as embedded spreadsheets, are preserved in the original Word
+ document.</p>
+
+ <h1 id="item8">Basic features</h1>
+
+ <h2 id="item11">Accessing your Documents</h2>
+
+ <p>You can store your documents on your device only — under
+ “My iPad” or “My iPhone” — or sync them with a cloud service such as Dropbox.
+ In the former case, you can transfer files to your computer using <a href=
+ "http://support.apple.com/kb/HT4094">iTunes file sharing</a>, and in the
+ latter case you can either access your files through the respective service's
+ website, or by installing the service's software on your computer. Box,
+ Dropbox, Google Drive, and Microsoft OneDrive all have clients available for
+ Windows and Mac which you can install for free.</p>
+
+ <p>File synchronisation happens automatically. Whenever a
+ document is saved, it is uploaded in the background, while you continue
+ working. If you have your computer set up for syncing, you will usually see
+ these changes appear within a few seconds. Within UX Write, you can check for
+ updates to existing documents using the refresh button.</p>
+
+ <p>If you're working offline, you can still add and change documents in any
+ of the Box, Dropbox, Google Drive, OneDrive or WebDAV locations you have set
+ up. When you have an Internet connection available again, just launch UX
+ Write, and it will attempt to upload the documents. To move, copy, or delete
+ documents, simply tap the “Edit” button in the file browser.</p>
+
+ <p class="Tip"><b>Tip:</b> We recommend creating and storing all your
+ documents on Dropbox, because it keeps backup copies of every version
+ uploaded for 30 days. You can view and recover old versions of your document
+ if the need arises — see Section <a href="#item10">4.1</a>.</p>
+
+ <h2 id="item4">Editing</h2>
+
+ <p>Text editing works in much the same way as in any other iOS app, but with
+ a few enhancements:</p>
+
+ <ul>
+ <li>
+ <p>An extra row of keys above the keyboard provides access to common
+ punctuation symbols</p>
+ </li>
+
+ <li>
+ <p>The two leftmost keys let you move the cursor or select text by
+ holding them down to bring up a virtual trackpad. Swipe with one finger
+ to move slowly, and two fingers to move faster.</p>
+ </li>
+
+ <li>
+ <p>The formatting key, when held down, replaces the other top-row keys
+ with keys for basic formatting options like bold, italic, and lists</p>
+ </li>
+
+ <li>
+ <p>The autocorrect key allows you to confirm or revert the latest
+ autocorrect replacement (see Section <a href="#item2">2.5</a> for more
+ details)</p>
+ </li>
+
+ <li>
+ <p>You can triple-tap anywhere in the text to select the whole
+ paragraph</p>
+ </li>
+ </ul>
+
+ <p>Note: The keyboard extensions are only available on the iPad.</p>
+
+ <p>UX Write also includes full support for external bluetooth keyboards, and
+ supports all of the standard keyboard shortcuts:</p>
+
+ <table style="width: 100%;" id="item7">
+ <caption>
+ Keyboard shortcuts
+ </caption>
+
+ <colgroup>
+ <col width="50%">
+ <col width="50%">
+ </colgroup>
+
+ <tbody>
+ <tr>
+ <td>
+ <p>Cmd-B</p>
+ </td>
+
+ <td>
+ <p>Bold</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-I</p>
+ </td>
+
+ <td>
+ <p>Italic</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-U</p>
+ </td>
+
+ <td>
+ <p>Underline</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-X</p>
+ </td>
+
+ <td>
+ <p>Cut</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-C</p>
+ </td>
+
+ <td>
+ <p>Copy</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-V</p>
+ </td>
+
+ <td>
+ <p>Paste</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-A</p>
+ </td>
+
+ <td>
+ <p>Select all</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Option-Left/Right</p>
+ </td>
+
+ <td>
+ <p>Move back or forward one word</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Option-Up/Down</p>
+ </td>
+
+ <td>
+ <p>Move up or down one paragraph</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-Left/Right</p>
+ </td>
+
+ <td>
+ <p>Move to start or end of line</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Cmd-Up/Down</p>
+ </td>
+
+ <td>
+ <p>Move to start of end of document</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <p>Shift-Arrow key (+ Cmd or Option)</p>
+ </td>
+
+ <td>
+ <p>Any of the above, but for selection</p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ <h2 id="item5">Styles</h2>
+
+ <p>All formatting in UX Write, with the exception of
+ bold, italic, underline and lists, is controlled using <i>styles</i> —
+ such as headings and normal paragraphs. A style serves two purposes:</p>
+
+ <ol>
+ <li>
+ <p>It determines the <i>formatting</i> of the text, such
+ as the font, colour, and paragraph alignment. When a style is modified,
+ all text associated with that style automatically adopts the new
+ formatting, making it easy to ensure consistent presentation throughout
+ your document.</p>
+ </li>
+
+ <li>
+ <p>It indicates the <i>purpose</i> of a piece of text,
+ such as a heading or title. UX Write uses this information for various
+ purposes, such as building a table of contents, displaying the outline
+ view, and determining the possible targets for cross-references.</p>
+ </li>
+ </ol>
+
+ <p>UX Write Basic Edition provides a plain set of built-in styles for
+ headings, block quotes, a document title, and normal text. UX Write
+ Professional Edition allows you to modify the appearance of these built-in
+ styles, as well as create your own; see Section <a href=
+ "#item29">3.1</a> for details.</p>
+
+ <h2 id="item6">Auto correct</h2>
+
+ <p>Automatic correction of typing mistakes can sometimes lead to unexpected
+ results, since no piece of software can accurately guess what you meant to
+ type in every case. When UX Write makes a correction, it highlights it in
+ green, and gives you the opportunity to confirm whether or not it has made
+ the right replacement.</p>
+
+ <p>Tapping on a highlighted word brings up a menu that allows you to accept
+ the correction, revert to the original, or bring up a list of more
+ suggestions, with the option to add the word to the custom dictionary. Any
+ substitutions you explicitly accept are remembered by UX Write, and will
+ occur automatically the next time you make the same typing mistake. You can
+ access the custom dictionary and list of automatic substitutions via the
+ settings menu.</p>
+
+ <h2 id="item2">Outline Navigation</h2>
+
+ <p>You can use the outline view — the third toolbar button
+ from the right — to view the structure of your document and quickly jump
+ between sections. This is particularly useful for large documents, where
+ scrolling would be a hassle.</p>
+
+ <p>The outline view is based on the headings, figures, and
+ tables in your document. For headings to be included, you must mark them as
+ such using the formatting menu. Tables and figures are always included. As
+ you modify your document by adding, removing, or changing content, the
+ outline is automatically kept up-to-date. UX Write Professional Edition also
+ allows you to edit the outline — see Section <a href="#item30">3.4</a> for
+ details.</p>
+
+ <p>In landscape mode on the iPad, you can “pin” the outline to
+ the left of your screen, and it will be displayed alongside your document. To
+ pin or unpin it, use the button at the top of the outline. To hide the
+ outline when it is pinned, press the 'X' button.</p>
+
+ <p>The outline view corresponds directly to what in the table
+ of contents, list of figures, and list of tables, if you have added any of
+ these to your document. See Section <a href="#item32">3.9</a> for
+ details.</p>
+
+ <h1 id="item27">Professional features</h1>
+
+ <p>This section describes features that are only available in
+ UX Write Professional Edition. You can upgrade to this by either purchasing
+ it outright, or by subscribing on a monthly basis. Go to the settings menu
+ and select “View upgrade options” to see details.</p>
+
+ <h2 id="item29">Styles</h2>
+
+ <p>Styles, introduced in Section <a href=
+ "#item5">2.3</a>, define both the formatting and purpose of text in your
+ document. Heading styles, for instance, denote the document outline, and are
+ used for constructing the table of contents. Each style can have different
+ formatting properties, such as fonts, colours, margins, paragraph alignment,
+ borders, and more.</p>
+
+ <p>Using styles enables you to achieve consistent formatting
+ throughout your entire document. Instead of manually changing formatting on a
+ case-by-case basis — as many other word processors encourage you to do — you
+ adjust a style once and it applies to all text in the document associated
+ with the style. This is useful for ensuring your document complies with
+ requirements from your organisation or publisher.</p>
+
+ <p>UX Write provides a number of built-in styles, based on
+ those present in HTML. There are six levels of headings, in addition
+ to normal paragraphs and block quotes. You can change the way any of
+ these are formatted, and also add your own custom styles for specific
+ purposes. For example, this document contains a “Tip” style, which appears as
+ a light-grey box with rounded corners, and left and right margins that place
+ it in the center of the page.</p>
+
+ <p>To manage styles, go to the formatting menu, and select
+ “Edit Styles”. This will bring up the style manager, with a list of styles on
+ the left, and formatting properties on either the top or right of the screen
+ (depending on your screen orientation).</p>
+
+ <p>To edit an existing style, simply select it in the list, and change any of
+ the formatting properties. You will see a preview displayed below the
+ controls that shows an example piece of text as it would be displayed in the
+ document.</p>
+
+ <p>To add a new style, scroll down to the bottom of the list and tap next to
+ the green '+' button. Type in your style name and press enter. You can now
+ set up the formatting for this style, and subsequently select it from the
+ formatting menu in the editor.</p>
+
+ <p>Direct formatting is still available if you want it, via
+ the item near the bottom of the formatting menu. This gives you the same
+ properties as are available in the style editor, but the changes only apply
+ to the current selection.</p>
+
+ <p>Styles you create in UX Write are compatible with Word, and
+ you can also edit and use the styles in Word itself.</p>
+
+ <p class="Tip"><b>Tip:</b> If you want to re-use your styles with multiple
+ documents, you can set up a template for creating new documents. See Section
+ <a href="#item15">3.13</a> for details.</p>
+
+ <h2 id="item39">Formatting</h2>
+
+ <p>There are two ways to adjust formatting:</p>
+
+ <ul>
+ <li>
+ <p><b>Styles.</b> You can select these from the formatting
+ menu; they apply at the paragraph level. Generally, you should use styles
+ to control formatting, as this provides structural information about the
+ document (in the case of headings), and allows you to easily change
+ formatting throughout the whole document for any given style.</p>
+ </li>
+
+ <li>
+ <p><b>Direct formatting.</b> You can also select this from
+ the formatting menu; this is intended for “one-off” cases where you wish
+ to format a particular piece of text without defining a style, such as
+ highlighting something important. You have access to all the same
+ formatting options as you do for styles. Direct formatting corresponds to
+ what you would see in the toolbar of Microsoft Word; we've deliberately
+ de-emphasised it in the user interface to encourage the use of
+ styles.</p>
+ </li>
+ </ul>
+
+ <p>All of the formatting properties directly correspond to
+ those of CSS (Cascading Style Sheets), the web standard used in conjunction
+ with HTML. In most cases, the CSS formatting properties UX Write supports can
+ also be translated directly to those of Microsoft Word; the main exception is
+ that Word has a slightly different way of handling paragraph borders and
+ margins.</p>
+
+ <p>Formatting properties are divided into two categories:
+ <i>text</i> and <i>paragraph</i>. Text properties, in the case of direct
+ formatting, can be applied to only a portion of a paragraph. The rest apply
+ to the paragraph as a whole.</p>
+
+ <h2 id="item26">Document structure</h2>
+
+ <p>Most formal documents like reports and books are divided
+ into multiple levels of <b>sections</b>, with <b>cross-references</b> between
+ them, and a <b>table of contents</b> at the front. Styles are key to
+ achieving this, because the program needs to be told which pieces of text are
+ headings — it can't simply guess that “18 point bold” means a second-level
+ heading. By using styles to mark all your headings, you can take advantage of
+ the following features:</p>
+
+ <ul>
+ <li>
+ <p>Table of contents (Insert menu)</p>
+ </li>
+
+ <li>
+ <p>Cross-references (Insert menu)</p>
+ </li>
+
+ <li>
+ <p>Automatic numbering</p>
+ </li>
+
+ <li>
+ <p>Outline editor (Outline button on toolbar)</p>
+ </li>
+ </ul>
+
+ <p>Whenever a section number changes as a result of changes
+ earlier in the document, its number is automatically updated, as are those of
+ all references that point to it, and the table of contents. The same is true
+ of figures and tables. When you print or generate a PDF, page numbers are
+ automatically calculated for you and included in the table of contents.</p>
+
+ <h2 id="item30">Outline editing</h2>
+
+ <p>You can rearrange and delete sections in the outline by
+ pressing the “Edit button”. To change the order of sections, tap and drag the
+ section name to your desired position. To delete an item, just press the red
+ button on the left, and confirm by pressing the “Delete” button that appears.
+ All changes you make in the outline editor are immediately reflected in the
+ document, including updates to numbering.</p>
+
+ <h2 id="item35">Find and replace</h2>
+
+ <p>On iPad, a search bar is visible at the top of the screen,
+ and you can just type in your search term and hit enter. Tap the down arrow
+ to view options, including replacement text. On iPhone, the search bar and
+ options are accessible via the settings menu.</p>
+
+ <p>By default, searching will look for the exact text you have
+ entered, with case sensitivity determined by whether you have selected that
+ option. Alternatively, you can search and replace text using <i>regular
+ expressions</i>, which allow you to enter patterns that can match multiple
+ snippets of text. Regular expression support is mainly intended for advanced
+ users, such as programmers, who are already familiar with the concept. If you
+ would like to learn more, we recommend the tutorial at at <a href=
+ "http://regexone.com">regexone.com</a>.</p>
+
+ <h2 id="item36">Spell checking</h2>
+
+ <p>The spell checking option will search through your document
+ and highlight any instances of words it finds which are not in the system or
+ custom dictionaries.</p>
+
+ <p>The language used is determined by the following three
+ settings, in order:</p>
+
+ <ul>
+ <li>
+ <p>Language for the current document (Settings > This
+ Document > Language)</p>
+ </li>
+
+ <li>
+ <p>Default language for UX Write (Settings >
+ Application > Language)</p>
+ </li>
+
+ <li>
+ <p>System language (set in the Settings app of your iPad
+ or iPhone)</p>
+ </li>
+ </ul>
+
+ <p>There is currently no support for handling multiple
+ languages in a single document. The set of languages available for spell
+ checking is determined by the built-in dictionaries provided by the operating
+ system, which as of 7.1 are:</p>
+
+ <ul>
+ <li>
+ <p class="NoSpacing">Danish</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Dutch</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">English (Australia)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">English (Canada)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">English (United Kingdom)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">English (United States)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">French</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">German</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Italian</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Portuguese (Brazil)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Portuguese (Portugal)</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Russian</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Spanish</p>
+ </li>
+
+ <li>
+ <p class="NoSpacing">Swedish</p>
+ </li>
+ </ul>
+
+ <h2 id="item37">Word count</h2>
+
+ <p>You can view the word count for your document from the
+ settings menu. This also includes the total number of characters and
+ paragraphs.</p>
+
+ <h2 id="item31">Automatic numbering</h2>
+
+ <p>UX Write can assign numbers to all headings, figures, and
+ tables automatically. For headings, you can turn this on using the “Heading
+ numbering” option in the settings menu. For figures and tables, you can set
+ this on an individual basis either at insertion time, or by tapping on the
+ item and selecting “Figure” or “Table” in the popup menu.</p>
+
+ <p>Numbering is updated automatically as the document changes.
+ If you add or remove a heading, change it's nesting level (e.g.
+ from Heading 2 to Heading 1), or move sections around using the outline
+ editor, the numbers will be updated to reflect the changes. The same is also
+ true for figures and tables.</p>
+
+ <p>All cross-references, plus the table of contents, list of
+ figures, and list of tables (if present) are also kept up to date whenever
+ the numbers change. This ensures that you never have out-of-date references
+ and you don't have to remember to manually update other parts of the
+ document. </p>
+
+ <h2 id="item32">Table of contents</h2>
+
+ <p>While it's possible to manually create a table of contents
+ in any word processor, doing so is tedious, particularly when keeping all the
+ section titles and page numbers up to date. In UX Write, inserting a table of
+ contents causes it to be constructed automatically based on the headings,
+ just like the outline view described in Section <a href=
+ "#item30">3.4</a>. And like automatic numbering and the outline view, every
+ time you add or remove a section, or change its title, the table of contents
+ automatically updates to reflect the change.</p>
+
+ <p>Page numbers are <i>not</i> displayed in the table of
+ contents during editing or when saving as a HTML file, as neither has any
+ concept of distinct pages. When you print or export to PDF, the correct page
+ numbers will be filled in for you. There's no need to do this manually.</p>
+
+ <p>You can also insert a list of figures or list of tables,
+ which work similarly to the table of contents. The text shown in these comes
+ from the captions, with the numbers shown in the same way as section numbers.
+ As with the table of contents, these are always kept in sync with the rest of
+ document.</p>
+
+ <p>If your document is in HTML format, the table of contents,
+ list of figures, and list of tables will appear as links that can be clicked
+ to jump to the appropriate section when viewed in a web browser.</p>
+
+ <h2 id="item1">Cross-references</h2>
+
+ <p>You can insert a cross-reference to any section heading,
+ figure, or table in your document. When you select this option from the
+ insert menu, you'll see a document outline (the same as in the outline view),
+ and can select a target of the cross-reference.</p>
+
+ <p>References appear as hyperlinks in the document. When you
+ tap on one, you'll have the option to either go to the target of the
+ reference, or change it to point to a different section, figure, or
+ table.</p>
+
+ <p>If your reference is to a numbered heading, figure, or
+ table, the number will be updated whenever that of its target changes. If the
+ target is not numbered, the reference will contain the text instead, and will
+ also update whenever the text changes.</p>
+
+ <h2 id="item3">Footnotes and endnotes</h2>
+
+ <p>Because UX Write uses a continuous layout for editing, in
+ which the document is not divided into separate pages, footnotes are
+ displayed inline with the text<span class="footnote">A footnote looks like
+ this</span>. For consistency, and to avoid the need to jump back and forth
+ between the content and the end of the document, endnotes are handled in the
+ same way<span class="endnote">An endnote looks like this</span>.</p>
+
+ <p>HTML does not have any explicit support for either
+ footnotes or endnotes, in the sense that there is no <footnote> element
+ that can clearly indicate its purpose. UX Write uses <span> elements
+ with a class of “footnote” or “endnote” to represent these.</p>
+
+ <p>Microsoft Word documents <i>do</i> have explicit support
+ for both, so when editing a .docx file, UX Write will save them in the
+ appropriate format. When you open the document in Word, you'll see footnotes
+ at the bottom of the page, and endnotes at the end of the document.</p>
+
+ <p>To have footnotes and endnotes appear in their correct
+ positions in a print or PDF output, you must use the LaTeX typesetting option
+ (see Section <a href="#item23">3.12</a>). WebKit does not have the
+ capabilities to support pagination features.</p>
+
+ <h2 id="item23">Printing and PDF export</h2>
+
+ <p>Two different typesetting systems are supported for
+ producing print and PDF output. You can choose between these using the
+ “Typesetting” option under the settings menu:</p>
+
+ <ul>
+ <li>
+ <p><b>WebKit</b> (recommended). Safari's layout engine,
+ optimised for on-screen rendering of HTML content.</p>
+
+ <p>This is the layout engine used for displaying your
+ documents during editing, and the PDF files it generates match exactly
+ the formatting you see on screen; though line breaks will be different
+ for the printed page.</p>
+ </li>
+
+ <li>
+ <p><b>LaTeX</b> (new). The de-facto standard in many
+ scientific disciplines, optimised for high-quality typography and
+ paginated output.</p>
+
+ <p>Support for LaTeX is new in 2.0. Currently, only
+ limited formatting options are supported, and English is the only
+ supported language. We'll be improving this throughout the 2.x release
+ cycle, with support for other languages and many other features, such as
+ equations, bibliographies, and headers/footers.</p>
+ </li>
+ </ul>
+
+ <p>Of these two, only LaTeX is capable of correctly
+ typesetting footnotes and endnotes, as well as other pagination-dependent
+ features we'll be adding in the future. If you print or export to PDF using
+ WebKit, footnotes and endnotes will appear inline with the text, as they do
+ during editing.</p>
+
+ <h2 id="item15">Creating Templates</h2>
+
+ <p>Often you'll want to create a series of documents which all have a
+ consistent look and feel, based on styles that you have set up, as described
+ in Section <a href="#item29">3.1</a>. While UX Write does not have a “proper”
+ template feature (yet), you can get the same effect by creating a normal
+ document with your desired settings, and treating that as a starting point
+ for new documents.</p>
+
+ <p>To create a template:</p>
+
+ <ol>
+ <li>
+ <p>Create a new document, calling it “My template” (or whatever you
+ like)</p>
+ </li>
+
+ <li>
+ <p>Open the document and use the style manager to change the default
+ fonts, colours, and other formatting properties that you want</p>
+ </li>
+
+ <li>
+ <p>Create any custom styles that you will use regularly — e.g. “Title” or
+ “Abstract”</p>
+ </li>
+ </ol>
+
+ <p>To create a new document based on a template:</p>
+
+ <ol>
+ <li>
+ <p>Tap and hold on the template document in the file manager</p>
+ </li>
+
+ <li>
+ <p>Select “Duplicate”</p>
+ </li>
+
+ <li>
+ <p>Type in the name for your new document</p>
+ </li>
+
+ <li>
+ <p>Open the new document and start writing</p>
+ </li>
+ </ol>
+
+ <p>We'll be adding a more sophisticated mechanism for browsing and previewing
+ template files, along with a few nice samples, in a future update.</p>
+
+ <h1 id="item13">Common Tasks</h1>
+
+ <h2 id="item10">Dropbox Versioning</h2>
+
+ <p>One of the best features of Dropbox is that it automatically keeps old
+ versions of every file that's uploaded to it. It's always been possible to
+ log into the Dropbox website and access these old versions via their web
+ interface, but now you can do it directly from within UX Write itself.</p>
+
+ <p>If you ever need to recover an older version of a document, simply tap and
+ hold on it in the file browser, and select “Versions” in the popup menu. You
+ can then browse through all the versions that Dropbox has kept, and restore
+ the one you want. UX Write autosaves every three minutes, so if you're
+ connected to the Internet while you're working, you'll have regular snapshots
+ of your documents.<b></b></p>
+
+ <h2 id="item12">Converting from HTML to docx</h2>
+
+ <p>If you've upgraded from a previous version of UX Write and wish to convert
+ your HTML documents to .docx so they can be used with Microsoft Word, you can
+ do so as follows:</p>
+
+ <ul>
+ <li>
+ <p>Tap and hold on the document in the file browser</p>
+ </li>
+
+ <li>
+ <p>Select <b>Convert to</b> <b>docx</b></p>
+ </li>
+ </ul>
+
+ <p>Note that due to differences between the two file formats, there may be
+ some loss of formatting during the transition — for example, the rounded
+ borders used in the “Tip” style in this document can't be represented in
+ docx. For this reason, the original HTML file will be kept as a backup.</p>
+
+ <h1 id="item16">Troubleshooting</h1>
+
+ <h2 id="item18">Reporting Bugs</h2>
+
+ <p>If you encounter a crash in UX Write, you will be asked if you would like
+ to submit a bug report. This report includes a crash log indicating exactly
+ where in the program the problem occurred, as well as a redacted copy of your
+ document in which all text and images have been removed. An email window will
+ appear where you can add comments about what happened, and the bug report
+ will be sent to us when you hit “Send”. You can CC yourself a copy for
+ reference if you like.</p>
+
+ <p><b>If we can't reproduce it, we can't fix it.</b> Many people send in bug
+ reports containing just the crash log. Often, we can to determine from this
+ what went wrong, but this isn't always the case. To increase the chances of
+ us being able to fix the problem, try to provide a detailed description of
+ what you were doing right before the crash occurred.</p>
+
+ <p>The best bug reports provide a clear set of steps that explain how to
+ reproduce the problem. During beta testing of 2.0, one particularly helpful
+ person even used iPad screen recording software to make a video demonstrating
+ how to trigger a bug, edited the video in iMovie, and added an audio track
+ with narration to explain what was going on. You certainly don't have to go
+ to this much effort, but a few simple instructions in your email which
+ explain how to reliably reproduce a problem will help a lot.</p>
+
+ <p>If you encounter any other issues that do not involve a crash, such as
+ formatting inconsistencies or strange user interface behaviour, just select
+ the <b>Submit bug report</b> option from the settings menu and send us a
+ note. Remember, the more information, the better.</p>
+
+ <p>The app store does not provide developers with any way to directly respond
+ to bug reports included in reviews. You can say whatever you want, but
+ <b>please also let us know about your problem</b> in case we need to ask you
+ for more information in order to fix it.</p>
+
+ <h2 id="item14">Purchase and Subscription</h2>
+
+ <p>Every time you install something from the app store, iOS
+ includes a <i>receipt file</i> which is accessible to the app. This file
+ includes information about the version number of the app that you originally
+ downloaded, as well as any in-app payments you have made. UX Write looks at
+ this file to determine whether or not to enable the features in the
+ professional edition.</p>
+
+ <p>If you buy a new iPad or iPhone and install UX Write on it
+ via iTunes, this receipt file might not be present. If you have purchased or
+ subscribed to the app, it's necessary for UX Write to request a copy of the
+ receipt file from the app store so it can verify your upgrade status. You can
+ do this either from the intro screen shown at first launch, or by selecting
+ “Reactivate existing upgrade” from the settings menu.</p>
+
+ <p>If you originally purchased UX Write prior to the release
+ of version 2.0 (when it was a paid-only app), you should automatically have
+ access to the professional edition. The way UX Write determines this is by
+ looking at the receipt file and checking what the version number of the app
+ was at the time of your purchase. So if you see the app running as basic
+ edition, select “Reactivate existing upgrade” from the settings menu.</p>
+
+ <p>If you have any problems with upgrades or payments,
+ <a href="http://www.uxproductivity.com/support">please contact us</a>.</p>
+
+ <h2 id="item20">The Field Update Problem</h2>
+
+ <p>If you open a .docx file in Word after editing it in UX Write, you'll see
+ the following message:</p>
+
+ <blockquote>
+ “This document contains fields that may refer to other files. Do you want
+ to update the fields in this document?”
+ </blockquote>
+
+ <p>When you see this message, just click <b>Yes</b> (or press the <b>Y</b>
+ key).</p>
+
+ <p>Sadly, this is a symptom of a design flaw in Word, and is something only
+ Microsoft can fix. Unlike UX Write, Word does not keep the table of contents,
+ cross references, or figure/table numbers (all collectively known as
+ <b>Fields</b>) up to date automatically. Instead, it forces you to manually
+ tell it when it to update the fields after you have made changes to your
+ document.</p>
+
+ <p>Despite the fact that UX Write never actually produces fields that refer
+ to other files, this message is still displayed in every version of Word that
+ we have tested with, including Word 2013. The only way we could prevent such
+ a dialog from appearing is to store a setting in the document that tells Word
+ that there is no need to update the fields — but this would simply leave you
+ with an invalid table of contents and incorrect cross-references. While we've
+ done our best to ensure that UX Write provides the best user experience
+ within the app itself, we're not able to fix Word.</p>
+
+ <h2 id="item22">Opening .doc files</h2>
+
+ <p>Microsoft Word has used a number of different file formats over the years,
+ and UX Write only supports the most recent version, .docx, which is a modern,
+ XML-based, well-documented open standard. The older .doc format is a
+ proprietary and very complex binary file format that would take a minimum of
+ six months to support. We've decided that time is better spent on other
+ useful features instead.</p>
+
+ <p>If you have a .doc file that you wish to edit in UX Write, you can convert
+ it to .docx by opening it in any recent version of Word (2007 and later), and
+ using “Save as” to convert it to docx. Doing so will maintain all of the
+ content and formatting, and provide exactly the same experience when working
+ with the document in Word itself. You will then have your document in a much
+ more portable format, and be able to edit it in Word, UX Write, and other
+ word processors such as LibreOffice.</p>
+
+ <h1 id="item28">More information</h1>
+
+ <p>If you have a question that isn't answered here, check out
+ our <a href="http://www.uxproductivity.com/support">support website</a> for
+ more info. We also maintain a <a href=
+ "http://blog.uxproductivity.com">blog</a> discussing the development of the
+ app and new features that are in the works. Many of our posts discuss various
+ questions people have had about UX Write and may provide you with a deeper
+ understanding of why certain aspects of the app are the way they are.</p>
+
+ <p>We value any feedback you have about the app, and you can
+ send it to us any time via the option on the settings menu. We receive a
+ <i>lot</i> of email, and can't guarantee to respond individually or add every
+ requested feature, but we certainly take into account your feedback when
+ deciding on priorities for future updates.</p>
+</body>
+</html>
diff --git a/consumers/web/client/ui.js b/consumers/web/client/ui.js
new file mode 100644
index 0000000..08e263b
--- /dev/null
+++ b/consumers/web/client/ui.js
@@ -0,0 +1,75 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+function Button(imagePrefix)
+{
+ var self = this;
+ var mouseInside = false;
+
+ this.element = document.createElement("div");
+ this.element.style.display = "inline-block";
+ this.element.style.width = "20px";
+ this.element.style.height = "20px";
+ this.element.style.padding = "10px";
+ this.element.style.margin = "8px";
+ this.element.style.borderWidth = "4px";
+ this.element.style.borderRadius = "4px";
+ this.element.addEventListener("mousedown",function() {
+ if (self.onMouseDown != null)
+ self.onMouseDown();
+ });
+ this.element.addEventListener("mouseover",function() {
+ mouseInside = true;
+ updateBackgroundColor();
+ });
+ this.element.addEventListener("mouseout",function() {
+ mouseInside = false;
+ updateBackgroundColor();
+ });
+
+
+ this.img = document.createElement("img");
+ this.img.style.width = "20px";
+ this.img.style.height = "20px";
+ this.element.appendChild(this.img);
+
+
+ this.value = false;
+
+ this.setValue = function(newValue)
+ {
+ this.value = newValue;
+ if (this.value)
+ this.img.setAttribute("src",imagePrefix+"-on.png");
+ else
+ this.img.setAttribute("src",imagePrefix+".png");
+ updateBackgroundColor();
+ }
+
+ function updateBackgroundColor()
+ {
+ var color = "transparent";
+ if (mouseInside)
+ color = "#ccc";
+ else if (self.value)
+ color = "#000";
+ self.element.style.backgroundColor = color;
+ self.element.style.borderColor = color;
+ }
+
+ this.setValue(false);
+}
diff --git a/consumers/web/client/uxeditor.js b/consumers/web/client/uxeditor.js
new file mode 100644
index 0000000..45fe5e4
--- /dev/null
+++ b/consumers/web/client/uxeditor.js
@@ -0,0 +1,320 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+var IMPL_DIR = "../../../Editor/src";
+var RESOURCES_DIR = ".";
+
+function UXEditor(element)
+{
+ var self = this;
+ var doc = element.ownerDocument;
+ var iframeWrapper = null;
+ var iframe = null;
+ var setupCompletion = null;
+ var pendingScripts = {};
+ var doneScriptInit = false;
+
+ console.log("UXEditor: element = "+element);
+ console.log("UXEditor: doc = "+doc);
+
+ function setup(completion, iframeSrc, editorSrc, resources)
+ {
+ setupCompletion = completion;
+ IMPL_DIR = editorSrc;
+ RESOURCES_DIR = resources;
+ iframeWrapper = doc.createElement("div");
+// iframeWrapper.setAttribute("id","_contentWrapper");
+ iframeWrapper.setAttribute("tabindex","0");
+ iframeWrapper.style.border = "none";
+
+ iframe = doc.createElement("iframe");
+ iframe.setAttribute("id","_content");
+ iframe.addEventListener("load",iframeLoaded);
+ iframe.setAttribute("src", iframeSrc); //"sample.html";
+ iframe.style.border = "none";
+// iframe.setAttribute("class","contentframe");
+
+ iframeWrapper.appendChild(iframe);
+ element.appendChild(iframeWrapper);
+
+ self.iframeWrapper = iframeWrapper;
+ self.iframe = iframe;
+
+ window.onresize = updateIFrameSize;
+ updateIFrameSize();
+ }
+
+ function updateIFrameSize()
+ {
+ var width = window.innerWidth;
+ var height = window.innerHeight - 64;
+
+ iframe.style.width = width+"px";
+ iframe.style.height = height+"px";
+ iframeWrapper.style.width = width+"px";
+ iframeWrapper.style.height = height+"px";
+ }
+
+ function iframeLoaded()
+ {
+ console.log("iframe loaded");
+ self.cdoc = iframe.contentDocument;
+ self.cwin = iframe.contentWindow;
+
+ var javascriptFiles = ["first.js",
+ "ElementTypes.js",
+ "AutoCorrect.js",
+ "ChangeTracking.js",
+ "Clipboard.js",
+ "Cursor.js",
+ "DOM.js",
+ "Editor.js",
+ "Equations.js",
+ "Figures.js",
+ "Formatting.js",
+ "Hierarchy.js",
+ "Input.js",
+ "Lists.js",
+ "Main.js",
+ "Metadata.js",
+ "NodeSet.js",
+ "Outline.js",
+ "Position.js",
+ "PostponedActions.js",
+ "Range.js",
+ "Selection.js",
+ "3rdparty/showdown/showdown.js",
+ "Scan.js",
+ "StringBuilder.js",
+ "Styles.js",
+ "Tables.js",
+ "Text.js",
+ "traversal.js",
+ "types.js",
+ "UndoManager.js",
+ "util.js",
+ "Viewport.js"];
+
+ // We first create all the script objects and set their onload properties. Only *after*
+ // that do we actually add them to the document. This ensures that pendingScripts will
+ // only ever become empty after all the scripts have definitely loaded.
+ var scripts = [];
+ for (var i = 0; i < javascriptFiles.length; i++) {
+ var src = IMPL_DIR+"/"+javascriptFiles[i];
+ var script = document.createElement("script");
+ script.setAttribute("src",src);
+ pendingScripts[src] = true;
+ script.onload = function(e) { scriptLoaded(e.target); }
+ scripts.push(script);
+ }
+
+ // Now add the script elements to the document, triggering their load
+ for (var i = 0; i < scripts.length; i++)
+ self.cdoc.head.appendChild(scripts[i]);
+ }
+
+ function scriptLoaded(script)
+ {
+ delete pendingScripts[script.getAttribute("src")];
+ console.log("loadedScript: "+script.getAttribute("src")+
+ "; remaining = "+Object.keys(pendingScripts).length);
+ if (Object.keys(pendingScripts).length > 0)
+ return;
+
+ if (!doneScriptInit) {
+ doneScriptInit = true;
+ console.log("Now we should init");
+
+ self.cwin.Main_init(800,150, RESOURCES_DIR + "/builtin.css",false);
+
+ if (setupCompletion != null)
+ setupCompletion();
+ }
+ }
+
+ function invokeCallbacks()
+ {
+ var messages = JSON.parse(self.cwin.Editor_getBackMessages());
+
+ if (self.callbacks == null)
+ return;
+ console.log("messages.length = "+messages.length);
+ for (var i = 0; i < messages.length; i++) {
+ var name = messages[i][0];
+ var args = messages[i].slice(1);
+ if ((self.callbacks != null) && (self.callbacks[name] != null))
+ self.callbacks[name].apply(null,args);
+ }
+ }
+
+ function wrap(name)
+ {
+ return function() {
+ var argsArray = [];
+ var args = new Array();
+ console.log("arguments.length = "+arguments.length);
+ for (var i = 0; i < arguments.length; i++) {
+ args.push(arguments[i]);
+ }
+ var res = self.cwin.Main_execute(function() {
+ return self.cwin[name].apply(null,args);
+ });
+ invokeCallbacks();
+
+ // Ensure we have a completely separate copy of the data
+ if (res == null) {
+ return null;
+ }
+ else {
+ var str = JSON.stringify(res);
+ return JSON.parse(str);
+ }
+ }
+ }
+
+ var op = {
+ clipboard: {
+ cut: wrap("Clipboard_cut"),
+ copy: wrap("Clipboard_copy"),
+ pasteText: wrap("Clipboard_pasteText"),
+ pasteHTML: wrap("Clipboard_pasteHTML"),
+ },
+ cursor: {
+ positionCursor: wrap("Cursor_positionCursor"),
+ getCursorPosition: wrap("Cursor_getCursorPosition"),
+ insertReference: wrap("Cursor_insertReference"),
+ insertLink: wrap("Cursor_insertLink"),
+ insertCharacter: wrap("Cursor_insertCharacter"),
+ deleteCharacter: wrap("Cursor_deleteCharacter"),
+ enterPressed: wrap("Cursor_enterPressed"),
+ getPrecedingWord: wrap("Cursor_getPrecedingWord"),
+ getLinkProperties: wrap("Cursor_getLinkProperties"),
+ setLinkProperties: wrap("Cursor_setLinkProperties"),
+ setReferenceTarget: wrap("Cursor_setReferenceTarget"),
+ insertFootnote: wrap("Cursor_insertFootnote"),
+ insertEndnote: wrap("Cursor_insertEndnote"),
+ test: wrap("Cursor_test"),
+ },
+ figures: {
+ insertFigure: wrap("Figures_insertFigure"),
+ getSelectedFigureId: wrap("Figures_getSelectedFigureId"),
+ getProperties: wrap("Figures_getProperties"),
+ setProperties: wrap("Figures_setProperties"),
+ getGeometry: wrap("Figures_getGeometry"),
+ },
+ formatting: {
+ getFormatting: wrap("Formatting_getFormatting"),
+ applyFormattingChanges: wrap("Formatting_applyFormattingChanges"),
+ },
+ input: {
+ },
+ lists: {
+ increaseIndent: wrap("Lists_increaseIndent"),
+ decreaseIndent: wrap("Lists_decreaseIndent"),
+ clearList: wrap("Lists_clearList"),
+ setUnorderedList: wrap("Lists_setUnorderedList"),
+ setOrderedList: wrap("Lists_setOrderedList"),
+ },
+ main: {
+ getLanguage: wrap("Main_getLanguage"),
+ setLanguage: wrap("Main_setLanguage"),
+ setGenerator: wrap("Main_setGenerator"),
+ prepareForSave: wrap("Main_prepareForSave"),
+ getHTML: wrap("Main_getHTML"),
+ isEmptyDocument: wrap("Main_isEmptyDocument"),
+ },
+ outline: {
+ getOutline: wrap("Outline_getOutline"),
+ moveSection: wrap("Outline_moveSection"),
+ deleteItem: wrap("Outline_deleteItem"),
+ goToItem: wrap("Outline_goToItem"),
+ scheduleUpdateStructure: wrap("Outline_scheduleUpdateStructure"),
+ setTitle: wrap("Outline_setTitle"),
+ setNumbered: wrap("Outline_setNumbered"),
+ insertTableOfContents: wrap("Outline_insertTableOfContents"),
+ insertListOfFigures: wrap("Outline_insertListOfFigures"),
+ insertListOfTables: wrap("Outline_insertListOfTables"),
+ setPrintMode: wrap("Outline_setPrintMode"),
+ examinePrintLayout: wrap("Outline_examinePrintLayout"),
+ detectSectionNumbering: wrap("Outline_detectSectionNumbering"),
+ findUsedStyles: wrap("Outline_findUsedStyles"),
+ },
+ scan: {
+ reset: wrap("Scan_reset"),
+ next: wrap("Scan_next"),
+ addMatch: wrap("Scan_addMatch"),
+ showMatch: wrap("Scan_showMatch"),
+ replaceMatch: wrap("Scan_replaceMatch"),
+ removeMatch: wrap("Scan_removeMatch"),
+ goToMatch: wrap("Scan_goToMatch"),
+ },
+ selection: {
+ update: wrap("Selection_update"),
+ selectAll: wrap("Selection_selectAll"),
+ selectParagraph: wrap("Selection_selectParagraph"),
+ selectWordAtCursor: wrap("Selection_selectWordAtCursor"),
+ dragSelectionBegin: wrap("Selection_dragSelectionBegin"),
+ dragSelectionUpdate: wrap("Selection_dragSelectionUpdate"),
+ moveStartLeft: wrap("Selection_moveStartLeft"),
+ moveStartRight: wrap("Selection_moveStartRight"),
+ moveEndLeft: wrap("Selection_moveEndLeft"),
+ moveEndRight: wrap("Selection_moveEndRight"),
+ setSelectionStartAtCoords: wrap("Selection_setSelectionStartAtCoords"),
+ setSelectionEndAtCoords: wrap("Selection_setSelectionEndAtCoords"),
+ setTableSelectionEdgeAtCoords: wrap("Selection_setTableSelectionEdgeAtCoords"),
+ print: wrap("Selection_print"),
+ },
+ styles: {
+ getCSSText: wrap("Styles_getCSSText"),
+ setCSSText: wrap("Styles_setCSSText"),
+ getParagraphClass: wrap("Styles_getParagraphClass"),
+ setParagraphClass: wrap("Styles_setParagraphClass"),
+ },
+ tables: {
+ insertTable: wrap("Tables_insertTable"),
+ addAdjacentRow: wrap("Tables_addAdjacentRow"),
+ addAdjacentColumn: wrap("Tables_addAdjacentColumn"),
+ removeAdjacentRow: wrap("Tables_removeAdjacentRow"),
+ removeAdjacentColumn: wrap("Tables_removeAdjacentColumn"),
+ clearCells: wrap("Tables_clearCells"),
+ mergeCells: wrap("Tables_mergeCells"),
+ splitSelection: wrap("Tables_splitSelection"),
+ getSelectedTableId: wrap("Tables_getSelectedTableId"),
+ getProperties: wrap("Tables_getProperties"),
+ setProperties: wrap("Tables_setProperties"),
+ setColWidths: wrap("Tables_setColWidths"),
+ getGeometry: wrap("Tables_getGeometry"),
+ },
+ undoManager: {
+ getLength: wrap("UndoManager_getLength"),
+ getIndex: wrap("UndoManager_getIndex"),
+ setIndex: wrap("UndoManager_setIndex"),
+ undo: wrap("UndoManager_undo"),
+ redo: wrap("UndoManager_redo"),
+ newGroup: wrap("UndoManager_newGroup"),
+ groupType: wrap("UndoManager_groupType"),
+ },
+ };
+
+ self.setup = setup;
+ self.op = op;
+ self.callbacks = null;
+ self.cdoc = null;
+ self.cwin = null;
+ self.iframeWrapper = null;
+ self.iframe = null;
+}
diff --git a/external/README.txt b/external/README.txt
index efbbfb4..7c5ad65 100644
--- a/external/README.txt
+++ b/external/README.txt
@@ -1,4 +1,4 @@
-README.txt 1.1.0 UTF-8
+README.txt 1.1.1 UTF-8
EXTERNAL DOWNLOADS SETUP AND USE
================================
@@ -131,7 +131,6 @@
copies of DLLs from external\download\bin\
iconv.dll
- exit
libjpeg-9.dll
libpng16-16.dll
libtiff-5.dll
@@ -177,6 +176,7 @@
REVISIONS
+ 1.1.1 2015-01-12-19:24 Stray word removed from the list of DLLs in Section 4
1.1.0 2015-01-08-21:20 Updated Draft with complete coverage
1.0.0 2015-01-08-15:21 Initial Draft replacement of the original README.txt
diff --git a/external/external.txt b/external/external.txt
index 4846554..d6fad4e 100644
--- a/external/external.txt
+++ b/external/external.txt
@@ -70,6 +70,15 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ TODO:
+ * Make headway on issue COR-21 to either reconcile it or figure out what
+ to do with "malformed" Zip files that create empty directories (a
+ Unix-ism).
+
+ 1.0.1 2015-02-14-11:59 Add TODO
+ Note that the *.sh files are not listed in this manifest. They are
+ now also removed, since they conflict with changes made to where
+ the externals are unzipped.
1.0.0 2015-01-08-21:14 Create initial version to account for the files in
the external\ folder
diff --git a/external/extract_downloads.sh b/external/extract_downloads.sh
deleted file mode 100755
index 38b9d6e..0000000
--- a/external/extract_downloads.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/bash
-
-set -e
-
-mkdir packages
-
-mkdir packages/SDL2
-mkdir packages/SDL2_image
-mkdir packages/iconv
-mkdir packages/libxml2
-mkdir packages/zlib
-
-(cd packages/SDL2 && unzip ../../download/SDL2-devel-2.0.3-VC.zip)
-(cd packages/SDL2_image && unzip ../../download/SDL2_image-devel-2.0.0-VC.zip)
-(cd packages/iconv && unzip ../../download/iconv-1.9.2.win32.zip)
-(cd packages/libxml2 && unzip ../../download/libxml2-2.7.8.win32.zip)
-(cd packages/zlib && unzip ../../download/zlib128-dll.zip)
-chmod -R u+w packages/zlib
-
-for i in bin lib include; do
- if [ ! -d $i ]; then
- mkdir $i
- fi
-done
-
-mv packages/SDL2/SDL2-2.0.3/include/* include
-mv packages/SDL2/SDL2-2.0.3/lib/x86/*.lib lib
-mv packages/SDL2/SDL2-2.0.3/lib/x86/*.dll bin
-
-mv packages/SDL2_image/SDL2_image-2.0.0/include/* include
-mv packages/SDL2_image/SDL2_image-2.0.0/lib/x86/*.lib lib
-mv packages/SDL2_image/SDL2_image-2.0.0/lib/x86/*.dll bin
-
-mv packages/iconv/iconv-1.9.2.win32/include/* include
-mv packages/iconv/iconv-1.9.2.win32/lib/* lib
-mv packages/iconv/iconv-1.9.2.win32/bin/* bin
-
-mv packages/libxml2/libxml2-2.7.8.win32/include/* include
-mv packages/libxml2/libxml2-2.7.8.win32/lib/* lib
-mv packages/libxml2/libxml2-2.7.8.win32/bin/* bin
-
-mv packages/zlib/include/* include
-mv packages/zlib/lib/* lib
-mv packages/zlib/*.dll bin
-
-rm -rf packages
diff --git a/external/fetch_downloads.sh b/external/fetch_downloads.sh
deleted file mode 100755
index c03b9b3..0000000
--- a/external/fetch_downloads.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-
-set -e
-if [ ! -d download ]; then
- mkdir download
-fi
-
-URLS="http://zlib.net/zlib128-dll.zip \
- ftp://ftp.zlatkovic.com/libxml/iconv-1.9.2.win32.zip \
- ftp://ftp.zlatkovic.com/libxml/libxml2-2.7.8.win32.zip \
- https://www.libsdl.org/release/SDL2-devel-2.0.3-VC.zip \
- https://www.libsdl.org/projects/SDL_image/release/SDL2_image-devel-2.0.0-VC.zip"
-
-cd download
-for url in $URLS; do
- if [ ! -f $(basename $url) ]; then
- wget $url
- fi
-done
-
-cd ..
diff --git a/sample/README.txt b/sample/README.txt
new file mode 100644
index 0000000..8de6b4c
--- /dev/null
+++ b/sample/README.txt
@@ -0,0 +1,3 @@
+The 'code' directory contains binding code examples. Please read the WARNINGS file.
+
+The 'documents' directory contains sample documents for conversion.
diff --git a/sample/code/objc_bindings/EDJSInterface.h b/sample/code/objc_bindings/EDJSInterface.h
new file mode 100644
index 0000000..b4183de
--- /dev/null
+++ b/sample/code/objc_bindings/EDJSInterface.h
@@ -0,0 +1,367 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+// IMPORTANT NOTE: This code does not work in it's current form,
+// and exists for illustrative purposes only. It is an excerpt
+// from the UX Write source code indented to show how the bindings
+// between Objective C and JavaScript are implemented, both in
+// terms of calling *in* to JavaScript, and calling *out* of
+// JavaScript (that is, callback functions).
+//
+// (see further comments in EDJSInterface.m)
+
+#import <Foundation/Foundation.h>
+#import <CoreGraphics/CoreGraphics.h>
+
+@class JSAutoCorrect;
+@class JSChangeTracking;
+@class JSClipboard;
+@class JSCursor;
+@class JSEquations;
+@class JSFigures;
+@class JSFormatting;
+@class JSInput;
+@class JSLists;
+@class JSMain;
+@class JSMetadata;
+@class JSOutline;
+@class JSPreview;
+@class JSScan;
+@class JSSelection;
+@class JSStyles;
+@class JSTables;
+@class JSUndoManager;
+@class JSViewport;
+@class EDScanParagraph;
+
+@interface JSError : NSError
+
+@property (copy, readonly) NSString *type;
+@property (copy, readonly) NSString *message;
+@property (copy, readonly) NSString *operation;
+@property (copy, readonly) NSString *html;
+
+@end
+
+@protocol JSInterfaceDelegate
+
+- (void)jsAddOutlineItem:(NSString *)itemId type:(NSString *)type title:(NSString *)title;
+- (void)jsUpdateOutlineItem:(NSString *)itemId title:(NSString *)title;
+- (void)jsRemoveOutlineItem:(NSString *)itemId;
+- (void)jsOutlineUpdated;
+- (void)jsSetCursorX:(int)x y:(int)y width:(int)width height:(int)height;
+- (void)jsSetSelectionHandlesX1:(int)x1 y1:(int)y1 height1:(int)height1
+ x2:(int)x2 y2:(int)y2 height2:(int)height2;
+- (void)jsSetTableSelectionX:(int)x y:(int)y width:(int)width height:(int)height;
+- (void)jsSetSelectionBoundsLeft:(int)left top:(int)top right:(int)right bottom:(int)bottom;
+- (void)jsClearSelectionHandlesAndCursor;
+- (void)jsUpdateAutoCorrect;
+
+@end
+
+@protocol JSEvaluator
+
+- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
+
+@end
+
+@interface JSInterface : NSObject
+
+@property (weak) NSObject<JSEvaluator> *evaluator;
+@property (weak) NSObject<JSInterfaceDelegate> *delegate;
+@property (assign) BOOL jsInitialised;
+@property (strong) JSAutoCorrect *autoCorrect;
+@property (strong) JSChangeTracking *changeTracking;
+@property (strong) JSClipboard *clipboard;
+@property (strong) JSCursor *cursor;
+@property (strong) JSEquations *equations;
+@property (strong) JSFigures *figures;
+@property (strong) JSFormatting *formatting;
+@property (strong) JSInput *input;
+@property (strong) JSLists *lists;
+@property (strong) JSMain *main;
+@property (strong) JSMetadata *metadata;
+@property (strong) JSOutline *outline;
+@property (strong) JSPreview *preview;
+@property (strong) JSScan *scan;
+@property (strong) JSSelection *selection;
+@property (strong) JSStyles *styles;
+@property (strong) JSTables *tables;
+@property (strong) JSUndoManager *undoManager;
+@property (strong) JSViewport *viewport;
+@property (copy) NSString *currentOperation;
+@property (strong) JSError *error;
+@property (assign) BOOL documentModified;
+
+- (JSInterface *)initWithEvaluator:(NSObject<JSEvaluator> *)evaluator;
+- (BOOL)initJavaScriptWidth:(int)width textScale:(int)textScale cssURL:(NSString *)cssURL
+ clientRectsBug:(BOOL)clientRectsBug;
+- (void)printStatistics;
+
+@end
+
+@interface JSModule : NSObject
+
+@property (assign) JSInterface *js;
+
+- (JSModule *)initWithJS:(JSInterface *)js;
+
+@end
+
+// Functions implemented in AutoCorrect.js
+
+@interface JSAutoCorrect : JSModule
+
+- (void)correctPreceding:(int)numChars word:(NSString *)replacement confirmed:(BOOL)confirmed;
+- (NSDictionary *)getCorrection;
+- (NSDictionary *)getCorrectionCoords;
+- (void)acceptCorrection;
+- (void)replaceCorrection:(NSString *)replacement;
+
+@end
+
+// Functions implemented in ChangeTracking.js
+
+@interface JSChangeTracking : JSModule
+- (BOOL)showChanges;
+- (BOOL)trackChanges;
+- (void)setShowChanges:(BOOL)showChanges;
+- (void)setTrackChanges:(BOOL)trackChanges;
+@end
+
+// Functions implemented in Clipboard.js
+
+@interface JSClipboard : JSModule
+- (NSDictionary *)clipboardCut;
+- (NSDictionary *)clipboardCopy;
+- (void)pasteHTML:(NSString *)html;
+- (void)pasteText:(NSString *)text;
+@end
+
+// Functions implemented in Cursor.js
+
+@interface JSCursor : JSModule
+- (NSString *)positionCursorX:(int)x y:(int)y wordBoundary:(BOOL)wordBoundary;
+- (CGRect)getCursorPosition;
+- (void)moveLeft;
+- (void)moveRight;
+- (void)moveToStartOfDocument;
+- (void)moveToEndOfDocument;
+- (void)insertReference:(NSString *)itemId;
+- (void)insertLinkWithText:(NSString *)text URL:(NSString *)URL;
+- (void)insertCharacter:(unichar)character allowInvalidPos:(BOOL)allowInvalidPos;
+- (void)deleteCharacter;
+- (void)enterPressed;
+- (NSString *)getPrecedingWord;
+- (NSDictionary *)getLinkProperties;
+- (void)setLinkProperties:(NSDictionary *)properties;
+- (void)setReferenceTarget:(NSString *)itemId;
+- (void)insertFootnote:(NSString *)content;
+- (void)insertEndnote:(NSString *)content;
+@end
+
+// Functions implemented in Equations.js
+
+@interface JSEquations : JSModule
+- (void)insertEquation;
+@end
+
+// Functions implemented in Figures.js
+
+@interface JSFigures : JSModule
+- (void)insertFigure:(NSString *)filename width:(NSString *)width
+ numbered:(BOOL)numbered caption:(NSString *)caption;
+- (NSString *)getSelectedFigureId;
+- (NSDictionary *)getProperties:(NSString *)itemId;
+- (void)setProperties:(NSString *)itemId width:(NSString *)width src:(NSString *)src;
+- (NSDictionary *)getGeometry:(NSString *)itemId;
+@end
+
+// Functions implemented in Formatting.js
+
+@interface JSFormatting : JSModule
+- (NSDictionary *)getFormatting;
+- (void)applyFormattingChangesStyle:(NSString *)style properties:(NSDictionary *)properties;
+@end
+
+// Functions implemented in Input.js
+
+@interface JSInput : JSModule
+- (void)removePosition:(int)posId;
+
+// UITextInput methods
+- (NSString *)textInRangeStartId:(int)startId startAdjust:(int)startAdjust
+ endId:(int)endId endAdjust:(int)endAdjust;
+- (void)replaceRangeStart:(int)startId end:(int)endId withText:(NSString *)text;
+- (NSDictionary *)selectedTextRange;
+- (void)setSelectedTextRangeStart:(int)startId end:(int)endId;
+- (NSDictionary *)markedTextRange;
+- (void)setMarkedText:(NSString *)text startOffset:(int)startOffset endOffset:(int)endOffset;
+- (void)unmarkText;
+- (BOOL)forwardSelectionAffinity;
+- (void)setForwardSelectionAffinity:(BOOL)forwardSelectionAffinity;
+- (int)positionFromPosition:(int)posId offset:(int)offset;
+- (int)positionFromPosition:(int)posId inDirection:(NSString *)direction offset:(int)offset;
+- (int)comparePosition:(int)positionId toPosition:(int)otherId;
+- (int)offsetFromPosition:(int)fromPosition toPosition:(int)toPosition;
+- (int)positionWithinRangeStart:(int)startId end:(int)endId farthestInDirection:(NSString *)direction;
+- (NSDictionary *)characterRangeByExtendingPosition:(int)positionId inDirection:(NSString *)direction;
+- (NSDictionary *)firstRectForRangeStart:(int)startId end:(int)endId;
+- (NSDictionary *)caretRectForPosition:(int)posId;
+- (int)closestPositionToPointX:(int)x y:(int)y;
+- (int)closestPositionToPointX:(int)x y:(int)y withinRangeStart:(int)startId end:(int)endId;
+- (NSDictionary *)characterRangeAtPointX:(int)x y:(int)y;
+- (int)positionWithinRangeStart:(int)startId end:(int)endId atCharacterOffset:(int)offset;
+- (int)characterOffsetOfPosition:(int)positionId withinRangeStart:(int)startId end:(int)endId;
+
+// UITextInputTokenizer methods
+- (BOOL)isPosition:(int)posId atBoundary:(NSString *)granularity inDirection:(NSString *)direction;
+- (BOOL)isPosition:(int)posId withinTextUnit:(NSString *)granularity inDirection:(NSString *)direction;
+- (int)positionFromPosition:(int)posId toBoundary:(NSString *)granularity inDirection:(NSString *)direction;
+- (NSDictionary *)rangeEnclosingPosition:(int)posId withGranularity:(NSString *)granularity inDirection:(NSString *)direction;
+@end
+
+// Functions implemented in Lists.js
+
+@interface JSLists : JSModule
+- (void)increaseIndent;
+- (void)decreaseIndent;
+- (void)clearList;
+- (void)setUnorderedList;
+- (void)setOrderedList;
+@end
+
+// Functions implemented in Main.js
+
+@interface JSMain : JSModule
+- (NSString *)getLanguage;
+- (void)setLanguage:(NSString *)language;
+- (NSString *)setGenerator:(NSString *)generator;
+- (BOOL)prepareForSave;
+- (NSString *)getHTML;
+- (BOOL)isEmptyDocument;
+@end
+
+// Functions implemented in Metadata.js
+
+@interface JSMetadata : JSModule
+- (NSDictionary *)getMetadata;
+- (void)setMetadata:(NSDictionary *)metadata;
+@end
+
+// Functions implemented in Outline.js
+
+@interface JSOutline : JSModule
+- (NSDictionary *)getOutline;
+- (void)moveSection:(NSString *)sectionId parentId:(NSString *)parentId nextId:(NSString *)nextId;
+- (void)deleteItem:(NSString *)itemId;
+- (void)goToItem:(NSString *)itemId;
+- (void)scheduleUpdateStructure;
+- (void)set:(NSString *)itemId numbered:(BOOL)numbered;
+- (void)set:(NSString *)itemId title:(NSString *)title;
+- (void)insertTableOfContents;
+- (void)insertListOfFigures;
+- (void)insertListOfTables;
+- (void)setPrintMode:(BOOL)printMode;
+- (NSDictionary *)examinePrintLayout:(int)pageHeight;
+- (BOOL)detectSectionNumbering;
+- (NSDictionary *)findUsedStyles;
+@end
+
+// Functions implemented in Preview.js
+
+@interface JSPreview : JSModule
+- (void)showForStyle:(NSString *)styleId uiName:(NSString *)uiName title:(NSString *)title;
+@end
+
+// Functions implemented in Scan.js
+
+@interface JSScan : JSModule
+- (void)reset;
+- (EDScanParagraph *)next;
+- (int)addMatchStart:(int)start end:(int)end;
+- (void)showMatch:(int)matchId;
+- (void)replaceMatch:(int)matchId with:(NSString *)text;
+- (void)removeMatch:(int)matchId;
+- (void)goToMatch:(int)matchId;
+@end
+
+// Functions implemented in Selection.js
+
+@interface JSSelection : JSModule
+- (void)update;
+- (void)selectAll;
+- (void)selectParagraph;
+- (void)selectWordAtCursor;
+- (NSString *)dragSelectionBeginX:(int)x y:(int)y selectWord:(BOOL)selectWord;
+- (NSString *)dragSelectionUpdateX:(int)x y:(int)y selectWord:(BOOL)selectWord;
+- (NSString *)moveStartLeft;
+- (NSString *)moveStartRight;
+- (NSString *)moveEndLeft;
+- (NSString *)moveEndRight;
+- (void)setSelectionStartAtCoordsX:(int)x y:(int)y;
+- (void)setSelectionEndAtCoordsX:(int)x y:(int)y;
+- (void)setTableSelectionEdge:(NSString *)edge atCoordsX:(int)x y:(int)y;
+- (void)print;
+@end
+
+// Functions implemented in Styles.js
+
+@interface JSStyles : JSModule
+- (NSString *)getCSSText;
+- (void)setCSSText:(NSString *)cssText rules:(NSDictionary *)rules;
+- (NSString *)paragraphClass;
+- (void)setParagraphClass:(NSString *)paragraphClass;
+@end
+
+// Functions implemented in Tables.js
+
+@interface JSTables : JSModule
+- (void)insertTableRows:(int)rows cols:(int)cols width:(NSString *)width numbered:(BOOL)numbered
+ caption:(NSString *)caption className:(NSString *)className;
+- (void)addAdjacentRow;
+- (void)addAdjacentColumn;
+- (void)removeAdjacentRow;
+- (void)removeAdjacentColumn;
+- (void)clearCells;
+- (void)mergeCells;
+- (void)splitSelection;
+- (NSString *)getSelectedTableId;
+- (NSDictionary *)getProperties:(NSString *)itemId;
+- (void)setProperties:(NSString *)itemId width:(NSString *)width;
+- (void)set:(NSString *)itemId colWidths:(NSArray *)colWidths;
+- (NSDictionary *)getGeometry:(NSString *)itemId;
+@end
+
+// Functions implemented in UndoManager.js
+
+@interface JSUndoManager : JSModule
+- (int)getLength;
+- (int)getIndex;
+- (void)setIndex:(int)index;
+- (void)undo;
+- (void)redo;
+- (void)newGroup:(NSString *)name;
+- (NSString *)groupType;
+@end
+
+// Functions implemented in Viewport.js
+
+@interface JSViewport : JSModule
+- (void)setViewportWidth:(int)width;
+- (void)setTextScale:(int)textScale;
+@end
diff --git a/sample/code/objc_bindings/EDJSInterface.m b/sample/code/objc_bindings/EDJSInterface.m
new file mode 100644
index 0000000..51fd1cf
--- /dev/null
+++ b/sample/code/objc_bindings/EDJSInterface.m
@@ -0,0 +1,1788 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+// IMPORTANT NOTE: This code does not work in it's current form,
+// and exists for illustrative purposes only. It is an excerpt
+// from the UX Write source code indented to show how the bindings
+// between Objective C and JavaScript are implemented, both in
+// terms of calling *in* to JavaScript, and calling *out* of
+// JavaScript (that is, callback functions).
+//
+// The functions are referenced by number, which is due to the
+// fact that prior to the editor code becoming open source, it
+// was obfuscated in the files distributed with UX Write. Thus,
+// each API function was represented as an index into an array
+// of JavaScript functions to be called. This was necessary
+// because the obfuscator I was using (UglifyJS) renamed all the
+// global functions and this was the only way to keep track of them.
+//
+// This numeric referencing of functions is no longer relevant
+// not that there's no need to obfuscate the code (quite the opposite
+// in fact), so when implementing bindings for other languages you
+// can just reference the function names directly.
+
+#import "EDJSInterface.h"
+#import "EDScan.h"
+#import "EDUtil.h"
+#import <FileClient/FCError.h>
+#import <FileClient/FCUtil.h>
+
+typedef enum {
+ AutoCorrect_correctPrecedingWord,
+ AutoCorrect_getCorrection,
+ AutoCorrect_getCorrectionCoords,
+ AutoCorrect_acceptCorrection,
+ AutoCorrect_replaceCorrection,
+ ChangeTracking_showChanges,
+ ChangeTracking_trackChanges,
+ ChangeTracking_setShowChanges,
+ ChangeTracking_setTrackChanges,
+ Clipboard_cut,
+ Clipboard_copy,
+ Clipboard_pasteHTML,
+ Clipboard_pasteText,
+ Cursor_positionCursor,
+ Cursor_getCursorPosition,
+ Cursor_moveLeft,
+ Cursor_moveRight,
+ Cursor_moveToStartOfDocument,
+ Cursor_moveToEndOfDocument,
+ Cursor_insertReference,
+ Cursor_insertLink,
+ Cursor_insertCharacter,
+ Cursor_deleteCharacter,
+ Cursor_enterPressed,
+ Cursor_getPrecedingWord,
+ Cursor_getLinkProperties,
+ Cursor_setLinkProperties,
+ Cursor_setReferenceTarget,
+ Cursor_insertFootnote,
+ Cursor_insertEndnote,
+ Editor_getBackMessages,
+ Equations_insertEquation,
+ Figures_insertFigure,
+ Figures_getSelectedFigureId,
+ Figures_getProperties,
+ Figures_setProperties,
+ Figures_getGeometry,
+ Formatting_getFormatting,
+ Formatting_applyFormattingChanges,
+ Input_removePosition,
+ Input_textInRange,
+ Input_replaceRange,
+ Input_selectedTextRange,
+ Input_setSelectedTextRange,
+ Input_markedTextRange,
+ Input_setMarkedText,
+ Input_unmarkText,
+ Input_forwardSelectionAffinity,
+ Input_setForwardSelectionAffinity,
+ Input_positionFromPositionOffset,
+ Input_positionFromPositionInDirectionOffset,
+ Input_comparePositionToPosition,
+ Input_offsetFromPositionToPosition,
+ Input_positionWithinRangeFarthestInDirection,
+ Input_characterRangeByExtendingPositionInDirection,
+ Input_firstRectForRange,
+ Input_caretRectForPosition,
+ Input_closestPositionToPoint,
+ Input_closestPositionToPointWithinRange,
+ Input_characterRangeAtPoint,
+ Input_positionWithinRangeAtCharacterOffset,
+ Input_characterOffsetOfPositionWithinRange,
+ Input_isPositionAtBoundaryGranularityInDirection,
+ Input_isPositionWithinTextUnitInDirection,
+ Input_positionFromPositionToBoundaryInDirection,
+ Input_rangeEnclosingPositionWithGranularityInDirection,
+ Lists_increaseIndent,
+ Lists_decreaseIndent,
+ Lists_clearList,
+ Lists_setUnorderedList,
+ Lists_setOrderedList,
+ Main_getLanguage,
+ Main_setLanguage,
+ Main_setGenerator,
+ Main_init,
+ Main_getErrorReportingInfo,
+ Main_execute,
+ Main_prepareForSave,
+ Main_getHTML,
+ Main_isEmptyDocument,
+ Metadata_getMetadata,
+ Metadata_setMetadata,
+ Outline_moveSection,
+ Outline_deleteItem,
+ Outline_goToItem,
+ Outline_scheduleUpdateStructure,
+ Outline_setNumbered,
+ Outline_setTitle,
+ Outline_getOutline,
+ Outline_insertTableOfContents,
+ Outline_insertListOfFigures,
+ Outline_insertListOfTables,
+ Outline_setPrintMode,
+ Outline_examinePrintLayout,
+ Outline_detectSectionNumbering,
+ Outline_findUsedStyles,
+ Preview_showForStyle,
+ Scan_reset,
+ Scan_next,
+ Scan_addMatch,
+ Scan_showMatch,
+ Scan_replaceMatch,
+ Scan_removeMatch,
+ Scan_goToMatch,
+ Selection_update,
+ Selection_selectAll,
+ Selection_selectParagraph,
+ Selection_selectWordAtCursor,
+ Selection_dragSelectionBegin,
+ Selection_dragSelectionUpdate,
+ Selection_moveStartLeft,
+ Selection_moveStartRight,
+ Selection_moveEndLeft,
+ Selection_moveEndRight,
+ Selection_setSelectionStartAtCoords,
+ Selection_setSelectionEndAtCoords,
+ Selection_setTableSelectionEdgeAtCoords,
+ Selection_print,
+ Styles_getCSSText,
+ Styles_setCSSText,
+ Styles_getParagraphClass,
+ Styles_setParagraphClass,
+ Tables_insertTable,
+ Tables_addAdjacentRow,
+ Tables_addAdjacentColumn,
+ Tables_removeAdjacentRow,
+ Tables_removeAdjacentColumn,
+ Tables_clearCells,
+ Tables_mergeCells,
+ Tables_splitSelection,
+ Tables_getSelectedTableId,
+ Tables_getProperties,
+ Tables_setProperties,
+ Tables_setColWidths,
+ Tables_getGeometry,
+ UndoManager_getLength,
+ UndoManager_getIndex,
+ UndoManager_setIndex,
+ UndoManager_undo,
+ UndoManager_redo,
+ UndoManager_newGroup,
+ UndoManager_groupType,
+ Viewport_setViewportWidth,
+ Viewport_setTextScale,
+ JSInterfaceFunctionCount,
+} JSInterfaceFunction;
+
+static BOOL functionModifiesDocument(JSInterfaceFunction fun)
+{
+ switch (fun)
+ {
+ case AutoCorrect_correctPrecedingWord:
+ case AutoCorrect_acceptCorrection:
+ case AutoCorrect_replaceCorrection:
+ case ChangeTracking_setShowChanges:
+ case ChangeTracking_setTrackChanges:
+ case Clipboard_cut:
+ case Clipboard_pasteHTML:
+ case Clipboard_pasteText:
+ case Cursor_insertReference:
+ case Cursor_insertLink:
+ case Cursor_insertCharacter:
+ case Cursor_deleteCharacter:
+ case Cursor_enterPressed:
+ case Cursor_setLinkProperties:
+ case Cursor_setReferenceTarget:
+ case Cursor_insertFootnote:
+ case Cursor_insertEndnote:
+ case Equations_insertEquation:
+ case Figures_insertFigure:
+ case Figures_setProperties:
+ case Formatting_applyFormattingChanges:
+ case Lists_increaseIndent:
+ case Lists_decreaseIndent:
+ case Lists_clearList:
+ case Lists_setUnorderedList:
+ case Lists_setOrderedList:
+ case Main_setLanguage:
+ case Main_prepareForSave:
+ case Metadata_setMetadata:
+ case Outline_moveSection:
+ case Outline_deleteItem:
+ case Outline_scheduleUpdateStructure:
+ case Outline_setNumbered:
+ case Outline_setTitle:
+ case Outline_insertTableOfContents:
+ case Outline_insertListOfFigures:
+ case Outline_insertListOfTables:
+ case Outline_setPrintMode:
+ case Outline_examinePrintLayout:
+ case Scan_replaceMatch:
+ case Styles_setCSSText:
+ case Tables_insertTable:
+ case Tables_addAdjacentRow:
+ case Tables_addAdjacentColumn:
+ case Tables_removeAdjacentRow:
+ case Tables_removeAdjacentColumn:
+ case Tables_clearCells:
+ case Tables_mergeCells:
+ case Tables_splitSelection:
+ case Tables_setProperties:
+ case Tables_setColWidths:
+ case UndoManager_undo:
+ case UndoManager_redo:
+ return true;
+ case AutoCorrect_getCorrection:
+ case AutoCorrect_getCorrectionCoords:
+ case ChangeTracking_showChanges:
+ case ChangeTracking_trackChanges:
+ case Clipboard_copy:
+ case Cursor_positionCursor:
+ case Cursor_getCursorPosition:
+ case Cursor_moveLeft:
+ case Cursor_moveRight:
+ case Cursor_moveToStartOfDocument:
+ case Cursor_moveToEndOfDocument:
+ case Cursor_getPrecedingWord:
+ case Cursor_getLinkProperties:
+ case Editor_getBackMessages:
+ case Figures_getSelectedFigureId:
+ case Figures_getProperties:
+ case Figures_getGeometry:
+ case Formatting_getFormatting:
+ case Input_removePosition:
+ case Input_textInRange:
+ case Input_replaceRange:
+ case Input_selectedTextRange:
+ case Input_setSelectedTextRange:
+ case Input_markedTextRange:
+ case Input_setMarkedText:
+ case Input_unmarkText:
+ case Input_forwardSelectionAffinity:
+ case Input_setForwardSelectionAffinity:
+ case Input_positionFromPositionOffset:
+ case Input_positionFromPositionInDirectionOffset:
+ case Input_comparePositionToPosition:
+ case Input_offsetFromPositionToPosition:
+ case Input_positionWithinRangeFarthestInDirection:
+ case Input_characterRangeByExtendingPositionInDirection:
+ case Input_firstRectForRange:
+ case Input_caretRectForPosition:
+ case Input_closestPositionToPoint:
+ case Input_closestPositionToPointWithinRange:
+ case Input_characterRangeAtPoint:
+ case Input_positionWithinRangeAtCharacterOffset:
+ case Input_characterOffsetOfPositionWithinRange:
+ case Input_isPositionAtBoundaryGranularityInDirection:
+ case Input_isPositionWithinTextUnitInDirection:
+ case Input_positionFromPositionToBoundaryInDirection:
+ case Input_rangeEnclosingPositionWithGranularityInDirection:
+ case Main_getLanguage:
+ case Main_setGenerator:
+ case Main_init:
+ case Main_getErrorReportingInfo:
+ case Main_execute:
+ case Main_getHTML:
+ case Main_isEmptyDocument:
+ case Metadata_getMetadata:
+ case Outline_getOutline:
+ case Outline_goToItem:
+ case Outline_detectSectionNumbering:
+ case Outline_findUsedStyles:
+ case Preview_showForStyle:
+ case Scan_reset:
+ case Scan_next:
+ case Scan_addMatch:
+ case Scan_showMatch:
+ case Scan_removeMatch:
+ case Scan_goToMatch:
+ case Selection_update:
+ case Selection_selectAll:
+ case Selection_selectParagraph:
+ case Selection_selectWordAtCursor:
+ case Selection_dragSelectionBegin:
+ case Selection_dragSelectionUpdate:
+ case Selection_moveStartLeft:
+ case Selection_moveStartRight:
+ case Selection_moveEndLeft:
+ case Selection_moveEndRight:
+ case Selection_setSelectionStartAtCoords:
+ case Selection_setSelectionEndAtCoords:
+ case Selection_setTableSelectionEdgeAtCoords:
+ case Selection_print:
+ case Styles_getCSSText:
+ case Styles_getParagraphClass:
+ case Styles_setParagraphClass:
+ case Tables_getSelectedTableId:
+ case Tables_getProperties:
+ case Tables_getGeometry:
+ case UndoManager_getLength:
+ case UndoManager_getIndex:
+ case UndoManager_setIndex:
+ case UndoManager_newGroup:
+ case UndoManager_groupType:
+ case Viewport_setViewportWidth:
+ case Viewport_setTextScale:
+ case JSInterfaceFunctionCount:
+ return false;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSError //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSError
+
+- (JSError *)initWithType:(NSString *)type
+ message:(NSString *)message
+ operation:(NSString *)operation
+ html:(NSString *)html
+{
+ if (!(self = [super init]))
+ return nil;
+ _type = [type copy];
+ _message = [message copy];
+ _operation = [operation copy];
+ _html = [html copy];
+ return self;
+}
+
+- (NSString *)description
+{
+ NSMutableString *errorInfo = [NSMutableString stringWithCapacity: 0];
+ [errorInfo appendFormat: @"%@\n", _message];
+ [errorInfo appendFormat: @"Operation: %@\n", _operation];
+ [errorInfo appendFormat: @"\n"];
+ [errorInfo appendFormat: @"HTML:\n%@\n", _html];
+ return errorInfo;
+}
+
+- (NSString *)localizedDescription
+{
+ return [self description];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSInterface //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSInterface
+{
+ NSUInteger _numCalls[JSInterfaceFunctionCount];
+ NSTimeInterval _timeUsed[JSInterfaceFunctionCount];
+ NSTimeInterval _totalTimeUsed;
+}
+
+- (JSInterface *)initWithEvaluator:(NSObject<JSEvaluator> *)evaluator
+{
+ if (!(self = [super init]))
+ return nil;
+ _evaluator = evaluator;
+
+ _autoCorrect = [[JSAutoCorrect alloc] initWithJS: self];
+ _changeTracking = [[JSChangeTracking alloc] initWithJS: self];
+ _clipboard = [[JSClipboard alloc] initWithJS: self];
+ _cursor = [[JSCursor alloc] initWithJS: self];
+ _equations = [[JSEquations alloc] initWithJS: self];
+ _figures = [[JSFigures alloc] initWithJS: self];
+ _formatting = [[JSFormatting alloc] initWithJS: self];
+ _input = [[JSInput alloc] initWithJS: self];
+ _lists = [[JSLists alloc] initWithJS: self];
+ _main = [[JSMain alloc] initWithJS: self];
+ _metadata = [[JSMetadata alloc] initWithJS: self];
+ _outline = [[JSOutline alloc] initWithJS: self];
+ _preview = [[JSPreview alloc] initWithJS: self];
+ _scan = [[JSScan alloc] initWithJS: self];
+ _selection = [[JSSelection alloc] initWithJS: self];
+ _styles = [[JSStyles alloc] initWithJS: self];
+ _tables = [[JSTables alloc] initWithJS: self];
+ _undoManager = [[JSUndoManager alloc] initWithJS: self];
+ _viewport = [[JSViewport alloc] initWithJS: self];
+
+ return self;
+}
+
+- (void)dealloc
+{
+ _autoCorrect.js = nil;
+ _changeTracking.js = nil;
+ _clipboard.js = nil;
+ _cursor.js = nil;
+ _equations.js = nil;
+ _figures.js = nil;
+ _formatting.js = nil;
+ _input.js = nil;
+ _lists.js = nil;
+ _main.js = nil;
+ _metadata.js = nil;
+ _outline.js = nil;
+ _preview.js = nil;
+ _scan.js = nil;
+ _selection.js = nil;
+ _styles.js = nil;
+ _tables.js = nil;
+ _undoManager.js = nil;
+ _viewport.js = nil;
+}
+
+- (BOOL)initJavaScriptWidth:(int)width textScale:(int)textScale cssURL:(NSString *)cssURL
+ clientRectsBug:(BOOL)clientRectsBug
+{
+ // Special case javascript call to Main_init(). We don't use the normal mechanism here because
+ // at this point the JS interface has not been initialised, and the check for this in
+ // executeJavaScriptWithJSONResult would cause it to fail.
+ NSString *code = [NSString stringWithFormat: @"interface_functions[%d](%d,%d,\"%@\",%@)",
+ Main_init, width, textScale, cssURL, clientRectsBug ? @"true" : @"false"];
+ NSString *result = [_evaluator stringByEvaluatingJavaScriptFromString: code];
+ [self jsCallCompleted];
+ if ([@"true" isEqualToString: result]) {
+ return YES;
+ }
+ else {
+ self.currentOperation = @"JavaScript initialisation";
+ [self reportErrorWithType: nil format: @"%@", result];
+ self.currentOperation = nil;
+ return NO;
+ }
+}
+
+- (void)jsCallCompleted
+{
+ // Process pending callbacks
+ NSString *getBackMessages = [NSString stringWithFormat: @"interface_functions[%d]()",
+ Editor_getBackMessages];
+ NSString *str = [_evaluator stringByEvaluatingJavaScriptFromString: getBackMessages];
+ NSData *data = [str dataUsingEncoding: NSUTF8StringEncoding];
+ NSArray *array = [NSJSONSerialization JSONObjectWithData: data options: 0 error: nil];
+ for (NSArray *message in array)
+ [self dispatchCallbackMessage: message];
+}
+
+- (NSString *)operationStringWithFunction:(JSInterfaceFunction)function nargs:(int)nargs arguments:(va_list)ap
+{
+ NSMutableString *operation = [NSMutableString stringWithCapacity: 0];
+ [operation appendFormat: @"interface_functions[%d](", function];
+ NSObject *arg;
+ for (int argno = 0; argno < nargs; argno++) {
+ arg = va_arg(ap,NSObject*);
+ if (argno > 0)
+ [operation appendString: @","];
+ if (arg == nil) {
+ [operation appendString: @"null"];
+ }
+ else if ([arg isKindOfClass: [NSNumber class]]) {
+ [operation appendString: [arg description]];
+ }
+ else if ([arg isKindOfClass: [NSNull class]]) {
+ [operation appendString: @"null"];
+ }
+ else if ([arg isKindOfClass: [NSArray class]] || [arg isKindOfClass: [NSDictionary class]]) {
+ NSError *err = nil;
+ NSData *data = [NSJSONSerialization dataWithJSONObject: arg options: 0 error: &err];
+ if (data == nil) {
+ [NSException raise: @"NSJSONSerialization"
+ format: @"executeJavaScript %d: cannot serialise argument %d to JSON: %@",
+ function, argno, FCErrorDescription(err)];
+ }
+ else {
+ NSString *str = [[NSString alloc] initWithBytes: data.bytes length: data.length
+ encoding: NSUTF8StringEncoding];
+ [operation appendString: str];
+ }
+ }
+ else {
+ char *quoted = DFQuote(arg.description.UTF8String);
+ NSString *nsQuoted = [NSString stringWithUTF8String: quoted];
+ [operation appendString: nsQuoted];
+ free(quoted);
+ }
+ }
+ [operation appendString: @")"];
+ return operation;
+}
+
+- (id)executeJavaScriptWithJSONResult:(BOOL)jsonResult function:(JSInterfaceFunction)function nargs:(int)nargs arguments:(va_list)ap
+{
+ NSDate *start = [NSDate date];
+ if (!_jsInitialised) {
+ [NSException raise: @"JavaScriptNotInitialised"
+ format: @"Yet to receive a jsInterfaceInitFinished from JavaScript code"];
+ }
+ self.currentOperation = [self operationStringWithFunction: function nargs: nargs arguments: ap];
+ id result;
+ if (!jsonResult) {
+ NSString *code = [NSString stringWithFormat: @"interface_functions[%d](function() { return %@; });",
+ Main_execute, self.currentOperation];
+ result = [_evaluator stringByEvaluatingJavaScriptFromString: code];
+ [self jsCallCompleted];
+ }
+ else {
+ NSString *code = [NSString stringWithFormat: @"interface_functions[%d](function() { return JSON.stringify(%@); });",
+ Main_execute, self.currentOperation];
+
+ NSString *str = [_evaluator stringByEvaluatingJavaScriptFromString: code];
+ [self jsCallCompleted];
+
+ if ([str isEqualToString: @"null"]) {
+ result = nil;
+ }
+ else {
+ NSData *data = [str dataUsingEncoding: NSUTF8StringEncoding];
+ NSError *err = nil;
+ result = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &err];
+ if (result == nil) {
+ [self reportErrorWithType: nil format: @"Cannot deserialise JSON result \"%@\": %@",
+ str, FCErrorDescription(err)];
+ }
+ }
+ }
+
+ NSDate *end = [NSDate date];
+ NSTimeInterval interval = [end timeIntervalSinceDate: start];
+ _numCalls[function]++;
+ _timeUsed[function] += interval;
+ _totalTimeUsed += interval;
+
+ self.currentOperation = nil;
+ if (functionModifiesDocument(function))
+ self.documentModified = YES;
+ return result;
+}
+
+- (void)printStatistics
+{
+ if (_totalTimeUsed == 0.0)
+ return;
+
+ printf("\n");
+ printf("%-10s %-10s %-10s %-10s\n","Function","Calls","Time","Time pct");
+
+ NSMutableArray *order = [NSMutableArray arrayWithCapacity: 0];
+ for (NSUInteger i = 0; i < JSInterfaceFunctionCount; i++)
+ [order addObject: [NSNumber numberWithUnsignedInteger: i]];
+ [order sortUsingComparator:^NSComparisonResult(NSNumber *n1, NSNumber *n2) {
+ NSUInteger i1 = n1.unsignedIntValue;
+ NSUInteger i2 = n2.unsignedIntValue;
+ if (_timeUsed[i1] < _timeUsed[i2])
+ return NSOrderedAscending;
+ else if (_timeUsed[i1] > _timeUsed[i2])
+ return NSOrderedDescending;
+ else
+ return NSOrderedSame;
+ }];
+ for (NSNumber *n in order) {
+ NSUInteger i = n.unsignedIntValue;
+ double pct = 100*(_timeUsed[i]/_totalTimeUsed);
+ if (pct >= 0.01) {
+ printf("%-10d %-10d %-10d %.2f%%\n",(int)i,(int)_numCalls[i],(int)(_timeUsed[i]*1000),pct);
+ }
+ }
+ printf("totalTimeUsed = %.2fms\n",1000*_totalTimeUsed);
+}
+
+- (id)executeJavaScriptJSON:(JSInterfaceFunction)function nargs:(int)nargs, ...
+{
+ va_list ap;
+ va_start(ap,nargs);
+ NSString *result = (NSString *)[self executeJavaScriptWithJSONResult: YES
+ function: function
+ nargs: nargs
+ arguments: ap];
+ va_end(ap);
+ return result;
+}
+
+- (NSString *)executeJavaScript:(JSInterfaceFunction)function nargs:(int)nargs, ...
+{
+ va_list ap;
+ va_start(ap,nargs);
+ NSString *result = (NSString *)[self executeJavaScriptWithJSONResult: NO
+ function: function
+ nargs: nargs
+ arguments: ap];
+ va_end(ap);
+ return result;
+}
+
+- (void)dispatchCallbackMessage:(NSArray*)array
+{
+ if (array.count == 0)
+ return;
+
+ if (![[array objectAtIndex: 0] isKindOfClass: [NSString class]])
+ return;
+
+ NSString *functionName = [array objectAtIndex: 0];
+
+ if ([functionName isEqualToString: @"debug"] &&
+ ([array count] == 2) &&
+ [[array objectAtIndex: 1] isKindOfClass: [NSString class]]) {
+ NSString *message = [array objectAtIndex: 1];
+ debug(@"%@\n",message);
+ }
+ else if ([functionName isEqualToString: @"addOutlineItem"] &&
+ [_delegate respondsToSelector: @selector(jsAddOutlineItem:type:title:)] &&
+ ([array count] == 4) &&
+ [[array objectAtIndex: 1] isKindOfClass: [NSString class]] &&
+ [[array objectAtIndex: 2] isKindOfClass: [NSString class]]) {
+ // 3 could be a a string or null
+ NSString *title = [array objectAtIndex: 3];
+ if ([title isKindOfClass: [NSNull class]])
+ title = nil;
+ [_delegate jsAddOutlineItem: [array objectAtIndex: 1]
+ type: [array objectAtIndex: 2]
+ title: title];
+ }
+ else if ([functionName isEqualToString: @"updateOutlineItem"] &&
+ [_delegate respondsToSelector: @selector(jsUpdateOutlineItem:title:)] &&
+ ([array count] == 3) &&
+ [[array objectAtIndex: 1] isKindOfClass: [NSString class]] &&
+ [[array objectAtIndex: 2] isKindOfClass: [NSString class]]) {
+ [_delegate jsUpdateOutlineItem: [array objectAtIndex: 1] title: [array objectAtIndex: 2]];
+ }
+ else if ([functionName isEqualToString: @"removeOutlineItem"] &&
+ [_delegate respondsToSelector: @selector(jsRemoveOutlineItem:)] &&
+ ([array count] == 2) &&
+ [[array objectAtIndex: 1] isKindOfClass: [NSString class]]) {
+ [_delegate jsRemoveOutlineItem: [array objectAtIndex: 1]];
+ }
+ else if ([functionName isEqualToString: @"outlineUpdated"] &&
+ [_delegate respondsToSelector: @selector(jsOutlineUpdated)] &&
+ [array count] == 1) {
+ [_delegate jsOutlineUpdated];
+ }
+ else if ([functionName isEqualToString: @"setSelectionHandles"] &&
+ [_delegate respondsToSelector: @selector(jsSetSelectionHandlesX1:y1:height1:x2:y2:height2:)] &&
+ ([array count] == 7) &&
+ ([[array objectAtIndex: 1] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 2] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 3] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 4] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 5] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 6] isKindOfClass: [NSNumber class]])) {
+ [_delegate jsSetSelectionHandlesX1: ((NSNumber *)[array objectAtIndex: 1]).intValue
+ y1: ((NSNumber *)[array objectAtIndex: 2]).intValue
+ height1: ((NSNumber *)[array objectAtIndex: 3]).intValue
+ x2: ((NSNumber *)[array objectAtIndex: 4]).intValue
+ y2: ((NSNumber *)[array objectAtIndex: 5]).intValue
+ height2: ((NSNumber *)[array objectAtIndex: 6]).intValue];
+ }
+ else if ([functionName isEqualToString: @"setTableSelection"] &&
+ [_delegate respondsToSelector: @selector(jsSetTableSelectionX:y:width:height:)] &&
+ ([array count] == 5) &&
+ ([[array objectAtIndex: 1] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 2] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 3] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 4] isKindOfClass: [NSNumber class]])) {
+ [_delegate jsSetTableSelectionX: ((NSNumber *)[array objectAtIndex: 1]).intValue
+ y: ((NSNumber *)[array objectAtIndex: 2]).intValue
+ width: ((NSNumber *)[array objectAtIndex: 3]).intValue
+ height: ((NSNumber *)[array objectAtIndex: 4]).intValue];
+ }
+ else if ([functionName isEqualToString: @"setCursor"] &&
+ [_delegate respondsToSelector: @selector(jsSetCursorX:y:width:height:)] &&
+ ([array count] == 5) &&
+ ([[array objectAtIndex: 1] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 2] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 3] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 4] isKindOfClass: [NSNumber class]])) {
+ [_delegate jsSetCursorX: ((NSNumber *)[array objectAtIndex: 1]).intValue
+ y: ((NSNumber *)[array objectAtIndex: 2]).intValue
+ width: ((NSNumber *)[array objectAtIndex: 3]).intValue
+ height: ((NSNumber *)[array objectAtIndex: 4]).intValue];
+ }
+ else if ([functionName isEqualToString: @"clearSelectionHandlesAndCursor"] &&
+ [_delegate respondsToSelector: @selector(jsClearSelectionHandlesAndCursor)] &&
+ ([array count] == 1)) {
+ [_delegate jsClearSelectionHandlesAndCursor];
+ }
+ else if ([functionName isEqualToString: @"setSelectionBounds"] &&
+ [_delegate respondsToSelector: @selector(jsSetSelectionBoundsLeft:top:right:bottom:)] &&
+ ([array count] == 5) &&
+ ([[array objectAtIndex: 1] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 2] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 3] isKindOfClass: [NSNumber class]]) &&
+ ([[array objectAtIndex: 4] isKindOfClass: [NSNumber class]])) {
+ [_delegate jsSetSelectionBoundsLeft: ((NSNumber *)[array objectAtIndex: 1]).intValue
+ top: ((NSNumber *)[array objectAtIndex: 2]).intValue
+ right: ((NSNumber *)[array objectAtIndex: 3]).intValue
+ bottom: ((NSNumber *)[array objectAtIndex: 4]).intValue];
+ }
+ else if ([functionName isEqualToString: @"updateAutoCorrect"] &&
+ [_delegate respondsToSelector: @selector(jsUpdateAutoCorrect)]) {
+ [_delegate jsUpdateAutoCorrect];
+ }
+ else if ([functionName isEqualToString: @"error"] &&
+ (array.count == 3) &&
+ [[array objectAtIndex: 1] isKindOfClass: [NSString class]] &&
+ [[array objectAtIndex: 2] isKindOfClass: [NSString class]]) {
+ NSString *message = [array objectAtIndex: 1];
+ NSString *type = [array objectAtIndex: 2];
+ if (type.length == 0)
+ type = nil;
+ [self reportErrorWithType: type format: @"%@", message];
+ }
+}
+
+- (void)reportErrorWithType:(NSString *)type format:(NSString *)format, ...
+{
+ if (self.error != nil)
+ return;
+
+ va_list ap;
+ va_start(ap,format);
+ NSString *basicError = [[NSString alloc] initWithFormat: format arguments: ap];
+ va_end(ap);
+
+ NSString *getErrorReportingInfo = [NSString stringWithFormat: @"interface_functions[%d]()",
+ Main_getErrorReportingInfo];
+ NSString *html = [_evaluator stringByEvaluatingJavaScriptFromString: getErrorReportingInfo];
+
+ self.error = [[JSError alloc] initWithType: type
+ message: basicError
+ operation: self.currentOperation
+ html: html];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSModule //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSModule
+
+- (JSModule *)initWithJS:(JSInterface *)js
+{
+ if (!(self = [super init]))
+ return nil;
+ _js = js;
+ return self;
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSAutoCorrect //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSAutoCorrect
+
+- (void)correctPreceding:(int)numChars word:(NSString *)replacement confirmed:(BOOL)confirmed;
+{
+ [self.js executeJavaScript: AutoCorrect_correctPrecedingWord nargs: 3,
+ [NSNumber numberWithInt: numChars], replacement, [NSNumber numberWithBool: confirmed]];
+}
+
+- (NSDictionary *)getCorrection
+{
+ return [self.js executeJavaScriptJSON: AutoCorrect_getCorrection nargs: 0];
+}
+
+- (NSDictionary *)getCorrectionCoords
+{
+ return [self.js executeJavaScriptJSON: AutoCorrect_getCorrectionCoords nargs: 0];
+}
+
+- (void)acceptCorrection
+{
+ [self.js executeJavaScript: AutoCorrect_acceptCorrection nargs: 0];
+}
+
+- (void)replaceCorrection:(NSString *)replacement
+{
+ [self.js executeJavaScript: AutoCorrect_replaceCorrection nargs: 1, replacement];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSChangeTracking //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSChangeTracking
+
+- (BOOL)showChanges
+{
+ NSString *result = [self.js executeJavaScript: ChangeTracking_showChanges nargs: 0];
+ return [result isEqualToString: @"true"];
+}
+
+- (BOOL)trackChanges
+{
+ NSString *result = [self.js executeJavaScript: ChangeTracking_trackChanges nargs: 0];
+ return [result isEqualToString: @"true"];
+}
+
+- (void)setShowChanges:(BOOL)showChanges
+{
+ [self.js executeJavaScript: ChangeTracking_setShowChanges
+ nargs: 1, [NSNumber numberWithBool: showChanges]];
+}
+
+- (void)setTrackChanges:(BOOL)trackChanges
+{
+ [self.js executeJavaScript: ChangeTracking_setTrackChanges
+ nargs: 1, [NSNumber numberWithBool: trackChanges]];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSClipboard //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSClipboard
+
+// The copy operation is called clipboardCopy to keep the static analyzer happy, because it thinks
+// that it relates to making a copy of the object and reports a memory leak. The cut operation
+// is named similarly just for consistency.
+
+- (NSDictionary *)clipboardCut
+{
+ return [self.js executeJavaScriptJSON: Clipboard_cut nargs: 0];
+}
+
+- (NSDictionary *)clipboardCopy
+{
+ return [self.js executeJavaScriptJSON: Clipboard_copy nargs: 0];
+}
+
+- (void)pasteHTML:(NSString *)html
+{
+ [self.js executeJavaScript: Clipboard_pasteHTML nargs: 1, html];
+}
+
+- (void)pasteText:(NSString *)text
+{
+ [self.js executeJavaScript: Clipboard_pasteText nargs: 1, text];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSCursor //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Functions implemented in Cursor.js
+
+@implementation JSCursor
+
+- (NSString *)positionCursorX:(int)x y:(int)y wordBoundary:(BOOL)wordBoundary
+{
+ return [self.js executeJavaScript: Cursor_positionCursor nargs: 3,
+ [NSNumber numberWithInt: x], [NSNumber numberWithInt: y],
+ [NSNumber numberWithBool: wordBoundary]];
+}
+
+- (CGRect)getCursorPosition
+{
+ NSDictionary *result = [self.js executeJavaScriptJSON: Cursor_getCursorPosition nargs: 0];
+ return CGRectMake(NSDictionaryGetInt(result,@"x"),
+ NSDictionaryGetInt(result,@"y"),
+ NSDictionaryGetInt(result,@"width"),
+ NSDictionaryGetInt(result,@"height"));
+}
+
+- (void)moveLeft
+{
+ [self.js executeJavaScript: Cursor_moveLeft nargs: 0];
+}
+
+- (void)moveRight
+{
+ [self.js executeJavaScript: Cursor_moveRight nargs: 0];
+}
+
+- (void)moveToStartOfDocument
+{
+ [self.js executeJavaScript: Cursor_moveToStartOfDocument nargs: 0];
+}
+
+- (void)moveToEndOfDocument
+{
+ [self.js executeJavaScript: Cursor_moveToEndOfDocument nargs: 0];
+}
+
+- (void)insertReference:(NSString *)itemId
+{
+ [self.js executeJavaScript: Cursor_insertReference nargs: 1, itemId];
+}
+
+- (void)insertLinkWithText:(NSString *)text URL:(NSString *)URL
+{
+ [self.js executeJavaScript: Cursor_insertLink nargs: 2, text, URL];
+}
+
+- (void)insertCharacter:(unichar)character allowInvalidPos:(BOOL)allowInvalidPos
+{
+ NSString *str = [NSString stringWithFormat: @"%C", character];
+ [self.js executeJavaScript: Cursor_insertCharacter nargs: 2, str,
+ [NSNumber numberWithBool: allowInvalidPos]];
+}
+
+- (void)deleteCharacter
+{
+ [self.js executeJavaScript: Cursor_deleteCharacter nargs: 0];
+}
+
+- (void)enterPressed
+{
+ [self.js executeJavaScript: Cursor_enterPressed nargs: 0];
+}
+
+- (NSString *)getPrecedingWord
+{
+ return [self.js executeJavaScript: Cursor_getPrecedingWord nargs: 0];
+}
+
+- (NSDictionary *)getLinkProperties
+{
+ return [self.js executeJavaScriptJSON: Cursor_getLinkProperties nargs: 0];
+}
+
+- (void)setLinkProperties:(NSDictionary *)properties
+{
+ [self.js executeJavaScript: Cursor_setLinkProperties nargs: 1, properties];
+}
+
+- (void)setReferenceTarget:(NSString *)itemId
+{
+ [self.js executeJavaScript: Cursor_setReferenceTarget nargs: 1, itemId];
+}
+
+- (void)insertFootnote:(NSString *)content
+{
+ [self.js executeJavaScript: Cursor_insertFootnote nargs: 1, content];
+}
+
+- (void)insertEndnote:(NSString *)content
+{
+ [self.js executeJavaScript: Cursor_insertEndnote nargs: 1, content];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// Equations //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSEquations
+
+- (void)insertEquation
+{
+ [self.js executeJavaScript: Equations_insertEquation nargs: 0];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSFigures //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSFigures
+
+- (void)insertFigure:(NSString *)filename width:(NSString *)width
+ numbered:(BOOL)numbered caption:(NSString *)caption
+{
+ [self.js executeJavaScript: Figures_insertFigure nargs: 4,
+ filename, width, [NSNumber numberWithBool: numbered], caption];
+}
+
+- (NSString *)getSelectedFigureId
+{
+ return [self.js executeJavaScript: Figures_getSelectedFigureId nargs: 0];
+}
+
+- (NSDictionary *)getProperties:(NSString *)itemId
+{
+ return [self.js executeJavaScriptJSON: Figures_getProperties nargs: 1, itemId];
+}
+
+- (void)setProperties:(NSString *)itemId width:(NSString *)width src:(NSString *)src
+{
+ [self.js executeJavaScript: Figures_setProperties nargs: 3, itemId, width, src];
+}
+
+- (NSDictionary *)getGeometry:(NSString *)itemId
+{
+ return [self.js executeJavaScriptJSON: Figures_getGeometry nargs: 1, itemId];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSFormatting //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Functions implemented in Formatting.js
+
+@implementation JSFormatting
+
+- (NSDictionary *)getFormatting
+{
+ return [self.js executeJavaScriptJSON: Formatting_getFormatting nargs: 0];
+}
+
+- (void)applyFormattingChangesStyle:(NSString *)style properties:(NSDictionary *)properties
+{
+ [self.js executeJavaScript: Formatting_applyFormattingChanges nargs: 2, style, properties];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSInput //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSInput
+
+- (void)removePosition:(int)posId
+{
+ [self.js executeJavaScript: Input_removePosition nargs: 1, [NSNumber numberWithInt: posId]];
+}
+
+- (NSString *)textInRangeStartId:(int)startId startAdjust:(int)startAdjust
+ endId:(int)endId endAdjust:(int)endAdjust
+{
+ return [self.js executeJavaScript: Input_textInRange nargs: 4,
+ [NSNumber numberWithInt: startId],
+ [NSNumber numberWithInt: startAdjust],
+ [NSNumber numberWithInt: endId],
+ [NSNumber numberWithInt: endAdjust]];
+}
+
+- (void)replaceRangeStart:(int)startId end:(int)endId withText:(NSString *)text
+{
+ [self.js executeJavaScript: Input_replaceRange nargs: 3,
+ [NSNumber numberWithInt: startId], [NSNumber numberWithInt: endId], text];
+}
+
+- (NSDictionary *)selectedTextRange
+{
+ return [self.js executeJavaScriptJSON: Input_selectedTextRange nargs: 0];
+}
+
+- (void)setSelectedTextRangeStart:(int)startId end:(int)endId
+{
+ [self.js executeJavaScript: Input_setSelectedTextRange nargs: 2,
+ [NSNumber numberWithInt: startId], [NSNumber numberWithInt: endId]];
+}
+
+- (NSDictionary *)markedTextRange
+{
+ return [self.js executeJavaScriptJSON: Input_markedTextRange nargs: 0];
+}
+
+- (void)setMarkedText:(NSString *)text startOffset:(int)startOffset endOffset:(int)endOffset
+{
+ [self.js executeJavaScript: Input_setMarkedText nargs: 3,
+ text, [NSNumber numberWithInt: startOffset], [NSNumber numberWithInt: endOffset]];
+}
+
+- (void)unmarkText
+{
+ [self.js executeJavaScript: Input_unmarkText nargs: 0];
+}
+
+- (BOOL)forwardSelectionAffinity
+{
+ NSString *result = [self.js executeJavaScript: Input_forwardSelectionAffinity nargs: 0];
+ return [result isEqualToString: @"true"];
+}
+
+- (void)setForwardSelectionAffinity:(BOOL)forwardSelectionAffinity
+{
+ [self.js executeJavaScript: Input_setForwardSelectionAffinity nargs: 1,
+ [NSNumber numberWithBool: forwardSelectionAffinity]];
+}
+
+- (int)positionFromPosition:(int)posId offset:(int)offset
+{
+ NSString *result = [self.js executeJavaScript: Input_positionFromPositionOffset nargs: 2,
+ [NSNumber numberWithInt: posId], [NSNumber numberWithInt: offset]];
+ return result.intValue;
+}
+
+- (int)positionFromPosition:(int)posId inDirection:(NSString *)direction offset:(int)offset
+{
+ NSString *result = [self.js executeJavaScript: Input_positionFromPositionInDirectionOffset nargs: 3,
+ [NSNumber numberWithInt: posId], direction, [NSNumber numberWithInt: offset]];
+ return result.intValue;
+}
+
+- (int)comparePosition:(int)positionId toPosition:(int)otherId
+{
+ NSString *result = [self.js executeJavaScript: Input_comparePositionToPosition nargs: 2,
+ [NSNumber numberWithInt: positionId], [NSNumber numberWithInt: otherId]];
+ return result.intValue;
+}
+
+- (int)offsetFromPosition:(int)fromPosition toPosition:(int)toPosition
+{
+ NSString *result = [self.js executeJavaScript: Input_offsetFromPositionToPosition nargs: 2,
+ [NSNumber numberWithInt: fromPosition], [NSNumber numberWithInt: toPosition]];
+ return result.intValue;
+}
+
+- (int)positionWithinRangeStart:(int)startId end:(int)endId farthestInDirection:(NSString *)direction
+{
+ NSString *result = [self.js executeJavaScript: Input_positionWithinRangeFarthestInDirection nargs: 3,
+ [NSNumber numberWithInt: startId], [NSNumber numberWithInt: endId], direction];
+ return result.intValue;
+}
+
+- (NSDictionary *)characterRangeByExtendingPosition:(int)positionId inDirection:(NSString *)direction
+{
+ return [self.js executeJavaScriptJSON: Input_characterRangeByExtendingPositionInDirection nargs: 2,
+ [NSNumber numberWithInt: positionId], direction];
+}
+
+- (NSDictionary *)firstRectForRangeStart:(int)startId end:(int)endId
+{
+ return [self.js executeJavaScriptJSON: Input_firstRectForRange nargs: 2,
+ [NSNumber numberWithInt: startId], [NSNumber numberWithInt: endId]];
+}
+
+- (NSDictionary *)caretRectForPosition:(int)posId
+{
+ return [self.js executeJavaScriptJSON: Input_caretRectForPosition nargs: 1,
+ [NSNumber numberWithInt: posId]];
+}
+
+- (int)closestPositionToPointX:(int)x y:(int)y
+{
+ NSString *result = [self.js executeJavaScript: Input_closestPositionToPoint nargs: 2,
+ [NSNumber numberWithInt: x], [NSNumber numberWithInt: y]];
+ return result.intValue;
+}
+
+- (int)closestPositionToPointX:(int)x y:(int)y withinRangeStart:(int)startId end:(int)endId
+{
+ NSString *result = [self.js executeJavaScript: Input_closestPositionToPointWithinRange nargs: 4,
+ [NSNumber numberWithInt: x], [NSNumber numberWithInt: y],
+ [NSNumber numberWithInt: startId], [NSNumber numberWithInt: endId]];
+ return result.intValue;
+}
+
+- (NSDictionary *)characterRangeAtPointX:(int)x y:(int)y
+{
+ return [self.js executeJavaScriptJSON: Input_characterRangeAtPoint nargs: 2,
+ [NSNumber numberWithInt: x], [NSNumber numberWithInt: y]];
+}
+
+- (int)positionWithinRangeStart:(int)startId end:(int)endId atCharacterOffset:(int)offset
+{
+ NSString *result = [self.js executeJavaScript: Input_positionWithinRangeAtCharacterOffset nargs: 3,
+ [NSNumber numberWithInt: startId], [NSNumber numberWithInt: endId],
+ [NSNumber numberWithInt: offset]];
+ return result.intValue;
+}
+
+- (int)characterOffsetOfPosition:(int)positionId withinRangeStart:(int)startId end:(int)endId
+{
+ NSString *result = [self.js executeJavaScript: Input_characterOffsetOfPositionWithinRange nargs: 3,
+ [NSNumber numberWithInt: positionId],
+ [NSNumber numberWithInt: startId], [NSNumber numberWithInt: endId]];
+ return result.intValue;
+}
+
+// UITextInputTokenizer methods
+
+- (BOOL)isPosition:(int)posId atBoundary:(NSString *)granularity inDirection:(NSString *)direction
+{
+ NSString *result = [self.js executeJavaScript: Input_isPositionAtBoundaryGranularityInDirection nargs: 3,
+ [NSNumber numberWithInt: posId], granularity, direction];
+ return [result isEqualToString: @"true"];
+}
+
+- (BOOL)isPosition:(int)posId withinTextUnit:(NSString *)granularity inDirection:(NSString *)direction
+{
+ NSString *result = [self.js executeJavaScript: Input_isPositionWithinTextUnitInDirection nargs: 3,
+ [NSNumber numberWithInt: posId], granularity, direction];
+ return [result isEqualToString: @"true"];
+}
+
+- (int)positionFromPosition:(int)posId toBoundary:(NSString *)granularity inDirection:(NSString *)direction
+{
+ NSString *result = [self.js executeJavaScript: Input_positionFromPositionToBoundaryInDirection nargs: 3,
+ [NSNumber numberWithInt: posId], granularity, direction];
+ return result.intValue;
+}
+
+- (NSDictionary *)rangeEnclosingPosition:(int)posId withGranularity:(NSString *)granularity inDirection:(NSString *)direction
+{
+ return [self.js executeJavaScriptJSON: Input_rangeEnclosingPositionWithGranularityInDirection nargs: 3,
+ [NSNumber numberWithInt: posId], granularity, direction];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSLists //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Functions implemented in Lists.js
+
+@implementation JSLists
+
+- (void)increaseIndent
+{
+ [self.js executeJavaScript: Lists_increaseIndent nargs: 0];
+}
+
+- (void)decreaseIndent
+{
+ [self.js executeJavaScript: Lists_decreaseIndent nargs: 0];
+}
+
+- (void)clearList
+{
+ [self.js executeJavaScript: Lists_clearList nargs: 0];
+}
+
+- (void)setUnorderedList
+{
+ [self.js executeJavaScript: Lists_setUnorderedList nargs: 0];
+}
+
+- (void)setOrderedList
+{
+ [self.js executeJavaScript: Lists_setOrderedList nargs: 0];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSMain //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Functions implemented in Main.js
+
+@implementation JSMain
+
+- (NSString *)getLanguage
+{
+ return [self.js executeJavaScript: Main_getLanguage nargs: 0];
+}
+
+- (void)setLanguage:(NSString *)language
+{
+ [self.js executeJavaScript: Main_setLanguage nargs: 1, language];
+}
+
+- (NSString *)setGenerator:(NSString *)generator
+{
+ return [self.js executeJavaScript: Main_setGenerator nargs: 1, generator];
+}
+
+- (BOOL)prepareForSave
+{
+ NSString *result = [self.js executeJavaScript: Main_prepareForSave nargs: 0];
+ return [@"true" isEqualToString: result];
+}
+
+- (NSString *)getHTML;
+{
+ return [self.js executeJavaScript: Main_getHTML nargs: 0];
+}
+
+- (BOOL)isEmptyDocument
+{
+ NSString *result = [self.js executeJavaScript: Main_isEmptyDocument nargs: 0];
+ return [result isEqualToString: @"true"];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSMetadata //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSMetadata
+
+- (NSDictionary *)getMetadata
+{
+ return [self.js executeJavaScriptJSON: Metadata_getMetadata nargs: 0];
+}
+
+- (void)setMetadata:(NSDictionary *)metadata
+{
+ [self.js executeJavaScriptJSON: Metadata_setMetadata nargs: 1, metadata];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSOutline //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Functions implemented in Outline.js
+
+@implementation JSOutline
+
+- (NSDictionary *)getOutline
+{
+ return [self.js executeJavaScriptJSON: Outline_getOutline nargs: 0];
+}
+
+- (void)moveSection:(NSString *)sectionId parentId:(NSString *)parentId nextId:(NSString *)nextId
+{
+ [self.js executeJavaScript: Outline_moveSection nargs: 3, sectionId, parentId, nextId];
+}
+
+- (void)deleteItem:(NSString *)itemId
+{
+ [self.js executeJavaScript: Outline_deleteItem nargs: 1, itemId];
+}
+
+- (void)scheduleUpdateStructure
+{
+ [self.js executeJavaScript: Outline_scheduleUpdateStructure nargs: 0];
+}
+
+- (void)goToItem:(NSString *)itemId
+{
+ [self.js executeJavaScript: Outline_goToItem nargs: 1, itemId];
+}
+
+- (void)set:(NSString *)itemId numbered:(BOOL)numbered
+{
+ [self.js executeJavaScript: Outline_setNumbered nargs: 2, itemId, [NSNumber numberWithBool: numbered]];
+}
+
+- (void)set:(NSString *)itemId title:(NSString *)title
+{
+ [self.js executeJavaScript: Outline_setTitle nargs: 2, itemId, title];
+}
+
+- (void)insertTableOfContents
+{
+ [self.js executeJavaScript: Outline_insertTableOfContents nargs: 0];
+}
+
+- (void)insertListOfFigures
+{
+ [self.js executeJavaScript: Outline_insertListOfFigures nargs: 0];
+}
+
+- (void)insertListOfTables
+{
+ [self.js executeJavaScript: Outline_insertListOfTables nargs: 0];
+}
+
+- (void)setPrintMode:(BOOL)printMode
+{
+ [self.js executeJavaScript: Outline_setPrintMode nargs: 1, [NSNumber numberWithBool: printMode]];
+}
+
+- (NSDictionary *)examinePrintLayout:(int)pageHeight
+{
+ return [self.js executeJavaScriptJSON: Outline_examinePrintLayout nargs: 1,
+ [NSNumber numberWithInt: pageHeight]];
+}
+
+- (BOOL)detectSectionNumbering
+{
+ NSString *result = [self.js executeJavaScript: Outline_detectSectionNumbering nargs: 0];
+ return [result isEqualToString: @"true"];
+}
+
+- (NSDictionary *)findUsedStyles
+{
+ return [self.js executeJavaScriptJSON: Outline_findUsedStyles nargs: 0];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSPreview //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSPreview
+
+- (void)showForStyle:(NSString *)styleId uiName:(NSString *)uiName title:(NSString *)title
+{
+ [self.js executeJavaScript: Preview_showForStyle nargs: 3, styleId, uiName, title];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSScan //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSScan
+
+- (void)reset
+{
+ [self.js executeJavaScript: Scan_reset nargs: 0];
+}
+
+- (EDScanParagraph *)next
+{
+ NSDictionary *dict = [self.js executeJavaScriptJSON: Scan_next nargs: 0];
+ if ((dict == nil) || ![dict isKindOfClass: [NSDictionary class]])
+ return nil;
+
+ NSString *text = FCGetString(dict,@"text",nil);
+ NSString *sectionId = FCGetString(dict,@"sectionId",nil);
+ if (text == nil)
+ return nil;
+
+ return [[EDScanParagraph alloc] initWithText: text sectionId: sectionId];
+}
+
+- (int)addMatchStart:(int)start end:(int)end
+{
+ return [self.js executeJavaScript: Scan_addMatch nargs: 2,
+ [NSNumber numberWithInt: start],
+ [NSNumber numberWithInt: end]].intValue;
+}
+
+- (void)showMatch:(int)matchId
+{
+ [self.js executeJavaScript: Scan_showMatch nargs: 1, [NSNumber numberWithInt: matchId]];
+}
+
+- (void)replaceMatch:(int)matchId with:(NSString *)text
+{
+ [self.js executeJavaScript: Scan_replaceMatch nargs: 2, [NSNumber numberWithInt: matchId], text];
+}
+
+- (void)removeMatch:(int)matchId
+{
+ [self.js executeJavaScript: Scan_removeMatch nargs: 1, [NSNumber numberWithInt: matchId]];
+}
+
+- (void)goToMatch:(int)matchId
+{
+ [self.js executeJavaScript: Scan_goToMatch nargs: 1, [NSNumber numberWithInt: matchId]];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSSelection //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Functions implemented in Selection.js
+
+@implementation JSSelection
+
+- (void)update
+{
+ [self.js executeJavaScript: Selection_update nargs: 0];
+}
+
+- (void)selectAll
+{
+ [self.js executeJavaScript: Selection_selectAll nargs: 0];
+}
+
+- (void)selectParagraph
+{
+ [self.js executeJavaScript: Selection_selectParagraph nargs: 0];
+}
+
+- (void)selectWordAtCursor
+{
+ [self.js executeJavaScript: Selection_selectWordAtCursor nargs: 0];
+}
+
+- (NSString *)dragSelectionBeginX:(int)x y:(int)y selectWord:(BOOL)selectWord
+{
+ return [self.js executeJavaScript: Selection_dragSelectionBegin nargs: 3,
+ [NSNumber numberWithInt: x], [NSNumber numberWithInt: y],
+ [NSNumber numberWithBool: selectWord]];
+}
+
+- (NSString *)dragSelectionUpdateX:(int)x y:(int)y selectWord:(BOOL)selectWord
+{
+ return [self.js executeJavaScript: Selection_dragSelectionUpdate nargs: 3,
+ [NSNumber numberWithInt: x], [NSNumber numberWithInt: y],
+ [NSNumber numberWithBool: selectWord]];
+}
+
+- (NSString *)moveStartLeft
+{
+ return [self.js executeJavaScript: Selection_moveStartLeft nargs: 0];
+}
+
+- (NSString *)moveStartRight
+{
+ return [self.js executeJavaScript: Selection_moveStartRight nargs: 0];
+}
+
+- (NSString *)moveEndLeft
+{
+ return [self.js executeJavaScript: Selection_moveEndLeft nargs: 0];
+}
+
+- (NSString *)moveEndRight
+{
+ return [self.js executeJavaScript: Selection_moveEndRight nargs: 0];
+}
+
+- (void)setSelectionStartAtCoordsX:(int)x y:(int)y
+{
+ [self.js executeJavaScript: Selection_setSelectionStartAtCoords nargs: 2,
+ [NSNumber numberWithInt: x], [NSNumber numberWithInt: y]];
+}
+
+- (void)setSelectionEndAtCoordsX:(int)x y:(int)y
+{
+ [self.js executeJavaScript: Selection_setSelectionEndAtCoords nargs: 2,
+ [NSNumber numberWithInt: x], [NSNumber numberWithInt: y]];
+}
+
+- (void)setTableSelectionEdge:(NSString *)edge atCoordsX:(int)x y:(int)y
+{
+ [self.js executeJavaScript: Selection_setTableSelectionEdgeAtCoords nargs: 3,
+ edge, [NSNumber numberWithInt: x], [NSNumber numberWithInt: y]];
+}
+
+- (void)print
+{
+ [self.js executeJavaScript: Selection_print nargs: 0];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSStyles //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSStyles
+
+- (NSString *)getCSSText
+{
+ return [self.js executeJavaScript: Styles_getCSSText nargs: 0];
+}
+
+- (void)setCSSText:(NSString *)cssText rules:(NSDictionary *)rules
+{
+// debug(@"---------------------- setCSSText ----------------------\n");
+// debug(@"%@",cssText);
+// if ((cssText.length > 0) && ([cssText characterAtIndex: cssText.length-1] != '\n'))
+// debug(@"\n");
+// debug(@"--------------------------------------------------------\n");
+ [self.js executeJavaScriptJSON: Styles_setCSSText nargs: 2, cssText, rules];
+}
+
+- (NSString *)paragraphClass
+{
+ return [self.js executeJavaScript: Styles_getParagraphClass nargs: 0];
+}
+
+- (void)setParagraphClass:(NSString *)paragraphClass;
+{
+ [self.js executeJavaScript: Styles_setParagraphClass nargs: 1, paragraphClass];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSTables //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Functions implemented in Tables.js
+
+@implementation JSTables
+
+- (void)insertTableRows:(int)rows cols:(int)cols width:(NSString *)width numbered:(BOOL)numbered
+ caption:(NSString *)caption className:(NSString *)className;
+{
+ [self.js executeJavaScript: Tables_insertTable nargs: 6,
+ [NSNumber numberWithInt: rows], [NSNumber numberWithInt: cols],
+ width, [NSNumber numberWithBool: numbered], caption, className];
+}
+
+- (void)addAdjacentRow
+{
+ [self.js executeJavaScript: Tables_addAdjacentRow nargs: 0];
+}
+
+- (void)addAdjacentColumn
+{
+ [self.js executeJavaScript: Tables_addAdjacentColumn nargs: 0];
+}
+
+- (void)removeAdjacentRow
+{
+ [self.js executeJavaScript: Tables_removeAdjacentRow nargs: 0];
+}
+
+- (void)removeAdjacentColumn
+{
+ [self.js executeJavaScript: Tables_removeAdjacentColumn nargs: 0];
+}
+
+- (void)clearCells
+{
+ [self.js executeJavaScript: Tables_clearCells nargs: 0];
+}
+
+- (void)mergeCells
+{
+ [self.js executeJavaScript: Tables_mergeCells nargs: 0];
+}
+
+- (void)splitSelection
+{
+ [self.js executeJavaScript: Tables_splitSelection nargs: 0];
+}
+
+- (NSString *)getSelectedTableId
+{
+ return [self.js executeJavaScript: Tables_getSelectedTableId nargs: 0];
+}
+
+- (NSDictionary *)getProperties:(NSString *)itemId
+{
+ return [self.js executeJavaScriptJSON: Tables_getProperties nargs: 1, itemId];
+}
+
+- (void)setProperties:(NSString *)itemId width:(NSString *)width
+{
+ [self.js executeJavaScript: Tables_setProperties nargs: 2, itemId, width];
+}
+
+- (void)set:(NSString *)itemId colWidths:(NSArray *)colWidths
+{
+ [self.js executeJavaScript: Tables_setColWidths nargs: 2, itemId, colWidths];
+}
+
+- (NSDictionary *)getGeometry:(NSString *)itemId
+{
+ return [self.js executeJavaScriptJSON: Tables_getGeometry nargs: 1, itemId];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSUndoManager //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation JSUndoManager
+
+- (int)getLength
+{
+ NSString *result = [self.js executeJavaScript: UndoManager_getLength nargs: 0];
+ return result.intValue;
+}
+
+- (int)getIndex
+{
+ NSString *result = [self.js executeJavaScript: UndoManager_getIndex nargs: 0];
+ return result.intValue;
+}
+
+- (void)setIndex:(int)index
+{
+ [self.js executeJavaScript: UndoManager_setIndex nargs: 1, [NSNumber numberWithInt: index]];
+}
+
+- (void)undo
+{
+ [self.js executeJavaScript: UndoManager_undo nargs: 0];
+}
+
+- (void)redo
+{
+ [self.js executeJavaScript: UndoManager_redo nargs: 0];
+}
+
+- (void)newGroup:(NSString *)name
+{
+ [self.js executeJavaScript: UndoManager_newGroup nargs: 1, name];
+}
+
+- (NSString *)groupType
+{
+ return [self.js executeJavaScript: UndoManager_groupType nargs: 0];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// JSViewport //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Functions implemented in Viewport.js
+
+@implementation JSViewport
+
+- (void)setViewportWidth:(int)width
+{
+ [self.js executeJavaScript: Viewport_setViewportWidth nargs: 1, [NSNumber numberWithInt: width]];
+}
+
+- (void)setTextScale:(int)textScale
+{
+ [self.js executeJavaScript: Viewport_setTextScale nargs: 1, [NSNumber numberWithInt: textScale]];
+}
+
+@end
diff --git a/sample/code/objc_bindings/WARNING b/sample/code/objc_bindings/WARNING
new file mode 100644
index 0000000..cbc20f2
--- /dev/null
+++ b/sample/code/objc_bindings/WARNING
@@ -0,0 +1,12 @@
+IMPORTANT NOTE: This code does not work in it's current form, and exists for
+illustrative purposes only. It is an excerpt from the UX Write source code
+indented to show how the bindings between Objective C and JavaScript are
+implemented, both in terms of calling *in* to JavaScript, and calling *out* of
+JavaScript (that is, callback functions).
+
+The files in this directory should be considered temporary. They are here for
+the purpose of demonstrating to developers of various bindings how this can be
+achieved. It is envisaged that once there is at least one binding that has been
+developed purely as part of the Corinthia project, that will serve as the
+example for any future bindings, and the Objective-C/Apple-specific files can be
+removed.
diff --git a/sample/documents/INDEX b/sample/documents/INDEX
new file mode 100644
index 0000000..de74ddc
--- /dev/null
+++ b/sample/documents/INDEX
@@ -0,0 +1,29 @@
+This directory contains various files in the document formats that
+Corinthia supports.
+
+Contents of /html
+
+Name: Tags:
+----------------------------------------------------------------------
+h1-6_center_p.html H1-H6, b, i, u, p, center, bgcolor
+lists.html ul, ol ,li
+tables.html tr, td, th, border, cellpadding, br
+
+Contents of /docx
+
+Name: Tags:
+----------------------------------------------------------------------
+
+
+Contents of /odf
+
+Name: Tags:
+----------------------------------------------------------------------
+
+
+Contents of /tex
+
+Name: Tags:
+----------------------------------------------------------------------
+
+
diff --git a/sample/documents/docx/we-need-more-samples b/sample/documents/docx/we-need-more-samples
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sample/documents/docx/we-need-more-samples
diff --git a/sample/documents/html/h1-6_center_p.html b/sample/documents/html/h1-6_center_p.html
new file mode 100644
index 0000000..afdd014
--- /dev/null
+++ b/sample/documents/html/h1-6_center_p.html
@@ -0,0 +1,27 @@
+<head>
+<title>HTML: Headers 1-6, comment, center, paragraph</title>
+</head>
+<body bgcolor="PINK">
+
+<h1>This is a H1 header</h1>
+<h2>This is a H2 header</h2>
+<h3>This is a H3 header</h3>
+<h4>This is a H4 header</h4>
+<h5>This is a H5 header</h5>
+<h6>This is a H6 header</H6>
+
+<!-- This is a comment -->
+
+<center>This sentence is centered.</center>
+
+<p>This is a paragraph with five sentences, this sentence is plain.
+<b>This is a paragraph with five sentences, this sentence is bold.</b>
+<u>This is a paragraph with five sentences, this sentence is
+underlined.</u>
+<i>This is a paragraph with five sentences, this
+sentence is slanted.</i>
+<b><i>This is a paragraph with five
+sentences, this sentence is bold and slanted.</b></i>
+</p>
+
+</body>
diff --git a/sample/documents/html/lists.html b/sample/documents/html/lists.html
new file mode 100644
index 0000000..6a932c1
--- /dev/null
+++ b/sample/documents/html/lists.html
@@ -0,0 +1,18 @@
+<head>
+<title>HTML: Lists</title>
+</head>
+<body bgcolor="BLUE">
+
+<ol> Ordered List:
+ <li> Item 1 </li>
+ <li> Item 2 </li>
+ <li> Item 3 </li>
+</ol>
+
+<ul> Bulleted List:
+ <li> Item 1 </li>
+ <li> Item 2 </li>
+ <li> Item 3 </li>
+</ul>
+
+</body>
diff --git a/sample/documents/html/simple_1.html b/sample/documents/html/simple_1.html
new file mode 100644
index 0000000..6a932c1
--- /dev/null
+++ b/sample/documents/html/simple_1.html
@@ -0,0 +1,18 @@
+<head>
+<title>HTML: Lists</title>
+</head>
+<body bgcolor="BLUE">
+
+<ol> Ordered List:
+ <li> Item 1 </li>
+ <li> Item 2 </li>
+ <li> Item 3 </li>
+</ol>
+
+<ul> Bulleted List:
+ <li> Item 1 </li>
+ <li> Item 2 </li>
+ <li> Item 3 </li>
+</ul>
+
+</body>
diff --git a/sample/documents/html/table.html b/sample/documents/html/table.html
new file mode 100644
index 0000000..18cd7ab
--- /dev/null
+++ b/sample/documents/html/table.html
@@ -0,0 +1,33 @@
+<head>
+<title>HTML: Tables</title>
+</head>
+<body bgcolor="YELLOW">
+
+<table border="2">
+ <tr>
+ <td>Cell Line 1 (right)</td>
+ <td>cell Line 1 (left)</td>
+ </tr>
+ <tr>
+ <td>Cell Line 2 (right)</td>
+ <td>cell Line 2 (left)</td>
+ </tr>
+</table>
+<br/>
+<br/>
+<br/>
+<table cellpadding=5 border="5">
+ <tr>
+ <th>Column 1</th>
+ <th>Column 2</th>
+ </tr>
+ <tr>
+ <td>Line 1 column 1</td>
+ <td>Line 1 column 2</td>
+ </tr>
+ <tr>
+ <td>Line 2 column 1</td>
+ <td>Line 2 column 2</td>
+ </tr>
+</table>
+</body>
diff --git a/sample/documents/odf/we-need-more-samples b/sample/documents/odf/we-need-more-samples
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sample/documents/odf/we-need-more-samples
diff --git a/sample/documents/tex/we-need-more-samples b/sample/documents/tex/we-need-more-samples
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sample/documents/tex/we-need-more-samples
diff --git a/sample/documents/we-need-more-samples b/sample/documents/we-need-more-samples
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sample/documents/we-need-more-samples
diff --git a/schemas/createimpl.js b/schemas/createimpl.js
index 1d65042..e3ad79d 100755
--- a/schemas/createimpl.js
+++ b/schemas/createimpl.js
@@ -1,18 +1,21 @@
#!/usr/local/bin/phantomjs --web-security=no
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
var autoGeneratedMsg = "// This file was automatically generated using schemas/generate.sh. "+
"Do not edit.";
diff --git a/schemas/relaxng.js b/schemas/relaxng.js
index f73a668..233a263 100755
--- a/schemas/relaxng.js
+++ b/schemas/relaxng.js
@@ -1,18 +1,21 @@
#!/usr/local/bin/phantomjs --web-security=no
-// Copyright 2012-2014 UX Productivity Pty Ltd
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
/*