From f5df4973a10f6b91354a87f86a482743865ef775 Mon Sep 17 00:00:00 2001 From: Marc Liyanage Date: Sun, 27 Feb 2005 21:29:28 +0000 Subject: [PATCH] lots of source directory layout rearrangements and cleanups git-svn-id: svn+ssh://www.entropy.ch/Users/liyanage/Documents/svnroot/trunk/TestXSLT@154 153f8dbc-cef0-0310-8e0e-ba1d6c9f8c6b --- AppDelegate.h | 18 - AppDelegate.m | 40 - Distribution/readme.xml | 7 + DragDestinationTextView.h | 25 - DragDestinationTextView.m | 194 ----- FOPWrapper.java | 111 --- FindPanelController.h | 34 - FindPanelController.m | 129 ---- JAXPWrapper.java | 237 ------ JumpToLinePanelController.h | 16 - JumpToLinePanelController.m | 43 -- MyDocument.h | 199 ------ MyDocument.m | 1302 --------------------------------- NSApplicationScriptingCategory.h | 17 - NSApplicationScriptingCategory.m | 25 - ParameterSet.h | 34 - ParameterSet.m | 136 ---- StringErrorListener.java | 50 -- TabViewDraggingCategory.h | 22 - TabViewDraggingCategory.m | 36 - TestXSLT Icon.psd | Bin 110564 -> 0 bytes TestXSLT-Icon.png | Bin 10116 -> 0 bytes TestXSLT.icns | Bin 51981 -> 0 bytes TestXSLT.pbproj/liyanage.mode1 | 128 +--- TestXSLT.pbproj/liyanage.pbxuser | 967 +++++++++----------------- TestXSLT.pbproj/project.pbxproj | 182 +++-- TestXSLT.tif | Bin 84576 -> 0 bytes UnsavedChangesPanelController.h | 14 - UnsavedChangesPanelController.m | 22 - WarningIcon.psd | Bin 17127 -> 0 bytes WarningIcon.tif | Bin 1218 -> 0 bytes Workset.h | 68 -- Workset.m | 333 --------- XMLParserLibxml.h | 48 -- XMLParserLibxml.m | 315 -------- XMLTextView.h | 42 -- XMLTextView.m | 345 --------- XMLUtils.h | 23 - XMLUtils.m | 67 -- XSLTProcessor.h | 64 -- XSLTProcessor.m | 162 ----- XSLTProcessorFactory.h | 29 - XSLTProcessorFactory.m | 34 - XSLTProcessorJAXPBase.h | 34 - XSLTProcessorJAXPBase.m | 71 -- XSLTProcessorLibxslt.h | 48 -- XSLTProcessorLibxslt.m | 194 ----- XSLTProcessorSablotron.h | 29 - XSLTProcessorSablotron.m | 203 ------ XSLTProcessorSaxon.h | 21 - XSLTProcessorSaxon.m | 30 - XSLTProcessorXalan_J.h | 17 - XSLTProcessorXalan_J.m | 29 - XSL_FO_Renderer.h | 34 - XSL_FO_Renderer.m | 29 - artwork/TestXSLT Icon.psd | Bin 0 -> 110564 bytes artwork/TestXSLT-Icon.png | Bin 0 -> 10116 bytes artwork/TestXSLT.icns | Bin 0 -> 51981 bytes artwork/TestXSLT.tif | Bin 0 -> 84576 bytes artwork/WarningIcon.psd | Bin 0 -> 17127 bytes artwork/WarningIcon.tif | Bin 0 -> 1218 bytes artwork/powered_by_libxslt.gif | Bin 0 -> 3010 bytes distclean.sh | 7 - main.m | 14 - powered_by_libxslt.gif | Bin 3010 -> 0 bytes ragel_xmldeclscanner.c | 186 ----- ragel_xmldeclscanner.h | 46 -- ragel_xmldeclscanner_out.c | 508 ------------- ragel_xmlscanner.c | 462 ------------ ragel_xmlscanner.h | 69 -- ragel_xmlscanner_out.c | 909 ------------------------ src-java/FOPWrapper.java | 111 +++ src-java/JAXPWrapper.java | 237 ++++++ src-java/StringErrorListener.java | 50 ++ src/AppDelegate.h | 18 + src/AppDelegate.m | 40 + src/DragDestinationTextView.h | 25 + src/DragDestinationTextView.m | 194 +++++ src/FindPanelController.h | 34 + src/FindPanelController.m | 129 ++++ src/JumpToLinePanelController.h | 16 + src/JumpToLinePanelController.m | 43 ++ src/MyDocument.h | 199 ++++++ src/MyDocument.m | 1303 ++++++++++++++++++++++++++++++++++ src/NSApplicationScriptingCategory.h | 17 + src/NSApplicationScriptingCategory.m | 25 + src/ParameterSet.h | 34 + src/ParameterSet.m | 136 ++++ src/TabViewDraggingCategory.h | 22 + src/TabViewDraggingCategory.m | 36 + src/UnsavedChangesPanelController.h | 14 + src/UnsavedChangesPanelController.m | 22 + src/Workset.h | 68 ++ src/Workset.m | 333 +++++++++ src/XMLParserLibxml.h | 48 ++ src/XMLParserLibxml.m | 315 ++++++++ src/XMLTextView.h | 42 ++ src/XMLTextView.m | 345 +++++++++ src/XMLUtils.h | 23 + src/XMLUtils.m | 67 ++ src/XSLTProcessor.h | 64 ++ src/XSLTProcessor.m | 162 +++++ src/XSLTProcessorFactory.h | 29 + src/XSLTProcessorFactory.m | 34 + src/XSLTProcessorJAXPBase.h | 34 + src/XSLTProcessorJAXPBase.m | 71 ++ src/XSLTProcessorLibxslt.h | 48 ++ src/XSLTProcessorLibxslt.m | 194 +++++ src/XSLTProcessorSablotron.h | 29 + src/XSLTProcessorSablotron.m | 203 ++++++ src/XSLTProcessorSaxon.h | 21 + src/XSLTProcessorSaxon.m | 30 + src/XSLTProcessorXalan_J.h | 17 + src/XSLTProcessorXalan_J.m | 29 + src/XSL_FO_Renderer.h | 34 + src/XSL_FO_Renderer.m | 29 + src/main.m | 14 + src/ragel_xmldeclscanner.c | 186 +++++ src/ragel_xmldeclscanner.h | 46 ++ src/ragel_xmldeclscanner_out.c | 508 +++++++++++++ src/ragel_xmlscanner.c | 462 ++++++++++++ src/ragel_xmlscanner.h | 69 ++ src/ragel_xmlscanner_out.c | 909 ++++++++++++++++++++++++ src/test_ragel_xmlscanner.c | 31 + target_libxslt.sh | 44 -- test_ragel_xmlscanner.c | 31 - 126 files changed, 7683 insertions(+), 8049 deletions(-) delete mode 100644 AppDelegate.h delete mode 100644 AppDelegate.m delete mode 100644 DragDestinationTextView.h delete mode 100644 DragDestinationTextView.m delete mode 100644 FOPWrapper.java delete mode 100644 FindPanelController.h delete mode 100644 FindPanelController.m delete mode 100644 JAXPWrapper.java delete mode 100644 JumpToLinePanelController.h delete mode 100644 JumpToLinePanelController.m delete mode 100644 MyDocument.h delete mode 100644 MyDocument.m delete mode 100644 NSApplicationScriptingCategory.h delete mode 100644 NSApplicationScriptingCategory.m delete mode 100644 ParameterSet.h delete mode 100644 ParameterSet.m delete mode 100644 StringErrorListener.java delete mode 100644 TabViewDraggingCategory.h delete mode 100644 TabViewDraggingCategory.m delete mode 100644 TestXSLT Icon.psd delete mode 100644 TestXSLT-Icon.png delete mode 100644 TestXSLT.icns delete mode 100644 TestXSLT.tif delete mode 100644 UnsavedChangesPanelController.h delete mode 100644 UnsavedChangesPanelController.m delete mode 100644 WarningIcon.psd delete mode 100644 WarningIcon.tif delete mode 100644 Workset.h delete mode 100644 Workset.m delete mode 100644 XMLParserLibxml.h delete mode 100644 XMLParserLibxml.m delete mode 100644 XMLTextView.h delete mode 100644 XMLTextView.m delete mode 100644 XMLUtils.h delete mode 100644 XMLUtils.m delete mode 100644 XSLTProcessor.h delete mode 100644 XSLTProcessor.m delete mode 100644 XSLTProcessorFactory.h delete mode 100644 XSLTProcessorFactory.m delete mode 100644 XSLTProcessorJAXPBase.h delete mode 100644 XSLTProcessorJAXPBase.m delete mode 100644 XSLTProcessorLibxslt.h delete mode 100644 XSLTProcessorLibxslt.m delete mode 100644 XSLTProcessorSablotron.h delete mode 100644 XSLTProcessorSablotron.m delete mode 100644 XSLTProcessorSaxon.h delete mode 100644 XSLTProcessorSaxon.m delete mode 100644 XSLTProcessorXalan_J.h delete mode 100644 XSLTProcessorXalan_J.m delete mode 100644 XSL_FO_Renderer.h delete mode 100644 XSL_FO_Renderer.m create mode 100644 artwork/TestXSLT Icon.psd create mode 100644 artwork/TestXSLT-Icon.png create mode 100644 artwork/TestXSLT.icns create mode 100644 artwork/TestXSLT.tif create mode 100644 artwork/WarningIcon.psd create mode 100644 artwork/WarningIcon.tif create mode 100644 artwork/powered_by_libxslt.gif delete mode 100644 distclean.sh delete mode 100644 main.m delete mode 100644 powered_by_libxslt.gif delete mode 100644 ragel_xmldeclscanner.c delete mode 100644 ragel_xmldeclscanner.h delete mode 100644 ragel_xmldeclscanner_out.c delete mode 100644 ragel_xmlscanner.c delete mode 100644 ragel_xmlscanner.h delete mode 100644 ragel_xmlscanner_out.c create mode 100644 src-java/FOPWrapper.java create mode 100644 src-java/JAXPWrapper.java create mode 100644 src-java/StringErrorListener.java create mode 100644 src/AppDelegate.h create mode 100644 src/AppDelegate.m create mode 100644 src/DragDestinationTextView.h create mode 100644 src/DragDestinationTextView.m create mode 100644 src/FindPanelController.h create mode 100644 src/FindPanelController.m create mode 100644 src/JumpToLinePanelController.h create mode 100644 src/JumpToLinePanelController.m create mode 100644 src/MyDocument.h create mode 100644 src/MyDocument.m create mode 100644 src/NSApplicationScriptingCategory.h create mode 100644 src/NSApplicationScriptingCategory.m create mode 100644 src/ParameterSet.h create mode 100644 src/ParameterSet.m create mode 100644 src/TabViewDraggingCategory.h create mode 100644 src/TabViewDraggingCategory.m create mode 100644 src/UnsavedChangesPanelController.h create mode 100644 src/UnsavedChangesPanelController.m create mode 100644 src/Workset.h create mode 100644 src/Workset.m create mode 100644 src/XMLParserLibxml.h create mode 100644 src/XMLParserLibxml.m create mode 100644 src/XMLTextView.h create mode 100644 src/XMLTextView.m create mode 100644 src/XMLUtils.h create mode 100644 src/XMLUtils.m create mode 100644 src/XSLTProcessor.h create mode 100644 src/XSLTProcessor.m create mode 100644 src/XSLTProcessorFactory.h create mode 100644 src/XSLTProcessorFactory.m create mode 100644 src/XSLTProcessorJAXPBase.h create mode 100644 src/XSLTProcessorJAXPBase.m create mode 100644 src/XSLTProcessorLibxslt.h create mode 100644 src/XSLTProcessorLibxslt.m create mode 100644 src/XSLTProcessorSablotron.h create mode 100644 src/XSLTProcessorSablotron.m create mode 100644 src/XSLTProcessorSaxon.h create mode 100644 src/XSLTProcessorSaxon.m create mode 100644 src/XSLTProcessorXalan_J.h create mode 100644 src/XSLTProcessorXalan_J.m create mode 100644 src/XSL_FO_Renderer.h create mode 100644 src/XSL_FO_Renderer.m create mode 100644 src/main.m create mode 100644 src/ragel_xmldeclscanner.c create mode 100644 src/ragel_xmldeclscanner.h create mode 100644 src/ragel_xmldeclscanner_out.c create mode 100644 src/ragel_xmlscanner.c create mode 100644 src/ragel_xmlscanner.h create mode 100644 src/ragel_xmlscanner_out.c create mode 100644 src/test_ragel_xmlscanner.c delete mode 100644 target_libxslt.sh delete mode 100644 test_ragel_xmlscanner.c diff --git a/AppDelegate.h b/AppDelegate.h deleted file mode 100644 index 8029d82..0000000 --- a/AppDelegate.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// NSDocumentControllerNotificationCategory.h -// TestXSLT -// -// Created by Marc Liyanage on Sat Mar 29 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import - -@interface AppDelegate : NSObject -{ - IBOutlet NSWindow* prefsWindow; -} - -- (void)applicationWillTerminate:(NSNotification *)aNotification; - -@end diff --git a/AppDelegate.m b/AppDelegate.m deleted file mode 100644 index 7ebb67e..0000000 --- a/AppDelegate.m +++ /dev/null @@ -1,40 +0,0 @@ -// -// NSDocumentControllerNotificationCategory.m -// TestXSLT -// -// Created by Marc Liyanage on Sat Mar 29 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "AppDelegate.h" - -@implementation AppDelegate - - -- (id)init { - - self = [super init]; - if (!self) return nil; - - NSString *templateXML = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"template" ofType:@"xml"]]; - NSString *templateXSLT = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"template" ofType:@"xslt"]]; - - NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys: - @"YES", @"enableWellformedCheck", - @"YES", @"enableSyntaxAnalysis", - templateXML, @"templateXML", - templateXSLT, @"templateXSLT", - nil]; - [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; - - return self; - -} - - -- (void)applicationWillTerminate:(NSNotification *)aNotification { - [prefsWindow orderOut:self]; -} - - -@end diff --git a/Distribution/readme.xml b/Distribution/readme.xml index 31df711..2d8224d 100644 --- a/Distribution/readme.xml +++ b/Distribution/readme.xml @@ -35,6 +35,13 @@ Mac OS X 10.3. and Safari 1.0 must be installed on your system. + 3.2 + 24-FEB-2005 + Updated libxml2, libxslt, libexpat and Sablotron Libraries to the most recent versions. + Changed the way these libraries are included in the project, which removes tons of unused files from the distribution. + + + 3.1 19-FEB-2005 Extra special big thanks to the folks at VitalSource (http://www.vitalsource.com) for their generous donation in support of this release :-) diff --git a/DragDestinationTextView.h b/DragDestinationTextView.h deleted file mode 100644 index 3f70a1d..0000000 --- a/DragDestinationTextView.h +++ /dev/null @@ -1,25 +0,0 @@ - -// $Id$ - -/* DragDestinationTextView */ - -#import - - -/* This is a subclass of NSTextView that behaves identically except for drag and drop. - * Unlike NSTextView, this one will accept file drags, do all the highlighting etc. - * If the user drops the file at the end, it calls its delegate which must implement - * (BOOL)handleDroppedFile:(NSString *)filename forTextView:(NSTextView *)textView; - */ -@interface DragDestinationTextView : NSTextView -{ - NSRect previousRect; -} - -- (BOOL)dragIsFile:(id )sender; -- (NSString *)getFileForDrag:(id )sender; - - - - -@end diff --git a/DragDestinationTextView.m b/DragDestinationTextView.m deleted file mode 100644 index da3a835..0000000 --- a/DragDestinationTextView.m +++ /dev/null @@ -1,194 +0,0 @@ - - - -#import "DragDestinationTextView.h" -#import "MyDocument.h" - -@implementation DragDestinationTextView - - -// ========================================================== -// Overridden drag and drop methods -// ========================================================== - -- (NSDragOperation)draggingEntered:(id )sender { - - // We're only interested in files here, let the superclass handle everything else - - if (![self dragIsFile:sender]) { - return [super draggingEntered:sender]; - } - - // It is a file, highlight drop target - - [self lockFocus]; - [[NSColor selectedControlColor] set]; - NSFrameRectWithWidth([self visibleRect], 2.5); - [self unlockFocus]; - [[self window] flushWindow]; - - return NSDragOperationGeneric; - -} - - - -- (NSDragOperation)draggingUpdated:(id )sender { - - NSRect currentRect; - - // We're only interested in files here, let the superclass handle everything else - - if (![self dragIsFile:sender]) { - return [super draggingUpdated:sender]; - } - - - /* some code to handle the case where a user drags the mouse around an edge of the - * text field, triggering an autoscroll. If we don't do anything, our highlight frame - * would get scrolled along with the content and then redrawn immediately which - * obviously looks messy. - * Instead we check if the visible rectangle has moved since the last - * invocation. If it did, we just clear the frame and do no drawing. - * If the frame didn't move, we will draw the frame. - */ - currentRect = [self visibleRect]; - - if (!NSEqualRects(currentRect, previousRect)) { - - previousRect = currentRect; - [self setNeedsDisplay:YES]; - - } else { - - [self lockFocus]; - [[NSColor selectedControlColor] set]; - NSFrameRectWithWidth(currentRect, 2); - [self unlockFocus]; - [[self window] flushWindow]; - - } - - return NSDragOperationGeneric; - -} - - - -- (BOOL)prepareForDragOperation:(id )sender { - - if (![self dragIsFile:sender]) { - return [super prepareForDragOperation:sender]; - } - - return YES; - -} - - - -- (BOOL)performDragOperation:(id )sender { - - NSString *filename; - BOOL result; - - if (![self dragIsFile:sender]) { - return [super performDragOperation:sender]; - } - - filename = [self getFileForDrag:sender]; - result = [[self delegate] handleDroppedFile:filename forTextView:self]; - - if (result == NO) { - [self setNeedsDisplay:YES]; - } - - return result; -} - - - -- (void)concludeDragOperation:(id )sender { - - if (![self dragIsFile:sender]) { - [super concludeDragOperation:sender]; - return; - } - - [self setNeedsDisplay:YES]; - -} - - - -- (void)draggingExited:(id )sender { - - if (![self dragIsFile:sender]) { - [super draggingExited:sender]; - return; - } - - [self setNeedsDisplay:YES]; - -} - - - - - - - -// ========================================================== -// Helper methods to find out if a given NSDraggingInfo refers to a file drag -// ========================================================== - -- (BOOL)dragIsFile:(id )sender { - - BOOL isDirectory; - BOOL fileExists; - - NSString *dragFilename = [self getFileForDrag:sender]; - - if (dragFilename == nil) { - return NO; - } - - fileExists = [[NSFileManager defaultManager] fileExistsAtPath:dragFilename isDirectory:&isDirectory]; - - return (fileExists && (!isDirectory)); -} - - - -- (NSString *)getFileForDrag:(id )sender { - - NSPasteboard *pb = [sender draggingPasteboard]; - NSString *availableType = [pb availableTypeFromArray:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; - NSString *availableTypeString = [pb availableTypeFromArray:[NSArray arrayWithObjects:NSStringPboardType, nil]]; - NSString *dragFilename; - NSArray *props; - - if (availableType == nil) { - return nil; - } - - if (availableTypeString != nil) { - return nil; - } - - - - - - props = [pb propertyListForType:availableType]; - dragFilename = [props objectAtIndex:0]; - - return dragFilename; - -} - - - - - -@end diff --git a/FOPWrapper.java b/FOPWrapper.java deleted file mode 100644 index aea741a..0000000 --- a/FOPWrapper.java +++ /dev/null @@ -1,111 +0,0 @@ - -import java.io.*; - -import org.xml.sax.*; -import com.apple.cocoa.foundation.NSData; - -//Avalon -import org.apache.avalon.framework.ExceptionUtil; -import org.apache.avalon.framework.logger.Logger; -import org.apache.avalon.framework.logger.ConsoleLogger; - -//FOP -import org.apache.fop.apps.Driver; -import org.apache.fop.apps.FOPException; -import org.apache.fop.messaging.MessageHandler; - -/** - * This class helps calling FOP from the Obj-C side. - * Based on "ExampleFO2PDF.java" from the FOP project. - */ -public class FOPWrapper { - - String error; - boolean errorOccurred = false; - - public NSData convert(NSData foData) throws IOException, FOPException { - - //Construct driver - System.setProperty("java.awt.headless", "true"); - Driver driver = new Driver(); - - //Setup logger - Logger logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); - driver.setLogger(logger); - MessageHandler.setScreenLogger(logger); - - //Setup Renderer (output format) - driver.setRenderer(Driver.RENDER_PDF); - - //Setup output - ByteArrayOutputStream out = new java.io.ByteArrayOutputStream(); - try { - driver.setOutputStream(out); - - //Setup input - InputStream in = new java.io.ByteArrayInputStream(foData.bytes(0, foData.length())); - try { - driver.setInputSource(new InputSource(in)); - - //Process FO - driver.run(); - } catch (Exception e) { - error = e.toString(); - errorOccurred = true; - } finally { - in.close(); - } - - } finally { - out.close(); - } - - if (errorOccurred) { - return null; - } - return new NSData(out.toByteArray()); - - } - - public String getErrorMessage() { - return error; - } - - public boolean errorOccurred() { - return errorOccurred; - } - - - /* - public static void main(String[] args) { - try { - System.out.println("FOP ExampleFO2PDF\n"); - System.out.println("Preparing..."); - - //Setup directories - File baseDir = new File("."); - File outDir = new File(baseDir, "out"); - outDir.mkdirs(); - - //Setup input and output files - File fofile = new File(baseDir, "xml/fo/helloworld.fo"); - File pdffile = new File(outDir, "ResultFO2PDF.pdf"); - - System.out.println("Input: XSL-FO (" + fofile + ")"); - System.out.println("Output: PDF (" + pdffile + ")"); - System.out.println(); - System.out.println("Transforming..."); - - FOPWrapper app = new FOPWrapper(); - app.convertFO2PDF(fofile, pdffile); - - System.out.println("Success!"); - } catch (Exception e) { - System.err.println(ExceptionUtil.printStackTrace(e)); - System.exit(-1); - } - } - - */ - -} diff --git a/FindPanelController.h b/FindPanelController.h deleted file mode 100644 index 8e4de1e..0000000 --- a/FindPanelController.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// FindPanelController.h -// TestXSLT -// -// Created by Marc Liyanage on Tue Aug 20 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import - -@interface FindPanelController : NSWindowController { - - IBOutlet NSTextField *findField; - IBOutlet NSButton *caseInsensitiveCheckbox; - IBOutlet NSButton *nextButton; - IBOutlet NSButton *previousButton; - unsigned int searchFlags; - BOOL aborted; - -} - -- (unsigned int)caseInsensitiveFlag; -- (unsigned int)searchFlags; -- (void)setFindString:(id)string; -- (void)setSearchFlags:(unsigned int)flags; -- (NSString *)findString; -- (IBAction)find:(id)sender; -- (IBAction)findPrevious:(id)sender; -- (IBAction)abortFind:(id)sender; -- (IBAction)keyUp:(NSEvent *)event; -- (void)refresh; -- (BOOL)aborted; - -@end diff --git a/FindPanelController.m b/FindPanelController.m deleted file mode 100644 index 2d864bc..0000000 --- a/FindPanelController.m +++ /dev/null @@ -1,129 +0,0 @@ -// -// FindPanelController.m -// TestXSLT -// -// Created by Marc Liyanage on Tue Aug 20 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import "FindPanelController.h" - - -@implementation FindPanelController - -- (IBAction)findPrevious:(id)sender { - -// NSLog(@"Find Previous!"); - - [self find:sender]; - [self setSearchFlags:NSBackwardsSearch | [self caseInsensitiveFlag]]; - -} - -- (void)awakeFromNib { - - [self refresh]; -} - - -- (IBAction)find:(id)sender { - -// NSLog(@"Find!"); - - if ([[findField stringValue] length] > 0) { - [self setFindString:[findField stringValue]]; - } - - [NSApp stopModal]; - [self setSearchFlags:0 | [self caseInsensitiveFlag]]; - - -} - - -- (unsigned int)caseInsensitiveFlag { - - if ([caseInsensitiveCheckbox state] == NSOnState) { - return NSCaseInsensitiveSearch; - } else { - return 0; - } -} - -- (void)setSearchFlags:(unsigned int)flags { - - searchFlags = flags; - -} - - -- (unsigned int)searchFlags { - - return searchFlags; - -} - -- (IBAction)keyUp:(NSEvent *)event { - - BOOL state = [[findField stringValue] length] > 0; - [nextButton setEnabled:state]; - [previousButton setEnabled:state]; - -} - - -- (IBAction)abortFind:(id)sender { - - aborted = YES; - [NSApp stopModal]; - -} - -- (BOOL)aborted { - return aborted; -} - -- (void)setFindString:(id)string { - - if (string != nil) { - NSPasteboard *findBoard = [NSPasteboard pasteboardWithName:NSFindPboard]; - [findBoard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; - [findBoard setString:string forType:NSStringPboardType]; - -// NSLog(@"setFindString: %@", string); - [findField setStringValue:string]; - } else { -// NSLog(@"null setFindString: %@", string); - } - - -} - -- (void)refresh { - - [findField setStringValue:[self findString]]; - - BOOL state = [[findField stringValue] length] > 0; - [nextButton setEnabled:state]; - [previousButton setEnabled:state]; - aborted = NO; - -} - - - -- (NSString *)findString { - - NSPasteboard *findBoard = [NSPasteboard pasteboardWithName:NSFindPboard]; - [findBoard types]; - return [findBoard stringForType:NSStringPboardType]; - -} - - - - - - - -@end diff --git a/JAXPWrapper.java b/JAXPWrapper.java deleted file mode 100644 index fb9de49..0000000 --- a/JAXPWrapper.java +++ /dev/null @@ -1,237 +0,0 @@ -// -// JAXPWrapper.java -// TestXSLT -// -// Created by Marc Liyanage on Mon Aug 04 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -//package ch.entropy.testxslt; - -import java.io.*; -import java.util.*; -import java.util.regex.*; -import javax.xml.transform.*; -import javax.xml.transform.stream.*; -import javax.xml.*; -import javax.xml.parsers.*; -import org.xml.sax.*; -import com.apple.cocoa.foundation.*; - -/** - * JAXPWrapper is a helper class to make it easier to access JAXP transformers - * from the Obj-C code. - * - * @author Marc Liyanage - * @version $Id$ - */ -public class JAXPWrapper { - - ByteArrayOutputStream bos; - Exception transformException; - String errorMessage = "(no errors)"; - int errorSource = 0; - int errorLine = 0; - - public static final int XSLT_ERROR_SOURCE_XML = 1; - public static final int XSLT_ERROR_SOURCE_XSLT = 2; - - public NSData getResult() { - return new NSData(bos.toByteArray()); - } - - /** - * Does something really useful. - *

- * Blah blah {@link AnotherClass} blah blah. - * - * @param arg1 the first parameter - * @param arg2 the second parameter - * @return true if something, - * false otherwise. - */ - public boolean transform(String processorClassName, NSData xml, NSData xslt, String parameters, String baseUri) { - - java.lang.System.setProperty("javax.xml.transform.TransformerFactory", processorClassName); - - //System.err.println("java reached: xml: " + xml + " xsl: " + xslt + " param: " + parameters + " baseuri: " + baseUri); - - try { - - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer t = tf.newTransformer(new StreamSource(new ByteArrayInputStream(xslt.bytes(0, xslt.length())), baseUri)); - - - if (parameters.length() > 0) { - /* - * evil in-band separator tricks... - */ - Pattern pairDelimiter = Pattern.compile("--_-!-_--"); - Pattern keyValueDelimiter = Pattern.compile("==_=!=_=="); - - String [] pairs = pairDelimiter.split(parameters); - - for (int i = 0; i < pairs.length; i++) { - System.err.println("after1"); - String [] keyValue = keyValueDelimiter.split(pairs[i]); - - if (keyValue.length > 0) { - System.err.println("after2"); - String key = keyValue[0]; - String value; - - if (keyValue.length > 1) { - value = keyValue[1]; - } else { - value = ""; - } - - t.setParameter(key, value); - } - } - } - - bos = new ByteArrayOutputStream(); - t.transform(new StreamSource(new ByteArrayInputStream(xml.bytes(0, xml.length()))), new StreamResult(bos)); - - } catch (TransformerConfigurationException e) { - - errorSource = XSLT_ERROR_SOURCE_XSLT; /* That's the assumption anyway */ - errorMessage = getDeepestException(e).getMessage(); - errorLine = getLineNumber(getDeepestException(e)); - transformException = e; - - return false; - - } catch (TransformerException e) { - - errorSource = XSLT_ERROR_SOURCE_XML; /* That's the assumption anyway */ - errorMessage = getDeepestException(e).getMessage(); - errorLine = getLineNumber(getDeepestException(e)); - transformException = e; - return false; - - } catch (Exception e) { - - System.err.println("Exception: " + e); - transformException = e; - errorMessage = e.getMessage(); - return false; - } - - return true; - } - - - - protected static Throwable getDeepestException(Throwable t) { - - Throwable next = t; - - while (t.getCause() != null) { - t = t.getCause(); - System.err.println("found nested throwable: " + t); - } - - return t; - } - - protected static int getLineNumber(Throwable t) { - - if (t instanceof TransformerException) { - - TransformerException te = (TransformerException)t; - SourceLocator sl = te.getLocator(); - if (sl != null) { - return sl.getLineNumber(); - } - - - } else if (t instanceof SAXParseException) { - SAXParseException spe = (SAXParseException)t; - return spe.getLineNumber(); - } - - return 0; - - } - - - - public String getErrorMessage() { - return errorMessage; - } - - public int getErrorLine() { - return errorLine; - } - - public int getErrorSource() { - return errorSource; - } - - - - /** - * Main method for command-line invocation. - * - * @param argv the argument String array - */ - public static void main (String argv[]) { - - JAXPWrapper ref = new JAXPWrapper(); - System.out.println("ref: " + ref); - String processorImpl = "com.icl.saxon.TransformerFactoryImpl"; - - System.out.println("\nParam Test\n"); - String xml = "\n\n\n\n"; - String xslt = "\n----"; - String parameters = "param1==_=!=_==right1--_-!-_--param2==_=!=_==right2"; - ref.transform(processorImpl, new NSData(xml.getBytes()), new NSData(xslt.getBytes()), parameters, null); - System.out.println(ref.getResult()); - System.out.println("source: " + ref.getErrorSource() + " line: " + ref.getErrorLine() + " msg: " + ref.getErrorMessage()); - - System.out.println("\nEmpty param test\n"); - xml = "\n\n\n\n"; - xslt = "\n----"; - parameters = ""; - ref.transform(processorImpl, new NSData(xml.getBytes()), new NSData(xslt.getBytes()), parameters, null); - System.out.println(ref.getResult()); - System.out.println("source: " + ref.getErrorSource() + " line: " + ref.getErrorLine() + " msg: " + ref.getErrorMessage()); - - System.out.println("\nsystem-property() test\n"); - xml = "\n\n\n"; - xslt = "\nvendor: "; - ref.transform(processorImpl, new NSData(xml.getBytes()), new NSData(xslt.getBytes()), parameters, null); - System.out.println(ref.getResult()); - System.out.println("source: " + ref.getErrorSource() + " line: " + ref.getErrorLine() + " msg: " + ref.getErrorMessage()); - - System.out.println("\nBroken XML Test\n"); - xml = "\n\n\n\n\n\n"; - xslt = "\nmatch!"; - ref.transform(processorImpl, new NSData(xml.getBytes()), new NSData(xslt.getBytes()), parameters, null); - System.out.println("source: " + ref.getErrorSource() + " line: " + ref.getErrorLine() + " msg: " + ref.getErrorMessage()); - - System.out.println("\nBroken XSLT Test\n"); - xml = "\n"; - xslt = "\nmatch!"; - ref.transform(processorImpl, new NSData(xml.getBytes()), new NSData(xslt.getBytes()), parameters, null); - System.out.println("source: " + ref.getErrorSource() + " line: " + ref.getErrorLine() + " msg: " + ref.getErrorMessage()); - - System.out.println("\nBroken XML and XSLT Test\n"); - xml = "\n"; - xslt = "\nmatch!"; - ref.transform(processorImpl, new NSData(xml.getBytes()), new NSData(xslt.getBytes()), parameters, null); - System.out.println("source: " + ref.getErrorSource() + " line: " + ref.getErrorLine() + " msg: " + ref.getErrorMessage()); - - System.out.println("\nBroken XML and XSLT Test 2\n"); - xml = "\n"; - xslt = "\n\n\n\n\n\n\n\nmatch!\n\n\n"; - ref.transform(processorImpl, new NSData(xml.getBytes()), new NSData(xslt.getBytes()), parameters, null); - System.out.println("source: " + ref.getErrorSource() + " line: " + ref.getErrorLine() + " msg: " + ref.getErrorMessage()); - - - - } - -} diff --git a/JumpToLinePanelController.h b/JumpToLinePanelController.h deleted file mode 100644 index 7d73841..0000000 --- a/JumpToLinePanelController.h +++ /dev/null @@ -1,16 +0,0 @@ -/* JumpToLinePanelController */ - -#import - -@interface JumpToLinePanelController : NSWindowController -{ - IBOutlet NSTextField *lineNumberField; - unsigned int lineNumber; -} - -- (IBAction)jumpToLine:(id)sender; -- (IBAction)abortJumpToLine:(id)sender; -- (void)setLineNumber:(unsigned int)lineNumber; -- (unsigned int)lineNumber; - -@end diff --git a/JumpToLinePanelController.m b/JumpToLinePanelController.m deleted file mode 100644 index 3aabf18..0000000 --- a/JumpToLinePanelController.m +++ /dev/null @@ -1,43 +0,0 @@ -#import "JumpToLinePanelController.h" - -@implementation JumpToLinePanelController - - -- (IBAction)jumpToLine:(id)sender { - - [self setLineNumber:[lineNumberField intValue]]; - - [NSApp stopModal]; - -} - - - -- (IBAction)abortJumpToLine:(id)sender { - -// NSLog(@"abort Jump!"); - [self setLineNumber:0]; - [NSApp stopModal]; - -} - - - -- (void)setLineNumber:(unsigned int)line { - - -// NSLog(@"setLineNumber: %d", line); - lineNumber = line; - -} - -- (unsigned int)lineNumber { - - return lineNumber; -} - - - - - -@end diff --git a/MyDocument.h b/MyDocument.h deleted file mode 100644 index e7f3cf0..0000000 --- a/MyDocument.h +++ /dev/null @@ -1,199 +0,0 @@ -// -// MyDocument.h -// TestXSLT -// -// Created by Marc Liyanage on Sun Mar 03 2002. -// Copyright (c) 2001 __MyCompanyName__. All rights reserved. -// -// $Id$ - - -#import -#import -#include - -#import "XMLUtils.h" -#import "Workset.h" -#import "ParameterSet.h" -#import "XSLTProcessorFactory.h" -#import "XMLParserLibxml.h" -#import "XMLTextView.h" -#import "FindPanelController.h" -#import "JumpToLinePanelController.h" -#import "UnsavedChangesPanelController.h" -#import "XSL_FO_Renderer.h" - - -enum { - XML = 1, - XSLT, - PARAMETERS, - RESULT, -}; - -@interface MyDocument : NSDocument -{ - Workset *workset; - NSTimer *uiUpdateTimer; - BOOL resultDirty; - BOOL xmlDirty; - BOOL xsltDirty; - - BOOL webViewUpToDate; - BOOL imageViewUpToDate; - - int pdfPageCount, pdfCurrentPage; - - NSBundle *processorBundle; - - XSLTProcessor *processor; - XMLParserLibxml *wellFormedParser; - - NSImage *warningIcon; - IBOutlet NSImageView *xmlWellFormedIcon; - IBOutlet NSImageView *xsltWellFormedIcon; - IBOutlet NSButton *processButton; - IBOutlet NSButton *saveResultAsButton; - IBOutlet NSButton *saveResultButton; - IBOutlet NSButton *openResultURLButton; - IBOutlet NSTextField *processingTimeField; - IBOutlet NSTextField *saveResultFilenameField; - IBOutlet NSTextField *saveXmlFilenameField; - IBOutlet NSTextField *saveXsltFilenameField; - IBOutlet NSButton *saveXmlAsButton; - IBOutlet NSButton *saveXmlButton; - IBOutlet NSButton *saveXsltButton; - IBOutlet NSButton *saveXsltAsButton; - IBOutlet NSButton *paramRemoveButton; - IBOutlet NSTabView *tabView; - IBOutlet NSTabView *resultTabView; - IBOutlet XMLTextView *xmlView; - IBOutlet XMLTextView *xsltView; - IBOutlet NSTextView *resultView; - IBOutlet NSTableView *parameterTable; - IBOutlet NSButton *autoSaveCheckbox; - IBOutlet NSButton *autoShowCheckbox; - IBOutlet NSDrawer *errorDrawer; - IBOutlet NSPopUpButton *processorTypePopUp; - IBOutlet WebView *resultWebView; - IBOutlet NSImageView *resultImageView; - - IBOutlet NSTextField *pdfCurrentPageField; - IBOutlet NSTextField *pdfPageCountField; - IBOutlet NSButton *pdfPreviousPageButton; - IBOutlet NSButton *pdfNextPageButton; - IBOutlet NSButton *pdfSaveAsButton; - - IBOutlet NSTextField *xmlTagStackField; - IBOutlet NSTextField *xsltTagStackField; - - NSData *pdfData, *xslfoRendererResultData; - NSConditionLock *xslfoRendererLock; - - NSString *drawerMessage; - - IBOutlet NSTextField *webViewBaseURL; - - FindPanelController *findPanelController; - JumpToLinePanelController *jumpToLinePanelController; - UnsavedChangesPanelController *unsavedChangesPanelController; - - NSUserDefaults *defaults; -} - -- (BOOL)canUseSelectionForFindNow; -- (BOOL)canFindNow; -- (BOOL)canFindAgainNow; -- (IBAction)showFindPanel:(id)sender; -- (IBAction)findNext:(id)sender; -- (IBAction)findPrevious:(id)sender; -- (IBAction)useSelectionForFind:(id)sender; -- (void)findStringWithSearchFlags:(int)flags; - -- (BOOL)canJumpToLineNow; -- (IBAction)showJumpToLinePanel:(id)sender; - -- (BOOL)showUnsavedChangesPanel; - -- (void)updateCompleteUI; -- (void)updateUI; -- (void)doUpdateUI; -- (NSTabView *)tabView; -- (IBAction)selectTab:(id)sender; -- (IBAction)selectTabById:(int)tabId; - -- (IBAction)setProcessorType:(id)sender; -- (IBAction)switchProcessorToType:(int)newType updateUI:(BOOL)updateUI; - -- (IBAction)showInBrowser:(id)sender; -- (void)uiUpdateTimerTarget:(NSTimer *)timer; -- (BOOL)canProcessNow; -- (BOOL)validateMenuItem:(NSMenuItem *)menuItem; - -- (void)resizeWebView; - -- (NSTextView *)currentTextView; - -// AppleScript Stuff -- (id)handleProcessScriptCommand:(NSScriptCommand *)command; -- (id)handleExportScriptCommand:(NSScriptCommand *)command; -- (id)handleSetParamScriptCommand:(NSScriptCommand *)command; -- (id)handleClearParamScriptCommand:(NSScriptCommand *)command; -- (id)handleSetProcessorTypeScriptCommand:(NSScriptCommand *)command; - - -// AppleScript accessors -- (NSString *)xmlcode; -- (void)setXmlcode:(NSString *)s; -- (NSString *)xsltcode; -- (void)setXsltcode:(NSString *)s; -- (NSString *)result; - -// Drag and Drop for our custom NSTextView subclass -- (BOOL)handleDroppedFile:(NSString *)filename forTextView:(NSTextView *)sender; - -- (IBAction)process:(id)sender; -- (IBAction)loadXml:(id)sender; -- (IBAction)loadXslt:(id)sender; - -- (BOOL)canSaveXmlAsNow; -- (BOOL)canSaveXmlNow; -- (BOOL)canSaveXsltAsNow; -- (BOOL)canSaveXsltNow; -- (BOOL)canSaveResultAsNow; -- (BOOL)canSaveResultNow; - -- (IBAction)saveResultAs:(id)sender; -- (IBAction)saveResult:(id)sender; -- (IBAction)saveXmlAs:(id)sender; -- (IBAction)saveXml:(id)sender; -- (IBAction)saveXsltAs:(id)sender; -- (IBAction)saveXslt:(id)sender; -- (IBAction)saveCurrentAs:(id)sender; -- (IBAction)saveCurrent:(id)sender; -- (IBAction)newParameter:(id)sender; -- (IBAction)removeParameter:(id)sender; -- (IBAction)openResultURL:(id)sender; -- (void)autoSave; - -- (void)updateResultWebView; -- (void)updateResultImageView; - -- (IBAction)renderFo:(id)sender; - -- (IBAction)showErrorLocation:(id)sender; - -- (IBAction)pdfPreviousPage:(id)sender; -- (IBAction)pdfNextPage:(id)sender; -- (IBAction)pdfSaveAs:(id)sender; - -- (void)checkForExternalModifications; - -/* -- (IBAction)showXmlTab:(id)sender; -- (IBAction)showXsltTab:(id)sender; -- (IBAction)showParameterTab:(id)sender; -- (IBAction)showResultTab:(id)sender; -*/ - -@end diff --git a/MyDocument.m b/MyDocument.m deleted file mode 100644 index c122af3..0000000 --- a/MyDocument.m +++ /dev/null @@ -1,1302 +0,0 @@ -// -// MyDocument.m -// TestXSLT -// -// Created by Marc Liyanage on Sun Mar 03 2002. -// Copyright (c) 2001 __MyCompanyName__. All rights reserved. -// -// $Id$ - -#import "MyDocument.h" -#import "Workset.h" -#import - - - -@implementation MyDocument - -- (id)init { - -// NSZombieEnabled = YES; - - if (self = [super init]) { - workset = [[Workset alloc] init]; - processor = [XSLTProcessorFactory makeProcessorOfType:PROCESSORTYPE_SABLOTRON]; - wellFormedParser = [[XMLParserLibxml alloc] init]; - xmlDirty = NO; - xsltDirty = NO; - } - - defaults = [NSUserDefaults standardUserDefaults]; - - return self; -} - -- (void)dealloc { - - [uiUpdateTimer release]; - [workset release]; - [processor release]; - [wellFormedParser release]; - [findPanelController release]; - [jumpToLinePanelController release]; - [unsavedChangesPanelController release]; - -} - - -- (IBAction)selectTab:(id)sender { - - [self selectTabById:[sender tag]]; - -} - - -- (IBAction)selectTabById:(int)tabId { - - NSString *tabName; - - switch (tabId) { - - case XML: - tabName = @"xmlTab"; - break; - - case XSLT: - tabName = @"xsltTab"; - break; - - case PARAMETERS: - tabName = @"parametersTab"; - break; - - case RESULT: - default: - tabName = @"resultTab"; - break; - - } - - [tabView selectTabViewItemWithIdentifier:tabName]; - -} - - -- (void)textViewDidChangeSelection:(NSNotification *)aNotification { - [self updateUI]; -} - - -- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem { - - [[self undoManager] removeAllActions]; - - [self doUpdateUI]; -} - - -- (void)updateUI { - -// NSLog(@"updateUI running..."); - - [uiUpdateTimer invalidate]; - [uiUpdateTimer release]; - - uiUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(uiUpdateTimerTarget:) userInfo:nil repeats:NO]; - - [uiUpdateTimer retain]; - - -} - - -- (void)uiUpdateTimerTarget:(NSTimer *)timer { - - [self doUpdateUI]; - [timer release]; - uiUpdateTimer = nil; -} - - -- (void)doUpdateUI { - - NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier]; - NSString *activeResultTabIdentifier = [[resultTabView selectedTabViewItem] identifier]; - - BOOL xmlTabIsVisible = [activeTabIdentifier isEqualToString:@"xmlTab"]; - BOOL xsltTabIsVisible = !xmlTabIsVisible && [activeTabIdentifier isEqualToString:@"xsltTab"]; - BOOL paramTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible) && [activeTabIdentifier isEqualToString:@"parametersTab"]; - BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible); - BOOL resultTabHtmlIsVisible = resultTabIsVisible && [activeResultTabIdentifier isEqualToString:@"htmlResult"]; - BOOL resultTabXslfoIsVisible = resultTabIsVisible && !resultTabHtmlIsVisible && [activeResultTabIdentifier isEqualToString:@"xslfoResult"]; -// BOOL resultTabTextIsVisible = resultTabIsVisible && !(resultTabHtmlIsVisible || resultTabXslfoIsVisible); - -// NSLog(@"xml: %d, xslt: %d, param: %d, result: %d, reshtml: %d, resxslfo: %d, restext: %d", xmlTabIsVisible, xsltTabIsVisible, paramTabIsVisible, resultTabIsVisible, resultTabHtmlIsVisible, resultTabXslfoIsVisible, resultTabTextIsVisible); - - if (xmlTabIsVisible) { - [saveXmlFilenameField setObjectValue:[workset xmlFilename]]; - [saveXmlFilenameField setToolTip:[workset xmlFilename]]; - [saveXmlButton setEnabled:[self canSaveXmlNow]]; - [saveXmlAsButton setEnabled:[self canSaveXmlAsNow]]; - [xmlTagStackField setStringValue:[xmlView calculateTagStack]]; - - if ([defaults boolForKey:@"enableWellformedCheck"]) { - [xmlView checkWellFormed]; - if ([workset hasXmlCode] && [xmlView hasError]) { - [xmlWellFormedIcon setImage:warningIcon]; - [xmlWellFormedIcon setToolTip:[xmlView valueForKey:@"errorString"]]; - [self setValue:[xmlView valueForKey:@"errorString"] forKey:@"drawerMessage"]; - } else { - [xmlWellFormedIcon setImage:nil]; - [xmlWellFormedIcon setToolTip:nil]; - [self setValue:nil forKey:@"drawerMessage"]; - } - } - - } else if (xsltTabIsVisible) { - [saveXsltFilenameField setObjectValue:[workset xsltFilename]]; - [saveXsltFilenameField setToolTip:[workset xsltFilename]]; - [saveXsltButton setEnabled:[self canSaveXsltNow]]; - [saveXsltAsButton setEnabled:[self canSaveXsltAsNow]]; - [xsltTagStackField setStringValue:[xsltView calculateTagStack]]; - - if ([defaults boolForKey:@"enableWellformedCheck"]) { - [xsltView checkWellFormed]; - if ([workset hasXsltCode] && [xsltView hasError]) { - [xsltWellFormedIcon setImage:warningIcon]; - [xsltWellFormedIcon setToolTip:[xsltView valueForKey:@"errorString"]]; - [self setValue:[xsltView valueForKey:@"errorString"] forKey:@"drawerMessage"]; - } else { - [xsltWellFormedIcon setImage:nil]; - [xsltWellFormedIcon setToolTip:nil]; - [self setValue:nil forKey:@"drawerMessage"]; - } - } - - } else if (paramTabIsVisible) { - [paramRemoveButton setEnabled:[parameterTable selectedRow] != -1]; - [parameterTable reloadData]; - } else if (resultTabIsVisible) { - [saveResultAsButton setEnabled:[self canSaveResultAsNow]]; - [saveResultButton setEnabled:[self canSaveResultNow]]; - [autoSaveCheckbox setEnabled:[workset hasResultFilename]]; - [openResultURLButton setEnabled:[workset hasResultFilename]]; - [autoShowCheckbox setEnabled:[openResultURLButton isEnabled]]; - [saveResultFilenameField setObjectValue:[workset resultFilename]]; - [saveResultFilenameField setToolTip:[workset resultFilename]]; - - if (resultTabHtmlIsVisible) { - [self resizeWebView]; - [self updateResultWebView]; - } else if (resultTabXslfoIsVisible) { - [self updateResultImageView]; - [pdfCurrentPageField setIntValue: (pdfPageCount ? (pdfCurrentPage + 1) : 0)]; - [pdfPageCountField setIntValue:pdfPageCount]; - - [pdfPreviousPageButton setEnabled:pdfCurrentPage > 0]; - [pdfNextPageButton setEnabled:pdfCurrentPage < (pdfPageCount - 1)]; - [pdfSaveAsButton setEnabled:(pdfPageCount > 0)]; -// } else if (resultTabTextIsVisible) { - - } - } - - - [processButton setEnabled:[self canProcessNow]]; - - // move this to xmlview. -// [self updateWellFormedIcons]; - - - - [resultView setString:[workset stringResult]]; - -} - - -- (void)updateResultWebView { - if (!webViewUpToDate) { - WebFrame *mainFrame = [resultWebView mainFrame]; -// [mainFrame loadHTMLString:[workset stringResult] baseURL:nil]; - [mainFrame loadHTMLString:[workset stringResult] baseURL:[NSURL URLWithString:[webViewBaseURL stringValue]]]; -// [mainFrame loadHTMLString:[workset stringResult] baseURL:[NSURL URLWithString:@"file:///Users/liyanage/Sites/primavera/images/x"]]; - webViewUpToDate = YES; - } -} - - -- (void)updateResultImageView { - if (!imageViewUpToDate) { - [self renderFo:self]; - imageViewUpToDate = YES; - } -} - - -- (BOOL)canProcessNow { - - return [workset hasXmlCode] && [workset hasXsltCode]; - -} - -- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - -// NSLog(@"validate: %@, tag: %d", menuItem, [menuItem tag]); - - NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier]; - BOOL xmlTabIsVisible = [activeTabIdentifier isEqualToString:@"xmlTab"]; - BOOL xsltTabIsVisible = !xmlTabIsVisible && [activeTabIdentifier isEqualToString:@"xsltTab"]; - BOOL paramTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible) && [activeTabIdentifier isEqualToString:@"parametersTab"]; - BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible); - - - switch ([menuItem tag]) { - - case 10: // Process - return [self canProcessNow]; - break; - - case 11: // Save - return [workset hasResultFilename]; - break; - - case 12: // Find - return [self canFindNow]; - break; - - case 13: // Find Next - case 14: // Find Previous - return [self canFindAgainNow]; - break; - - case 15: // Use Selection for Find - return [self canUseSelectionForFindNow]; - break; - - case 16: // Jump to Line - return [self canJumpToLineNow]; - break; - - case 17: // Save Current Pane - if (xmlTabIsVisible) { - return [self canSaveXmlNow]; - } else if (xsltTabIsVisible) { - return [self canSaveXsltNow]; - } else if (resultTabIsVisible) { - return [self canSaveResultNow]; - } - break; - - case 18: // Save Current Pane As... - if (xmlTabIsVisible) { - return [self canSaveXmlAsNow]; - } else if (xsltTabIsVisible) { - return [self canSaveXsltAsNow]; - } else if (resultTabIsVisible) { - return [self canSaveResultAsNow]; - } - break; - - default: - return YES; - break; - - } - - return [super validateMenuItem:menuItem]; - -} - -- (IBAction)showInBrowser:(id)sender { - - - -} - - -- (void)updateCompleteUI { - - [xmlView setString:[workset xmlCode]]; - [xsltView setString:[workset xsltCode]]; - [self doUpdateUI]; - -} - -- (void)textDidChange:(NSNotification *)aNotification { - - id sender = [aNotification object]; - - if ([sender isEqual:xmlView]) { - [workset setXmlCode:[xmlView string]]; - xmlDirty = YES; - } else if ([sender isEqual:xsltView]) { - [workset setXsltCode:[xsltView string]]; - xsltDirty = YES; - } - - [self updateChangeCount:NSChangeDone]; - [self updateUI]; - -} - - - -- (NSTabView *)tabView { - - return tabView; - -} - -- (BOOL)canJumpToLineNow { - - NSTextView *view = [self currentTextView]; - - return (view == xmlView) || (view == xsltView); - -} - - -- (IBAction)showJumpToLinePanel:(id)sender { - - [NSApp beginSheet:[jumpToLinePanelController window] - modalForWindow:[[[self windowControllers] objectAtIndex:0] window] - modalDelegate:nil - didEndSelector:nil - contextInfo:nil]; - - [NSApp runModalForWindow:[jumpToLinePanelController window]]; - [NSApp endSheet:[jumpToLinePanelController window]]; - [[jumpToLinePanelController window] orderOut:self]; - - if ([jumpToLinePanelController lineNumber] == 0) { - return; - } - - [((XMLTextView *)[self currentTextView]) selectLineByNumber:[jumpToLinePanelController lineNumber]]; - -// NSLog(@"jump to line: %d", [jumpToLinePanelController lineNumber]); - -} - - -- (IBAction)showFindPanel:(id)sender { - - [findPanelController refresh]; - - [NSApp beginSheet:[findPanelController window] - modalForWindow:[[[self windowControllers] objectAtIndex:0] window] - modalDelegate:nil - didEndSelector:nil - contextInfo:nil]; - - [NSApp runModalForWindow:[findPanelController window]]; - [NSApp endSheet:[findPanelController window]]; - [[findPanelController window] orderOut:self]; - - if ([findPanelController aborted]) { - return; - } - - [self findStringWithSearchFlags:[findPanelController searchFlags]]; - -} - - - - -- (IBAction)findNext:(id)sender { - - [self findStringWithSearchFlags:[findPanelController searchFlags] & NSCaseInsensitiveSearch]; - -} - - -- (IBAction)findPrevious:(id)sender { - - [self findStringWithSearchFlags:([findPanelController searchFlags] | NSBackwardsSearch)]; - -} - -- (BOOL)canUseSelectionForFindNow { - - NSTextView *view = [self currentTextView]; - NSRange selectedRange; - - if (view == nil) { - return NO; - } - - selectedRange = [view selectedRange]; - - if (selectedRange.length < 1) { - return NO; - } - - return YES; - -} - - - -- (IBAction)useSelectionForFind:(id)sender { - - NSString *text; - NSTextView *view = [self currentTextView]; - - text = [[view string] substringWithRange:[view selectedRange]]; - - [findPanelController setFindString:text]; - -} - - - - -- (BOOL)canFindNow { - - NSString *currentTabViewItem = [[[self tabView] selectedTabViewItem] identifier]; - - if ([currentTabViewItem isEqualToString:@"xmlTab"] - || [currentTabViewItem isEqualToString:@"xsltTab"] - || [currentTabViewItem isEqualToString:@"resultTab"]) { - return YES; - } - - return NO; - -} - -- (BOOL)canFindAgainNow { - - return ([findPanelController findString] != nil) && [self canFindNow]; - -} - - -- (void)findStringWithSearchFlags:(int)flags { - - NSTextView *currentView; - NSString *text; - NSString *string; - NSRange selectedRange, leftRange, rightRange, resultRange, searchRange; - - NSPasteboard *findBoard = [NSPasteboard pasteboardWithName:NSFindPboard]; - [findBoard types]; - string = [findBoard stringForType:NSStringPboardType]; - - currentView = [self currentTextView]; - if (currentView == nil) { - return; - } - - text = [currentView string]; - - selectedRange = [currentView selectedRange]; - leftRange = NSMakeRange(0, selectedRange.location); - rightRange = NSMakeRange(NSMaxRange(selectedRange), [text length] - NSMaxRange(selectedRange)); - - if (flags & NSBackwardsSearch) { - searchRange = leftRange; - } else { - searchRange = rightRange; - } - - resultRange = [text rangeOfString:string options:flags range:searchRange]; - - if (resultRange.location == NSNotFound) { - NSBeep(); - return; - } - - [currentView setSelectedRange:resultRange]; - [currentView scrollRangeToVisible:resultRange]; - -} - - - - -- (NSTextView *)currentTextView { - - NSString *currentTabViewItem = [[[self tabView] selectedTabViewItem] identifier]; - - if ([currentTabViewItem isEqualToString:@"xmlTab"]) { - return xmlView; - } else if ([currentTabViewItem isEqualToString:@"xsltTab"]) { - return xsltView; - } else if ([currentTabViewItem isEqualToString:@"resultTab"]) { - return resultView; - } - - return nil; - -} - - - - - -- (IBAction)process:(id)sender { - - - const char **params = [[workset parameterSet] cArray]; - - struct timeval tstart, tend; - gettimeofday(&tstart, NULL); - - long processingTime; - - if ([workset hasXsltFilename]) { - [processor setBaseUri:[NSString stringWithFormat:@"file://%@", [workset xsltFilename]]]; - } - - if (![processor processStrings:[XMLUtils getDataWithEncodingFromString:[workset xmlCode]] withXslt:[XMLUtils getDataWithEncodingFromString:[workset xsltCode]] andParameters:params]) { - - [self setValue:[NSString stringWithFormat:@"Error on line %d of your %@ code:\n%@", [processor errorLine], ([processor errorSource] == XSLT_ERROR_SOURCE_XML ? @"XML" : @"XSLT"), [processor errorMessage]] forKey:@"drawerMessage"]; - - NSBeep(); - [errorDrawer openOnEdge:NSMinYEdge]; - [self showErrorLocation:nil]; - - } else { - - gettimeofday(&tend, NULL); - - processingTime = ((tend.tv_sec * 1000000 + tend.tv_usec) - (tstart.tv_sec * 1000000 + tstart.tv_usec)) / 1000; - - [workset setResult:[processor result]]; - [workset setResultEncoding:[processor resultEncoding]]; - resultDirty = YES; - [self autoSave]; -// [errorDrawer close]; - [self selectTabById:RESULT]; - [processingTimeField setStringValue:[NSString stringWithFormat:@"Time: %ldms", processingTime]]; - } - - webViewUpToDate = NO; - imageViewUpToDate = NO; - - [self updateUI]; -} - - -- (void)autoSave { - - if (resultDirty && [autoSaveCheckbox state] == NSOnState) { - [self saveResult:nil]; - } - -} - -- (void)autoShow { - - if ([autoShowCheckbox state] == NSOnState) { - [self openResultURL:nil]; - } - -} - - -- (IBAction)loadXml:(id)sender { - - NSOpenPanel *panel = [NSOpenPanel openPanel]; - - if ([panel runModalForDirectory:nil file:nil types:nil] == NSOKButton) { - - // NSLog(@"choosen: %@", [[panel filenames] objectAtIndex:0]); - - [workset setXmlCode:[XMLUtils getStringWithEncodingFromFile:[[panel filenames] objectAtIndex:0]]]; - [workset setXmlFilename:[[panel filenames] objectAtIndex:0]]; - [self updateChangeCount:NSChangeDone]; - [self updateCompleteUI]; - } -} - - - - - -- (IBAction)loadXslt:(id)sender { - - NSOpenPanel *panel = [NSOpenPanel openPanel]; - - if ([panel runModalForDirectory:nil file:nil types:nil] == NSOKButton) { - - // NSLog(@"choosen: %@", [[panel filenames] objectAtIndex:0]); - - [workset setXsltCode:[XMLUtils getStringWithEncodingFromFile:[[panel filenames] objectAtIndex:0]]]; - [workset setXsltFilename:[[panel filenames] objectAtIndex:0]]; - [self updateChangeCount:NSChangeDone]; - [self updateCompleteUI]; - - } -} - - - - -- (BOOL)canSaveXmlAsNow { - return [workset hasXmlCode]; -} - -- (BOOL)canSaveXmlNow { - return [workset hasXmlFilename] && xmlDirty; -} - -- (BOOL)canSaveXsltAsNow { - return [workset hasXsltCode]; -} - -- (BOOL)canSaveXsltNow { - return [workset hasXsltFilename] && xsltDirty; -} - -- (BOOL)canSaveResultAsNow { - return [workset hasResult]; -} - -- (BOOL)canSaveResultNow { - return [workset hasResultFilename] && resultDirty; -} - - - - -- (IBAction)saveXmlAs:(id)sender { - - NSSavePanel *panel = [NSSavePanel savePanel]; - - if ([panel runModal] == NSFileHandlingPanelOKButton) { - - [workset setXmlFilename:[panel filename]]; - [self saveXml:nil]; - - } -} - - - -- (IBAction)saveXml:(id)sender { - - - if ([workset hasXmlFilename]) { - [workset saveXml]; - xmlDirty = NO; - } - - [self updateUI]; -} - - -- (IBAction)saveXsltAs:(id)sender { - - NSSavePanel *panel = [NSSavePanel savePanel]; - - if ([panel runModal] == NSFileHandlingPanelOKButton) { - - [workset setXsltFilename:[panel filename]]; - [self saveXslt:nil]; - - } -} - - - -- (IBAction)saveXslt:(id)sender { - - if ([workset hasXsltFilename]) { - [workset saveXslt]; - xsltDirty = NO; - } - - [self updateUI]; -} - - - -- (IBAction)saveResultAs:(id)sender { - - NSSavePanel *panel = [NSSavePanel savePanel]; - - if ([panel runModal] == NSFileHandlingPanelOKButton) { - - [workset setResultFilename:[panel filename]]; - - [self saveResult:nil]; - - } -} - -- (IBAction)saveResult:(id)sender { - - if ([workset hasResultFilename]) { - - [[workset result] writeToFile:[workset resultFilename] atomically:NO]; - resultDirty = NO; - - } - - [self updateUI]; - [self autoShow]; - -} - - -- (IBAction)saveCurrentAs:(id)sender { - - NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier]; - BOOL xmlTabIsVisible = [activeTabIdentifier isEqualToString:@"xmlTab"]; - BOOL xsltTabIsVisible = !xmlTabIsVisible && [activeTabIdentifier isEqualToString:@"xsltTab"]; - BOOL paramTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible) && [activeTabIdentifier isEqualToString:@"parametersTab"]; - BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible); - - if (xmlTabIsVisible) { - [self saveXmlAs:sender]; - } else if (xsltTabIsVisible) { - [self saveXsltAs:sender]; - } else if (resultTabIsVisible) { - [self saveResultAs:sender]; - } - -} - - - - -- (IBAction)saveCurrent:(id)sender { - - NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier]; - BOOL xmlTabIsVisible = [activeTabIdentifier isEqualToString:@"xmlTab"]; - BOOL xsltTabIsVisible = !xmlTabIsVisible && [activeTabIdentifier isEqualToString:@"xsltTab"]; - BOOL paramTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible) && [activeTabIdentifier isEqualToString:@"parametersTab"]; - BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible); - - if (xmlTabIsVisible) { - [self saveXml:sender]; - } else if (xsltTabIsVisible) { - [self saveXslt:sender]; - } else if (resultTabIsVisible) { - [self saveResult:sender]; - } - -} - - - - - - -- (IBAction)openResultURL:(id)sender { - -// NSLog(@"openResultURL running..."); - - if ([workset hasResultFilename]) { - - [[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:[workset resultFilename]]]; - - } -} - - -- (IBAction)newParameter:(id)sender { - - [[workset parameterSet] addParameter:@"name" withValue:@"value"]; - [self doUpdateUI]; - -} - -- (IBAction)removeParameter:(id)sender { - - int row = [parameterTable selectedRow]; - - if (row != -1) { - [[workset parameterSet] removeParameterAtIndex:row]; - [self doUpdateUI]; - } else { - NSBeep(); - } - -} - -- (int)numberOfRowsInTableView:(NSTableView *)aTableView { - return [[workset parameterSet] count]; -} - -- (id)tableView:(NSTableView *)aTableView -objectValueForTableColumn:(NSTableColumn *)aTableColumn - row:(int)rowIndex { - - return [[workset parameterSet] getField:[aTableColumn identifier] atIndex:rowIndex]; -} - - - -- (void)tableView:(NSTableView *)aTableView - setObjectValue:(id)anObject - forTableColumn:(NSTableColumn *)aTableColumn - row:(int)rowIndex { - - [[workset parameterSet] setField:[aTableColumn identifier] atIndex:rowIndex toString:anObject]; -} - - - - -- (IBAction)setProcessorType:(id)sender { - - int newType = [sender tag]; - - if ([processor processorType] == newType) { - return; - } - - [self switchProcessorToType:newType updateUI:NO]; - -} - - -- (IBAction)switchProcessorToType:(int)newType updateUI:(BOOL)updateUI { - - XSLTProcessor *newProcessor = nil; - - newProcessor = [XSLTProcessorFactory makeProcessorOfType:newType]; - - if (!newProcessor) { - NSLog(@"Unable to create new processor of type '%d'", newType); - } - - [processor release]; - processor = newProcessor; - - if (updateUI) { - [processorTypePopUp selectItemAtIndex:[processorTypePopUp indexOfItemWithTag:newType]]; - } - - -} - - - -- (id)handleProcessScriptCommand:(NSScriptCommand *)command { - - if ([self canProcessNow]) { - [self process:nil]; - } - - return nil; - -} - - -- (id)handleExportScriptCommand:(NSScriptCommand *)command { - - NSDictionary *args = [command evaluatedArguments]; - NSString *file = [args objectForKey:@"File"]; - -// NSLog(file); - - if (file != nil) { - - [workset setResultFilename:file]; - - [self saveResult:nil]; - } - - return nil; - -} - -- (id)handleSetParamScriptCommand:(NSScriptCommand *)command { - - NSDictionary *args = [command evaluatedArguments]; - NSString *paramName = [args objectForKey:@"Name"]; - NSString *paramValue = [args objectForKey:@"Value"]; - - [[workset parameterSet] removeParameterByName:paramName]; - - [[workset parameterSet] addParameter:paramName withValue:paramValue]; - [self doUpdateUI]; - - return nil; - -} - -- (id)handleClearParamScriptCommand:(NSScriptCommand *)command { - - NSDictionary *args = [command evaluatedArguments]; - NSString *paramName = [args objectForKey:@"Name"]; - - [[workset parameterSet] removeParameterByName:paramName]; - return nil; - -} - -- (id)handleSetProcessorTypeScriptCommand:(NSScriptCommand *)command { - - NSDictionary *args = [command evaluatedArguments]; - NSString *processorType = [args objectForKey:@"Name"]; - - if ([processorType caseInsensitiveCompare:@"libxslt"] == NSOrderedSame) { - - [self switchProcessorToType:PROCESSORTYPE_LIBXSLT updateUI:YES]; - - } else if ([processorType caseInsensitiveCompare:@"sablotron"] == NSOrderedSame) { - - [self switchProcessorToType:PROCESSORTYPE_SABLOTRON updateUI:YES]; - - } else if ([processorType caseInsensitiveCompare:@"saxon"] == NSOrderedSame) { - - [self switchProcessorToType:PROCESSORTYPE_SAXON updateUI:YES]; - - } else if ([processorType caseInsensitiveCompare:@"xalan-j"] == NSOrderedSame) { - - [self switchProcessorToType:PROCESSORTYPE_XALAN_J updateUI:YES]; - - } else { - NSLog(@"unknown processor"); - } - - [self doUpdateUI]; - return nil; - -} - -- (BOOL)handleDroppedFile:(NSString *)filename forTextView:(NSTextView *)sender { - - NSString *fileContents = [XMLUtils getStringWithEncodingFromFile:filename]; - - if ([sender isEqual: xmlView]) { - - [self setXmlcode:fileContents]; - [workset setXmlFilename:filename]; - - } else if ([sender isEqual:xsltView]) { - - [self setXsltcode:fileContents]; - [workset setXsltFilename:filename]; - - } else { - - NSLog(@"Unknown sender view"); - - } - - [self updateUI]; - return YES; - -} - - - - -- (NSString *)xmlcode { - return [workset xmlCode]; -} - -- (void)setXmlcode:(NSString *)s { - - NSString *currentContents = [[[NSString alloc] initWithString:[self xmlcode]] autorelease]; - - [[self undoManager] registerUndoWithTarget:self - selector:@selector(setXmlcode:) - object:currentContents]; - - [workset setXmlCode:s]; - [self updateCompleteUI]; -} - - - -- (NSString *)xsltcode { - return [workset xsltCode]; -} - -- (void)setXsltcode:(NSString *)s { - - NSString *currentContents = [[[NSString alloc] initWithString:[self xsltcode]] autorelease]; - - [[self undoManager] registerUndoWithTarget:self - selector:@selector(setXsltcode:) - object:currentContents]; - - [workset setXsltCode:s]; - [self updateCompleteUI]; -} - - -- (NSString *)result { - return [workset stringResult]; -} - - - -- (void)tableViewSelectionDidChange:(NSNotification *)notification { - [self doUpdateUI]; -} - - -- (void)checkForExternalModifications { - - BOOL keep = NO; - - if ([workset xmlModifiedExternally] && xmlDirty || [workset xsltModifiedExternally] && xsltDirty) { - - /* external changes conflicting with local changes detected. - * Ask the user if we should keep the local unsaved changes - */ - keep = [self showUnsavedChangesPanel]; - - } - - if ([workset xmlModifiedExternally] && !(xmlDirty && keep)) { - [workset reloadXmlFromFile]; - [self updateChangeCount:NSChangeDone]; - [self updateCompleteUI]; - xmlDirty = NO; - } - - if ([workset xsltModifiedExternally] && !(xsltDirty && keep)) { - [workset reloadXsltFromFile]; - [self updateChangeCount:NSChangeDone]; - [self updateCompleteUI]; - xsltDirty = NO; - } - - [self updateUI]; - -} - - -- (BOOL)showUnsavedChangesPanel { - - [NSApp beginSheet:[unsavedChangesPanelController window] - modalForWindow:[[[self windowControllers] objectAtIndex:0] window] - modalDelegate:nil - didEndSelector:nil - contextInfo:nil]; - - [NSApp runModalForWindow:[unsavedChangesPanelController window]]; - [NSApp endSheet:[unsavedChangesPanelController window]]; - [[unsavedChangesPanelController window] orderOut:self]; - - return ([unsavedChangesPanelController keepChanges]); - -} - -- (void)xslfoRenderThread { - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - XSL_FO_Renderer *xfr = [[[XSL_FO_Renderer alloc] init] autorelease]; - xslfoRendererResultData = [xfr render:[workset result]]; - - [pool release]; - [xslfoRendererLock unlockWithCondition:2]; - -} - - -- (IBAction)renderFo:(id)sender { - - xslfoRendererLock = [[[NSConditionLock alloc] initWithCondition:1] autorelease]; - [NSThread detachNewThreadSelector:@selector(xslfoRenderThread) toTarget:self withObject:nil]; - [xslfoRendererLock lockWhenCondition:2]; - [xslfoRendererLock unlock]; - - if (!xslfoRendererResultData) { - NSLog(@"Unable to render, NULL result"); - return; - } - - [xslfoRendererResultData retain]; - [pdfData release]; - pdfData = xslfoRendererResultData; - - NSImage *pdfImage = [[[NSImage alloc] initWithData:xslfoRendererResultData] autorelease]; - [pdfImage setBackgroundColor:[NSColor whiteColor]]; - [pdfImage recache]; - [pdfImage setCacheMode:NSImageCacheNever]; - - NSClipView *clipView = (NSClipView *)[resultImageView superview]; - NSScrollView *scrollView = (NSScrollView *)[clipView superview]; - - [resultImageView setImage:pdfImage]; - [resultImageView setFrameSize:[pdfImage size]]; - [resultImageView display]; - - [clipView scrollToPoint:NSMakePoint([resultImageView frame].origin.x, [resultImageView frame].size.height - [clipView frame].size.height + [resultImageView frame].origin.y)]; - [scrollView reflectScrolledClipView:clipView]; - - pdfPageCount = [[[pdfImage representations] objectAtIndex:0] pageCount]; - pdfCurrentPage = 0; - -} - - -- (IBAction)pdfPreviousPage:(id)sender { - - if (pdfCurrentPage > 0) { - pdfCurrentPage--; - [[[[resultImageView image] representations] objectAtIndex:0] setCurrentPage:pdfCurrentPage]; - [resultImageView setNeedsDisplay:YES]; - [self doUpdateUI]; - } - -} - -- (IBAction)pdfNextPage:(id)sender { - - if (pdfCurrentPage < (pdfPageCount - 1)) { - pdfCurrentPage++; - [[[[resultImageView image] representations] objectAtIndex:0] setCurrentPage:pdfCurrentPage]; - [resultImageView setNeedsDisplay:YES]; - [self doUpdateUI]; - } - -} - - -- (IBAction)pdfSaveAs:(id)sender { - - NSSavePanel *panel = [NSSavePanel savePanel]; - - if ([panel runModal] == NSFileHandlingPanelOKButton) { - - [pdfData writeToFile:[panel filename] atomically:YES]; - - } - -} - - - - -- (void)windowDidBecomeMain:(NSNotification *)aNotification { - - [self checkForExternalModifications]; - -} - -- (void)windowDidResize:(NSNotification *)aNotification { - - [self resizeWebView]; - -} - -- (void)resizeWebView { - -// [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]]; - [resultWebView setNeedsDisplay:YES]; - -} - - - - - -- (NSString *)windowNibName -{ - // Override returning the nib file name of the document - // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. - return @"MyDocument"; -} - -- (void)windowControllerDidLoadNib:(NSWindowController *) aController -{ - - - - NSSize errorDrawerSize; - - [super windowControllerDidLoadNib:aController]; - - [resultImageView setImageFrameStyle:NSImageFramePhoto]; - [resultImageView setImageScaling:NSScaleNone]; - [resultImageView setImageAlignment:NSImageAlignCenter]; - [resultImageView setEditable:NO]; - - [resultWebView setTextSizeMultiplier:0.9]; - - warningIcon = [xmlWellFormedIcon image]; - - [self updateCompleteUI]; - - errorDrawerSize = [errorDrawer contentSize]; - errorDrawerSize.height = 130; - [errorDrawer setContentSize:errorDrawerSize]; - - NSFont *computerFont = [NSFont fontWithName:@"Courier" size:12.0]; - [resultView setFont:computerFont]; - - [tabView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; - - - - if (findPanelController == nil) { - findPanelController = [[FindPanelController alloc] initWithWindowNibName:@"FindPanel"]; -// NSLog(@"init find panel controller: %@", findPanelController); - } - - if (jumpToLinePanelController == nil) { - jumpToLinePanelController = [[JumpToLinePanelController alloc] initWithWindowNibName:@"JumpToLine"]; -// NSLog(@"init jump to line panel controller: %@", jumpToLinePanelController); - } - - if (unsavedChangesPanelController == nil) { - unsavedChangesPanelController = [[UnsavedChangesPanelController alloc] initWithWindowNibName:@"UnsavedChanges"]; -// NSLog(@"init unsaved changes panel controller: %@", unsavedChangesPanelController); - } - -} - - -- (void)canCloseDocumentWithDelegate:(id)delegate shouldCloseSelector:(SEL)shouldCloseSelector contextInfo:(void *)contextInfo { - - [uiUpdateTimer invalidate]; - [super canCloseDocumentWithDelegate:delegate shouldCloseSelector:shouldCloseSelector contextInfo:contextInfo]; -} - - - - - - - - -- (IBAction)showErrorLocation:(id)sender { - - XMLTextView *textView; - int errorLine = 0; - - if ([processor errorSource] == XSLT_ERROR_SOURCE_XML) { - [self selectTabById:XML]; - textView = xmlView; - } else { - [self selectTabById:XSLT]; - textView = xsltView; - } - - errorLine = [processor errorLine]; - - [textView selectLineByNumber:errorLine]; -} - - -- (NSData *)dataRepresentationOfType:(NSString *)aType -{ - // Insert code here to write your document from the given data. You can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead. - return [NSArchiver archivedDataWithRootObject:workset]; -} - -- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType -{ - // Insert code here to read your document from the given data. You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead. - - [workset release]; - workset = [[NSUnarchiver unarchiveObjectWithData:data] retain]; - [self updateCompleteUI]; - - return YES; -} - -@end diff --git a/NSApplicationScriptingCategory.h b/NSApplicationScriptingCategory.h deleted file mode 100644 index cebd626..0000000 --- a/NSApplicationScriptingCategory.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// NSApplicationScriptingCategory.h -// AETest -// -// Created by Marc Liyanage on Thu Jul 04 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// -// $Id$ - - -#import - -@interface NSApplication(Scripting) - -- (id)handleCreateScriptCommand:(NSScriptCommand*)command; - -@end diff --git a/NSApplicationScriptingCategory.m b/NSApplicationScriptingCategory.m deleted file mode 100644 index dd4e43c..0000000 --- a/NSApplicationScriptingCategory.m +++ /dev/null @@ -1,25 +0,0 @@ -// -// NSApplicationScriptingCategory.m -// AETest -// -// Created by Marc Liyanage on Thu Jul 04 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// -// $Id$ - - -#import "NSApplicationScriptingCategory.h" - - -@implementation NSApplication(Scripting) - -- (id)handleCreateScriptCommand:(NSScriptCommand*)command -{ -// NSLog(@"Create..."); - - [[NSDocumentController sharedDocumentController] newDocument:nil]; - - return nil; -} - -@end diff --git a/ParameterSet.h b/ParameterSet.h deleted file mode 100644 index c3fb7bf..0000000 --- a/ParameterSet.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// ParameterSet.h -// TestXSLT -// -// Created by Marc Liyanage on Sat Mar 09 2002. -// Copyright (c) 2001 __MyCompanyName__. All rights reserved. -// - -#import - - -@interface ParameterSet : NSObject { - - NSMutableArray *parameters; - const char **cArray; - -} - -- (void)addParameter:(NSString *)name withValue:(NSString *)value; -- (void)setField:(NSString *)fieldName atIndex:(int)index toString:(NSString *)s; -- (NSString *)getField:(NSString *)fieldName atIndex:(int)index; -- (void)removeParameterAtIndex:(int)index; -- (void)setParameterSet:(NSMutableArray *)array; -- (void)removeParameterByName:(NSString *)name; - -- (const char **)cArray; - -- (int)count; - - - - - -@end diff --git a/ParameterSet.m b/ParameterSet.m deleted file mode 100644 index bced5b4..0000000 --- a/ParameterSet.m +++ /dev/null @@ -1,136 +0,0 @@ -// -// ParameterSet.m -// TestXSLT -// -// Created by Marc Liyanage on Sat Mar 09 2002. -// Copyright (c) 2001 __MyCompanyName__. All rights reserved. -// - -#import "ParameterSet.h" - - -@implementation ParameterSet - -- (id)init { - - if (self = [super init]) { - parameters = [[NSMutableArray alloc] init]; - cArray = NULL; - } - - // NSLog(@"ParameterSet init, %@", parameters); - - return self; - -} - -- (void)dealloc { - - [parameters release]; - if (cArray != NULL) { - free(cArray); - } - - [super dealloc]; -// NSLog(@"ParameterSet dealloc"); -} - - -- (void)encodeWithCoder:(NSCoder *)coder { - [coder encodeObject:parameters]; -} - - -- (id)initWithCoder:(NSCoder *)coder { - - if (self = [super init]) { - [self setParameterSet:[coder decodeObject]]; - } - return self; - -} - -- (void)setParameterSet:(NSMutableArray *)array { - - [array retain]; - [parameters release]; - parameters = array; - -} - - -- (void)addParameter:(NSString *)name withValue:(NSString *)value { - - NSMutableDictionary *entry = [NSMutableDictionary dictionaryWithCapacity:2]; - [entry setObject:name forKey:@"parameterName"]; - [entry setObject:value forKey:@"parameterValue"]; - -// NSLog("entry: %@", entry); - - [parameters addObject:entry]; - -} - - - -- (void)setField:(NSString *)fieldName atIndex:(int)index toString:(NSString *)s { - [[parameters objectAtIndex:index] setObject:s forKey:fieldName]; -} - -- (NSString *)getField:(NSString *)fieldName atIndex:(int)index { - return [[parameters objectAtIndex:index] objectForKey:fieldName]; -} - - - -- (void)removeParameterAtIndex:(int)index { - [parameters removeObjectAtIndex:index]; -} - -- (void)removeParameterByName:(NSString *)name { - - int i; - NSString *currentName; - - for (i = 0; i < [self count]; i++) { - currentName = [self getField:@"parameterName" atIndex:i]; - if ([currentName isEqualToString:name]) { - [self removeParameterAtIndex:i]; - [self removeParameterByName:name]; - } - } - -} - - -- (int)count { - return [parameters count]; -} - -- (const char **)cArray { - - int i; - const char **temp; - - if (cArray != NULL) { - free(cArray); - } - - temp = cArray = malloc((([self count] * 2) + 1) * sizeof(char *)); - - - for (i = 0; i < [self count]; i++) { - - *(temp++) = (char *)[[self getField:@"parameterName" atIndex:i] cString]; - *(temp++) = (char *)[[self getField:@"parameterValue" atIndex:i] cString]; - - } - - *(temp) = NULL; - - return cArray; -} - - - -@end diff --git a/StringErrorListener.java b/StringErrorListener.java deleted file mode 100644 index 3e1ae68..0000000 --- a/StringErrorListener.java +++ /dev/null @@ -1,50 +0,0 @@ -// -// ErrorListener.java -// TestXSLT -// -// Created by Marc Liyanage on Sun Jun 08 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -package ch.entropy.testxslt; - -import javax.xml.transform.*; - - -public class StringErrorListener implements ErrorListener { - - String errorString; - - public void warning(TransformerException exception) throws TransformerException { - - errorString = exception.toString(); - System.err.println("captured warning"); - - } - - public void error(TransformerException exception) throws TransformerException { - - errorString = exception.toString(); - System.err.println("captured error"); - - } - - public void fatalError(TransformerException exception) throws TransformerException { - - errorString = exception.toString(); - System.err.println("captured fatalError"); - - } - - - public String getErrorString() { - - return errorString; - } - - - - - - -} diff --git a/TabViewDraggingCategory.h b/TabViewDraggingCategory.h deleted file mode 100644 index 9ea6c8e..0000000 --- a/TabViewDraggingCategory.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// TabViewDraggingCategory.h -// TestXSLT -// -// Created by Marc Liyanage on Sun Oct 26 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - - -#import -#import - - -@interface NSTabView (DraggingCategory) - -- (NSDragOperation)draggingUpdated:(id)dragInfo; -- (NSDragOperation)draggingEntered:(id)dragInfo; - -@end - - - diff --git a/TabViewDraggingCategory.m b/TabViewDraggingCategory.m deleted file mode 100644 index 484b7d9..0000000 --- a/TabViewDraggingCategory.m +++ /dev/null @@ -1,36 +0,0 @@ -// -// TabViewDraggingCategory.m -// TestXSLT -// -// Created by Marc Liyanage on Sun Oct 26 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "TabViewDraggingCategory.h" - - -@implementation NSTabView (DraggingCategory) - -- (NSDragOperation)draggingUpdated:(id)dragInfo { - - NSPoint mouse = [self convertPoint:[dragInfo draggingLocation] fromView:nil]; - - NSTabViewItem *hitItem = [self tabViewItemAtPoint:mouse]; - NSString *identifier = [hitItem identifier]; - - if (hitItem && ([identifier isEqualToString:@"xmlTab"] || [identifier isEqualToString:@"xsltTab"])) { - [self selectTabViewItem:hitItem]; - } - - return NSDragOperationGeneric; - -} - -- (NSDragOperation)draggingEntered:(id)dragInfo { - - return NSDragOperationGeneric; - -} - - -@end diff --git a/TestXSLT Icon.psd b/TestXSLT Icon.psd deleted file mode 100644 index 77a86f75a7fedb417db9098f27a43672513aebcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110564 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%0APLaGG;=>j7><={9;T@4%fO4OeK# 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 diff --git a/TestXSLT-Icon.png b/TestXSLT-Icon.png deleted file mode 100644 index 6e4e7e11ffb513b37f918d09ce50b89586afa528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10116 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 L&a%oJcl-YUYWA|O diff --git a/TestXSLT.icns b/TestXSLT.icns deleted file mode 100644 index 6aee7bc55f35f4066b6614ddff5777e941b283d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51981 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 diff --git a/TestXSLT.pbproj/liyanage.mode1 b/TestXSLT.pbproj/liyanage.mode1 index 19ac20b..17ed6c8 100644 --- a/TestXSLT.pbproj/liyanage.mode1 +++ b/TestXSLT.pbproj/liyanage.mode1 @@ -224,8 +224,6 @@ Layout - BecomeActive - ContentConfiguration PBXBottomSmartGroupGIDs @@ -262,15 +260,18 @@ PBXSmartGroupTreeModuleOutlineStateExpansionKey 2A37F4AAFDCFA73011CA2CEA - 2A37F4B8FDCFA73011CA2CEA + 2A37F4ABFDCFA73011CA2CEA + 2A37F4C3FDCFA73011CA2CEA + 1B3CBAE107CBDCB3008B4FAA 1C37FBAC04509CD000000102 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey - 29 - 28 + 4 + 2 + 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey @@ -289,7 +290,7 @@ 220 RubberWindowFrame - 90 200 1221 622 0 0 1440 878 + 121 122 1221 622 0 0 1440 878 Module PBXSmartGroupTreeModule @@ -305,7 +306,7 @@ PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel - InfoPlist.strings + MyDocument.m PBXSplitModuleInNavigatorKey Split0 @@ -313,78 +314,40 @@ PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel - InfoPlist.strings + MyDocument.m bookmark - 1BB5020107CDCED30015DFDC + 1BB925B307D272F600307053 history 1B896C1507B17E7A00ECFC52 - 1B7EA28D07B2D82300B881B7 - 1B7EA28E07B2D82300B881B7 - 1B7EA28F07B2D82300B881B7 - 1B64BBA707C5E1EC0014535B - 1B64BC4B07C6A3070014535B - 1B64BC8707C6AB200014535B - 1B64BC8807C6AB200014535B - 1BF5370307C74C8200D6EBDB - 1BF5370B07C74CDD00D6EBDB - 1BF5371B07C74F6000D6EBDB - 1BF5372507C7508600D6EBDB 1BF5372E07C750B100D6EBDB 1BF5374907C753E100D6EBDB 1BF5374A07C753E100D6EBDB 1BF5374B07C753E100D6EBDB - 1BF5374C07C753E100D6EBDB 1BF5374D07C753E100D6EBDB 1BF5374E07C753E100D6EBDB 1BF5376007C7590200D6EBDB 1B894BCB07CA5F24005318E9 - 1B894C0107CA9707005318E9 1B3CBB6107CBE588008B4FAA 1B3CBBF107CBF19D008B4FAA - 1B3CBBF207CBF19D008B4FAA - 1B3CBBF407CBF19D008B4FAA - 1B3CBBF507CBF19D008B4FAA - 1B3CBBF607CBF19D008B4FAA - 1B3CBBF707CBF19D008B4FAA - 1B3CBBF807CBF19D008B4FAA 1B3CBC1A07CBF4AE008B4FAA 1B3CBC8F07CBF643008B4FAA - 1B3CBC9107CBF643008B4FAA 1B3CBC9207CBF643008B4FAA - 1B3CBCDE07CC6A3D008B4FAA - 1B3CBCDF07CC6A3D008B4FAA - 1B3CBD0007CCA0BA008B4FAA - 1B3CBD0107CCA0BA008B4FAA - 1B3CBD0207CCA0BA008B4FAA - 1B3CBD0307CCA0BA008B4FAA - 1BB501EB07CDCA860015DFDC 1BB501EF07CDCABC0015DFDC 1BB501F007CDCABC0015DFDC - 1BB501F107CDCABC0015DFDC + 1BB9243307D2657000307053 + 1BB924EE07D26B2500307053 + 1BB925AB07D2714A00307053 + 1BB925AC07D2714A00307053 + 1BB924D607D269EA00307053 prevStack - 1B896BFF07B17C8300ECFC52 1B896C1607B17E7A00ECFC52 1B896C3707B1829F00ECFC52 - 1B896C3E07B1835000ECFC52 - 1B896C6D07B1899100ECFC52 - 1B896C7507B18B5000ECFC52 - 1B7EA29207B2D82300B881B7 - 1B7EA29307B2D82300B881B7 - 1B7EA29507B2D82300B881B7 - 1B7EA29607B2D82300B881B7 - 1B7EA29707B2D82300B881B7 1BE3507607C5D1FF00D05BE4 - 1B64BBAA07C5E1EC0014535B - 1B64BBC107C5E67B0014535B - 1B64BBD807C5ED600014535B 1B64BC1107C686420014535B 1B64BC2607C688D70014535B - 1B64BC5407C6A3070014535B - 1B64BC8207C6A8DC0014535B - 1B64BC8B07C6AB200014535B 1B64BC9807C6AC590014535B 1B64BC9A07C6AC590014535B 1BF536FC07C74BC400D6EBDB @@ -396,22 +359,13 @@ 1B894BF807CA8EF8005318E9 1B3CBB3F07CBE26E008B4FAA 1B3CBBFC07CBF19D008B4FAA - 1B3CBC0307CBF19D008B4FAA - 1B3CBC0407CBF19D008B4FAA - 1B3CBC0507CBF19D008B4FAA - 1B3CBC0607CBF19D008B4FAA 1B3CBC9507CBF643008B4FAA - 1B3CBC9907CBF643008B4FAA - 1B3CBCE307CC6A3D008B4FAA - 1B3CBCE407CC6A3D008B4FAA - 1B3CBCE507CC6A3D008B4FAA - 1B3CBCE607CC6A3D008B4FAA - 1B3CBCE707CC6A3D008B4FAA - 1B3CBCEA07CC6A3D008B4FAA - 1B3CBCEB07CC6A3D008B4FAA - 1BB501EC07CDCA860015DFDC - 1BB501F207CDCABC0015DFDC 1BB501F307CDCABC0015DFDC + 1BB9243C07D266A400307053 + 1BB9243D07D266A400307053 + 1BB924EF07D26B2500307053 + 1BB925AD07D2714A00307053 + 1BB925AE07D2714A00307053 SplitCount @@ -425,7 +379,7 @@ Frame {{0, 0}, {978, 438}} RubberWindowFrame - 90 200 1221 622 0 0 1440 878 + 121 122 1221 622 0 0 1440 878 Module PBXNavigatorGroup @@ -445,7 +399,7 @@ Frame {{0, 445}, {978, 135}} RubberWindowFrame - 90 200 1221 622 0 0 1440 878 + 121 122 1221 622 0 0 1440 878 Module XCDetailModule @@ -469,9 +423,9 @@ TableOfContents - 1BB501B707CD49BB0015DFDC + 1BB9259407D26B3800307053 1CE0B1FE06471DED0097A5F4 - 1BB501B807CD49BB0015DFDC + 1BB9259507D26B3800307053 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -484,7 +438,7 @@ StatusbarIsVisible TimeStamp - 130928339.76569076 + 131232502.27118193 ToolbarDisplayMode 1 ToolbarIsVisible @@ -499,12 +453,12 @@ 5 WindowOrderList + 1BB9259607D26B3800307053 1C0AD2B3069F1EA900FABCE6 - 1B3CBCB907CBF93D008B4FAA /Users/liyanage/svn/entropy/TestXSLT/TestXSLT.pbproj WindowString - 90 200 1221 622 0 0 1440 878 + 121 122 1221 622 0 0 1440 878 WindowTools @@ -532,12 +486,6 @@ 1CD052900623707200166675 PBXProjectModuleLabel MyDocument.m - bookmark - 1BB5020207CDCED30015DFDC - history - - 1B3CBD1207CCA12E008B4FAA - SplitCount 1 @@ -550,7 +498,7 @@ Frame {{0, 0}, {701, 0}} RubberWindowFrame - 672 357 701 277 0 0 1440 878 + 578 97 701 277 0 0 1440 878 Module PBXNavigatorGroup @@ -576,7 +524,7 @@ Frame {{0, 7}, {701, 228}} RubberWindowFrame - 672 357 701 277 0 0 1440 878 + 578 97 701 277 0 0 1440 878 Module PBXBuildResultsModule @@ -598,17 +546,17 @@ TableOfContents - 1B3CBCB907CBF93D008B4FAA - 1BB501BA07CD49BB0015DFDC + 1BB9259607D26B3800307053 + 1BB9259707D26B3800307053 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID ToolbarConfiguration xcode.toolbar.config.build WindowString - 672 357 701 277 0 0 1440 878 + 578 97 701 277 0 0 1440 878 WindowToolGUID - 1B3CBCB907CBF93D008B4FAA + 1BB9259607D26B3800307053 WindowToolIsVisible @@ -910,8 +858,8 @@ yes sizes - {{0, 0}, {493, 167}} - {{0, 176}, {493, 267}} + {{0, 0}, {366, 167}} + {{0, 176}, {366, 267}} VerticalSplitView @@ -960,9 +908,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1BB501BB07CD49BB0015DFDC + 1BB925A807D2707400307053 1CD0528B0623707200166675 - 1BB501BC07CD49BB0015DFDC + 1BB925A907D2707400307053 ToolbarConfiguration xcode.toolbar.config.run @@ -971,7 +919,7 @@ WindowToolGUID 1C0AD2B3069F1EA900FABCE6 WindowToolIsVisible - + Identifier diff --git a/TestXSLT.pbproj/liyanage.pbxuser b/TestXSLT.pbproj/liyanage.pbxuser index be15021..693cdbe 100644 --- a/TestXSLT.pbproj/liyanage.pbxuser +++ b/TestXSLT.pbproj/liyanage.pbxuser @@ -3,7 +3,7 @@ 089C1660FE840EACC02AAC07 = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {937, 406}}"; - sepNavSelRange = "{162, 0}"; + sepNavSelRange = "{312, 0}"; sepNavVisRect = "{{0, 0}, {937, 406}}"; }; }; @@ -81,7 +81,7 @@ 1B387DB50503FDF50064611D = { fileReference = 2A37F4ACFDCFA73011CA2CEA; isa = PBXFileBreakpoint; - lineNumber = 1204; + lineNumber = 1205; state = 1; }; 1B3BC83B0436364A006C8631 = { @@ -146,110 +146,10 @@ vrLen = 514; vrLoc = 1888; }; - 1B3CBBF207CBF19D008B4FAA = { - fRef = 1BB569F404E3010E0099E21C; - isa = PBXTextBookmark; - name = "FOPWrapper.java: 30"; - rLen = 0; - rLoc = 761; - rType = 0; - vrLen = 741; - vrLoc = 0; - }; - 1B3CBBF407CBF19D008B4FAA = { - fRef = 2A37F4AEFDCFA73011CA2CEA; - isa = PBXTextBookmark; - name = "MyDocument.h: defaults"; - rLen = 0; - rLoc = 2638; - rType = 0; - vrLen = 584; - vrLoc = 85; - }; - 1B3CBBF507CBF19D008B4FAA = { - fRef = F7D20D5002F9CFDC01000103; - isa = PBXTextBookmark; - name = "XSLTProcessorFactory.h: 14"; - rLen = 0; - rLoc = 350; - rType = 0; - vrLen = 477; - vrLoc = 0; - }; - 1B3CBBF607CBF19D008B4FAA = { - fRef = F7D20D1102F9A9BE01000103; - isa = PBXTextBookmark; - name = "XSLTProcessor.h: resultEncoding"; - rLen = 0; - rLoc = 584; - rType = 0; - vrLen = 458; - vrLoc = 0; - }; - 1B3CBBF707CBF19D008B4FAA = { - fRef = F7D20D1502F9AB3B01000103; - isa = PBXTextBookmark; - name = "XSLTProcessorSablotron.h: 13"; - rLen = 0; - rLoc = 245; - rType = 0; - vrLen = 723; - vrLoc = 0; - }; - 1B3CBBF807CBF19D008B4FAA = { - fRef = 1B6AEEBE0493442600000102; - isa = PBXTextBookmark; - name = "XSLTProcessorSaxon.h: 18"; - rLen = 0; - rLoc = 262; - rType = 0; - vrLen = 266; - vrLoc = 0; - }; 1B3CBBFC07CBF19D008B4FAA = { isa = PBXTargetBookmark; trg = 1B3CBBAD07CBEF5B008B4FAA; }; - 1B3CBC0307CBF19D008B4FAA = { - fRef = F7D20D5002F9CFDC01000103; - isa = PBXTextBookmark; - name = "XSLTProcessorFactory.h: 14"; - rLen = 0; - rLoc = 350; - rType = 0; - vrLen = 477; - vrLoc = 0; - }; - 1B3CBC0407CBF19D008B4FAA = { - fRef = F7D20D1102F9A9BE01000103; - isa = PBXTextBookmark; - name = "XSLTProcessor.h: resultEncoding"; - rLen = 0; - rLoc = 584; - rType = 0; - vrLen = 458; - vrLoc = 0; - }; - 1B3CBC0507CBF19D008B4FAA = { - fRef = F7D20D1502F9AB3B01000103; - isa = PBXTextBookmark; - name = "XSLTProcessorSablotron.h: 13"; - rLen = 0; - rLoc = 245; - rType = 0; - vrLen = 723; - vrLoc = 0; - }; - 1B3CBC0607CBF19D008B4FAA = { - fRef = 1B6AEEBE0493442600000102; - isa = PBXTextBookmark; - name = "XSLTProcessorSaxon.h: 18"; - rLen = 0; - rLoc = 262; - rType = 0; - vrLen = 266; - vrLoc = 0; - }; 1B3CBC1A07CBF4AE008B4FAA = { fRef = 1B64BC9307C6AB3D0014535B; isa = PBXTextBookmark; @@ -302,10 +202,6 @@ isa = PBXTargetBookmark; trg = 1B3CBBAD07CBEF5B008B4FAA; }; - 1B3CBC9107CBF643008B4FAA = { - fRef = F7D210D302FA755701000103; - isa = PBXBookmark; - }; 1B3CBC9207CBF643008B4FAA = { fRef = F739177802FCAAF401000103; isa = PBXTextBookmark; @@ -326,150 +222,6 @@ vrLen = 755; vrLoc = 1388; }; - 1B3CBC9907CBF643008B4FAA = { - fRef = F7D210D302FA755701000103; - isa = PBXBookmark; - }; - 1B3CBCDE07CC6A3D008B4FAA = { - fRef = 1B17499C04FEB2BE00E5CBC3; - isa = PBXTextBookmark; - name = "ragel_xmlscanner.c: 249"; - rLen = 0; - rLoc = 6569; - rType = 0; - vrLen = 823; - vrLoc = 8551; - }; - 1B3CBCDF07CC6A3D008B4FAA = { - fRef = 1B17499B04FEB2BE00E5CBC3; - isa = PBXTextBookmark; - name = "ragel_xmlscanner.h: findCompletion"; - rLen = 0; - rLoc = 816; - rType = 0; - vrLen = 566; - vrLoc = 548; - }; - 1B3CBCE307CC6A3D008B4FAA = { - fRef = 1BD3D60E050160EC00FF9835; - isa = PBXTextBookmark; - name = XMLDeclScanner; - rLen = 14; - rLoc = 1284; - rType = 0; - vrLen = 727; - vrLoc = 965; - }; - 1B3CBCE407CC6A3D008B4FAA = { - fRef = 1B17499C04FEB2BE00E5CBC3; - isa = PBXTextBookmark; - name = "ragel_xmlscanner.c: 249"; - rLen = 0; - rLoc = 6569; - rType = 0; - vrLen = 825; - vrLoc = 8551; - }; - 1B3CBCE507CC6A3D008B4FAA = { - fRef = 1BD3D5C605015C8400FF9835; - isa = PBXTextBookmark; - name = "ragel_xmldeclscanner.c: getEncodingFromXmlDecl"; - rLen = 0; - rLoc = 1638; - rType = 0; - vrLen = 619; - vrLoc = 1330; - }; - 1B3CBCE607CC6A3D008B4FAA = { - fRef = 1B02A8AC04FFD5E400D27002; - isa = PBXTextBookmark; - name = "test_ragel_xmlscanner.c: 20"; - rLen = 0; - rLoc = 321; - rType = 0; - vrLen = 509; - vrLoc = 0; - }; - 1B3CBCE707CC6A3D008B4FAA = { - fRef = 1BD3D5C705015C8400FF9835; - isa = PBXTextBookmark; - name = "ragel_xmldeclscanner.h: 25"; - rLen = 0; - rLoc = 497; - rType = 0; - vrLen = 381; - vrLoc = 392; - }; - 1B3CBCEA07CC6A3D008B4FAA = { - fRef = 1B17499B04FEB2BE00E5CBC3; - isa = PBXTextBookmark; - name = "ragel_xmlscanner.h: findCompletion"; - rLen = 0; - rLoc = 816; - rType = 0; - vrLen = 566; - vrLoc = 548; - }; - 1B3CBCEB07CC6A3D008B4FAA = { - fRef = 1B1749C304FEB65B00E5CBC3; - isa = PBXTextBookmark; - name = "ragel_xmlscanner_out.c: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 896; - vrLoc = 0; - }; - 1B3CBD0007CCA0BA008B4FAA = { - fRef = 1B1749C304FEB65B00E5CBC3; - isa = PBXTextBookmark; - name = find; - rLen = 4; - rLoc = 17580; - rType = 0; - vrLen = 1089; - vrLoc = 16955; - }; - 1B3CBD0107CCA0BA008B4FAA = { - fRef = 1B02A8AC04FFD5E400D27002; - isa = PBXTextBookmark; - name = "test_ragel_xmlscanner.c: 20"; - rLen = 0; - rLoc = 321; - rType = 0; - vrLen = 509; - vrLoc = 0; - }; - 1B3CBD0207CCA0BA008B4FAA = { - fRef = 1BD3D60E050160EC00FF9835; - isa = PBXTextBookmark; - name = "ragel_xmldeclscanner_out.c: 509"; - rLen = 0; - rLoc = 12614; - rType = 0; - vrLen = 595; - vrLoc = 11152; - }; - 1B3CBD0307CCA0BA008B4FAA = { - fRef = 1BD3D5C605015C8400FF9835; - isa = PBXTextBookmark; - name = "ragel_xmldeclscanner.c: getEncodingFromXmlDecl"; - rLen = 0; - rLoc = 1632; - rType = 0; - vrLen = 613; - vrLoc = 1330; - }; - 1B3CBD1207CCA12E008B4FAA = { - fRef = 2A37F4ACFDCFA73011CA2CEA; - isa = PBXTextBookmark; - name = "\t\t\t\t[xmlWellFormedIcon setToolTip:[xmlView valueForKey:@\"errorString\"]];\n"; - rLen = 73; - rLoc = 3665; - rType = 0; - vrLen = 0; - vrLoc = 0; - }; 1B45862E04C14DA30097AE1B = { activeExec = 0; buildArgumentsString = "libexpat-helper.sh"; @@ -527,46 +279,6 @@ sepNavVisRect = "{{0, 0}, {826, 399}}"; }; }; - 1B64BBA707C5E1EC0014535B = { - fRef = 1B6AEEBF0493442600000102; - isa = PBXTextBookmark; - name = "XSLTProcessorSaxon.m: 24"; - rLen = 0; - rLoc = 327; - rType = 0; - vrLen = 358; - vrLoc = 28; - }; - 1B64BBAA07C5E1EC0014535B = { - fRef = 1B6AEEBF0493442600000102; - isa = PBXTextBookmark; - name = "XSLTProcessorSaxon.m: 24"; - rLen = 0; - rLoc = 327; - rType = 0; - vrLen = 358; - vrLoc = 28; - }; - 1B64BBC107C5E67B0014535B = { - fRef = F786D09402FB227701000103; - isa = PBXTextBookmark; - name = "XMLTextView.m: 238"; - rLen = 0; - rLoc = 4429; - rType = 0; - vrLen = 534; - vrLoc = 4142; - }; - 1B64BBD807C5ED600014535B = { - fRef = F786D09302FB227701000103; - isa = PBXTextBookmark; - name = "-(BOOL)checkWellFormed;\n"; - rLen = 24; - rLoc = 792; - rType = 0; - vrLen = 628; - vrLoc = 263; - }; 1B64BC1107C686420014535B = { fRef = F7641DB002FFB2FA01A8A905; isa = PBXTextBookmark; @@ -581,36 +293,6 @@ fRef = 2A37F4B5FDCFA73011CA2CEA; isa = PBXBookmark; }; - 1B64BC4B07C6A3070014535B = { - fRef = F755EF1702E9C0F2014C0C38; - isa = PBXTextBookmark; - name = "DragDestinationTextView.m: 177"; - rLen = 0; - rLoc = 3737; - rType = 0; - vrLen = 600; - vrLoc = 3259; - }; - 1B64BC5407C6A3070014535B = { - fRef = F755EF1702E9C0F2014C0C38; - isa = PBXTextBookmark; - name = "DragDestinationTextView.m: 177"; - rLen = 0; - rLoc = 3737; - rType = 0; - vrLen = 600; - vrLoc = 3259; - }; - 1B64BC8207C6A8DC0014535B = { - fRef = F56420C102329DDD01000103; - isa = PBXTextBookmark; - name = "Workset.h: xmlCode"; - rLen = 0; - rLoc = 656; - rType = 0; - vrLen = 597; - vrLoc = 82; - }; 1B64BC8507C6AB120014535B = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {937, 406}}"; @@ -618,36 +300,6 @@ sepNavVisRect = "{{0, 0}, {937, 406}}"; }; }; - 1B64BC8707C6AB200014535B = { - fRef = F56420C102329DDD01000103; - isa = PBXTextBookmark; - name = "Workset.h: xmlCode"; - rLen = 0; - rLoc = 656; - rType = 0; - vrLen = 597; - vrLoc = 82; - }; - 1B64BC8807C6AB200014535B = { - fRef = F56420C202329DDD01000103; - isa = PBXTextBookmark; - name = "Workset.m: 19"; - rLen = 0; - rLoc = 318; - rType = 0; - vrLen = 1004; - vrLoc = 33; - }; - 1B64BC8B07C6AB200014535B = { - fRef = F56420C202329DDD01000103; - isa = PBXTextBookmark; - name = "Workset.m: 16"; - rLen = 0; - rLoc = 425; - rType = 0; - vrLen = 962; - vrLoc = 33; - }; 1B64BC9307C6AB3D0014535B = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {937, 406}}"; @@ -724,86 +376,6 @@ lineNumber = 91; state = 1; }; - 1B7EA28D07B2D82300B881B7 = { - fRef = 1BF7F12404F2BE74007723F5; - isa = PBXTextBookmark; - name = "XSL_FO_Renderer.m: 23"; - rLen = 0; - rLoc = 463; - rType = 0; - vrLen = 495; - vrLoc = 0; - }; - 1B7EA28E07B2D82300B881B7 = { - fRef = 1B5E2EFA04F102EA00F043CD; - isa = PBXTextBookmark; - name = "\tBOOL swresult = [jw transform:[self getJAXPProcessorName] :xmlCode :xsltCode :paramBuffer :jaxpBaseUri];\n"; - rLen = 106; - rLoc = 888; - rType = 0; - vrLen = 611; - vrLoc = 789; - }; - 1B7EA28F07B2D82300B881B7 = { - fRef = 1B5E2F1E04F1065100F043CD; - isa = PBXTextBookmark; - name = "XSLTProcessorXalan_J.m: 27"; - rLen = 0; - rLoc = 404; - rType = 0; - vrLen = 411; - vrLoc = 0; - }; - 1B7EA29207B2D82300B881B7 = { - fRef = 2A37F4ACFDCFA73011CA2CEA; - isa = PBXTextBookmark; - name = "MyDocument.m: 215"; - rLen = 0; - rLoc = 6181; - rType = 0; - vrLen = 689; - vrLoc = 5770; - }; - 1B7EA29307B2D82300B881B7 = { - fRef = 1B6AEEC80493DF6900000102; - isa = PBXTextBookmark; - name = "StringErrorListener.java: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 634; - vrLoc = 0; - }; - 1B7EA29507B2D82300B881B7 = { - fRef = 1BF7F12404F2BE74007723F5; - isa = PBXTextBookmark; - name = "XSL_FO_Renderer.m: 23"; - rLen = 0; - rLoc = 463; - rType = 0; - vrLen = 495; - vrLoc = 0; - }; - 1B7EA29607B2D82300B881B7 = { - fRef = 1B5E2EFA04F102EA00F043CD; - isa = PBXTextBookmark; - name = "\tBOOL swresult = [jw transform:[self getJAXPProcessorName] :xmlCode :xsltCode :paramBuffer :jaxpBaseUri];\n"; - rLen = 106; - rLoc = 888; - rType = 0; - vrLen = 611; - vrLoc = 789; - }; - 1B7EA29707B2D82300B881B7 = { - fRef = 1B5E2F1E04F1065100F043CD; - isa = PBXTextBookmark; - name = "XSLTProcessorXalan_J.m: 27"; - rLen = 0; - rLoc = 404; - rType = 0; - vrLen = 411; - vrLoc = 0; - }; 1B894BCB07CA5F24005318E9 = { isa = PBXTargetBookmark; trg = 1B45862E04C14DA30097AE1B; @@ -832,26 +404,6 @@ vrLen = 434; vrLoc = 0; }; - 1B894C0107CA9707005318E9 = { - fRef = 2A37F4ACFDCFA73011CA2CEA; - isa = PBXTextBookmark; - name = "MyDocument.m: 235"; - rLen = 0; - rLoc = 6685; - rType = 0; - vrLen = 888; - vrLoc = 6144; - }; - 1B896BFF07B17C8300ECFC52 = { - fRef = 1B3BC92B04365B9B006C8631; - isa = PBXTextBookmark; - name = "AppDelegate.m: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 593; - vrLoc = 0; - }; 1B896C0A07B17E1300ECFC52 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; @@ -890,83 +442,171 @@ vrLen = 312; vrLoc = 0; }; - 1B896C3E07B1835000ECFC52 = { + 1B8B40170502692200371325 = { + fileReference = F786D09402FB227701000103; + isa = PBXFileBreakpoint; + lineNumber = 327; + state = 1; + }; + 1BB501EF07CDCABC0015DFDC = { + fRef = 1B3CBC8907CBF598008B4FAA; + isa = PBXTextBookmark; + name = "Info.plist: 47"; + rLen = 0; + rLoc = 1353; + rType = 0; + vrLen = 814; + vrLoc = 278; + }; + 1BB501F007CDCABC0015DFDC = { + fRef = F7BEF93602D6273601F46A01; + isa = PBXTextBookmark; + name = "English: 150"; + rLen = 0; + rLoc = 4421; + rType = 0; + vrLen = 777; + vrLoc = 3982; + }; + 1BB501F307CDCABC0015DFDC = { + fRef = F7BEF93602D6273601F46A01; + isa = PBXTextBookmark; + name = "English: 150"; + rLen = 0; + rLoc = 4421; + rType = 0; + vrLen = 777; + vrLoc = 3982; + }; + 1BB569F404E3010E0099E21C = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {826, 1568}}"; + sepNavSelRange = "{761, 0}"; + sepNavVisRect = "{{0, 0}, {826, 399}}"; + sepNavWindowFrame = "{{107, 185}, {750, 558}}"; + }; + }; + 1BB9243307D2657000307053 = { + fRef = F7641DAF02FFB2FA01A8A905; + isa = PBXTextBookmark; + name = "readme.xml: 38"; + rLen = 0; + rLoc = 2448; + rType = 0; + vrLen = 1691; + vrLoc = 1047; + }; + 1BB9243A07D266A400307053 = { fRef = 2A37F4AEFDCFA73011CA2CEA; isa = PBXTextBookmark; - name = xslfoRendererData; - rLen = 17; - rLoc = 2362; + name = "MyDocument.h: canUseSelectionForFindNow"; + rLen = 0; + rLoc = 2638; rType = 0; - vrLen = 841; - vrLoc = 2096; + vrLen = 516; + vrLoc = 148; }; - 1B896C6D07B1899100ECFC52 = { - fRef = 1B3BC92604365914006C8631; + 1BB9243C07D266A400307053 = { + fRef = 2A37F4AEFDCFA73011CA2CEA; isa = PBXTextBookmark; - name = "AppDelegate.h: 1"; + name = "MyDocument.h: canUseSelectionForFindNow"; rLen = 0; - rLoc = 0; + rLoc = 2638; rType = 0; - vrLen = 316; + vrLen = 579; + vrLoc = 85; + }; + 1BB9243D07D266A400307053 = { + fRef = 2A37F4ACFDCFA73011CA2CEA; + isa = PBXTextBookmark; + name = "xmlWellFormedIcon setToolTip:[xmlView valueForKey:@\"errorString\"]];\n\t\t\t\t["; + rLen = 73; + rLoc = 3694; + rType = 0; + vrLen = 594; vrLoc = 0; }; - 1B896C7507B18B5000ECFC52 = { - fRef = 1BB569F404E3010E0099E21C; + 1BB924D607D269EA00307053 = { + fRef = 2A37F4ACFDCFA73011CA2CEA; isa = PBXTextBookmark; - name = "FOPWrapper.java: 30"; + name = "xmlWellFormedIcon setToolTip:[xmlView valueForKey:@\"errorString\"]];\n\t\t\t\t["; + rLen = 73; + rLoc = 3694; + rType = 0; + vrLen = 594; + vrLoc = 0; + }; + 1BB924DA07D269EA00307053 = { + fRef = 2A37F4ACFDCFA73011CA2CEA; + isa = PBXTextBookmark; + name = "xmlWellFormedIcon setToolTip:[xmlView valueForKey:@\"errorString\"]];\n\t\t\t\t["; + rLen = 73; + rLoc = 3694; + rType = 0; + vrLen = 594; + vrLoc = 0; + }; + 1BB924E907D26A6100307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 5"; rLen = 0; - rLoc = 761; + rLoc = 162; rType = 0; - vrLen = 741; + vrLen = 312; vrLoc = 0; }; - 1B8B40170502692200371325 = { - fileReference = F786D09402FB227701000103; - isa = PBXFileBreakpoint; - lineNumber = 327; - state = 1; + 1BB924EA07D26A6100307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 5"; + rLen = 0; + rLoc = 162; + rType = 0; + vrLen = 312; + vrLoc = 0; }; - 1BB501EB07CDCA860015DFDC = { - fRef = 1BD3D5C705015C8400FF9835; + 1BB924EE07D26B2500307053 = { + fRef = F7984B7002D626B50156A887; isa = PBXTextBookmark; - name = "ragel_xmldeclscanner.h: getEncodingFromXmlDecl"; + name = "TestXSLT.scriptSuite: 1"; rLen = 0; - rLoc = 468; + rLoc = 0; rType = 0; - vrLen = 381; - vrLoc = 392; + vrLen = 837; + vrLoc = 0; }; - 1BB501EC07CDCA860015DFDC = { - fRef = 1BD3D5C705015C8400FF9835; + 1BB924EF07D26B2500307053 = { + fRef = F7984B7002D626B50156A887; isa = PBXTextBookmark; - name = "ragel_xmldeclscanner.h: getEncodingFromXmlDecl"; + name = "TestXSLT.scriptSuite: 1"; rLen = 0; - rLoc = 468; + rLoc = 0; rType = 0; - vrLen = 381; - vrLoc = 392; + vrLen = 837; + vrLoc = 0; }; - 1BB501EF07CDCABC0015DFDC = { - fRef = 1B3CBC8907CBF598008B4FAA; + 1BB924F107D26B2E00307053 = { + fRef = 089C1660FE840EACC02AAC07; isa = PBXTextBookmark; - name = "Info.plist: 47"; + name = "English: 5"; rLen = 0; - rLoc = 1353; + rLoc = 162; rType = 0; - vrLen = 814; - vrLoc = 278; + vrLen = 312; + vrLoc = 0; }; - 1BB501F007CDCABC0015DFDC = { - fRef = F7BEF93602D6273601F46A01; + 1BB9259207D26B3800307053 = { + fRef = 089C1660FE840EACC02AAC07; isa = PBXTextBookmark; - name = "English: 150"; + name = "English: 5"; rLen = 0; - rLoc = 4421; + rLoc = 162; rType = 0; - vrLen = 777; - vrLoc = 3982; + vrLen = 312; + vrLoc = 0; }; - 1BB501F107CDCABC0015DFDC = { + 1BB9259307D26B3800307053 = { fRef = 089C1660FE840EACC02AAC07; isa = PBXTextBookmark; name = "English: 5"; @@ -976,27 +616,27 @@ vrLen = 312; vrLoc = 0; }; - 1BB501F207CDCABC0015DFDC = { - fRef = 1B3CBC8907CBF598008B4FAA; + 1BB9259807D26D4A00307053 = { + fRef = 089C1660FE840EACC02AAC07; isa = PBXTextBookmark; - name = "Info.plist: 47"; + name = "English: 5"; rLen = 0; - rLoc = 1353; + rLoc = 162; rType = 0; - vrLen = 814; - vrLoc = 278; + vrLen = 312; + vrLoc = 0; }; - 1BB501F307CDCABC0015DFDC = { - fRef = F7BEF93602D6273601F46A01; + 1BB9259907D26FB100307053 = { + fRef = 089C1660FE840EACC02AAC07; isa = PBXTextBookmark; - name = "English: 150"; + name = "English: 5"; rLen = 0; - rLoc = 4421; + rLoc = 162; rType = 0; - vrLen = 777; - vrLoc = 3982; + vrLen = 312; + vrLoc = 0; }; - 1BB5020107CDCED30015DFDC = { + 1BB9259A07D26FC700307053 = { fRef = 089C1660FE840EACC02AAC07; isa = PBXTextBookmark; name = "English: 5"; @@ -1006,23 +646,145 @@ vrLen = 312; vrLoc = 0; }; - 1BB5020207CDCED30015DFDC = { + 1BB9259B07D26FD700307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 5"; + rLen = 0; + rLoc = 162; + rType = 0; + vrLen = 312; + vrLoc = 0; + }; + 1BB925A507D2705800307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 7"; + rLen = 0; + rLoc = 312; + rType = 0; + vrLen = 312; + vrLoc = 0; + }; + 1BB925A607D2705D00307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 7"; + rLen = 0; + rLoc = 312; + rType = 0; + vrLen = 312; + vrLoc = 0; + }; + 1BB925A707D2707400307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 7"; + rLen = 0; + rLoc = 312; + rType = 0; + vrLen = 312; + vrLoc = 0; + }; + 1BB925AA07D270AC00307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 7"; + rLen = 0; + rLoc = 312; + rType = 0; + vrLen = 312; + vrLoc = 0; + }; + 1BB925AB07D2714A00307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 7"; + rLen = 0; + rLoc = 312; + rType = 0; + vrLen = 312; + vrLoc = 0; + }; + 1BB925AC07D2714A00307053 = { + fRef = 2A37F4AEFDCFA73011CA2CEA; + isa = PBXTextBookmark; + name = "MyDocument.h: canUseSelectionForFindNow"; + rLen = 0; + rLoc = 2638; + rType = 0; + vrLen = 516; + vrLoc = 148; + }; + 1BB925AD07D2714A00307053 = { + fRef = 089C1660FE840EACC02AAC07; + isa = PBXTextBookmark; + name = "English: 7"; + rLen = 0; + rLoc = 312; + rType = 0; + vrLen = 312; + vrLoc = 0; + }; + 1BB925AE07D2714A00307053 = { + fRef = 2A37F4AEFDCFA73011CA2CEA; + isa = PBXTextBookmark; + name = "MyDocument.h: canUseSelectionForFindNow"; + rLen = 0; + rLoc = 2638; + rType = 0; + vrLen = 516; + vrLoc = 148; + }; + 1BB925AF07D2714A00307053 = { fRef = 2A37F4ACFDCFA73011CA2CEA; isa = PBXTextBookmark; name = "xmlWellFormedIcon setToolTip:[xmlView valueForKey:@\"errorString\"]];\n\t\t\t\t["; rLen = 73; - rLoc = 3665; + rLoc = 3694; rType = 0; - vrLen = 0; + vrLen = 594; vrLoc = 0; }; - 1BB569F404E3010E0099E21C = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {826, 1568}}"; - sepNavSelRange = "{761, 0}"; - sepNavVisRect = "{{0, 0}, {826, 399}}"; - sepNavWindowFrame = "{{107, 185}, {750, 558}}"; - }; + 1BB925B007D2718800307053 = { + fRef = 2A37F4ACFDCFA73011CA2CEA; + isa = PBXTextBookmark; + name = "MyDocument.m: 37"; + rLen = 0; + rLoc = 709; + rType = 0; + vrLen = 614; + vrLoc = 384; + }; + 1BB925B107D2719400307053 = { + fRef = 2A37F4ACFDCFA73011CA2CEA; + isa = PBXTextBookmark; + name = "MyDocument.m: 37"; + rLen = 0; + rLoc = 709; + rType = 0; + vrLen = 614; + vrLoc = 384; + }; + 1BB925B207D2728C00307053 = { + fRef = 2A37F4ACFDCFA73011CA2CEA; + isa = PBXTextBookmark; + name = "- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType\n"; + rLen = 71; + rLoc = 29988; + rType = 0; + vrLen = 804; + vrLoc = 29564; + }; + 1BB925B307D272F600307053 = { + fRef = 2A37F4ACFDCFA73011CA2CEA; + isa = PBXTextBookmark; + name = "- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType\n"; + rLen = 71; + rLoc = 29988; + rType = 0; + vrLen = 804; + vrLoc = 29564; }; 1BD3D5C605015C8400FF9835 = { uiCtxt = { @@ -1085,7 +847,7 @@ isa = PBXTextBookmark; name = "readme.xml: 49"; rLen = 0; - rLoc = 4518; + rLoc = 4821; rType = 0; vrLen = 3018; vrLoc = 2419; @@ -1100,46 +862,6 @@ vrLen = 1347; vrLoc = 0; }; - 1BF5370307C74C8200D6EBDB = { - fRef = F786D09302FB227701000103; - isa = PBXTextBookmark; - name = "XMLTextView.h: defaults"; - rLen = 0; - rLoc = 564; - rType = 0; - vrLen = 688; - vrLoc = 224; - }; - 1BF5370B07C74CDD00D6EBDB = { - fRef = F786D09402FB227701000103; - isa = PBXTextBookmark; - name = "-(void)awakeFromNib "; - rLen = 20; - rLoc = 210; - rType = 0; - vrLen = 603; - vrLoc = 152; - }; - 1BF5371B07C74F6000D6EBDB = { - fRef = 1B3BC92604365914006C8631; - isa = PBXTextBookmark; - name = "AppDelegate.h: applicationWillTerminate:"; - rLen = 0; - rLoc = 279; - rType = 0; - vrLen = 351; - vrLoc = 0; - }; - 1BF5372507C7508600D6EBDB = { - fRef = 1B3BC92B04365B9B006C8631; - isa = PBXTextBookmark; - name = "AppDelegate.m: 30"; - rLen = 0; - rLoc = 854; - rType = 0; - vrLen = 743; - vrLoc = 236; - }; 1BF5372E07C750B100D6EBDB = { fRef = 1B64BC8507C6AB120014535B; isa = PBXTextBookmark; @@ -1181,16 +903,6 @@ vrLen = 986; vrLoc = 0; }; - 1BF5374C07C753E100D6EBDB = { - fRef = F7641DAF02FFB2FA01A8A905; - isa = PBXTextBookmark; - name = "readme.xml: 207"; - rLen = 0; - rLoc = 14239; - rType = 0; - vrLen = 2579; - vrLoc = 2340; - }; 1BF5374D07C753E100D6EBDB = { fRef = F7641DAC02FFB2FA01A8A905; isa = PBXTextBookmark; @@ -1505,7 +1217,7 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 130893875; + PBXPerProjectTemplateStateSaveDate = 131230514; PBXPrepackagedSmartGroups_v2 = ( { PBXTransientLocationAtTop = bottom; @@ -2318,96 +2030,66 @@ Frame = "{{0, 0}, {904, 293}}"; WindowFrame = "{{343, 79}, {904, 315}}"; }; - PBXWorkspaceStateSaveDate = 130893875; + PBXWorkspaceStateSaveDate = 131230514; }; perUserProjectItems = { 1B3CBB3F07CBE26E008B4FAA = 1B3CBB3F07CBE26E008B4FAA; 1B3CBB6107CBE588008B4FAA = 1B3CBB6107CBE588008B4FAA; 1B3CBBF107CBF19D008B4FAA = 1B3CBBF107CBF19D008B4FAA; - 1B3CBBF207CBF19D008B4FAA = 1B3CBBF207CBF19D008B4FAA; - 1B3CBBF407CBF19D008B4FAA = 1B3CBBF407CBF19D008B4FAA; - 1B3CBBF507CBF19D008B4FAA = 1B3CBBF507CBF19D008B4FAA; - 1B3CBBF607CBF19D008B4FAA = 1B3CBBF607CBF19D008B4FAA; - 1B3CBBF707CBF19D008B4FAA = 1B3CBBF707CBF19D008B4FAA; - 1B3CBBF807CBF19D008B4FAA = 1B3CBBF807CBF19D008B4FAA; 1B3CBBFC07CBF19D008B4FAA = 1B3CBBFC07CBF19D008B4FAA; - 1B3CBC0307CBF19D008B4FAA = 1B3CBC0307CBF19D008B4FAA; - 1B3CBC0407CBF19D008B4FAA = 1B3CBC0407CBF19D008B4FAA; - 1B3CBC0507CBF19D008B4FAA = 1B3CBC0507CBF19D008B4FAA; - 1B3CBC0607CBF19D008B4FAA = 1B3CBC0607CBF19D008B4FAA; 1B3CBC1A07CBF4AE008B4FAA = 1B3CBC1A07CBF4AE008B4FAA; 1B3CBC8F07CBF643008B4FAA = 1B3CBC8F07CBF643008B4FAA; - 1B3CBC9107CBF643008B4FAA = 1B3CBC9107CBF643008B4FAA; 1B3CBC9207CBF643008B4FAA = 1B3CBC9207CBF643008B4FAA; 1B3CBC9507CBF643008B4FAA = 1B3CBC9507CBF643008B4FAA; - 1B3CBC9907CBF643008B4FAA = 1B3CBC9907CBF643008B4FAA; - 1B3CBCDE07CC6A3D008B4FAA = 1B3CBCDE07CC6A3D008B4FAA; - 1B3CBCDF07CC6A3D008B4FAA = 1B3CBCDF07CC6A3D008B4FAA; - 1B3CBCE307CC6A3D008B4FAA = 1B3CBCE307CC6A3D008B4FAA; - 1B3CBCE407CC6A3D008B4FAA = 1B3CBCE407CC6A3D008B4FAA; - 1B3CBCE507CC6A3D008B4FAA = 1B3CBCE507CC6A3D008B4FAA; - 1B3CBCE607CC6A3D008B4FAA = 1B3CBCE607CC6A3D008B4FAA; - 1B3CBCE707CC6A3D008B4FAA = 1B3CBCE707CC6A3D008B4FAA; - 1B3CBCEA07CC6A3D008B4FAA = 1B3CBCEA07CC6A3D008B4FAA; - 1B3CBCEB07CC6A3D008B4FAA = 1B3CBCEB07CC6A3D008B4FAA; - 1B3CBD0007CCA0BA008B4FAA = 1B3CBD0007CCA0BA008B4FAA; - 1B3CBD0107CCA0BA008B4FAA = 1B3CBD0107CCA0BA008B4FAA; - 1B3CBD0207CCA0BA008B4FAA = 1B3CBD0207CCA0BA008B4FAA; - 1B3CBD0307CCA0BA008B4FAA = 1B3CBD0307CCA0BA008B4FAA; - 1B3CBD1207CCA12E008B4FAA = 1B3CBD1207CCA12E008B4FAA; - 1B64BBA707C5E1EC0014535B = 1B64BBA707C5E1EC0014535B; - 1B64BBAA07C5E1EC0014535B = 1B64BBAA07C5E1EC0014535B; - 1B64BBC107C5E67B0014535B = 1B64BBC107C5E67B0014535B; - 1B64BBD807C5ED600014535B = 1B64BBD807C5ED600014535B; 1B64BC1107C686420014535B = 1B64BC1107C686420014535B; 1B64BC2607C688D70014535B = 1B64BC2607C688D70014535B; - 1B64BC4B07C6A3070014535B = 1B64BC4B07C6A3070014535B; - 1B64BC5407C6A3070014535B = 1B64BC5407C6A3070014535B; - 1B64BC8207C6A8DC0014535B = 1B64BC8207C6A8DC0014535B; - 1B64BC8707C6AB200014535B = 1B64BC8707C6AB200014535B; - 1B64BC8807C6AB200014535B = 1B64BC8807C6AB200014535B; - 1B64BC8B07C6AB200014535B = 1B64BC8B07C6AB200014535B; 1B64BC9807C6AC590014535B = 1B64BC9807C6AC590014535B; 1B64BC9A07C6AC590014535B = 1B64BC9A07C6AC590014535B; - 1B7EA28D07B2D82300B881B7 = 1B7EA28D07B2D82300B881B7; - 1B7EA28E07B2D82300B881B7 = 1B7EA28E07B2D82300B881B7; - 1B7EA28F07B2D82300B881B7 = 1B7EA28F07B2D82300B881B7; - 1B7EA29207B2D82300B881B7 = 1B7EA29207B2D82300B881B7; - 1B7EA29307B2D82300B881B7 = 1B7EA29307B2D82300B881B7; - 1B7EA29507B2D82300B881B7 = 1B7EA29507B2D82300B881B7; - 1B7EA29607B2D82300B881B7 = 1B7EA29607B2D82300B881B7; - 1B7EA29707B2D82300B881B7 = 1B7EA29707B2D82300B881B7; 1B894BCB07CA5F24005318E9 = 1B894BCB07CA5F24005318E9; 1B894BCD07CA5F24005318E9 = 1B894BCD07CA5F24005318E9; 1B894BF807CA8EF8005318E9 = 1B894BF807CA8EF8005318E9; - 1B894C0107CA9707005318E9 = 1B894C0107CA9707005318E9; - 1B896BFF07B17C8300ECFC52 = 1B896BFF07B17C8300ECFC52; 1B896C1507B17E7A00ECFC52 = 1B896C1507B17E7A00ECFC52; 1B896C1607B17E7A00ECFC52 = 1B896C1607B17E7A00ECFC52; 1B896C3707B1829F00ECFC52 = 1B896C3707B1829F00ECFC52; - 1B896C3E07B1835000ECFC52 = 1B896C3E07B1835000ECFC52; - 1B896C6D07B1899100ECFC52 = 1B896C6D07B1899100ECFC52; - 1B896C7507B18B5000ECFC52 = 1B896C7507B18B5000ECFC52; - 1BB501EB07CDCA860015DFDC = 1BB501EB07CDCA860015DFDC; - 1BB501EC07CDCA860015DFDC = 1BB501EC07CDCA860015DFDC; 1BB501EF07CDCABC0015DFDC = 1BB501EF07CDCABC0015DFDC; 1BB501F007CDCABC0015DFDC = 1BB501F007CDCABC0015DFDC; - 1BB501F107CDCABC0015DFDC = 1BB501F107CDCABC0015DFDC; - 1BB501F207CDCABC0015DFDC = 1BB501F207CDCABC0015DFDC; 1BB501F307CDCABC0015DFDC = 1BB501F307CDCABC0015DFDC; - 1BB5020107CDCED30015DFDC = 1BB5020107CDCED30015DFDC; - 1BB5020207CDCED30015DFDC = 1BB5020207CDCED30015DFDC; + 1BB9243307D2657000307053 = 1BB9243307D2657000307053; + 1BB9243A07D266A400307053 = 1BB9243A07D266A400307053; + 1BB9243C07D266A400307053 = 1BB9243C07D266A400307053; + 1BB9243D07D266A400307053 = 1BB9243D07D266A400307053; + 1BB924D607D269EA00307053 = 1BB924D607D269EA00307053; + 1BB924DA07D269EA00307053 = 1BB924DA07D269EA00307053; + 1BB924E907D26A6100307053 = 1BB924E907D26A6100307053; + 1BB924EA07D26A6100307053 = 1BB924EA07D26A6100307053; + 1BB924EE07D26B2500307053 = 1BB924EE07D26B2500307053; + 1BB924EF07D26B2500307053 = 1BB924EF07D26B2500307053; + 1BB924F107D26B2E00307053 = 1BB924F107D26B2E00307053; + 1BB9259207D26B3800307053 = 1BB9259207D26B3800307053; + 1BB9259307D26B3800307053 = 1BB9259307D26B3800307053; + 1BB9259807D26D4A00307053 = 1BB9259807D26D4A00307053; + 1BB9259907D26FB100307053 = 1BB9259907D26FB100307053; + 1BB9259A07D26FC700307053 = 1BB9259A07D26FC700307053; + 1BB9259B07D26FD700307053 = 1BB9259B07D26FD700307053; + 1BB925A507D2705800307053 = 1BB925A507D2705800307053; + 1BB925A607D2705D00307053 = 1BB925A607D2705D00307053; + 1BB925A707D2707400307053 = 1BB925A707D2707400307053; + 1BB925AA07D270AC00307053 = 1BB925AA07D270AC00307053; + 1BB925AB07D2714A00307053 = 1BB925AB07D2714A00307053; + 1BB925AC07D2714A00307053 = 1BB925AC07D2714A00307053; + 1BB925AD07D2714A00307053 = 1BB925AD07D2714A00307053; + 1BB925AE07D2714A00307053 = 1BB925AE07D2714A00307053; + 1BB925AF07D2714A00307053 = 1BB925AF07D2714A00307053; + 1BB925B007D2718800307053 = 1BB925B007D2718800307053; + 1BB925B107D2719400307053 = 1BB925B107D2719400307053; + 1BB925B207D2728C00307053 = 1BB925B207D2728C00307053; + 1BB925B307D272F600307053 = 1BB925B307D272F600307053; 1BE3507607C5D1FF00D05BE4 = 1BE3507607C5D1FF00D05BE4; 1BF536FC07C74BC400D6EBDB = 1BF536FC07C74BC400D6EBDB; - 1BF5370307C74C8200D6EBDB = 1BF5370307C74C8200D6EBDB; - 1BF5370B07C74CDD00D6EBDB = 1BF5370B07C74CDD00D6EBDB; - 1BF5371B07C74F6000D6EBDB = 1BF5371B07C74F6000D6EBDB; - 1BF5372507C7508600D6EBDB = 1BF5372507C7508600D6EBDB; 1BF5372E07C750B100D6EBDB = 1BF5372E07C750B100D6EBDB; 1BF5374907C753E100D6EBDB = 1BF5374907C753E100D6EBDB; 1BF5374A07C753E100D6EBDB = 1BF5374A07C753E100D6EBDB; 1BF5374B07C753E100D6EBDB = 1BF5374B07C753E100D6EBDB; - 1BF5374C07C753E100D6EBDB = 1BF5374C07C753E100D6EBDB; 1BF5374D07C753E100D6EBDB = 1BF5374D07C753E100D6EBDB; 1BF5374E07C753E100D6EBDB = 1BF5374E07C753E100D6EBDB; 1BF5375107C753E100D6EBDB = 1BF5375107C753E100D6EBDB; @@ -2422,9 +2104,9 @@ }; 2A37F4ACFDCFA73011CA2CEA = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1714, 18242}}"; - sepNavSelRange = "{3665, 73}"; - sepNavVisRect = "{{0, 0}, {0, 0}}"; + sepNavIntBoundsRect = "{{0, 0}, {1714, 18256}}"; + sepNavSelRange = "{29988, 71}"; + sepNavVisRect = "{{0, 17850}, {937, 406}}"; sepNavWindowFrame = "{{122, 252}, {750, 558}}"; }; }; @@ -2432,7 +2114,7 @@ uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {937, 2800}}"; sepNavSelRange = "{2638, 0}"; - sepNavVisRect = "{{0, 71}, {937, 406}}"; + sepNavVisRect = "{{0, 84}, {937, 406}}"; sepNavWindowFrame = "{{126, 239}, {990, 546}}"; }; }; @@ -2530,9 +2212,9 @@ }; F7641DAF02FFB2FA01A8A905 = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {4290, 2898}}"; - sepNavSelRange = "{3401, 0}"; - sepNavVisRect = "{{0, 434}, {937, 406}}"; + sepNavIntBoundsRect = "{{0, 0}, {4290, 2996}}"; + sepNavSelRange = "{2448, 0}"; + sepNavVisRect = "{{0, 210}, {937, 406}}"; sepNavWindowFrame = "{{15, 269}, {750, 558}}"; }; }; @@ -2566,6 +2248,13 @@ sepNavWindowFrame = "{{191, 189}, {750, 558}}"; }; }; + F7984B7002D626B50156A887 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {937, 2688}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {937, 406}}"; + }; + }; F7BEF93602D6273601F46A01 = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {937, 2730}}"; diff --git a/TestXSLT.pbproj/project.pbxproj b/TestXSLT.pbproj/project.pbxproj index b7fd8b8..0867c36 100644 --- a/TestXSLT.pbproj/project.pbxproj +++ b/TestXSLT.pbproj/project.pbxproj @@ -113,7 +113,8 @@ fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; - path = test_ragel_xmlscanner.c; + name = test_ragel_xmlscanner.c; + path = src/test_ragel_xmlscanner.c; refType = 4; sourceTree = ""; }; @@ -206,7 +207,8 @@ fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = ragel_xmlscanner.h; + name = ragel_xmlscanner.h; + path = src/ragel_xmlscanner.h; refType = 4; sourceTree = ""; }; @@ -214,7 +216,8 @@ fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; - path = ragel_xmlscanner.c; + name = ragel_xmlscanner.c; + path = src/ragel_xmlscanner.c; refType = 4; sourceTree = ""; }; @@ -222,7 +225,8 @@ fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; - path = ragel_xmlscanner_out.c; + name = ragel_xmlscanner_out.c; + path = src/ragel_xmlscanner_out.c; refType = 4; sourceTree = ""; }; @@ -242,7 +246,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.java; - path = JAXPWrapper.java; + name = JAXPWrapper.java; + path = "src-java/JAXPWrapper.java"; refType = 4; sourceTree = ""; }; @@ -258,7 +263,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = UnsavedChangesPanelController.h; + name = UnsavedChangesPanelController.h; + path = src/UnsavedChangesPanelController.h; refType = 4; sourceTree = ""; }; @@ -266,7 +272,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = UnsavedChangesPanelController.m; + name = UnsavedChangesPanelController.m; + path = src/UnsavedChangesPanelController.m; refType = 4; sourceTree = ""; }; @@ -274,7 +281,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = AppDelegate.h; + name = AppDelegate.h; + path = src/AppDelegate.h; refType = 4; sourceTree = ""; }; @@ -283,7 +291,8 @@ indentWidth = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = AppDelegate.m; + name = AppDelegate.m; + path = src/AppDelegate.m; refType = 4; sourceTree = ""; usesTabs = 1; @@ -504,7 +513,7 @@ GCC_OPTIMIZATION_LEVEL = 0; HEADER_SEARCH_PATHS = "build/libs/inst/include/libxml2 build/libs/inst/include"; INFOPLIST_FILE = Info.plist; - LIBRARY_SEARCH_PATHS = /Users/liyanage/cvs/entropy/TestXSLT/build/libs; + LIBRARY_SEARCH_PATHS = build/libs; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = TestXSLT; @@ -708,7 +717,6 @@ 1B3CBC4407CBF598008B4FAA, 1B3CBC4507CBF598008B4FAA, 1B3CBC4607CBF598008B4FAA, - 1B3CBC4707CBF598008B4FAA, 1B3CBC4807CBF598008B4FAA, 1B3CBC4907CBF598008B4FAA, 1B3CBC4A07CBF598008B4FAA, @@ -754,12 +762,6 @@ settings = { }; }; - 1B3CBC4707CBF598008B4FAA = { - fileRef = F7E9761A02EAE49801CD68AE; - isa = PBXBuildFile; - settings = { - }; - }; 1B3CBC4807CBF598008B4FAA = { fileRef = F7E9761C02EAE5BF01CD68AE; isa = PBXBuildFile; @@ -1219,7 +1221,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XSLTProcessorJAXPBase.h; + name = XSLTProcessorJAXPBase.h; + path = src/XSLTProcessorJAXPBase.h; refType = 4; sourceTree = ""; }; @@ -1227,7 +1230,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XSLTProcessorJAXPBase.m; + name = XSLTProcessorJAXPBase.m; + path = src/XSLTProcessorJAXPBase.m; refType = 4; sourceTree = ""; }; @@ -1235,7 +1239,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XSLTProcessorXalan_J.h; + name = XSLTProcessorXalan_J.h; + path = src/XSLTProcessorXalan_J.h; refType = 4; sourceTree = ""; }; @@ -1243,7 +1248,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XSLTProcessorXalan_J.m; + name = XSLTProcessorXalan_J.m; + path = src/XSLTProcessorXalan_J.m; refType = 4; sourceTree = ""; }; @@ -1286,7 +1292,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XSLTProcessorSaxon.h; + name = XSLTProcessorSaxon.h; + path = src/XSLTProcessorSaxon.h; refType = 4; sourceTree = ""; }; @@ -1294,7 +1301,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XSLTProcessorSaxon.m; + name = XSLTProcessorSaxon.m; + path = src/XSLTProcessorSaxon.m; refType = 4; sourceTree = ""; }; @@ -1313,7 +1321,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.java; - path = StringErrorListener.java; + name = StringErrorListener.java; + path = "src-java/StringErrorListener.java"; refType = 4; sourceTree = ""; }; @@ -1399,7 +1408,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.java; - path = FOPWrapper.java; + name = FOPWrapper.java; + path = "src-java/FOPWrapper.java"; refType = 4; sourceTree = ""; }; @@ -1458,7 +1468,8 @@ fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; - path = ragel_xmldeclscanner.c; + name = ragel_xmldeclscanner.c; + path = src/ragel_xmldeclscanner.c; refType = 4; sourceTree = ""; }; @@ -1466,7 +1477,8 @@ fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = ragel_xmldeclscanner.h; + name = ragel_xmldeclscanner.h; + path = src/ragel_xmldeclscanner.h; refType = 4; sourceTree = ""; }; @@ -1480,7 +1492,8 @@ fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; - path = ragel_xmldeclscanner_out.c; + name = ragel_xmldeclscanner_out.c; + path = src/ragel_xmldeclscanner_out.c; refType = 4; sourceTree = ""; }; @@ -1494,7 +1507,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XMLUtils.h; + name = XMLUtils.h; + path = src/XMLUtils.h; refType = 4; sourceTree = ""; }; @@ -1502,7 +1516,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XMLUtils.m; + name = XMLUtils.m; + path = src/XMLUtils.m; refType = 4; sourceTree = ""; }; @@ -1542,7 +1557,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = TabViewDraggingCategory.h; + name = TabViewDraggingCategory.h; + path = src/TabViewDraggingCategory.h; refType = 4; sourceTree = ""; }; @@ -1550,7 +1566,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = TabViewDraggingCategory.m; + name = TabViewDraggingCategory.m; + path = src/TabViewDraggingCategory.m; refType = 4; sourceTree = ""; }; @@ -1584,7 +1601,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XSL_FO_Renderer.h; + name = XSL_FO_Renderer.h; + path = src/XSL_FO_Renderer.h; refType = 4; sourceTree = ""; }; @@ -1592,7 +1610,8 @@ fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XSL_FO_Renderer.m; + name = XSL_FO_Renderer.m; + path = src/XSL_FO_Renderer.m; refType = 4; sourceTree = ""; }; @@ -1675,7 +1694,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = MyDocument.m; + name = MyDocument.m; + path = src/MyDocument.m; refType = 4; sourceTree = ""; }; @@ -1683,7 +1703,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = MyDocument.h; + name = MyDocument.h; + path = src/MyDocument.h; refType = 4; sourceTree = ""; }; @@ -1701,7 +1722,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = main.m; + name = main.m; + path = src/main.m; refType = 4; sourceTree = ""; }; @@ -1756,7 +1778,6 @@ F7984B7002D626B50156A887, F7BEF93502D6273601F46A01, 089C165FFE840EACC02AAC07, - F7E9761A02EAE49801CD68AE, F7D210D302FA755701000103, F70DC0B90334879E01000103, ); @@ -1864,7 +1885,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = Workset.h; + name = Workset.h; + path = src/Workset.h; refType = 4; sourceTree = ""; }; @@ -1872,7 +1894,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = Workset.m; + name = Workset.m; + path = src/Workset.m; refType = 4; sourceTree = ""; }; @@ -1880,7 +1903,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = ParameterSet.h; + name = ParameterSet.h; + path = src/ParameterSet.h; refType = 4; sourceTree = ""; }; @@ -1888,7 +1912,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = ParameterSet.m; + name = ParameterSet.m; + path = src/ParameterSet.m; refType = 4; sourceTree = ""; }; @@ -1963,7 +1988,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = FindPanelController.h; + name = FindPanelController.h; + path = src/FindPanelController.h; refType = 4; sourceTree = ""; }; @@ -1971,7 +1997,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = FindPanelController.m; + name = FindPanelController.m; + path = src/FindPanelController.m; refType = 4; sourceTree = ""; }; @@ -1987,7 +2014,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XMLParserLibxml.h; + name = XMLParserLibxml.h; + path = src/XMLParserLibxml.h; refType = 4; sourceTree = ""; }; @@ -1995,7 +2023,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XMLParserLibxml.m; + name = XMLParserLibxml.m; + path = src/XMLParserLibxml.m; refType = 4; sourceTree = ""; }; @@ -2021,7 +2050,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = DragDestinationTextView.h; + name = DragDestinationTextView.h; + path = src/DragDestinationTextView.h; refType = 4; sourceTree = ""; }; @@ -2029,7 +2059,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = DragDestinationTextView.m; + name = DragDestinationTextView.m; + path = src/DragDestinationTextView.m; refType = 4; sourceTree = ""; }; @@ -2091,7 +2122,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XMLTextView.h; + name = XMLTextView.h; + path = src/XMLTextView.h; refType = 4; sourceTree = ""; }; @@ -2099,7 +2131,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XMLTextView.m; + name = XMLTextView.m; + path = src/XMLTextView.m; refType = 4; sourceTree = ""; }; @@ -2122,7 +2155,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = JumpToLinePanelController.h; + name = JumpToLinePanelController.h; + path = src/JumpToLinePanelController.h; refType = 4; sourceTree = ""; }; @@ -2130,7 +2164,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = JumpToLinePanelController.m; + name = JumpToLinePanelController.m; + path = src/JumpToLinePanelController.m; refType = 4; sourceTree = ""; }; @@ -2164,7 +2199,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XSLTProcessor.h; + name = XSLTProcessor.h; + path = src/XSLTProcessor.h; refType = 4; sourceTree = ""; }; @@ -2172,7 +2208,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XSLTProcessor.m; + name = XSLTProcessor.m; + path = src/XSLTProcessor.m; refType = 4; sourceTree = ""; }; @@ -2180,7 +2217,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XSLTProcessorSablotron.h; + name = XSLTProcessorSablotron.h; + path = src/XSLTProcessorSablotron.h; refType = 4; sourceTree = ""; }; @@ -2188,7 +2226,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XSLTProcessorSablotron.m; + name = XSLTProcessorSablotron.m; + path = src/XSLTProcessorSablotron.m; refType = 4; sourceTree = ""; }; @@ -2196,7 +2235,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XSLTProcessorLibxslt.h; + name = XSLTProcessorLibxslt.h; + path = src/XSLTProcessorLibxslt.h; refType = 4; sourceTree = ""; }; @@ -2204,7 +2244,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XSLTProcessorLibxslt.m; + name = XSLTProcessorLibxslt.m; + path = src/XSLTProcessorLibxslt.m; refType = 4; sourceTree = ""; }; @@ -2212,7 +2253,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = XSLTProcessorFactory.h; + name = XSLTProcessorFactory.h; + path = src/XSLTProcessorFactory.h; refType = 4; sourceTree = ""; }; @@ -2220,14 +2262,16 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = XSLTProcessorFactory.m; + name = XSLTProcessorFactory.m; + path = src/XSLTProcessorFactory.m; refType = 4; sourceTree = ""; }; F7D210D302FA755701000103 = { isa = PBXFileReference; lastKnownFileType = image.tiff; - path = WarningIcon.tif; + name = WarningIcon.tif; + path = artwork/WarningIcon.tif; refType = 4; sourceTree = ""; }; @@ -2235,7 +2279,8 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; - path = NSApplicationScriptingCategory.m; + name = NSApplicationScriptingCategory.m; + path = src/NSApplicationScriptingCategory.m; refType = 4; sourceTree = ""; }; @@ -2243,21 +2288,16 @@ fileEncoding = 5; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; - path = NSApplicationScriptingCategory.h; - refType = 4; - sourceTree = ""; - }; - F7E9761A02EAE49801CD68AE = { - isa = PBXFileReference; - lastKnownFileType = image.tiff; - path = TestXSLT.tif; + name = NSApplicationScriptingCategory.h; + path = src/NSApplicationScriptingCategory.h; refType = 4; sourceTree = ""; }; F7E9761C02EAE5BF01CD68AE = { isa = PBXFileReference; lastKnownFileType = image.icns; - path = TestXSLT.icns; + name = TestXSLT.icns; + path = artwork/TestXSLT.icns; refType = 4; sourceTree = ""; }; diff --git a/TestXSLT.tif b/TestXSLT.tif deleted file mode 100644 index 311f68fa991c40a9a1e100717d31591695e6fab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84576 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 V0HdsSaiA}DJ-)d9(PQt6{~yWafo}i+ diff --git a/UnsavedChangesPanelController.h b/UnsavedChangesPanelController.h deleted file mode 100644 index fff82a9..0000000 --- a/UnsavedChangesPanelController.h +++ /dev/null @@ -1,14 +0,0 @@ -/* UnsavedChangesPanelController */ - -#import - - - -@interface UnsavedChangesPanelController : NSWindowController -{ - BOOL keepChanges; -} -- (IBAction)discardUnsavedChanges:(id)sender; -- (IBAction)keepUnsavedChanges:(id)sender; -- (BOOL)keepChanges; -@end diff --git a/UnsavedChangesPanelController.m b/UnsavedChangesPanelController.m deleted file mode 100644 index bbb7fd2..0000000 --- a/UnsavedChangesPanelController.m +++ /dev/null @@ -1,22 +0,0 @@ -#import "UnsavedChangesPanelController.h" - -@implementation UnsavedChangesPanelController - -- (IBAction)discardUnsavedChanges:(id)sender -{ - keepChanges = FALSE; - [NSApp stopModal]; -} - -- (IBAction)keepUnsavedChanges:(id)sender -{ - keepChanges = TRUE; - [NSApp stopModal]; -} - -- (BOOL)keepChanges -{ - return keepChanges; -} - -@end diff --git a/WarningIcon.psd b/WarningIcon.psd deleted file mode 100644 index 341ca6387e73a6f491cfbaf10a35d2c2f02b3fde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17127 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 diff --git a/WarningIcon.tif b/WarningIcon.tif deleted file mode 100644 index 5e8311a135abe3bc6a909919ccbcdbe047324a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmd5+-%C?r7=FH;lQWs1LZz7(T{XAW=7yKMaIi6CyC_lI@Nzd@2_|?^QhFm2TQG^h zn^?wZ8@n;wMOeuw3M>2Z2ZVT=iWeCe)ziD)14#dyr^Bfp(8MPyk2yHeS`O-qK7fdFTf7Ph;oz0}k zcO49cLbO_~!UtzkV}{0lbIj#(GIQsy?>EO82n48U8o#{&KR*Y%y7up(ug}i8+t+1g zt>o)Q@|Di7%izv4@Y7Q;HGPR5&!6W|E|=Nc+rf_;%jC*Yqh>f9uK4BF61e#Y{ICeR z-C*VW?Da7;be6L>uZma2?I+;+L&(g1;@Qi!1#tB~_X_S&f6!^6Rv`g{HSvwfoiG^wW0 zBsW!+TZ~+nzeHYXCN76notaxCZ-%@VE>N$InYbY8#1CADI*B8@XY_g1{xg4|PE~2z Wt28hC!i6Ww=4$wI4LH*T^Z6Y$VD6d# diff --git a/Workset.h b/Workset.h deleted file mode 100644 index 3c73b81..0000000 --- a/Workset.h +++ /dev/null @@ -1,68 +0,0 @@ -// -// Workset.h -// TestXSLT -// -// Created by Marc Liyanage on Sun Mar 03 2002. -// Copyright (c) 2001 __MyCompanyName__. All rights reserved. -// - -#import -#import "ParameterSet.h" -#import "XMLUtils.h" - - -@interface Workset : NSObject { - - NSString *xmlCode; - NSString *xsltCode; - NSString *xmlFilename; - NSDate *xmlFileModificationDate; - NSString *xsltFilename; - NSDate *xsltFileModificationDate; - NSString *resultFilename; - NSData *result; - ParameterSet *parameterSet; - NSStringEncoding resultEncoding; -} - - -- (int)resultEncoding; -- (void)setResultEncoding:(NSStringEncoding)encoding; - -- (NSString *)stringResult; - -- (NSString *)xmlCode; -- (void)setXmlCode:(NSString *)s; -- (NSString *)xsltCode; -- (void)setXsltCode:(NSString *)s; -- (NSData *)result; -- (void)setResult:(NSData *)s; -- (ParameterSet *)parameterSet; -- (void)setParameterSet:(ParameterSet *)parameterSet; - -- (NSString *)xmlFilename; -- (void)setXmlFilename:(NSString *)s; -- (BOOL)hasXmlFilename; -- (NSString *)xsltFilename; -- (void)setXsltFilename:(NSString *)s; -- (BOOL)hasXsltFilename; -- (NSString *)resultFilename; -- (void)setResultFilename:(NSString *)s; -- (BOOL)hasResultFilename; - -- (BOOL)saveXml; -- (BOOL)saveXslt; -- (void)updateXmlFileModificationDate; -- (void)updateXsltFileModificationDate; -- (void)reloadXmlFromFile; -- (void)reloadXsltFromFile; -- (BOOL)xmlModifiedExternally; -- (BOOL)xsltModifiedExternally; - - -- (BOOL)hasXmlCode; -- (BOOL)hasXsltCode; -- (BOOL)hasResult; -- (BOOL)hasParameters; - -@end diff --git a/Workset.m b/Workset.m deleted file mode 100644 index ba849e4..0000000 --- a/Workset.m +++ /dev/null @@ -1,333 +0,0 @@ -// -// Workset.m -// TestXSLT -// -// Created by Marc Liyanage on Sun Mar 03 2002. -// Copyright (c) 2001 __MyCompanyName__. All rights reserved. -// - -#import "Workset.h" - - -@implementation Workset - -- (id)init { - - self = [super init]; - if (!self) return nil; - - xmlCode = [[NSUserDefaults standardUserDefaults] stringForKey:@"templateXML"]; - xsltCode = [[NSUserDefaults standardUserDefaults] stringForKey:@"templateXSLT"]; - -// xmlCode = [[NSString stringWithFormat:@"\nPut your XML code here.\nPut your XSLT code under the XSLT tab.\nThen click on the Process button.\n"] retain]; -// xsltCode = [[NSString stringWithFormat:@"\n\n\n\n\n\n"] retain]; - result = [[NSData alloc] init]; - parameterSet = [[ParameterSet alloc] init]; - xmlFilename = nil; - xsltFilename = nil; - resultFilename = nil; - - return self; - -} - -- (id)initWithCoder:(NSCoder *)coder { - - if (self = [super init]) { - [self setXmlCode:[coder decodeObject]]; - [self setXsltCode:[coder decodeObject]]; - [self setResult:[coder decodeObject]]; - [self setParameterSet:[coder decodeObject]]; - [self setXmlFilename:[coder decodeObject]]; - [self setXsltFilename:[coder decodeObject]]; - [self setResultFilename:[coder decodeObject]]; - - } - return self; - -} - - -- (void)encodeWithCoder:(NSCoder *)coder { - - [coder encodeObject:xmlCode]; - [coder encodeObject:xsltCode]; - [coder encodeObject:result]; - [coder encodeObject:parameterSet]; - [coder encodeObject:xmlFilename]; - [coder encodeObject:xsltFilename]; - [coder encodeObject:resultFilename]; - -} - - -- (void)dealloc { - - [xmlCode release]; - [xsltCode release]; - [result release]; - [parameterSet release]; - - - [super dealloc]; - -// NSLog(@"Workset dealloc"); - -} - -- (NSString *)xmlCode { - return xmlCode; -} - -- (void)setXmlCode:(NSString *)s { - [s retain]; - [xmlCode release]; - xmlCode = s; -} - - - - - - -- (NSString *)xmlFilename { - return xmlFilename; -} - -- (void)setXmlFilename:(NSString *)s { - - [s retain]; - [xmlFilename release]; - xmlFilename = s; - - [self updateXmlFileModificationDate]; -} - -- (BOOL)hasXmlFilename { - return xmlFilename != nil; -} - -- (BOOL)saveXml { - - if (![self hasXmlFilename]) { - return FALSE; - } - - [[XMLUtils getDataWithEncodingFromString:[self xmlCode]] writeToFile:[self xmlFilename] atomically:NO]; - [self updateXmlFileModificationDate]; - - return YES; - -} - -- (BOOL)xmlModifiedExternally { - - NSDictionary *fileAttr; - - if (![self hasXmlFilename]) { - return FALSE; - } - - fileAttr = [[NSFileManager defaultManager] fileAttributesAtPath:[self xmlFilename] traverseLink:YES]; - - if (fileAttr == nil || xmlFileModificationDate == nil) { - return FALSE; - } - - if (![xmlFileModificationDate isEqualToDate:[fileAttr objectForKey:NSFileModificationDate]]) { - return TRUE; - } - - return FALSE; - -} - -- (void)updateXmlFileModificationDate { - - NSDictionary *fileAttr; - - if ([self hasXmlFilename]) { - fileAttr = [[NSFileManager defaultManager] fileAttributesAtPath:[self xmlFilename] traverseLink:YES]; - [xmlFileModificationDate release]; - xmlFileModificationDate = [fileAttr objectForKey:NSFileModificationDate]; - [xmlFileModificationDate retain]; -// NSLog(@"xml file mod date: %@", xmlFileModificationDate); - } - -} - -- (void)reloadXmlFromFile { - - [self setXmlCode:[XMLUtils getStringWithEncodingFromFile:[self xmlFilename]]]; - [self updateXmlFileModificationDate]; - -} - - - - - -- (int)resultEncoding { - return resultEncoding; -} - -- (void)setResultEncoding:(NSStringEncoding)newencoding { - resultEncoding = newencoding; -} - - - - - -- (NSString *)xsltFilename { - return xsltFilename; -} - -- (void)setXsltFilename:(NSString *)s { - - [s retain]; - [xsltFilename release]; - xsltFilename = s; - - [self updateXsltFileModificationDate]; - -} - -- (BOOL)hasXsltFilename { - return xsltFilename != nil; -} - -- (BOOL)saveXslt { - - if (![self hasXsltFilename]) { - return FALSE; - } - - [[XMLUtils getDataWithEncodingFromString:[self xsltCode]] writeToFile:[self xsltFilename] atomically:NO]; - [self updateXsltFileModificationDate]; - - return YES; - -} - -- (BOOL)xsltModifiedExternally { - - NSDictionary *fileAttr; - - if (![self hasXsltFilename]) { - return FALSE; - } - - fileAttr = [[NSFileManager defaultManager] fileAttributesAtPath:[self xsltFilename] traverseLink:YES]; - - if (fileAttr == nil || xsltFileModificationDate == nil) { - return FALSE; - } - - if (![xsltFileModificationDate isEqualToDate:[fileAttr objectForKey:NSFileModificationDate]]) { - return TRUE; - } - - return FALSE; - -} - -- (void)updateXsltFileModificationDate { - - NSDictionary *fileAttr; - - if ([self hasXsltFilename]) { - fileAttr = [[NSFileManager defaultManager] fileAttributesAtPath:[self xsltFilename] traverseLink:YES]; - [xsltFileModificationDate release]; - xsltFileModificationDate = [fileAttr objectForKey:NSFileModificationDate]; - [xsltFileModificationDate retain]; -// NSLog(@"xslt file mod date: %@", xsltFileModificationDate); - } -} - -- (void)reloadXsltFromFile { - - [self setXsltCode:[XMLUtils getStringWithEncodingFromFile:[self xsltFilename]]]; - [self updateXsltFileModificationDate]; - -} - - - - - -- (NSString *)resultFilename { - return resultFilename; -} - -- (void)setResultFilename:(NSString *)s { - [s retain]; - [resultFilename release]; - resultFilename = s; -} - -- (BOOL)hasResultFilename { - return resultFilename != nil; -} - - - - -- (NSString *)xsltCode { - return xsltCode; -} - -- (void)setXsltCode:(NSString *)s { - [s retain]; - [xsltCode release]; - xsltCode = s; -} - -- (NSData *)result { - return result; -} - -- (void)setResult:(NSData *)s { - [s retain]; - [result release]; - result = s; -} - - -- (NSString *)stringResult { - return [[[NSString alloc] initWithData:result encoding:[self resultEncoding]] autorelease]; -} - - - -- (ParameterSet *)parameterSet { - return parameterSet; -} - -- (void)setParameterSet:(ParameterSet *)newParams { - [newParams retain]; - [parameterSet release]; - parameterSet = newParams; -} - -- (BOOL)hasXmlCode { - return ([xmlCode length] > 0); -} - -- (BOOL)hasXsltCode { - return ([xsltCode length] > 0); -} - -- (BOOL)hasResult { - return ([result length] > 0); -} - -- (BOOL)hasParameters { - return ([parameterSet count] > 0); -} - - - - - -@end diff --git a/XMLParserLibxml.h b/XMLParserLibxml.h deleted file mode 100644 index cec31ef..0000000 --- a/XMLParserLibxml.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// XMLParserLibxml.h -// TestXSLT -// -// Created by Marc Liyanage on Sun Aug 04 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import - -#include "libxml/parser.h" - -extern void *xmlGenericErrorContext; - -@interface XMLParserLibxml : NSObject { - -// xmlParserCtxtPtr xmlContext; - xmlDocPtr parsedXmlDoc; - NSMutableString *errorMessage; - int errorLine; - BOOL errorOccurred; - NSString *baseUri; - -} - - -void makeUnixLineFeeds(char *buffer); - -- (BOOL)parseData:(NSData *)xmlCode; -//- (BOOL)checkWellFormedData:(NSData *)xmlCode; -- (void)setErrorMessage:(NSString *)message; -- (void)appendErrorMessage:(NSString *)message; -- (void)markFirstErrorLine; -- (NSString *)errorMessage; -- (void)clearError; -- (void)setError:(NSString *)message atLine:(int)line; -- (xmlDocPtr)nativeDoc; - -- (void)setBaseUri:(NSString *)uri; -- (NSString *)baseUri; - -- (int)errorLine; - -void XMLParserLibxml_xmlErrorHandler(id self, const char *message, ...); -void XMLParserLibxml_xmlErrorHandler2(id self, const char *message, ...); - - -@end diff --git a/XMLParserLibxml.m b/XMLParserLibxml.m deleted file mode 100644 index 7078d04..0000000 --- a/XMLParserLibxml.m +++ /dev/null @@ -1,315 +0,0 @@ -// -// XMLParserLibxml.m -// TestXSLT -// -// Created by Marc Liyanage on Sun Aug 04 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import "XMLParserLibxml.h" - - -@implementation XMLParserLibxml - - -- (id)init { - - if (self = [super init]) { - - errorMessage = [[NSMutableString alloc] init]; - errorLine = 0; - errorOccurred = NO; - //xmlContext = malloc(sizeof(xmlParserCtxt)); - //bzero(xmlContext, sizeof(xmlParserCtxt)); - parsedXmlDoc = NULL; - baseUri = NULL; - - } - - return self; -} - - -- (xmlDocPtr)nativeDoc { - - return parsedXmlDoc; - -} - -- (void)dealloc { - - [errorMessage release]; - [baseUri release]; - - if (parsedXmlDoc) { - xmlFreeDoc(parsedXmlDoc); -// free(xmlContext); - } - - -} - - - - -- (void)setErrorMessage:(NSString *)message { - - [errorMessage setString:message]; - -} - -- (int)errorLine { - - return errorLine; - -} - -- (NSString *)errorMessage { - - return errorMessage; - -} - - -- (void)setErrorOccurred:(BOOL)flag { - - errorOccurred = flag; - -} - -- (void)appendErrorMessage:(NSString *)message { - - if ([errorMessage length] > 0) { - [errorMessage appendString:@"\n"]; - } - [errorMessage appendString:[message substringWithRange:NSMakeRange(0, [message length] - 1)]]; - [self setErrorOccurred:YES]; - -} - -- (BOOL)errorOccurred { - - return errorOccurred; - -} - - -- (void)setError:(NSString *)message atLine:(int)line { - - [self setErrorMessage:message]; - errorLine = line; - [self setErrorOccurred:YES]; - - -} - - -- (void)clearError { - - [errorMessage setString:@""]; - [self setErrorOccurred:NO]; - errorLine = 0; - -} - - -void makeUnixLineFeeds(char *buffer) { - - int i = 0; - - while (buffer[i] != '\0') { - - if (buffer[i] == '\r') { - if (buffer[i + 1] == '\n') { - i++; - } else { - buffer[i] = '\n'; - } - } - i++; - } - -} - -/* - -- (BOOL)checkWellFormedData:(NSData *)xmlCode { - - // fixme: using nsdata now, not null-terminated. maybe replace with expat. - return YES; - char *xmlString = (char *)[xmlCode bytes]; - //const char *xmlString = [stringData bytes]; - int error = 0; - - makeUnixLineFeeds(xmlString); - - /* - NSData *stringData = [xmlCode dataUsingEncoding:NSUTF8StringEncoding]; - NSData *stringData = [xmlCode dataUsingEncoding:NSISOLatin1StringEncoding]; - - - xmlString = malloc([stringData length] + 1); - [stringData getBytes:xmlString]; - xmlString[[stringData length]] = '\0'; - */ - - -// xmlContext = xmlCreateDocParserCtxt(xmlString); - /* - if (!xmlContext) { - return NO; - } - - - [self clearError]; - xmlSetGenericErrorFunc(self, (xmlGenericErrorFunc)XMLParserLibxml_xmlErrorHandler); - - error = xmlParseDocument(xmlContext); - - if (xmlContext->myDoc) { - xmlFreeDoc(xmlContext->myDoc); - } - - xmlFreeParserCtxt(xmlContext); - xmlContext = NULL; - - if (error != XML_ERR_OK) { - return NO; - } else { - [self clearError]; - return YES; - } - - -} - -*/ - - - -- (BOOL)parseData:(NSData *)xmlCode { - -// int error = 0; - -// makeUnixLineFeeds(xmlString); - - xmlSubstituteEntitiesDefault(1); - xmlLoadExtDtdDefaultValue = 1; - - [self clearError]; - xmlSetGenericErrorFunc(self, (xmlGenericErrorFunc)XMLParserLibxml_xmlErrorHandler); - - if (parsedXmlDoc) { - xmlFreeDoc(parsedXmlDoc); - } - - parsedXmlDoc = xmlParseMemory([xmlCode bytes], [xmlCode length]); - - if (!parsedXmlDoc) { - return NO; - } - - if ([self baseUri] != nil) { - xmlNodeSetBase((xmlNodePtr)parsedXmlDoc, (xmlChar *)[[self baseUri] cString]); - } - [self clearError]; - return YES; - - -} - - - -- (void)markFirstErrorLine { - -// if (errorLine == 0 && xmlContext && xmlContext->input) { -// errorLine = xmlContext->input->line; -// } - - -} - -void XMLParserLibxml_xmlErrorHandler(id self, const char *message, ...) { - - char *messageData; - va_list args; - - - - [self markFirstErrorLine]; - - /* we're only interested in messages with the format string "%s" */ - if (strcmp(message, "%s")) { - return; - } - - va_start(args, message); - messageData = va_arg(args, char *); - - [self appendErrorMessage:[NSString stringWithCString:messageData]]; - - va_end(args); - - -} - - -void XMLParserLibxml_xmlErrorHandler2(id self, const char *message, ...) { - - const char *end = message + (strlen(message) - 1); - char *pos = (char *)message; - int errorLine = 0; - NSString *errorMessage; - char completeMessage[512]; - va_list args; - - /* Do not overwrite previous error information so the - first error in a series will be preserved - */ - if ([self errorOccurred]) { - return; - } - -// NSLog(@"xml error handler: %s", message); - - va_start(args, message); - - while (pos <= end) { - - if (!strncmp(pos, "%s", 2)) { - va_arg(args, char *); - } else if (!strncmp(pos, "%d", 2)) { - errorLine = va_arg(args, int); - } - - pos++; - - } - - va_end(args); - - va_start(args, message); - vsnprintf(completeMessage, 512, message, args); - va_end(args); - - errorMessage = [NSString stringWithCString:completeMessage]; - [self setError:errorMessage atLine:errorLine]; - - -} - - -- (void)setBaseUri:(NSString *)uri { - - [uri retain]; - [baseUri release]; - baseUri = uri; -} - -- (NSString *)baseUri { - return baseUri; -} - - - -@end diff --git a/XMLTextView.h b/XMLTextView.h deleted file mode 100644 index e7262b0..0000000 --- a/XMLTextView.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// XMLTextView.h -// TestXSLT -// -// Created by Marc Liyanage on Fri Aug 02 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import -#import - -#include -#include "expat.h" -#include "ragel_xmlscanner.h" -#import "XMLUtils.h" - -@interface XMLTextView : DragDestinationTextView -{ - - char (*resultstack)[MAXTAGLENGTH]; - int stackresult; - int tagpositions[STACKDEPTH]; - XML_Parser parser; - BOOL error; - int errorLine, errorColumn; - NSString *errorString; - NSUserDefaults *defaults; - -} - --(BOOL)hasError; --(void)clearError; --(void)flashRange:(NSRange)range; --(BOOL)completeAfterSlash; --(void)selectLineByNumber:(int)line; --(NSString *)calculateTagStack; --(NSString *)calculateTagStackAtLocation:(int)location; --(BOOL)checkWellFormed; --(void)setError:(NSString *)errstring atLine:(int)line atColumn:(int)column; --(void)clearError; - -@end diff --git a/XMLTextView.m b/XMLTextView.m deleted file mode 100644 index fb78013..0000000 --- a/XMLTextView.m +++ /dev/null @@ -1,345 +0,0 @@ -// -// XMLTextView.m -// TestXSLT -// -// Created by Marc Liyanage on Fri Aug 02 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import "XMLTextView.h" - - -@implementation XMLTextView - - - --(void)awakeFromNib { - - [self setRichText:NO]; - resultstack = NULL; - defaults = [NSUserDefaults standardUserDefaults]; - - // register our two input text views to receive file drags - // - // [xmlView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; - // [xsltView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; - - NSFont *computerFont = [NSFont fontWithName:@"Courier" size:12.0]; - [self setFont:computerFont]; - - [self setAllowsUndo:YES]; - -} - - -- (void)dealloc { - - if (resultstack) - free(resultstack); - [errorString release]; -} - --(void)selectLineByNumber:(int)line { - - NSString *data = [self string]; - unsigned int i, startIndex, lineEndIndex; - NSRange aRange; - - if (line == 0) { - return; - } - - - aRange.location = 0; - aRange.length = 0; - - for (i = 1; i <= line; i++) { - - [data getLineStart:&startIndex end:&lineEndIndex contentsEnd:nil forRange:aRange]; - aRange.location = lineEndIndex; - - } - - aRange.location = startIndex; - aRange.length = lineEndIndex - startIndex; - - [self setSelectedRange:aRange]; - [self scrollRangeToVisible:aRange]; - - -} - - - - - -- (void)keyDown:(NSEvent *)event { - - NSRange selectedRange; - - if (![defaults boolForKey:@"enableSyntaxAnalysis"]) { - [super keyDown:event]; - return; - } - - if ([[event characters] isEqual:@"\033"]) { - - if ([event modifierFlags] || [event isARepeat]) { - return; - } - [self complete:nil]; - return; - - } else if ([[event characters] isEqual:@"/"]) { - - selectedRange = [self selectedRange]; - if (selectedRange.location < 2 || selectedRange.length > 0) { - [super keyDown:event]; - return; - } - - if ([[[self string] substringWithRange:NSMakeRange(selectedRange.location - 1, 1)] isEqual:@"<"]) { - if([self completeAfterSlash]) { - return; - } - } - } - - - /* - if ([event modifierFlags] & NSFunctionKeyMask) { - [self didChangeText]; - } - */ - - //NSFunctionKeyMask - - - [super keyDown:event]; - -} - - - -- (BOOL)completeAfterSlash { - - int location = [self selectedRange].location - 1; - - [self calculateTagStackAtLocation:location]; - - if (stackresult) { - return NO; - } - - NSTextStorage *storage = [self textStorage]; - [storage beginEditing]; - [storage deleteCharactersInRange:NSMakeRange(location, 1)]; - [storage endEditing]; - - [self setSelectedRange:NSMakeRange(location, 0)]; - - [self complete:nil]; - - - return YES; -} - - - -- (void)flashRange:(NSRange)range { - - NSRect tagNameRect; - - tagNameRect = [self firstRectForCharacterRange:range]; - - tagNameRect.origin = [[self window] convertScreenToBase:tagNameRect.origin]; - - tagNameRect = [self convertRect:tagNameRect fromView:[[self window] contentView]]; - - - [self lockFocus]; - [[[NSColor selectedControlColor] colorWithAlphaComponent:0.75] set]; -/* - NSFrameRectWithWidth(tagNameRect, 2); - */ - [NSBezierPath fillRect:tagNameRect]; - [self unlockFocus]; - [[self window] flushWindow]; - - usleep(100000); - - [self setNeedsDisplay:YES]; - - -} - --(NSString *)calculateTagStack { - - return [self calculateTagStackAtLocation:[self selectedRange].location]; - -} - --(BOOL)checkWellFormed { - - int result; - NSData *data = [XMLUtils getDataWithEncodingFromString:[self string]]; - - parser = XML_ParserCreate(NULL); - - if (!parser) { - NSLog(@"Unable to allocate expat parser in XMLTextView:checkWellFormed!"); - return NO; - } - - result = XML_Parse(parser, [data bytes], [data length], 1); - - if (!result) { - [self setError:[NSString stringWithFormat:@"%s, line %d, column %d", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser), XML_GetCurrentColumnNumber(parser)] atLine:XML_GetCurrentLineNumber(parser) atColumn:XML_GetCurrentColumnNumber(parser)]; - } else if (error) { - [self clearError]; - } - - XML_ParserFree(parser); - - return result > 0; -} - - - --(void)clearError { - - errorLine = errorColumn = 0; - error = NO; - [errorString release]; - errorString = @""; - -} - --(BOOL)hasError { - - return error; - -} --(void)setError:(NSString *)errstring atLine:(int)line atColumn:(int)column { - - errorLine = line; - errorColumn = column; - error = YES; - [errstring retain]; - [errorString release]; - errorString = errstring; - -} - - - - - - - --(NSString *)calculateTagStackAtLocation:(int)location { - - const char *buffer; - int i; - NSRange selectedRange; - NSMutableString *mystack; - - if (![[NSUserDefaults standardUserDefaults] boolForKey:@"enableSyntaxAnalysis"]) { - return @""; - } - - buffer = [[self string] lossyCString]; - selectedRange = [self selectedRange]; - - if (resultstack) - free(resultstack); - - stackresult = 0; - resultstack = findCompletion(buffer, strlen(buffer), location, &stackresult, tagpositions); - - mystack = [NSMutableString stringWithCapacity:1000]; - - for (i = 0; resultstack && *(resultstack[i]); i++) { - if (*(resultstack[i+1])) { - [mystack appendFormat:@"%s/", resultstack[i]]; - } else { - if (stackresult) { - [mystack appendFormat:@"%s", resultstack[i]]; - } else { - [mystack appendFormat:@"<%s>", resultstack[i]]; - } - - - } - - } - - - switch (stackresult) { - - case 1: - [mystack appendString:@" (In tag)"]; - break; - - case 3: - [mystack appendString:@" (In comment section)"]; - break; - case 5: - [mystack appendString:@" (In CDATA section)"]; - break; - - case 8: - [mystack appendString:@" (No open tags)"]; - break; - - case 16: - [mystack appendString:@" (Tags are balanced)"]; - break; - } - - - return mystack; - -} - -- (void)complete:(id)sender { - - NSRange selectedRange, tagNameRange; - NSString *tagName = nil; - int location, i; - -// data = [self string]; - - selectedRange = [self selectedRange]; - location = selectedRange.location; - - /* May not have a selection, and insertion point must be preceded by at - * least one tag, which means at least 3 characters must be to its left - */ - if (selectedRange.length > 0 || location < 3 || stackresult) { - NSBeep(); - return; - } - - - for (i = 0; resultstack && *(resultstack[i]); i++) { - if (!*(resultstack[i+1])) { - tagName = [NSString stringWithCString:resultstack[i]]; - tagNameRange = NSMakeRange(tagpositions[i*2], tagpositions[i*2+1]- tagpositions[i*2]); - } - } - - - [self insertText:[NSString stringWithFormat:@"", tagName]]; - [self setSelectedRange:selectedRange]; - - [self flashRange:tagNameRange]; - [self calculateTagStack]; - -} - - - - - -@end diff --git a/XMLUtils.h b/XMLUtils.h deleted file mode 100644 index b11f21d..0000000 --- a/XMLUtils.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// XMLUtils.h -// TestXSLT -// -// Created by Marc Liyanage on Sun Aug 31 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import -#include "ragel_xmldeclscanner.h" - - -@interface XMLUtils : NSObject { - -} - - - - -+ (NSString *)getStringWithEncodingFromFile:(NSString *)filename; -+ (NSData *)getDataWithEncodingFromString:(NSString *)text; - -@end diff --git a/XMLUtils.m b/XMLUtils.m deleted file mode 100644 index 8635b71..0000000 --- a/XMLUtils.m +++ /dev/null @@ -1,67 +0,0 @@ -// -// XMLUtils.m -// TestXSLT -// -// Created by Marc Liyanage on Sun Aug 31 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "XMLUtils.h" - - -@implementation XMLUtils - - -+ (NSString *)getStringWithEncodingFromFile:(NSString *)filename { - - NSStringEncoding encoding; - NSString *fileString; - - NSData *fileContents = [NSData dataWithContentsOfFile:filename]; - if (fileContents == nil) { - return @"Unable to load file!"; - } - - encoding = getEncodingFromXmlDecl([fileContents bytes], [fileContents length]); - - if (encoding == 0) - encoding = [NSString defaultCStringEncoding]; - - NSLog(@"picked encoding: %d", encoding); - - - fileString = [[[NSString alloc] initWithData:fileContents encoding:encoding] autorelease]; - - if (fileString) - return fileString; - - if (encoding == NSUTF8StringEncoding) { - return @"Unable to load file, possibly invalid UTF-8 contents!"; - } else { - return @"Unable to load file!"; - } - -} - - - -+ (NSData *)getDataWithEncodingFromString:(NSString *)text { - - NSStringEncoding encoding; - - encoding = getEncodingFromXmlDecl([text UTF8String], [text length]); - - if (encoding == 0) - encoding = NSUTF8StringEncoding; - -// NSLog(@"Default output encoding UTF-8 used..."); - - return [text dataUsingEncoding:encoding allowLossyConversion:YES]; - -} - - - - - -@end diff --git a/XSLTProcessor.h b/XSLTProcessor.h deleted file mode 100644 index 67ea28b..0000000 --- a/XSLTProcessor.h +++ /dev/null @@ -1,64 +0,0 @@ -// -// XSLTProcessor.h -// TestXSLT -// -// Created by Marc Liyanage on Thu Aug 01 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import -#include "ragel_xmldeclscanner.h" - - -enum { - XSLT_ERROR_SOURCE_XML = 1, - XSLT_ERROR_SOURCE_XSLT, -}; - -enum { - PROCESSORTYPE_SABLOTRON = 1, - PROCESSORTYPE_LIBXSLT, - PROCESSORTYPE_SAXON, - PROCESSORTYPE_XALAN_J, -}; - - - -@interface XSLTProcessor : NSObject { - - NSData *result; - - NSString *errorMessage; - NSString *baseUri; - int errorLine; - int errorSource; - BOOL errorOccurred; - NSStringEncoding resultEncoding; - -} - - -- (void)setError:(NSString *)message atLine:(int)line inSource:(int)source; -- (void)clearError; -- (BOOL)errorOccurred; -- (int)errorLine; -- (int)errorSource; -- (void)setErrorSource:(int)newSource; -- (NSString *)errorMessage; -- (int)resultEncoding; -- (void)setResultEncoding:(NSStringEncoding)encoding; -- (void)setResultEncodingFromData:(NSData *)data; - -- (BOOL)processStrings:(NSData *)xmlCode withXslt:(NSData *)xsltCode andParameters:(const char **)params; - -- (void)setBaseUri:(NSString *)uri; -- (NSString *)baseUri; - -- (void)clearResult; -- (NSData *)result; -- (NSString *)stringResult; -- (void)setResult:(NSData *)newResult; -- (int)processorType; - - -@end diff --git a/XSLTProcessor.m b/XSLTProcessor.m deleted file mode 100644 index a167b0c..0000000 --- a/XSLTProcessor.m +++ /dev/null @@ -1,162 +0,0 @@ -// -// XSLTProcessor.m -// TestXSLT -// -// Created by Marc Liyanage on Thu Aug 01 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessor.h" - - -@implementation XSLTProcessor - -- (id)init { - - if (self = [super init]) { - [self clearResult]; - [self clearError]; - baseUri = nil; - } - - return self; - -} - - - -- (void)setError:(NSString *)message atLine:(int)line inSource:(int)source { - - errorOccurred = YES; - - [message retain]; - [errorMessage release]; - errorMessage = message; - errorLine = line; - errorSource = source; - -} - -- (BOOL)errorOccurred { - - return errorOccurred; - -} - - -- (void)clearError { - - errorOccurred = NO; - - [errorMessage release]; - errorMessage = @""; - errorLine = 0; - errorSource = 0; - -} - - -- (void)clearResult { - - [result autorelease]; - result = nil; - -} - - -- (NSData *)result { - - return result; - -} - -- (void)setResult:(NSData *)newResult { - - [newResult retain]; - [result autorelease]; - result = newResult; - -} - -- (int)resultEncoding { - return resultEncoding; -} - -- (void)setResultEncoding:(NSStringEncoding)newencoding { - - resultEncoding = newencoding; -} - - -- (void)setResultEncodingFromData:(NSData *)data { - - NSStringEncoding dataencoding = getEncodingFromXmlDecl((char *)[data bytes], [data length]); - - if (dataencoding == 0) - dataencoding = NSUTF8StringEncoding; - - [self setResultEncoding:dataencoding]; - -} - -- (NSString *)stringResult { - return [[[NSString alloc] initWithData:result encoding:[self resultEncoding]] autorelease]; -} - -- (int)errorLine { - - return errorLine; - -} - - -- (int)errorSource { - - return errorSource; - -} - -- (void)setErrorSource:(int)newSource { - - errorSource = newSource; - -} - -- (NSString *)errorMessage { - - return errorMessage; - -} - -- (void)setBaseUri:(NSString *)uri { - - [uri retain]; - [baseUri release]; - baseUri = uri; -} - -- (NSString *)baseUri { - return baseUri; -} - - -- (int)processorType { - - NSLog(@"Subclasses must override this method!"); - return 0; - -} - - - -- (BOOL)processStrings:(NSData *)xmlCode withXslt:(NSData *)xsltCode andParameters:(const char **)params { - - NSLog(@"Subclasses must override this method!"); - return NO; -} - - - - - -@end diff --git a/XSLTProcessorFactory.h b/XSLTProcessorFactory.h deleted file mode 100644 index 7461970..0000000 --- a/XSLTProcessorFactory.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// XSLTProcessorFactory.h -// TestXSLT -// -// Created by Marc Liyanage on Thu Aug 01 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import -#import "XSLTProcessor.h" -#import "XSLTProcessorSablotron.h" -#import "XSLTProcessorLibxslt.h" -#import "XSLTProcessorSaxon.h" -#import "XSLTProcessorXalan_J.h" - - -@interface XSLTProcessorFactory : NSObject { - - -} - - -+ (XSLTProcessor *)makeProcessorOfType:(int)processorType; - - - - - -@end diff --git a/XSLTProcessorFactory.m b/XSLTProcessorFactory.m deleted file mode 100644 index 34db70a..0000000 --- a/XSLTProcessorFactory.m +++ /dev/null @@ -1,34 +0,0 @@ -// -// XSLTProcessorFactory.m -// TestXSLT -// -// Created by Marc Liyanage on Thu Aug 01 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessorFactory.h" - - -@implementation XSLTProcessorFactory - - -+ (XSLTProcessor *)makeProcessorOfType:(int)processorType { - - if (processorType == PROCESSORTYPE_SABLOTRON) { - return [[XSLTProcessorSablotron alloc] init]; - } else if (processorType == PROCESSORTYPE_LIBXSLT) { - return [[XSLTProcessorLibxslt alloc] init]; - } else if (processorType == PROCESSORTYPE_SAXON) { - return [[XSLTProcessorSaxon alloc] init]; - } else if (processorType == PROCESSORTYPE_XALAN_J) { - return [[XSLTProcessorXalan_J alloc] init]; - } - - NSLog(@"Unknown processor type '%d' passed!", processorType); - return nil; - -} - - - -@end diff --git a/XSLTProcessorJAXPBase.h b/XSLTProcessorJAXPBase.h deleted file mode 100644 index 58a57e7..0000000 --- a/XSLTProcessorJAXPBase.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// XSLTProcessorJAXPBase.h -// TestXSLT -// -// Created by Marc Liyanage on Mon Aug 18 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import -#import "XSLTProcessor.h" - - - -@interface XSLTProcessorJAXPBase : XSLTProcessor { - -} - -- (NSString *) getJAXPProcessorName; - - -@end - - -// Java class declarations to keep the compiler happy - -@interface JAXPWrapper : NSObject -{} -- (int)getErrorSource; -- (int)getErrorLine; -- (NSString *)getErrorMessage; -- (NSData *)getResult; -- (BOOL)transform:(NSString *)processorClassName :(NSData *)xml :(NSData *)xslt :(NSString *)parameters :(NSString *)baseUri; -@end - diff --git a/XSLTProcessorJAXPBase.m b/XSLTProcessorJAXPBase.m deleted file mode 100644 index 13166c9..0000000 --- a/XSLTProcessorJAXPBase.m +++ /dev/null @@ -1,71 +0,0 @@ -// -// XSLTProcessorJAXPBase.m -// TestXSLT -// -// Created by Marc Liyanage on Mon Aug 18 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessorJAXPBase.h" - - -@implementation XSLTProcessorJAXPBase - - - - - - -- (BOOL)processStrings:(NSData *)xmlCode withXslt:(NSData *)xsltCode andParameters:(const char **)params { - - [self clearError]; - - NSString *jaxpBaseUri = @""; - if ([self baseUri] != nil) { - jaxpBaseUri = [self baseUri]; - } - - - NSMutableString *paramBuffer = [[NSMutableString alloc] init]; - int i = 0; - while (params && params[i]) { - - [paramBuffer appendString:[NSString stringWithFormat:@"%s==_=!=_==%s", params[i], params[i+1]]]; - - if (params[i+2]) { - // more parameters to follow - [paramBuffer appendString:@"--_-!-_--"]; - } - - i += 2; - } - - JAXPWrapper *jw = (JAXPWrapper *)[[NSClassFromString(@"JAXPWrapper") alloc] init]; - BOOL swresult = [jw transform:[self getJAXPProcessorName] :xmlCode :xsltCode :paramBuffer :jaxpBaseUri]; - - [self setResultEncodingFromData:xsltCode]; - - if (swresult) { - [self setResult:[jw getResult]]; - } else { - [self setError:[jw getErrorMessage] atLine:[jw getErrorLine] inSource:[jw getErrorSource]]; - } - - - [jw release]; - - return ![self errorOccurred]; - -} - - -- (NSString *) getJAXPProcessorName { - - NSLog(@"subclass must override getJAXPProcessorName in XSLTProcessorJAXPBase!"); - return nil; - -} - - - -@end diff --git a/XSLTProcessorLibxslt.h b/XSLTProcessorLibxslt.h deleted file mode 100644 index a5140df..0000000 --- a/XSLTProcessorLibxslt.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// XSLTProcessorLibxslt.h -// TestXSLT -// -// Created by Marc Liyanage on Thu Aug 01 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import -#import "XSLTProcessor.h" -#import "XMLParserLibxml.h" - -#include - -#include "libxml/parser.h" -#include "libxslt/documents.h" -#include "libxslt/extensions.h" -#include "libxslt/extra.h" -#include "libxslt/functions.h" -#include "libxslt/imports.h" -#include "libxslt/keys.h" -#include "libxslt/namespaces.h" -#include "libxslt/numbersInternals.h" -#include "libxslt/pattern.h" -#include "libxslt/preproc.h" -#include "libxslt/templates.h" -#include "libxslt/transform.h" -#include "libxslt/variables.h" -#include "libxslt/xslt.h" -#include "libxslt/xsltInternals.h" -#include "libxslt/xsltconfig.h" -#include "libxslt/xsltutils.h" -#include "libxslt/attributes.h" - -#include "libexslt/exslt.h" -#include "libexslt/exsltconfig.h" - - -@interface XSLTProcessorLibxslt : XSLTProcessor { - - -} - -void xsltErrorHandler(id self, const char *message, ...); - - - -@end diff --git a/XSLTProcessorLibxslt.m b/XSLTProcessorLibxslt.m deleted file mode 100644 index 9c27fde..0000000 --- a/XSLTProcessorLibxslt.m +++ /dev/null @@ -1,194 +0,0 @@ -// -// XSLTProcessorLibxslt.m -// TestXSLT -// -// Created by Marc Liyanage on Thu Aug 01 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessorLibxslt.h" - -#define MAX_PATHS 64 - - -@implementation XSLTProcessorLibxslt - -- (int)processorType { - - return PROCESSORTYPE_LIBXSLT; - -} - - - - - -- (BOOL)processStrings:(NSData *)xmlCode withXslt:(NSData *)xsltCode andParameters:(const char **)params { - - xmlChar *resultBuffer = NULL; - int resultSize = 0; - int bytesWritten = 0; - - XMLParserLibxml *xmlParser = [[[XMLParserLibxml alloc] init] autorelease]; - XMLParserLibxml *xsltParser = [[[XMLParserLibxml alloc] init] autorelease]; - - if ([self baseUri] != nil) { - [xsltParser setBaseUri:[self baseUri]]; - } - - xmlDocPtr resultDoc = NULL; - xsltStylesheetPtr stylesheet = NULL; -// xsltTemplatePtr template = NULL; - - - [self clearError]; - - exsltRegisterAll(); - xsltRegisterTestModule(); - - - - - /* There might be a race condition here as the error handler seems to be set globally. - * Multiple Documents processing at the same time could interfere. - */ - xsltSetGenericErrorFunc(self, (xmlGenericErrorFunc)xsltErrorHandler); - while (1) { - - if (![xmlParser parseData:xmlCode]) { - [self setError:[xmlParser errorMessage] atLine:[xmlParser errorLine] inSource:XSLT_ERROR_SOURCE_XML]; - break; - } - - if (![xsltParser parseData:xsltCode]) { - [self setError:[xsltParser errorMessage] atLine:[xsltParser errorLine] inSource:XSLT_ERROR_SOURCE_XSLT]; - break; - } - - - - - stylesheet = xsltParseStylesheetDoc([xsltParser nativeDoc]); - - if (!stylesheet) { - [self setErrorSource:XSLT_ERROR_SOURCE_XSLT]; - break; - } - - resultDoc = xsltApplyStylesheet(stylesheet, [xmlParser nativeDoc], params); -// resultDoc = xsltProfileStylesheet(stylesheet, [xmlParser nativeDoc], params, stderr); - - if (!resultDoc) { - [self setErrorSource:XSLT_ERROR_SOURCE_XSLT]; - break; - } - - break; - } - - - if (![self errorOccurred]) { - - bytesWritten = xsltSaveResultToString(&resultBuffer, &resultSize, resultDoc, stylesheet); - - [self setResult:[NSData dataWithBytes:resultBuffer length:resultSize]]; - [self setResultEncodingFromData:xsltCode]; - - - /* - template = stylesheet->templates; - while (template != NULL) { - - if (template->match) { - NSLog(@"match: %s", template->match); - } - - if (template->name) { - NSLog(@"name: %s", template->name); - } - - if (template->mode) { - NSLog(@"mode: %s", template->mode); - } - - NSLog(@"count: %d", template->nbCalls); - NSLog(@"time: %ld", template->time); - - template = template->next; - } - */ - - - } - - if (resultDoc) { - xmlFreeDoc(resultDoc); - } - - if (resultBuffer) { - free(resultBuffer); - } - - return ![self errorOccurred]; -} - - - - - -void xsltErrorHandler(id self, const char *message, ...) { - - const char *end = message + (strlen(message) - 1); - char *pos = (char *)message; - char *errorstring = NULL; - int errorLine = 0; - NSString *errorMessage; - char completeMessage[512]; - va_list args; - - /* Do not overwrite previous error information so the - first error in a series will be preserved - */ - if ([self errorOccurred]) { - return; - } - - - NSLog(@"xslt error handler: %s", message); - - va_start(args, message); - - while (pos <= end) { - - if (!strncmp(pos, "%s", 2)) { - errorstring = va_arg(args, char *); - } else if (!strncmp(pos, "%d", 2)) { - errorLine = va_arg(args, int); - } - - pos++; - - } - - va_end(args); - - va_start(args, message); - vsnprintf(completeMessage, 512, message, args); - va_end(args); - - errorMessage = [NSString stringWithCString:completeMessage]; - [self setError:errorMessage atLine:errorLine inSource:0]; - - -} - - - - - - - - - - -@end diff --git a/XSLTProcessorSablotron.h b/XSLTProcessorSablotron.h deleted file mode 100644 index ae3ce14..0000000 --- a/XSLTProcessorSablotron.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// XSLTProcessorSablotron.h -// TestXSLT -// -// Created by Marc Liyanage on Thu Aug 01 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import -#import "XSLTProcessor.h" - -#include "sablot.h" - - -@interface XSLTProcessorSablotron : XSLTProcessor { - - SablotSituation S; - SablotHandle processor; - MessageHandler msgHandlerPtr; - -} - -MH_ERROR rawErrorHandler(id self, SablotHandle processor_, MH_ERROR code, MH_LEVEL level, char **fields); -MH_ERROR rawMakeCodeHandler(id self, SablotHandle processor_, int severity, unsigned short facility, unsigned short code); -MH_ERROR rawLogHandler(id self, SablotHandle processor_, MH_ERROR code, MH_LEVEL level, char **fields); - - - -@end diff --git a/XSLTProcessorSablotron.m b/XSLTProcessorSablotron.m deleted file mode 100644 index 923b5a3..0000000 --- a/XSLTProcessorSablotron.m +++ /dev/null @@ -1,203 +0,0 @@ -// -// XSLTProcessorSablotron.m -// TestXSLT -// -// Created by Marc Liyanage on Thu Aug 01 2002. -// Copyright (c) 2002 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessorSablotron.h" - - -@implementation XSLTProcessorSablotron - - - -- (int)processorType { - - return PROCESSORTYPE_SABLOTRON; - -} - - - -+(BOOL)checkWellFormed:(NSString *)xmlCode { - - return NO; - -} - - - - - -- (id)init { - - if (self = [super init]) { - - [self clearResult]; - [self clearError]; - - SablotCreateSituation(&S); - SablotCreateProcessorForSituation(S, &processor); - - memset(&msgHandlerPtr, 0, sizeof(MessageHandler)); - - msgHandlerPtr.makeCode = (MessageHandlerMakeCode *)rawMakeCodeHandler; - msgHandlerPtr.log = (MessageHandlerLog *)rawLogHandler; - msgHandlerPtr.error = (MessageHandlerError *)rawErrorHandler; - SablotRegHandler(processor, HLR_MESSAGE, &msgHandlerPtr, self); - - } - - return self; - -} - - - - -- (void)dealloc { - - SablotDestroyProcessor(processor); - SablotDestroySituation(S); - - [super dealloc]; -} - - - - - - - - - - - -- (BOOL)processStrings:(NSData *)xmlCode withXslt:(NSData *)xsltCode andParameters:(const char **)params { - - char *resultBuffer; - - int resultCode = 0, i=0; - - - [self clearError]; - - - if ([self baseUri] != nil) { - SablotSetBase(processor, [[NSString stringWithFormat:@"%@/", [[self baseUri] stringByDeletingLastPathComponent]] cString]); - } - - char *xmlBuffer = malloc([xmlCode length] + 1); - [xmlCode getBytes:xmlBuffer]; - xmlBuffer[[xmlCode length]] = '\0'; - - char *xsltBuffer = malloc([xsltCode length] + 1); - [xsltCode getBytes:xsltBuffer]; - xsltBuffer[[xsltCode length]] = '\0'; - - SablotAddArgBuffer(S, processor, "xml", (char *)xmlBuffer); - SablotAddArgBuffer(S, processor, "xslt", (char *)xsltBuffer); - - while (params && params[i]) { - SablotAddParam(S, processor, params[i], params[i+1]); - i += 2; - } - - -// resultCode = SablotRunProcessor(processor, "arg:/xslt", "arg:/xml", "arg:/result", params, args); - resultCode = SablotRunProcessorGen(S, processor, "arg:/xslt", "arg:/xml", "arg:/result"); - - free(xmlBuffer); - free(xsltBuffer); - - if ([self errorOccurred]) { - return NO; - } - - SablotGetResultArg(processor, "arg:/result", &resultBuffer); - - [self setResult:[NSData dataWithBytes:resultBuffer length:strlen(resultBuffer)]]; - [self setResultEncodingFromData:xsltCode]; - SablotFree(resultBuffer); - - return YES; - -} - - - -MH_ERROR rawErrorHandler(id self, SablotHandle processor_, MH_ERROR code, MH_LEVEL level, char **fields) { - - int i = 0; - NSString *currentField; - NSRange colonRange, keyRange, valueRange; - NSString *key; - NSString *value; - - NSString *errorMessage; - int errorLine; - int errorSource; - - for (i = 0; fields[i] != NULL; i++) { - - currentField = [NSString stringWithCString:fields[i]]; - - colonRange = [currentField rangeOfString:@":"]; - keyRange = NSMakeRange(0, colonRange.location); - valueRange = NSMakeRange(colonRange.location + 1, [currentField length] - (colonRange.location + 1)); - - key = [currentField substringWithRange:keyRange]; - value = [currentField substringWithRange:valueRange]; - - if ([key isEqual:@"msg"]) { - errorMessage = value; - } - - if ([key isEqual:@"line"]) { - errorLine = [value intValue]; - } - - if ([key isEqual:@"URI"]) { - - if ([value isEqual:@"arg:/xml"]) { - errorSource = XSLT_ERROR_SOURCE_XML; - } else if ([value isEqual:@"arg:/xslt"]) { - errorSource = XSLT_ERROR_SOURCE_XSLT; - } - } - - } - - [self setError:errorMessage atLine:errorLine inSource:errorSource]; - - return 0; - -} - - -MH_ERROR rawMakeCodeHandler(id self, SablotHandle processor_, int severity, unsigned short facility, unsigned short code) { - - // NSLog(@"makeCode, proc %p, sev %d, fac %d, code %d", processor_, severity, facility, code); - return 0; -} - - -MH_ERROR rawLogHandler(id self, SablotHandle processor_, MH_ERROR code, MH_LEVEL level, char **fields) { - - int i = 0; - - for (i = 0; fields[i] != NULL; i++) { - // NSLog(@"Sablotron Log: %s", fields[i]); - } - - return 0; - -} - - - - - -@end diff --git a/XSLTProcessorSaxon.h b/XSLTProcessorSaxon.h deleted file mode 100644 index b01caad..0000000 --- a/XSLTProcessorSaxon.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// XSLTProcessorSaxon.h -// TestXSLT -// -// Created by Marc Liyanage on Sun Jun 08 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessorJAXPBase.h" - - -@interface XSLTProcessorSaxon : XSLTProcessorJAXPBase { - -} - -@end - - - - - diff --git a/XSLTProcessorSaxon.m b/XSLTProcessorSaxon.m deleted file mode 100644 index d7aca0b..0000000 --- a/XSLTProcessorSaxon.m +++ /dev/null @@ -1,30 +0,0 @@ -// -// XSLTProcessorSaxon.m -// TestXSLT -// -// Created by Marc Liyanage on Sun Jun 08 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessorSaxon.h" - - -@implementation XSLTProcessorSaxon - - -- (int)processorType { - - return PROCESSORTYPE_SAXON; - -} - - -- (NSString *) getJAXPProcessorName { - - return @"net.sf.saxon.TransformerFactoryImpl"; - -} - - - -@end diff --git a/XSLTProcessorXalan_J.h b/XSLTProcessorXalan_J.h deleted file mode 100644 index cc58a04..0000000 --- a/XSLTProcessorXalan_J.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// XSLTProcessorXalan_J.h -// TestXSLT -// -// Created by Marc Liyanage on Mon Aug 18 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessorJAXPBase.h" - - -@interface XSLTProcessorXalan_J : XSLTProcessorJAXPBase { - -} - -@end - diff --git a/XSLTProcessorXalan_J.m b/XSLTProcessorXalan_J.m deleted file mode 100644 index e4961b4..0000000 --- a/XSLTProcessorXalan_J.m +++ /dev/null @@ -1,29 +0,0 @@ -// -// XSLTProcessorXalan_J.m -// TestXSLT -// -// Created by Marc Liyanage on Mon Aug 18 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "XSLTProcessorXalan_J.h" - - -@implementation XSLTProcessorXalan_J - - -- (int)processorType { - - return PROCESSORTYPE_XALAN_J; - -} - - -- (NSString *) getJAXPProcessorName { - - return @"org.apache.xalan.processor.TransformerFactoryImpl"; - -} - - -@end diff --git a/XSL_FO_Renderer.h b/XSL_FO_Renderer.h deleted file mode 100644 index 4931a4c..0000000 --- a/XSL_FO_Renderer.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// XSL_FO_Renderer.h -// TestXSLT -// -// Created by Marc Liyanage on Tue Aug 19 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import - - -@interface XSL_FO_Renderer : NSObject { - -} - -- (NSData *)render:(NSData *)foData; - -@end - -// Java class declarations to keep the compiler happy - -@interface FOPWrapper : NSObject -{} -/* -- (int)getErrorSource; -- (int)getErrorLine; -- (NSString *)getResult; -*/ - -- (NSString *)getErrorMessage; -- (BOOL)errorOccurred; -- (NSData *)convert:(NSData *)foData; - -@end diff --git a/XSL_FO_Renderer.m b/XSL_FO_Renderer.m deleted file mode 100644 index f1daaca..0000000 --- a/XSL_FO_Renderer.m +++ /dev/null @@ -1,29 +0,0 @@ -// -// XSL_FO_Renderer.m -// TestXSLT -// -// Created by Marc Liyanage on Tue Aug 19 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// - -#import "XSL_FO_Renderer.h" - - -@implementation XSL_FO_Renderer - - -- (NSData *)render:(NSData *)foData { - - FOPWrapper *fw = (FOPWrapper *)[[NSClassFromString(@"FOPWrapper") alloc] init]; - - NSData *resultData = [fw convert:foData]; - // fixme: autorelease on resultData? creation on Java side? - - [fw release]; - - return resultData; -} - - - -@end diff --git a/artwork/TestXSLT Icon.psd b/artwork/TestXSLT Icon.psd new file mode 100644 index 0000000000000000000000000000000000000000..77a86f75a7fedb417db9098f27a43672513aebcf GIT binary patch literal 110564 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%0APLaGG;=>j7><={9;T@4%fO4OeK# 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 literal 0 HcmV?d00001 diff --git a/artwork/TestXSLT-Icon.png b/artwork/TestXSLT-Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4e7e11ffb513b37f918d09ce50b89586afa528 GIT binary patch literal 10116 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 L&a%oJcl-YUYWA|O literal 0 HcmV?d00001 diff --git a/artwork/TestXSLT.icns b/artwork/TestXSLT.icns new file mode 100644 index 0000000000000000000000000000000000000000..6aee7bc55f35f4066b6614ddff5777e941b283d1 GIT binary patch literal 51981 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 literal 0 HcmV?d00001 diff --git a/artwork/TestXSLT.tif b/artwork/TestXSLT.tif new file mode 100644 index 0000000000000000000000000000000000000000..311f68fa991c40a9a1e100717d31591695e6fab7 GIT binary patch literal 84576 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 V0HdsSaiA}DJ-)d9(PQt6{~yWafo}i+ literal 0 HcmV?d00001 diff --git a/artwork/WarningIcon.psd b/artwork/WarningIcon.psd new file mode 100644 index 0000000000000000000000000000000000000000..341ca6387e73a6f491cfbaf10a35d2c2f02b3fde GIT binary patch literal 17127 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 literal 0 HcmV?d00001 diff --git a/artwork/WarningIcon.tif b/artwork/WarningIcon.tif new file mode 100644 index 0000000000000000000000000000000000000000..5e8311a135abe3bc6a909919ccbcdbe047324a29 GIT binary patch literal 1218 zcmd5+-%C?r7=FH;lQWs1LZz7(T{XAW=7yKMaIi6CyC_lI@Nzd@2_|?^QhFm2TQG^h zn^?wZ8@n;wMOeuw3M>2Z2ZVT=iWeCe)ziD)14#dyr^Bfp(8MPyk2yHeS`O-qK7fdFTf7Ph;oz0}k zcO49cLbO_~!UtzkV}{0lbIj#(GIQsy?>EO82n48U8o#{&KR*Y%y7up(ug}i8+t+1g zt>o)Q@|Di7%izv4@Y7Q;HGPR5&!6W|E|=Nc+rf_;%jC*Yqh>f9uK4BF61e#Y{ICeR z-C*VW?Da7;be6L>uZma2?I+;+L&(g1;@Qi!1#tB~_X_S&f6!^6Rv`g{HSvwfoiG^wW0 zBsW!+TZ~+nzeHYXCN76notaxCZ-%@VE>N$InYbY8#1CADI*B8@XY_g1{xg4|PE~2z Wt28hC!i6Ww=4$wI4LH*T^Z6Y$VD6d# literal 0 HcmV?d00001 diff --git a/artwork/powered_by_libxslt.gif b/artwork/powered_by_libxslt.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6e403497019d863562ee83d7f7513eefe8ba48a GIT binary patch literal 3010 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 literal 0 HcmV?d00001 diff --git a/distclean.sh b/distclean.sh deleted file mode 100644 index 1bfada5..0000000 --- a/distclean.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -(cd libiconv && make distclean) -(cd libexpat && make distclean) -(cd libsablot && make distclean) -(cd libxml2 && make distclean) -(cd libxslt && make distclean) diff --git a/main.m b/main.m deleted file mode 100644 index ba617f4..0000000 --- a/main.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// main.m -// TestXSLT -// -// Created by Marc Liyanage on Sun Mar 03 2002. -// Copyright (c) 2001 __MyCompanyName__. All rights reserved. -// - -#import - -int main(int argc, const char *argv[]) -{ - return NSApplicationMain(argc, argv); -} diff --git a/powered_by_libxslt.gif b/powered_by_libxslt.gif deleted file mode 100644 index e6e403497019d863562ee83d7f7513eefe8ba48a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3010 zcmWmDi$9YK;{fpId3IkmkC{u%Y^a3845eIpX2U8+Bb7wWr6Sdtj_&gA>R#w|PEJP} z$w!^^;&@LwN*i;@J_x&Hf;akJ}HzmdaPQYI)fN9YL0KkH2 z;pwxXZQHlqzyDwFfb*7A>eZir*dD#}?d;p;=0@F%XJj&2rjTsjylL02o%{C14GcVf zKmY#evyqI9<3q#R*>|()>4(Sud@*B~IeYF@W#v`lg0bv}()kbbon7kuf}EQ-t5#N4 z3~voWVZz0W1qu7(Po6nB{%U+z{JwW{v&W95*4?`K!T90S=}d#+&Ek@&`bH%ugtNG` zsGk^bY`U9~c>;qaAqeugSN*{_9~Q>Dke#(ZIZ3T<8-Fzxy?0NX@W6HDwb4=C#N@=> z`#Cz@Veb8`pC9|V?&-saEl);<;^X5M7fti?bDo~xWL-FyExwR0`fkHU-{U7Tc%dQZ zvd$Wf^V2iag%|Tb{q^zH_^bN*TR}mArI#;0?(KOqJvIBzKwZr?x3D;N>}Xe)M$`Ey z@zBA^*OQr<83TXx4{CdzoSgjqH)yp3+M&Te$Hx?T@}9??PoEB+JAal)Bpf=DIyw33 z<=ALY;O4Yr>3n|JlP80}x88p}H90igceSECF-e$`l61MO*lszr_&ueoKjqTY4}P1=*t%;PG#=hpP*8;UcOw~+t+1bLE00$`_%cf zX~&OpBCD^ImnEkjzI~^5?9Z{OH&b?Yt6z-j=q}rXgM$JBHf5a1FqszG+tok*Sl0Ha zjmt$AK7JGkB9}k^onMfDv+m}#YZb{UiM9@bL&JZ3{J40jr0|zJzf4cR@nU&aRQzCAQRZY-8(Z(rZsySaFwkVqnuNUOSgdk6$fclV=?jgnjH zX>ln$Je(8G7l}mNZQpta1bqIVzw7F5Kp3F)!S4`=Mx#+E2=ego;6~Lk|3-rVumX7e z-vZ$OPXPE8V1?kz!iI}wcuTkVo`$N9T-bTiHW^VOku?v@wt~tV-Ng)U0c~qj&EtQE z=A2=6Ze`T7iIKe(TYsJ2iaD72kB_jkcJMl~qt`jsaHEF)lap&gZ*y8LrAhj=h>0NG zwvl%#HM<(}!nYJbh%6`HtoGO0xrW!>gL{J&J|RRyLvn5*Iqqikw-$$?adP_Fteyb2 zf>Rs{m7T}R&_&&>cE+$EIi`|o=32hbrU(Hb$3kSbaeE=;>|gYUJG*P|!OY zxDH_Ikk~q_t`zk3Is+qXz^nxb*5(7;iF(Q)K95F^8UYq5T z#I>`j`4lAvrc?#r{Kl6lHvXlu;P_Ypzn#q?l=t=;OBmwYnM2-&`+dR7vAhatvO5bCT>6b1w}fFTSpez@BsydkR3 z>rog*jJr^y1a7F%Fl66X287dXU@TBOeu^c5#%hM;6z8#I$(l9&lWIz9Iq;tcOW9>1 zXd549J}x})br4K-#)=p)%wxuz`N?4G|CHMkvGVW}Orsl0m~)A%soF#=}h2aCQ4C6gFUI~s!u zBp0|y#7Z=(l`rJ_2e~PEPKqUO0QIoEif89o_ps((T1r(Bd+(U@Ovu+}r2-YD6mbXX z_mzmIaX7K3arMTSDN5Y1R@|P_#A_D7Ysj-%*|=Hc;=O%Zd(XsKxv3RvJ(Aj%r|mP@A!FZ#P8pd}-b(7KCg zufG8&xT-wiq+G9-4wOZ?;%jP4eo&qAI|ym#j4?oLgE=+azuk*1Bp!Ll#8}3Dn;viZ zb8-J=tb?JQL#;xSigM8I+DU7lg9RaG9IR6+2RtJx!Np5$s{Q%+PrDTXV@&)7ZYPl( zqBzZBu7X$)9jnD9H($n3dSqB^IsKD7HxTnhY;h(wPi7DTOz}>7fnbGQs=Q;%Ht-l_ z3iH)GA7G6>4p`PpY$}p0D-kXvY8e1rm=+NXiC-lwb#?{u^)--BVXd5PTTRs{hX_lJ zQhJ#I-yoJ;f|N3AtZ?;lAwU?N2?p0N;R6ggZu1afHG@GQaInnfjf#L}70&V>Jc*Y! zv`v73B9?}ORrLZDLW_QR*BY_D7zh-DS+OX(R*qw&Ok(_CNzhxP7--O&iSPIdeB)HIhyX=(En+Cu~+Rx`|!c);pzQRn)*rSe17crCMF6uf%s3t5)K-1nD0T>u?2uN&4p5P;r-$8p}|T>Z}GN8Z5JiR2E%&lI#-GN zHb!2=^1T&%H{HU9T22&W#c9Xh<2c4_FSH?x3B>rL?DxZ6vIgbvWLtnyS0WF^y94L$ zrW10sW*B2;xiwzJniq6zRWkNpWz4(O3NSnH63RdSN5PqWv(-y|7R{3kiGTsD8f+vTq1@C~d&w~lcA-11JO98#g-2qJ5LRP&$e)?y# zlvJRl<6CS1T1nE)=K*|1{`QvFHt7ujZJZ%F@C71I2-~5}pmd{Qdxn{<%6=MA%$c~Ox{03<(ErOq8D!!u8%p$k8;f&S% x;(o;kr?e!#$aJwVB?bSst98=m`sE**HBM-6K5y-gzkBypGA(cAArJ%v{4b<15RU)= diff --git a/ragel_xmldeclscanner.c b/ragel_xmldeclscanner.c deleted file mode 100644 index f271a00..0000000 --- a/ragel_xmldeclscanner.c +++ /dev/null @@ -1,186 +0,0 @@ - -/* - * This is an input file for the "Ragel" finite state machine compiler utility. - * It produces output code which implements a tag scanner for XML data. - * It is used for intelligent xml tag completion in an XML editor interface. - * - * See the Ragel online documentation for additional - * information about the format of this file. - * - * Written by Marc Liyanage - * - */ - - -#include -#include "ragel_xmldeclscanner.h" - - -%% XMLDeclScanner - struct { - char *mark_encodingstart; - char *mark_encodingend; - }; - -%% - -%% XMLDeclScanner - - init { - fsm->mark_encodingstart = fsm->mark_encodingend = NULL; - } - - - func encodingstart { - DEBUG && fprintf(stderr, "encodingstart: %d %c\n", p - data, *p); - fsm->mark_encodingstart = p; - } - - func encodingend { - fsm->mark_encodingend = p; - DEBUG && fprintf(stderr, "encodingend: %d %c\n", p - data, *p); - DEBUG && fprintf(stderr, "length: %d\n", fsm->mark_encodingend - fsm->mark_encodingstart); - } - - - - BOM = 0xef 0xbb 0xbf; - -# Grammar taken straight from the XML 1.0 spec, except that EncodingDecl is not optional here - - Eq = '='; - - VersionNum = +(/[a-zA-Z0-9_.:]/ | '-'); - VersionInfo = space 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"'); - - EncName = (/[A-Za-z]/ *(/[A-Za-z0-9._]/ | '-')) >encodingstart %encodingend; - EncodingDecl = space 'encoding' Eq ('"' EncName '"' | "'" EncName "'" ); - - SDDecl = space 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')); - - XMLDecl = ''; - - - main = ?BOM XMLDecl /.*/; - -%% - - - - -unsigned int getEncodingFromXmlDecl(char *data, int len) { - - int encodinglength, result; - CFStringRef encodingString; - - XMLDeclScanner scanner, *machine = &scanner; - - XMLDeclScannerInit(machine); - XMLDeclScannerExecute(machine, data, len > 512 ? 512 : len); - XMLDeclScannerFinish(machine); - - if (!XMLDeclScannerAccept(machine)) { - return 0; - } - - encodinglength = machine->mark_encodingend - machine->mark_encodingstart; - - - encodingString = CFStringCreateWithBytes ( - NULL, - machine->mark_encodingstart, - (CFIndex)encodinglength, - kCFStringEncodingASCII, - 0 - ); - - result = CFStringConvertIANACharSetNameToEncoding(encodingString); - CFRelease(encodingString); - - if (result == kCFStringEncodingInvalidId) - return 0; - - result = CFStringConvertEncodingToNSStringEncoding(result); - - if (result == kCFStringEncodingInvalidId) - return 0; - - return result; - -} - - -unsigned int getIANACharSetName(char *data, int len, char *destbuffer, int destbufferlen) { - - int encodinglength, result; - CFStringRef encodingString; - - XMLDeclScanner scanner, *machine = &scanner; - - XMLDeclScannerInit(machine); - XMLDeclScannerExecute(machine, data, len > 512 ? 512 : len); - XMLDeclScannerFinish(machine); - - if (!XMLDeclScannerAccept(machine)) { - return 0; - } - - encodinglength = machine->mark_encodingend - machine->mark_encodingstart; - - bzero(dstbuffer, dstbufferlen); - strncpy(dstbuffer, machine->mark_encodingstart, dstbufferlen-1 > encodinglength ? dstbufferlen-1 : encodinglength); - - - encodingString = CFStringCreateWithBytes ( - NULL, - machine->mark_encodingstart, - (CFIndex)encodinglength, - kCFStringEncodingASCII, - 0 - ); - - result = CFStringConvertIANACharSetNameToEncoding(encodingString); - CFRelease(encodingString); - - if (result == kCFStringEncodingInvalidId) - return 0; - - result = CFStringConvertEncodingToNSStringEncoding(result); - - if (result == kCFStringEncodingInvalidId) - return 0; - - return result; - -} - - - -/* No longer used, now using CoreFoundation - - struct encodingPair { - int encoding; - char *matchstring; - }; - - struct encodingPair encodingPairs[] = { - {NSUTF8StringEncoding, "UTF-8"}, - {NSISOLatin1StringEncoding, "ISO-8859-1"}, - {0, NULL}, - }; - - - - for (i = 0; encodingPairs[i].matchstring; i++) { - - testlength = strlen(encodingPairs[i].matchstring); - if (!strncasecmp(machine->mark_encodingstart, encodingPairs[i].matchstring, encodinglength < testlength ? encodinglength : testlength)) { - return encodingPairs[i].encoding; - } - - } - - return 0; - -*/ - diff --git a/ragel_xmldeclscanner.h b/ragel_xmldeclscanner.h deleted file mode 100644 index c5e1793..0000000 --- a/ragel_xmldeclscanner.h +++ /dev/null @@ -1,46 +0,0 @@ - -/* - * This is an input file for the "Ragel" finite state machine compiler utility. - * - * Written by Marc Liyanage - * - */ - -/* - * ragel -o ragel_xmldeclscanner_out.c ragel_xmldeclscanner.c && env CFLAGS='-framework CoreFoundation' make ragel_xmldeclscanner_out - */ - -#include -#include -#include -#include -#include -#include - - -#define DEBUG 0 - -unsigned int getEncodingFromXmlDecl(char *data, int len); - - -/* -int main() { - - char *data, *pos; - - pos = data = (char *)malloc(40000); - int readlen = 0, i; - unsigned int result; - - - while ((readlen = read(0, pos, 40000)) > 0) { - pos += readlen; - } - - - result = getEncodingFromXmlDecl(data, pos - data); - - - printf("result: %d\n", result); -} -*/ \ No newline at end of file diff --git a/ragel_xmldeclscanner_out.c b/ragel_xmldeclscanner_out.c deleted file mode 100644 index 266e39d..0000000 --- a/ragel_xmldeclscanner_out.c +++ /dev/null @@ -1,508 +0,0 @@ -/* Automatically generated by Ragel from "ragel_xmldeclscanner.c". - * - * Parts of this file are copied from Ragel source covered by the GNU - * GPL. As a special exception, you may use the parts of this file copied - * from Ragel source without restriction. The remainder is derived from - * "ragel_xmldeclscanner.c" and inherits the copyright status of that file. - */ - -# 1 "ragel_xmldeclscanner.c" - -/* - * This is an input file for the "Ragel" finite state machine compiler utility. - * It produces output code which implements a tag scanner for XML data. - * It is used for intelligent xml tag completion in an XML editor interface. - * - * See the Ragel online documentation for additional - * information about the format of this file. - * - * Written by Marc Liyanage - * - */ - - -#include -#include "ragel_xmldeclscanner.h" - - -# 29 "ragel_xmldeclscanner_out.c" -/* Forward dec state for the transition structure. */ -struct XMLDeclScannerStateStruct; - -/* Only non-static data: current state, acceptance indicator. */ -struct XMLDeclScannerStruct -{ - int *curState; - int accept; -# 20 "ragel_xmldeclscanner.c" - - char *mark_encodingstart; - char *mark_encodingend; - -# 43 "ragel_xmldeclscanner_out.c" -}; -typedef struct XMLDeclScannerStruct XMLDeclScanner; - -/* Init the fsm. */ -void XMLDeclScannerInit( XMLDeclScanner *fsm ); - -/* Execute some chunk of data. */ -void XMLDeclScannerExecute( XMLDeclScanner *fsm, char *data, int dlen ); - -/* Indicate to the fsm tha there is no more data. */ -void XMLDeclScannerFinish( XMLDeclScanner *fsm ); - -/* Did the machine accept? */ -int XMLDeclScannerAccept( XMLDeclScanner *fsm ); - -# 25 "ragel_xmldeclscanner.c" - - -# 62 "ragel_xmldeclscanner_out.c" -#define f XMLDeclScanner_f -#define s XMLDeclScanner_s -#define k XMLDeclScanner_k -#define i XMLDeclScanner_i -#define t XMLDeclScanner_t - -#define SPEC_ANY_FLAT 0x01 -#define SPEC_ANY_SINGLE 0x02 -#define SPEC_ANY_RANGE 0x04 -#define SPEC_ANY_DEF 0x08 -#define SPEC_IS_FINAL 0x10 -#define SPEC_OUT_FUNC 0x20 - -/* The array of functions. */ -static int XMLDeclScanner_f[] = { - 1, 0, 1, 1 -}; - -/* The array of keys of transitions. */ -static char XMLDeclScanner_k[] = { - -69, -65, 60, -17, 60, 63, 120, 109, - 108, 32, 9, 13, 118, 101, 114, 115, - 105, 111, 110, 61, 34, 39, 45, 46, - 58, 95, 48, 57, 65, 90, 97, 122, - 39, 45, 46, 58, 95, 48, 57, 65, - 90, 97, 122, 39, 45, 46, 58, 95, - 48, 57, 65, 90, 97, 122, 39, 45, - 46, 58, 95, 48, 57, 65, 90, 97, - 122, 39, 45, 46, 58, 95, 48, 57, - 65, 90, 97, 122, 32, 9, 13, 45, - 46, 58, 95, 48, 57, 65, 90, 97, - 122, 34, 45, 46, 58, 95, 48, 57, - 65, 90, 97, 122, 34, 45, 46, 58, - 95, 48, 57, 65, 90, 97, 122, 34, - 45, 46, 58, 95, 48, 57, 65, 90, - 97, 122, 34, 45, 46, 58, 95, 48, - 57, 65, 90, 97, 122, 32, 9, 13, - 101, 110, 99, 111, 100, 105, 110, 103, - 61, 34, 39, 65, 90, 97, 122, 34, - 45, 46, 95, 48, 57, 65, 90, 97, - 122, 34, 45, 46, 95, 48, 57, 65, - 90, 97, 122, 34, 45, 46, 95, 48, - 57, 65, 90, 97, 122, 32, 63, 9, - 13, 65, 90, 97, 122, 39, 45, 46, - 95, 48, 57, 65, 90, 97, 122, 39, - 45, 46, 95, 48, 57, 65, 90, 97, - 122, 39, 45, 46, 95, 48, 57, 65, - 90, 97, 122, 32, 63, 9, 13, 116, - 97, 110, 100, 97, 108, 111, 110, 101, - 61, 34, 39, 110, 121, 101, 115, 39, - 111, 39, 32, 63, 9, 13, 110, 121, - 101, 115, 34, 111, 34, 32, 63, 9, - 13, 63, 63, 115, 62, 0 -}; - -/* The array of indicies into the transition array. */ -static unsigned char XMLDeclScanner_i[] = { - 1, 2, 3, 4, 3, 5, 6, 7, - 8, 9, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 21, - 21, 21, 21, 21, 22, 23, 24, 24, - 24, 24, 24, 24, 22, 23, 24, 24, - 24, 24, 24, 24, 22, 23, 24, 24, - 24, 24, 24, 24, 22, 23, 24, 24, - 24, 24, 24, 24, 25, 25, 26, 27, - 27, 27, 27, 27, 27, 28, 29, 30, - 30, 30, 30, 30, 30, 28, 29, 30, - 30, 30, 30, 30, 30, 28, 29, 30, - 30, 30, 30, 30, 30, 28, 29, 30, - 30, 30, 30, 30, 30, 25, 25, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 42, 43, 44, 45, 45, - 45, 45, 45, 43, 44, 45, 45, 45, - 45, 45, 43, 44, 45, 45, 45, 45, - 45, 46, 47, 46, 48, 48, 49, 50, - 51, 51, 51, 51, 51, 49, 50, 51, - 51, 51, 51, 51, 49, 50, 51, 51, - 51, 51, 51, 46, 47, 46, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, - 68, 70, 47, 70, 71, 72, 73, 74, - 75, 76, 75, 70, 47, 70, 47, 47, - 77, 78, 79, 79, 0 -}; - -/* The aray of states. */ -static int XMLDeclScanner_s[] = { - 768, 0, 0, 1026, 0, 0, 1, 1026, - 1, 1, 1, 1026, 2, 2, 1, 1026, - 3, 3, 2, 1026, 5, 5, 1, 1026, - 6, 6, 1, 1026, 7, 7, 1, 1026, - 8, 8, 1, 1286, 9, 9, 1, 1, - 1026, 12, 11, 1, 1026, 13, 12, 1, - 1026, 14, 13, 1, 1026, 15, 14, 1, - 1026, 16, 15, 1, 1026, 17, 16, 1, - 1026, 18, 17, 1, 1026, 19, 18, 1, - 1026, 20, 19, 2, 1286, 22, 21, 4, - 3, 1286, 32, 28, 5, 3, 1286, 43, - 36, 5, 3, 1286, 54, 44, 5, 3, - 1286, 65, 52, 5, 3, 1286, 76, 60, - 1, 1, 1286, 79, 62, 4, 3, 1286, - 89, 69, 5, 3, 1286, 100, 77, 5, - 3, 1286, 111, 85, 5, 3, 1286, 122, - 93, 5, 3, 1286, 133, 101, 1, 1, - 1026, 136, 103, 1, 1026, 137, 104, 1, - 1026, 138, 105, 1, 1026, 139, 106, 1, - 1026, 140, 107, 1, 1026, 141, 108, 1, - 1026, 142, 109, 1, 1026, 143, 110, 1, - 1026, 144, 111, 1, 1026, 145, 112, 2, - 1028, 147, 114, 2, 1286, 151, 116, 4, - 3, 1286, 161, 123, 4, 3, 1286, 171, - 130, 4, 3, 1286, 181, 137, 2, 1, - 1028, 185, 140, 2, 1286, 189, 142, 4, - 3, 1286, 199, 149, 4, 3, 1286, 209, - 156, 4, 3, 1286, 219, 163, 2, 1, - 1026, 223, 166, 1, 1026, 224, 167, 1, - 1026, 225, 168, 1, 1026, 226, 169, 1, - 1026, 227, 170, 1, 1026, 228, 171, 1, - 1026, 229, 172, 1, 1026, 230, 173, 1, - 1026, 231, 174, 1, 1026, 232, 175, 1, - 1026, 233, 176, 2, 1026, 235, 178, 2, - 1026, 237, 180, 1, 1026, 238, 181, 1, - 1026, 239, 182, 1, 1026, 240, 183, 1, - 1026, 241, 184, 1, 1286, 242, 185, 2, - 1, 1026, 246, 188, 2, 1026, 248, 190, - 1, 1026, 249, 191, 1, 1026, 250, 192, - 1, 1026, 251, 193, 1, 1026, 252, 194, - 1, 1286, 253, 195, 2, 1, 1026, 257, - 198, 1, 1026, 258, 199, 2, 1026, 260, - 201, 1, 792, 261, 202, 792, 261, 203, - 0 -}; - -/* The array of transitions. */ -static int *XMLDeclScanner_t[] = { - 0, 0, s+7, 0, s+11, 0, s+19, 0, - s+3, 0, s+23, 0, s+27, 0, s+31, 0, - s+35, 0, s+40, 0, s+44, 0, s+48, 0, - s+52, 0, s+56, 0, s+60, 0, s+64, 0, - s+68, 0, s+72, 0, s+106, 0, s+76, 0, - s+86, 0, s+81, 0, s+101, 0, s+96, 0, - s+91, 0, s+136, 0, s+116, 0, s+111, 0, - s+131, 0, s+126, 0, s+121, 0, s+140, 0, - s+144, 0, s+148, 0, s+152, 0, s+156, 0, - s+160, 0, s+164, 0, s+168, 0, s+172, 0, - s+176, 0, s+200, 0, s+180, f+0, s+195, f+2, - s+190, 0, s+185, 0, s+330, 0, s+334, 0, - s+204, f+0, s+219, f+2, s+214, 0, s+209, 0, - s+228, 0, s+232, 0, s+236, 0, s+240, 0, - s+244, 0, s+248, 0, s+252, 0, s+256, 0, - s+260, 0, s+264, 0, s+297, 0, s+268, 0, - s+284, 0, s+272, 0, s+276, 0, s+280, 0, - s+292, 0, s+288, 0, s+326, 0, s+313, 0, - s+301, 0, s+305, 0, s+309, 0, s+321, 0, - s+317, 0, s+224, 0, s+338, 0, s+341, 0, - 0 -}; - -/* The start state. */ -static int *XMLDeclScanner_start = s+15; - -/* Init the fsm to a runnable state. */ -void XMLDeclScannerInit( XMLDeclScanner *fsm ) -{ - fsm->curState = XMLDeclScanner_start; - fsm->accept = 0; -# 29 "ragel_xmldeclscanner.c" -{ - fsm->mark_encodingstart = fsm->mark_encodingend = NULL; - } -# 233 "ragel_xmldeclscanner_out.c" -} - -/* Did the fsm accept? */ -int XMLDeclScannerAccept( XMLDeclScanner *fsm ) -{ - return fsm->accept; -} - -/* Binary search an array of keys looking for a key. */ -static char *XMLDeclScannerBSearch( char c, char *keys, int len ) -{ - char *lower = keys; - char *mid; - char *upper = keys + len - 1; - while (1) { - if ( upper < lower ) - return 0; - - /* Find the midpoint. */ - mid = lower + ((upper-lower) >> 1); - - if ( c < *mid ) - upper = mid - 1; - else if ( c > *mid ) - lower = mid + 1; - else - return mid; - } -} - -/* Binary search an array of keys looking for a key. */ -static char *XMLDeclScannerRangeBSearch( char c, char *keys, int len ) -{ - char *lower = keys; - char *mid; - char *upper = keys + len - 2; - while (1) { - if ( upper < lower ) - return 0; - - /* Find the midpoint. Be sure to settle on the - * lower end of a range. */ - mid = lower + (((upper-lower) >> 1) & ~1); - - if ( c < mid[0] ) - upper = mid - 2; - else if ( c > mid[1] ) - lower = mid + 2; - else { - /* The key was found in the range mid, return it. */ - return mid; - } - } -} - -/* Execute the fsm on some chunk of data. */ -void XMLDeclScannerExecute( XMLDeclScanner *fsm, char *data, int dlen ) -{ - char *p = data; - int len = dlen; - int *cs = fsm->curState; - int specs, **trans, *funcs, nfuncs; - char *keys; - unsigned char *inds; - - if ( data == 0 ) - goto finishInput; - -again: - if ( cs == 0 || len == 0 ) - goto out; - - /* Get required data. */ - specs = *cs++; - keys = k + *cs++; - inds = i + *cs++; - - /* Try flat index. */ - if ( specs & SPEC_ANY_FLAT ) { - int indsLen = *cs++; - keys += 2; - inds += indsLen; - } - - /* Try binary search single. */ - if ( specs & SPEC_ANY_SINGLE ) { - /* Try to find the key. */ - int indsLen = *cs++; - char *match = XMLDeclScannerBSearch( *p, keys, indsLen ); - - if ( match != 0 ) { - trans = t + (inds[match - keys]<<1); - goto match; - } - - /* Advance over the keys and indicies. */ - keys += indsLen; - inds += indsLen; - } - - /* Try binary search range. */ - if ( specs & SPEC_ANY_RANGE ) { - /* Try to find the key. */ - int indsLen = *cs++; - char *match = XMLDeclScannerRangeBSearch( *p, keys, (indsLen<<1) ); - - if ( match != 0 ) { - trans = t + (inds[(match - keys)>>1]<<1); - goto match; - } - - /* Advance over the keys and indicies. */ - keys += (indsLen<<1); - inds += indsLen; - } - - /* Try the default transition. */ - if ( specs & SPEC_ANY_DEF ) { - trans = t + ((*inds)<<1); - goto match; - } - - /* No match. */ - cs = 0; - goto out; - -match: - /* Move to the new state. */ - cs = *trans++; - - /* Check for functions. */ - if ( (funcs=*trans) == 0 ) - goto noFuncs; - -execFuncs: - nfuncs = *funcs++; - while ( nfuncs-- > 0 ) { - switch ( *funcs++ ) { - case 0: -# 34 "ragel_xmldeclscanner.c" - { - DEBUG && fprintf(stderr, "encodingstart: %d %c\n", p - data, *p); - fsm->mark_encodingstart = p; - } break; - case 1: -# 39 "ragel_xmldeclscanner.c" - { - fsm->mark_encodingend = p; - DEBUG && fprintf(stderr, "encodingend: %d %c\n", p - data, *p); - DEBUG && fprintf(stderr, "length: %d\n", fsm->mark_encodingend - fsm->mark_encodingstart); - } break; -# 385 "ragel_xmldeclscanner_out.c" - } - } - -noFuncs: - p++, len--; - goto again; - -finishInput: - if ( cs != 0 && *cs & SPEC_IS_FINAL ) { - /* The machine accepts. */ - fsm->accept = 1; - /* If finishing in a final state then execute the - * out functions for it. (if any). */ - if ( *cs & SPEC_OUT_FUNC ) { - funcs = f+*(cs + (*cs>>8)-1); - len = 1; - goto execFuncs; - } - } - else { - /* If we are not in a final state then this - * is an error. Move to the error state. */ - fsm->curState = 0; - } - -out: - fsm->curState = cs; -} - -/* Indicate to the fsm that the input is done. Does cleanup tasks. */ -void XMLDeclScannerFinish( XMLDeclScanner *fsm ) -{ - XMLDeclScannerExecute( fsm, 0, 0 ); -} - -#undef f -#undef s -#undef k -#undef i -#undef t -#undef SPEC_ANY_FLAT -#undef SPEC_ANY_SINGLE -#undef SPEC_ANY_RANGE -#undef SPEC_ANY_DEF -#undef SPEC_IS_FINAL -#undef SPEC_OUT_FUNC - -# 66 "ragel_xmldeclscanner.c" - - - - - -unsigned int getEncodingFromXmlDecl(char *data, int len) { - - int encodinglength, result; - CFStringRef encodingString; - - XMLDeclScanner scanner, *machine = &scanner; - - XMLDeclScannerInit(machine); - XMLDeclScannerExecute(machine, data, len > 512 ? 512 : len); - XMLDeclScannerFinish(machine); - - if (!XMLDeclScannerAccept(machine)) { - return 0; - } - - encodinglength = machine->mark_encodingend - machine->mark_encodingstart; - - - encodingString = CFStringCreateWithBytes ( - NULL, - machine->mark_encodingstart, - (CFIndex)encodinglength, - kCFStringEncodingASCII, - 0 - ); - - result = CFStringConvertIANACharSetNameToEncoding(encodingString); - CFRelease(encodingString); - - if (result == kCFStringEncodingInvalidId) - return 0; - - result = CFStringConvertEncodingToNSStringEncoding(result); - - if (result == kCFStringEncodingInvalidId) - return 0; - - return result; - -} - - - -/* No longer used, now using CoreFoundation - - struct encodingPair { - int encoding; - char *matchstring; - }; - - struct encodingPair encodingPairs[] = { - {NSUTF8StringEncoding, "UTF-8"}, - {NSISOLatin1StringEncoding, "ISO-8859-1"}, - {0, NULL}, - }; - - - - for (i = 0; encodingPairs[i].matchstring; i++) { - - testlength = strlen(encodingPairs[i].matchstring); - if (!strncasecmp(machine->mark_encodingstart, encodingPairs[i].matchstring, encodinglength < testlength ? encodinglength : testlength)) { - return encodingPairs[i].encoding; - } - - } - - return 0; - -*/ - diff --git a/ragel_xmlscanner.c b/ragel_xmlscanner.c deleted file mode 100644 index 962b446..0000000 --- a/ragel_xmlscanner.c +++ /dev/null @@ -1,462 +0,0 @@ - -/* - * This is an input file for the "Ragel" finite state machine compiler utility. - * It produces output code which implements a tag scanner for XML data. - * It is used for intelligent xml tag completion in an XML editor interface. - * - * See the Ragel online documentation for additional - * information about the format of this file. - * - * Written by Marc Liyanage - * - */ - - -#include "ragel_xmlscanner.h" - - -/* modes for the scan, before or after cursor position */ -enum { - BEFORE = 1, - AFTER -}; - - -%% XMLScanner - struct { - char *data; - char *stack[STACKDEPTH]; - char *stack_e[STACKDEPTH]; - int sp; - int sp_e; - char *mark_namestart; - char *mark_nameend; - char *mark_attrstart; - char *mark_attrend; - char *before_toptag; - int cursor; - int in_comment; - int in_cdata; - int in_tag; - int mode; - }; -%% - - - -void checkETag(XMLScanner *fsm); -void popTag(XMLScanner *fsm); -void pushTag(XMLScanner *fsm); - -%% XMLScanner - - init { - fsm->sp = 0; - fsm->sp_e = 0; - fsm->mode = BEFORE; - fsm->in_comment = 0; - fsm->in_cdata = 0; - fsm->in_tag = 0; - } - - - func commentstart { - DEBUG && fprintf(stderr, "commentstart: %d %c\n", p - data, *p); - fsm->in_comment = 1; - } - - func commentend { - DEBUG && fprintf(stderr, "commentend: %d %c\n", p - data, *p); - fsm->in_comment = 0; - fsm->in_tag = 0; - } - - func cdatastart { - fsm->in_cdata = 1; - } - - func cdataend { - fsm->in_cdata = 0; - fsm->in_tag = 0; - } - - func enter_tag { - DEBUG && fprintf(stderr, "enter tag at %d\n", p - data); - fsm->in_tag = 1; - } - - func exit_tag { - DEBUG && fprintf(stderr, "exit tag at %d\n", p - data); - fsm->in_tag = 0; - } - - func name { -// fprintf(stderr, "name: %d %c\n", p - data, *p); - } - - func stag { - DEBUG && fprintf(stderr, "stag\n"); - pushTag(fsm); - } - - func etag { - DEBUG && fprintf(stderr, "stag: start: %d end: %d %c\n", fsm->mark_namestart - data, fsm->mark_nameend - data, *p); - checkETag(fsm); - } - - func mark_namestart { - DEBUG && fprintf(stderr, "markstart: %d %c\n", p - data, *p); - fsm->mark_namestart = p; - } - - func mark_nameend { - DEBUG && fprintf(stderr, "markend: %d %c\n", (p - 1) - data, *(p-1)); - fsm->mark_nameend = p; - } - - func mark_attrstart { -// fprintf(stderr, "attrstart: %d %c\n", p - data, *p); - fsm->mark_attrstart = p; - } - - func mark_attrend { -// fprintf(stderr, "attrend: %d %c\n", (p - 1) - data, *(p - 1)); - fsm->mark_attrend = p; - } - - -func attr { - // fprintf(stderr, "attr: start: %d end: %d %c\n", fsm->mark_attrstart - data, fsm->mark_attrend - data, *p); -} - -func pi { - DEBUG && fprintf(stderr, "pi: %d\n", p - data); -} - - - -# // This is the actual grammar used by the scanner. It calls into the -# // functions above at certain state transitions. - - lt = '<' %enter_tag; - gt = '>' %exit_tag; - - namechar = alpha | digit | '.' | '-' | '_' | ':'; - nmtoken = +namechar; - name = (alpha | '_' | ':') *namechar; - - attr = name >mark_attrstart '=' ((/'[^']*'/ | /"[^"]*"/) %mark_attrend) %attr; - stag = (lt (name >mark_namestart %mark_nameend) *(space | attr) gt) %stag; - etag = lt '/' (name >mark_namestart %mark_nameend) gt %etag; - emptytag = lt name *(space | attr) '/' gt; - - commentstart = '' %commentend; - comment = commentstart ((!commentend commentend) | commentend); - - cdatastart = '' %cdataend; - cdata = cdatastart ((!cdataend cdataend) | cdataend); - - nonlt = /[^<]/; - - main = *(comment %+1 | cdata %+1 | lt | stag | emptytag | etag | nonlt %-1); - -%% - - -/* - * findCompletion does the actual work of driving the state machine - * - * Input: - * data - pointer to the buffer containing the XML data - * len - length of the data to analyze - * cursor - logical position of the editing cursor in the data buffer - * result - pointer to integer, which will contain a bit field with - * additional status information after completion: - * - * Completion rules: - * - * - The system builds a stack of tags which are open at the indicated cursor - * position in the XML data. - * - If completion is possible at that cursor position, the integer - * result will be 0. The caller should insert a closing tag for the - * topmost tag name on the stack. - * - It can use the other elements of the - * stack for GUI goodies, like display of a stack of currently open tags - * in the editor. However, it should not assume that the tag stack can be - * used to close all opening tags. Instead, it should re-evaluate - * the document with this routine after the tag has been inserted and the - * cursor position might have moved as a result. - * - * - There are a few cases where completion should not be performed, this - * will be indicated by the bitfield in the result int parameter: - * - ERROR_IN_TAG: The cursor is in the middle of a tag. No useful completion - * is possible (maybe look at the prefix and complete - * accordingly, sometime in the future...) - * - ERROR_IN_COMMENT: The cursor is inside a comment block. - * - ERROR_IN_CDATA: The cursor is inside a cdata section. - * - ERROR_NO_TAG: There's no unmatched opening tag to the left of the cursor - * - ERROR_ALREADY_BALANCED_HERE: The currently open tags to the left of the - * cursor are already balanced with an equal amount - * of closing tags to the right of the cursor. - * - * Results: - * - * Returns a pointer to an array of pointers to chars. - * Each array entry contains one tag from the stack - * tags open at the cursor position. - * - */ -char (*findCompletion(char *data, int len, int cursor, int *result, int tagpositions[STACKDEPTH]))[] { - - XMLScanner scanner, *machine = &scanner; - char toptag[MAXTAGLENGTH]; - unsigned int i, lower, upper, openingcount, closingcount, identical_opening, identical_closing; - - char (*resultstack)[MAXTAGLENGTH] = NULL; - char (*resultstack_e)[MAXTAGLENGTH] = NULL; - - *result = 0; - - bzero(toptag, MAXTAGLENGTH); - - - // ------------ analyze data before cursor position ------------------ - - XMLScannerInit(machine); - - machine->mode = BEFORE; - machine->cursor = cursor; - - XMLScannerExecute(machine, data, cursor); - XMLScannerFinish(machine); - - - /* Any unbalanced open tags on the stack at all? If so, allocate memory - * and copy the tags over to a newly allocated buffer, into a stack. - */ - if (machine->sp) { - resultstack = malloc(MAXTAGLENGTH * ((machine->sp/2) + 1)); - } else { - /* Nothing useful to return to caller */ - *result |= ERROR_NO_TAG; - return NULL; - } - - openingcount = (machine->sp / 2); - - for (i = 0; i < openingcount; i++) { - lower = i * 2; - upper = lower + 1; - bzero(resultstack[i], MAXTAGLENGTH); - strncpy(resultstack[i], machine->stack[lower], machine->stack[upper] - machine->stack[lower]); - if (tagpositions) { - tagpositions[lower] = machine->stack[lower] - data; - tagpositions[upper] = machine->stack[upper] - data; - } - } - - /* make sure the slot after the topmost tag is zeroed out, so the - * calling code can use that as an end of stack marker. - */ - bzero(resultstack[openingcount], MAXTAGLENGTH); - - strncpy(toptag, resultstack[openingcount - 1], MAXTAGLENGTH); - - if (machine->in_tag) - *result |= ERROR_IN_TAG; - if (machine->in_comment) - *result |= ERROR_IN_COMMENT; - if (machine->in_cdata) - *result |= ERROR_IN_CDATA; - - if (*result) { - return resultstack; - } - - // count identical opening tags on the top of the stack. - identical_opening = 1; - for (i = (openingcount - 2); i >= 0; i--) { - if (!strcmp(resultstack[i], resultstack[i + 1])) { - identical_opening++; - } else { - break; - } - } - - - // ------------ analyze data after cursor position ------------------ - -// fprintf(stderr, "accept: %d\n", XMLScannerAccept(machine)); - - - /* Reinitialize and reconfigure the scanner, and run it again, but this time with - * the data from the cursor position until the end. - */ - XMLScannerInit(machine); - machine->mode = AFTER; - machine->cursor = cursor; - XMLScannerExecute(machine, data + cursor, len - cursor); - XMLScannerFinish(machine); - - /* If there are no closing tags, we don't need to check if - * the topmost opening tags on the stacks are already balanced - */ - closingcount = (machine->sp_e / 2); - if (!closingcount) { - return resultstack; - } - - resultstack_e = malloc(MAXTAGLENGTH * ((machine->sp_e/2) + 1)); - - for (i = 0; i < closingcount; i++) { - lower = i * 2; - upper = lower + 1; - - bzero(resultstack_e[i], MAXTAGLENGTH); - strncpy(resultstack_e[i], machine->stack_e[lower], machine->stack_e[upper] - machine->stack_e[lower]); - - } - - DEBUG && fprintf(stderr, "closing count %d\n", closingcount); - - identical_closing = closingcount ? 1 : 0; - for (i = 0; i < closingcount - 1; i++) { - if (!strcmp(resultstack_e[i], resultstack_e[i + 1])) { - identical_closing++; - } else { - break; - } - } - - DEBUG && fprintf(stderr, "identical_closing %d\n", identical_closing); - - /* last opening tag before cursor and first closing tag after - * cursor have to be identical, otherwise we are not interested - * if they are balanced - */ - if (strcmp(resultstack[openingcount - 1], resultstack_e[0])) { - free(resultstack_e); - return resultstack; - } - - /* ok, the adjacent opening and closing tags are identical, so we - * need to know if there are less closing tags than opening tags, - * because only then does tag completion make any sense at this location - */ - - if (identical_opening <= identical_closing) { - *result |= ERROR_ALREADY_BALANCED_HERE; - } - - free(resultstack_e); - - // caller needs to free() this... - return resultstack; - -} - - - - - -/* - * Push the current start and end buffer position markers onto our - * stack of currently open tags. We're operating with position numbers - * only at this point, later there will be actual copies out of the buffer - */ -void pushTag(XMLScanner *fsm) { - - char buffer[MAXTAGLENGTH]; - bzero(buffer, sizeof(buffer)); - - if (fsm->sp + 2 >= (STACKDEPTH - 1)) { - fprintf(stderr, "pushTag: stack overflow at %d, can't push more!\n", STACKDEPTH); - return; - } - - fsm->stack[fsm->sp++] = fsm->mark_namestart; - fsm->stack[fsm->sp++] = fsm->mark_nameend; - - DEBUG && strncpy(buffer, fsm->stack[fsm->sp - 2], fsm->stack[fsm->sp - 1] - fsm->stack[fsm->sp - 2]); - DEBUG && fprintf(stderr, "pushTag: pushing '%s'\n", buffer); - -} - - - -/* - * Push the current start and end buffer position markers for - * *end* tags onto the stack. - */ -void pushETag(XMLScanner *fsm) { - - char buffer[MAXTAGLENGTH]; - bzero(buffer, sizeof(buffer)); - - if (fsm->sp_e + 2 >= (STACKDEPTH - 1)) { - fprintf(stderr, "pushETag: stack overflow at %d, can't push more!\n", STACKDEPTH); - return; - } - - fsm->stack_e[fsm->sp_e++] = fsm->mark_namestart; - fsm->stack_e[fsm->sp_e++] = fsm->mark_nameend; - - DEBUG && strncpy(buffer, fsm->stack_e[fsm->sp_e - 2], fsm->stack_e[fsm->sp_e - 1] - fsm->stack_e[fsm->sp_e - 2]); - DEBUG && fprintf(stderr, "pushETag: pushing '%s'\n", buffer); -} - - - -/* - * pop the topmost element - */ -void popTag(XMLScanner *fsm) { - - char buffer[MAXTAGLENGTH]; - bzero(buffer, sizeof(buffer)); - - if (fsm->sp < 2) { - fprintf(stderr, "popTag: stack underflow, can't pop more!\n"); - return; - } - - fsm->sp -= 2; - - DEBUG && strncpy(buffer, fsm->stack[fsm->sp], fsm->stack[fsm->sp + 1] - fsm->stack[fsm->sp]); - DEBUG && fprintf(stderr, "popTag: popping '%s'\n", buffer); -} - - -/* - * check out the end tag we just stumbled upon. - * the behavior is different here, according to the scan mode - * (before or after cursor position). - */ -void checkETag(XMLScanner *fsm) { - - char buffer[MAXTAGLENGTH]; - bzero(buffer, sizeof(buffer)); - int len; - - /* return if the stack is empty in BEFORE mode, we can't do anything interesting */ - if (!fsm->sp && fsm->mode == BEFORE) { - return; - } - - len = fsm->mark_nameend - fsm->mark_namestart; - - strncpy(buffer, fsm->mark_namestart, len); - - /* if topmost tag on stack is identical to current end tag, pop it */ - if(fsm->sp && !strncmp(fsm->stack[fsm->sp - 2], buffer, len)) { -// fprintf(stderr, "checkETag: popping, len = %d, etag = '%s'\n", len, buffer); - popTag(fsm); - } else { - pushETag(fsm); - } - - -} - diff --git a/ragel_xmlscanner.h b/ragel_xmlscanner.h deleted file mode 100644 index 3e63694..0000000 --- a/ragel_xmlscanner.h +++ /dev/null @@ -1,69 +0,0 @@ - -/* - * This is an input file for the "Ragel" finite state machine compiler utility. - * It produces output code which implements a tag scanner for XML data. - * It is used for intelligent xml tag completion in an XML editor interface. - * - * See the Ragel online documentation for additional - * information about the format of this file. - * - * Written by Marc Liyanage - * - */ - - -#include -#include -#include -#include -#include -#include - -#define STACKDEPTH 600 -#define MAXTAGLENGTH 100 -#define DEBUG 0 - - -/* bit field flags for the return value, to indicate state to the caller */ -enum { - ERROR_IN_TAG = 1, - ERROR_IN_COMMENT = 2, - ERROR_IN_CDATA = 4, - ERROR_NO_TAG = 8, - ERROR_ALREADY_BALANCED_HERE = 16 -}; - -char (*findCompletion(char *data, int len, int cursor, int *result, int tagpositions[]))[]; - - -/* - -int main() { - - char *data, *pos; - - pos = data = (char *)malloc(40000); - int readlen = 0, i; - unsigned int result; - char (*resultstack)[MAXTAGLENGTH]; - - while ((readlen = read(0, pos, 40000)) > 0) { - pos += readlen; - } - - - resultstack = findCompletion(data, pos - data, 1382, &result); - for (i = 0; resultstack && *(resultstack[i]); i++) { - fprintf(stderr, "tag main (%p): '%s'\n", resultstack[i], resultstack[i]); - } - - if (resultstack) - free(resultstack); - - exit(0); - -} - - -*/ - diff --git a/ragel_xmlscanner_out.c b/ragel_xmlscanner_out.c deleted file mode 100644 index 381f843..0000000 --- a/ragel_xmlscanner_out.c +++ /dev/null @@ -1,909 +0,0 @@ -/* Automatically generated by Ragel from "ragel_xmlscanner.c". - * - * Parts of this file are copied from Ragel source covered by the GNU - * GPL. As a special exception, you may use the parts of this file copied - * from Ragel source without restriction. The remainder is derived from - * "ragel_xmlscanner.c" and inherits the copyright status of that file. - */ - -# 1 "ragel_xmlscanner.c" - -/* - * This is an input file for the "Ragel" finite state machine compiler utility. - * It produces output code which implements a tag scanner for XML data. - * It is used for intelligent xml tag completion in an XML editor interface. - * - * See the Ragel online documentation for additional - * information about the format of this file. - * - * Written by Marc Liyanage - * - */ - - -#include "ragel_xmlscanner.h" - - -/* modes for the scan, before or after cursor position */ -enum { - BEFORE = 1, - AFTER -}; - - -# 35 "ragel_xmlscanner_out.c" -/* Forward dec state for the transition structure. */ -struct XMLScannerStateStruct; - -/* Only non-static data: current state, acceptance indicator. */ -struct XMLScannerStruct -{ - int *curState; - int accept; -# 26 "ragel_xmlscanner.c" - - char *data; - char *stack[STACKDEPTH]; - char *stack_e[STACKDEPTH]; - int sp; - int sp_e; - char *mark_namestart; - char *mark_nameend; - char *mark_attrstart; - char *mark_attrend; - char *before_toptag; - int cursor; - int in_comment; - int in_cdata; - int in_tag; - int mode; - -# 62 "ragel_xmlscanner_out.c" -}; -typedef struct XMLScannerStruct XMLScanner; - -/* Init the fsm. */ -void XMLScannerInit( XMLScanner *fsm ); - -/* Execute some chunk of data. */ -void XMLScannerExecute( XMLScanner *fsm, char *data, int dlen ); - -/* Indicate to the fsm tha there is no more data. */ -void XMLScannerFinish( XMLScanner *fsm ); - -/* Did the machine accept? */ -int XMLScannerAccept( XMLScanner *fsm ); - -# 43 "ragel_xmlscanner.c" - - - - -void checkETag(XMLScanner *fsm); -void popTag(XMLScanner *fsm); -void pushTag(XMLScanner *fsm); - -# 87 "ragel_xmlscanner_out.c" -#define f XMLScanner_f -#define s XMLScanner_s -#define k XMLScanner_k -#define i XMLScanner_i -#define t XMLScanner_t - -#define SPEC_ANY_FLAT 0x01 -#define SPEC_ANY_SINGLE 0x02 -#define SPEC_ANY_RANGE 0x04 -#define SPEC_ANY_DEF 0x08 -#define SPEC_IS_FINAL 0x10 -#define SPEC_OUT_FUNC 0x20 - -/* The array of functions. */ -static int XMLScanner_f[] = { - 1, 0, 1, 1, 1, 2, 1, 3, - 1, 4, 1, 5, 1, 9, 1, 10, - 2, 1, 1, 2, 3, 3, 2, 4, - 4, 2, 5, 7, 2, 5, 8, 2, - 11, 11, 2, 12, 13, 3, 10, 11, - 11, 4, 4, 4, 9, 4, 4, 12, - 13, 12, 13, 6, 12, 13, 11, 12, - 13, 11 -}; - -/* The array of keys of transitions. */ -static char XMLScanner_k[] = { - 45, 45, 45, 45, 45, 62, 45, 60, - 45, 45, 62, 60, 67, 68, 65, 84, - 65, 91, 91, 93, 93, 93, 62, 93, - 60, 93, 93, 62, 93, 60, 60, 62, - 60, 32, 47, 58, 62, 95, 9, 13, - 65, 90, 97, 122, 32, 45, 46, 47, - 58, 62, 95, 9, 13, 48, 57, 65, - 90, 97, 122, 32, 45, 46, 47, 58, - 62, 95, 9, 13, 48, 57, 65, 90, - 97, 122, 32, 45, 46, 47, 58, 61, - 62, 95, 9, 13, 48, 57, 65, 90, - 97, 122, 32, 45, 46, 47, 58, 61, - 62, 95, 9, 13, 48, 57, 65, 90, - 97, 122, 32, 45, 46, 47, 58, 62, - 95, 9, 13, 48, 57, 65, 90, 97, - 122, 32, 45, 46, 47, 58, 61, 62, - 95, 9, 13, 48, 57, 65, 90, 97, - 122, 45, 46, 58, 61, 95, 48, 57, - 65, 90, 97, 122, 45, 46, 58, 61, - 95, 48, 57, 65, 90, 97, 122, 45, - 46, 58, 61, 95, 48, 57, 65, 90, - 97, 122, 32, 45, 46, 47, 58, 61, - 62, 95, 9, 13, 48, 57, 65, 90, - 97, 122, 32, 45, 46, 47, 58, 61, - 62, 95, 9, 13, 48, 57, 65, 90, - 97, 122, 32, 45, 46, 47, 58, 61, - 62, 95, 9, 13, 48, 57, 65, 90, - 97, 122, 34, 39, 32, 45, 46, 47, - 58, 61, 62, 95, 9, 13, 48, 57, - 65, 90, 97, 122, 32, 45, 46, 47, - 58, 61, 62, 95, 9, 13, 48, 57, - 65, 90, 97, 122, 32, 45, 46, 47, - 58, 61, 62, 95, 9, 13, 48, 57, - 65, 90, 97, 122, 45, 46, 58, 61, - 95, 48, 57, 65, 90, 97, 122, 45, - 46, 58, 61, 95, 48, 57, 65, 90, - 97, 122, 45, 46, 58, 61, 95, 48, - 57, 65, 90, 97, 122, 45, 46, 58, - 61, 95, 48, 57, 65, 90, 97, 122, - 45, 46, 58, 61, 95, 48, 57, 65, - 90, 97, 122, 45, 46, 58, 61, 95, - 48, 57, 65, 90, 97, 122, 34, 39, - 32, 47, 58, 62, 95, 9, 13, 65, - 90, 97, 122, 34, 32, 47, 58, 62, - 95, 9, 13, 65, 90, 97, 122, 39, - 45, 46, 58, 62, 95, 48, 57, 65, - 90, 97, 122, 45, 46, 58, 62, 95, - 48, 57, 65, 90, 97, 122, 45, 46, - 58, 62, 95, 48, 57, 65, 90, 97, - 122, 45, 46, 58, 62, 95, 48, 57, - 65, 90, 97, 122, 45, 46, 58, 62, - 95, 48, 57, 65, 90, 97, 122, 45, - 46, 58, 62, 95, 48, 57, 65, 90, - 97, 122, 45, 46, 58, 62, 95, 48, - 57, 65, 90, 97, 122, 45, 46, 58, - 62, 95, 48, 57, 65, 90, 97, 122, - 45, 46, 58, 62, 95, 48, 57, 65, - 90, 97, 122, 60, 33, 47, 58, 60, - 95, 65, 90, 97, 122, 60, 60, 45, - 60, 91, 58, 60, 95, 65, 90, 97, - 122, 32, 45, 46, 47, 58, 60, 62, - 95, 9, 13, 48, 57, 65, 90, 97, - 122, 32, 45, 46, 47, 58, 60, 62, - 95, 9, 13, 48, 57, 65, 90, 97, - 122, 32, 45, 46, 47, 58, 60, 62, - 95, 9, 13, 48, 57, 65, 90, 97, - 122, 0 -}; - -/* The array of indicies into the transition array. */ -static unsigned char XMLScanner_i[] = { - 1, 2, 3, 4, 5, 6, 5, 6, - 7, 5, 8, 9, 8, 10, 5, 6, - 11, 5, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, - 24, 26, 25, 24, 27, 28, 28, 29, - 24, 30, 25, 24, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, - 38, 43, 43, 44, 45, 46, 39, 47, - 48, 49, 44, 50, 51, 51, 44, 45, - 46, 39, 47, 48, 49, 44, 50, 51, - 51, 44, 52, 53, 39, 54, 55, 48, - 56, 44, 57, 58, 58, 44, 52, 53, - 39, 54, 55, 48, 56, 44, 57, 58, - 58, 44, 45, 46, 39, 47, 48, 49, - 44, 50, 51, 51, 44, 52, 53, 39, - 54, 55, 48, 56, 44, 57, 58, 58, - 59, 60, 61, 55, 62, 63, 64, 64, - 59, 60, 61, 55, 62, 63, 64, 64, - 59, 60, 61, 55, 62, 63, 64, 64, - 44, 52, 53, 39, 54, 55, 48, 56, - 44, 57, 58, 58, 44, 52, 53, 39, - 54, 55, 48, 56, 44, 57, 58, 58, - 44, 52, 53, 39, 54, 55, 48, 56, - 44, 57, 58, 58, 65, 66, 44, 52, - 53, 39, 54, 55, 48, 56, 44, 57, - 58, 58, 44, 52, 53, 39, 54, 55, - 48, 56, 44, 57, 58, 58, 44, 52, - 53, 39, 54, 55, 48, 56, 44, 57, - 58, 58, 59, 60, 61, 55, 62, 63, - 64, 64, 59, 60, 61, 55, 62, 63, - 64, 64, 59, 60, 61, 55, 62, 63, - 64, 64, 59, 60, 61, 55, 62, 63, - 64, 64, 59, 60, 61, 55, 62, 63, - 64, 64, 59, 60, 61, 55, 62, 63, - 64, 64, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 71, 76, 76, 67, 68, - 71, 72, 73, 74, 75, 71, 76, 76, - 69, 70, 77, 78, 79, 80, 81, 82, - 83, 83, 77, 78, 79, 80, 81, 82, - 83, 83, 77, 78, 79, 80, 81, 82, - 83, 83, 77, 78, 79, 80, 81, 82, - 83, 83, 77, 78, 79, 80, 81, 82, - 83, 83, 77, 78, 79, 80, 81, 82, - 83, 83, 77, 78, 79, 80, 81, 82, - 83, 83, 77, 78, 79, 80, 81, 82, - 83, 83, 77, 78, 79, 80, 81, 82, - 83, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 91, 92, 93, 94, 93, 94, - 95, 93, 96, 94, 97, 93, 98, 99, - 99, 94, 44, 45, 46, 39, 47, 93, - 48, 49, 44, 50, 51, 51, 94, 44, - 45, 46, 39, 47, 93, 48, 49, 44, - 50, 51, 51, 94, 44, 45, 46, 39, - 47, 93, 48, 49, 44, 50, 51, 51, - 94, 0 -}; - -/* The aray of states. */ -static int XMLScanner_s[] = { - 768, 0, 0, 1026, 0, 0, 1, 1034, - 1, 1, 1, 1034, 2, 3, 1, 1034, - 3, 5, 1, 1034, 4, 7, 2, 1338, - 6, 10, 2, 2, 1034, 8, 13, 1, - 1034, 9, 15, 2, 1338, 11, 18, 1, - 16, 1026, 12, 20, 1, 1026, 13, 21, - 1, 1026, 14, 22, 1, 1026, 15, 23, - 1, 1026, 16, 24, 1, 1026, 17, 25, - 1, 1026, 18, 26, 1, 1034, 19, 27, - 1, 1034, 20, 29, 1, 1034, 21, 31, - 1, 1034, 22, 33, 2, 1338, 24, 36, - 2, 6, 1034, 26, 39, 1, 1034, 27, - 41, 2, 1338, 29, 44, 1, 19, 1338, - 30, 46, 1, 25, 1026, 31, 48, 1, - 1338, 32, 49, 1, 10, 1286, 33, 51, - 5, 3, 1286, 44, 59, 7, 4, 1286, - 59, 70, 7, 4, 1286, 74, 81, 8, - 4, 1286, 90, 93, 8, 4, 1286, 106, - 105, 7, 4, 1286, 121, 116, 8, 4, - 1286, 137, 128, 5, 3, 1286, 148, 136, - 5, 3, 1286, 159, 144, 5, 3, 1286, - 170, 152, 8, 4, 1286, 186, 164, 8, - 4, 1286, 202, 176, 8, 4, 1026, 218, - 188, 2, 1286, 220, 190, 8, 4, 1286, - 236, 202, 8, 4, 1286, 252, 214, 8, - 4, 1286, 268, 226, 5, 3, 1286, 279, - 234, 5, 3, 1286, 290, 242, 5, 3, - 1286, 301, 250, 5, 3, 1286, 312, 258, - 5, 3, 1286, 323, 266, 5, 3, 1034, - 334, 274, 1, 1034, 335, 276, 1, 1286, - 336, 278, 5, 3, 1034, 347, 286, 1, - 1286, 348, 288, 5, 3, 1034, 359, 296, - 1, 1286, 360, 298, 5, 3, 1286, 371, - 306, 5, 3, 1286, 382, 314, 5, 3, - 1286, 393, 322, 5, 3, 1286, 404, 330, - 5, 3, 1286, 415, 338, 5, 3, 1286, - 426, 346, 5, 3, 1286, 437, 354, 5, - 3, 1286, 448, 362, 5, 3, 1338, 459, - 370, 1, 28, 1598, 460, 372, 5, 2, - 8, 1050, 469, 380, 1, 1050, 470, 382, - 1, 1050, 471, 384, 3, 1310, 474, 388, - 3, 2, 1310, 481, 394, 8, 4, 1310, - 497, 407, 8, 4, 1310, 513, 420, 8, - 4, 0 -}; - -/* The array of transitions. */ -static int *XMLScanner_t[] = { - 0, 0, s+7, 0, s+28, f+0, s+11, f+0, - s+15, 0, s+11, 0, s+19, 0, s+23, 0, - s+313, f+2, s+307, f+2, s+32, 0, s+36, 0, - s+307, f+16, s+313, f+16, s+45, 0, s+49, 0, - s+53, 0, s+57, 0, s+61, 0, s+65, 0, - s+69, 0, s+90, f+4, s+73, f+4, s+77, 0, - s+73, 0, s+81, 0, s+85, 0, s+307, f+6, - s+313, f+6, s+94, 0, s+98, 0, s+307, f+19, - s+313, f+19, s+307, f+25, s+313, f+25, s+112, 0, - s+307, f+10, s+313, f+10, s+117, 0, s+108, 0, - s+152, f+31, s+103, 0, s+157, f+31, s+162, f+31, - s+117, f+14, s+122, 0, s+127, 0, s+132, f+37, - s+103, f+14, s+137, f+37, s+142, 0, s+147, f+37, - s+167, 0, s+172, 0, s+177, f+37, s+182, 0, - s+186, f+37, s+191, 0, s+196, f+37, s+201, 0, - s+206, 0, s+211, 0, s+216, 0, s+221, 0, - s+226, 0, s+231, 0, s+235, 0, s+239, 0, - s+244, 0, s+248, 0, s+253, 0, s+117, f+46, - s+108, f+34, s+152, f+51, s+103, f+34, s+157, f+51, - s+162, f+51, s+287, 0, s+282, 0, s+297, 0, - s+302, f+14, s+292, 0, s+277, 0, s+272, 0, - s+307, f+28, s+313, f+28, s+321, f+8, s+325, f+22, - s+330, f+41, s+307, f+8, s+335, f+41, s+340, f+41, - s+313, f+8, s+307, 0, s+313, 0, s+3, 0, - s+41, 0, s+267, f+12, s+262, f+12, s+257, f+12, - 0 -}; - -/* The start state. */ -static int *XMLScanner_start = s+317; - -/* Init the fsm to a runnable state. */ -void XMLScannerInit( XMLScanner *fsm ) -{ - fsm->curState = XMLScanner_start; - fsm->accept = 0; -# 53 "ragel_xmlscanner.c" -{ - fsm->sp = 0; - fsm->sp_e = 0; - fsm->mode = BEFORE; - fsm->in_comment = 0; - fsm->in_cdata = 0; - fsm->in_tag = 0; - } -# 338 "ragel_xmlscanner_out.c" -} - -/* Did the fsm accept? */ -int XMLScannerAccept( XMLScanner *fsm ) -{ - return fsm->accept; -} - -/* Binary search an array of keys looking for a key. */ -static char *XMLScannerBSearch( char c, char *keys, int len ) -{ - char *lower = keys; - char *mid; - char *upper = keys + len - 1; - while (1) { - if ( upper < lower ) - return 0; - - /* Find the midpoint. */ - mid = lower + ((upper-lower) >> 1); - - if ( c < *mid ) - upper = mid - 1; - else if ( c > *mid ) - lower = mid + 1; - else - return mid; - } -} - -/* Binary search an array of keys looking for a key. */ -static char *XMLScannerRangeBSearch( char c, char *keys, int len ) -{ - char *lower = keys; - char *mid; - char *upper = keys + len - 2; - while (1) { - if ( upper < lower ) - return 0; - - /* Find the midpoint. Be sure to settle on the - * lower end of a range. */ - mid = lower + (((upper-lower) >> 1) & ~1); - - if ( c < mid[0] ) - upper = mid - 2; - else if ( c > mid[1] ) - lower = mid + 2; - else { - /* The key was found in the range mid, return it. */ - return mid; - } - } -} - -/* Execute the fsm on some chunk of data. */ -void XMLScannerExecute( XMLScanner *fsm, char *data, int dlen ) -{ - char *p = data; - int len = dlen; - int *cs = fsm->curState; - int specs, **trans, *funcs, nfuncs; - char *keys; - unsigned char *inds; - - if ( data == 0 ) - goto finishInput; - -again: - if ( cs == 0 || len == 0 ) - goto out; - - /* Get required data. */ - specs = *cs++; - keys = k + *cs++; - inds = i + *cs++; - - /* Try flat index. */ - if ( specs & SPEC_ANY_FLAT ) { - int indsLen = *cs++; - keys += 2; - inds += indsLen; - } - - /* Try binary search single. */ - if ( specs & SPEC_ANY_SINGLE ) { - /* Try to find the key. */ - int indsLen = *cs++; - char *match = XMLScannerBSearch( *p, keys, indsLen ); - - if ( match != 0 ) { - trans = t + (inds[match - keys]<<1); - goto match; - } - - /* Advance over the keys and indicies. */ - keys += indsLen; - inds += indsLen; - } - - /* Try binary search range. */ - if ( specs & SPEC_ANY_RANGE ) { - /* Try to find the key. */ - int indsLen = *cs++; - char *match = XMLScannerRangeBSearch( *p, keys, (indsLen<<1) ); - - if ( match != 0 ) { - trans = t + (inds[(match - keys)>>1]<<1); - goto match; - } - - /* Advance over the keys and indicies. */ - keys += (indsLen<<1); - inds += indsLen; - } - - /* Try the default transition. */ - if ( specs & SPEC_ANY_DEF ) { - trans = t + ((*inds)<<1); - goto match; - } - - /* No match. */ - cs = 0; - goto out; - -match: - /* Move to the new state. */ - cs = *trans++; - - /* Check for functions. */ - if ( (funcs=*trans) == 0 ) - goto noFuncs; - -execFuncs: - nfuncs = *funcs++; - while ( nfuncs-- > 0 ) { - switch ( *funcs++ ) { - case 0: -# 63 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "commentstart: %d %c\n", p - data, *p); - fsm->in_comment = 1; - } break; - case 1: -# 68 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "commentend: %d %c\n", p - data, *p); - fsm->in_comment = 0; - fsm->in_tag = 0; - } break; - case 2: -# 74 "ragel_xmlscanner.c" - { - fsm->in_cdata = 1; - } break; - case 3: -# 78 "ragel_xmlscanner.c" - { - fsm->in_cdata = 0; - fsm->in_tag = 0; - } break; - case 4: -# 83 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "enter tag at %d\n", p - data); - fsm->in_tag = 1; - } break; - case 5: -# 88 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "exit tag at %d\n", p - data); - fsm->in_tag = 0; - } break; - case 6: -# 93 "ragel_xmlscanner.c" - { -// fprintf(stderr, "name: %d %c\n", p - data, *p); - } break; - case 7: -# 97 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "stag\n"); - pushTag(fsm); - } break; - case 8: -# 102 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "stag: start: %d end: %d %c\n", fsm->mark_namestart - data, fsm->mark_nameend - data, *p); - checkETag(fsm); - } break; - case 9: -# 107 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "markstart: %d %c\n", p - data, *p); - fsm->mark_namestart = p; - } break; - case 10: -# 112 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "markend: %d %c\n", (p - 1) - data, *(p-1)); - fsm->mark_nameend = p; - } break; - case 11: -# 117 "ragel_xmlscanner.c" - { -// fprintf(stderr, "attrstart: %d %c\n", p - data, *p); - fsm->mark_attrstart = p; - } break; - case 12: -# 122 "ragel_xmlscanner.c" - { -// fprintf(stderr, "attrend: %d %c\n", (p - 1) - data, *(p - 1)); - fsm->mark_attrend = p; - } break; - case 13: -# 128 "ragel_xmlscanner.c" - { - // fprintf(stderr, "attr: start: %d end: %d %c\n", fsm->mark_attrstart - data, fsm->mark_attrend - data, *p); -} break; - case 14: -# 132 "ragel_xmlscanner.c" - { - DEBUG && fprintf(stderr, "pi: %d\n", p - data); -} break; -# 564 "ragel_xmlscanner_out.c" - } - } - -noFuncs: - p++, len--; - goto again; - -finishInput: - if ( cs != 0 && *cs & SPEC_IS_FINAL ) { - /* The machine accepts. */ - fsm->accept = 1; - /* If finishing in a final state then execute the - * out functions for it. (if any). */ - if ( *cs & SPEC_OUT_FUNC ) { - funcs = f+*(cs + (*cs>>8)-1); - len = 1; - goto execFuncs; - } - } - else { - /* If we are not in a final state then this - * is an error. Move to the error state. */ - fsm->curState = 0; - } - -out: - fsm->curState = cs; -} - -/* Indicate to the fsm that the input is done. Does cleanup tasks. */ -void XMLScannerFinish( XMLScanner *fsm ) -{ - XMLScannerExecute( fsm, 0, 0 ); -} - -#undef f -#undef s -#undef k -#undef i -#undef t -#undef SPEC_ANY_FLAT -#undef SPEC_ANY_SINGLE -#undef SPEC_ANY_RANGE -#undef SPEC_ANY_DEF -#undef SPEC_IS_FINAL -#undef SPEC_OUT_FUNC - -# 165 "ragel_xmlscanner.c" - - - -/* - * findCompletion does the actual work of driving the state machine - * - * Input: - * data - pointer to the buffer containing the XML data - * len - length of the data to analyze - * cursor - logical position of the editing cursor in the data buffer - * result - pointer to integer, which will contain a bit field with - * additional status information after completion: - * - * Completion rules: - * - * - The system builds a stack of tags which are open at the indicated cursor - * position in the XML data. - * - If completion is possible at that cursor position, the integer - * result will be 0. The caller should insert a closing tag for the - * topmost tag name on the stack. - * - It can use the other elements of the - * stack for GUI goodies, like display of a stack of currently open tags - * in the editor. However, it should not assume that the tag stack can be - * used to close all opening tags. Instead, it should re-evaluate - * the document with this routine after the tag has been inserted and the - * cursor position might have moved as a result. - * - * - There are a few cases where completion should not be performed, this - * will be indicated by the bitfield in the result int parameter: - * - ERROR_IN_TAG: The cursor is in the middle of a tag. No useful completion - * is possible (maybe look at the prefix and complete - * accordingly, sometime in the future...) - * - ERROR_IN_COMMENT: The cursor is inside a comment block. - * - ERROR_IN_CDATA: The cursor is inside a cdata section. - * - ERROR_NO_TAG: There's no unmatched opening tag to the left of the cursor - * - ERROR_ALREADY_BALANCED_HERE: The currently open tags to the left of the - * cursor are already balanced with an equal amount - * of closing tags to the right of the cursor. - * - * Results: - * - * Returns a pointer to an array of pointers to chars. - * Each array entry contains one tag from the stack - * tags open at the cursor position. - * - */ -char (*findCompletion(char *data, int len, int cursor, int *result, int tagpositions[]))[] { - - XMLScanner scanner, *machine = &scanner; - char toptag[MAXTAGLENGTH]; - unsigned int i, lower, upper, openingcount, closingcount, identical_opening, identical_closing; - - char (*resultstack)[MAXTAGLENGTH] = NULL; - char (*resultstack_e)[MAXTAGLENGTH] = NULL; - - *result = 0; - - bzero(toptag, MAXTAGLENGTH); - - - // ------------ analyze data before cursor position ------------------ - - XMLScannerInit(machine); - - machine->mode = BEFORE; - machine->cursor = cursor; - - XMLScannerExecute(machine, data, cursor); - XMLScannerFinish(machine); - - - /* Any unbalanced open tags on the stack at all? If so, allocate memory - * and copy the tags over to a newly allocated buffer, into a stack. - */ - if (machine->sp) { - resultstack = malloc(MAXTAGLENGTH * ((machine->sp/2) + 1))