Commit be809a8b authored by 刘俊宏's avatar 刘俊宏

完成 富文本编辑器ing

parent f40eb3e8
...@@ -453,6 +453,10 @@ ...@@ -453,6 +453,10 @@
F969BF08244EC38000C79953 /* GoodsCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F969BF06244EC38000C79953 /* GoodsCollectionViewCell.xib */; }; F969BF08244EC38000C79953 /* GoodsCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F969BF06244EC38000C79953 /* GoodsCollectionViewCell.xib */; };
F969BF1E244EE67900C79953 /* GoodsManageListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F969BF1C244EE67900C79953 /* GoodsManageListVC.swift */; }; F969BF1E244EE67900C79953 /* GoodsManageListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F969BF1C244EE67900C79953 /* GoodsManageListVC.swift */; };
F969BF1F244EE67900C79953 /* GoodsManageListVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = F969BF1D244EE67900C79953 /* GoodsManageListVC.xib */; }; F969BF1F244EE67900C79953 /* GoodsManageListVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = F969BF1D244EE67900C79953 /* GoodsManageListVC.xib */; };
F96A581D24790D9A0070A057 /* libxml2.2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = F96A581C24790D9A0070A057 /* libxml2.2.tbd */; };
F96A585024790E300070A057 /* TFHpple.m in Sources */ = {isa = PBXBuildFile; fileRef = F96A584B24790E300070A057 /* TFHpple.m */; };
F96A585124790E300070A057 /* TFHppleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = F96A584E24790E300070A057 /* TFHppleElement.m */; };
F96A585224790E300070A057 /* XPathQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = F96A584F24790E300070A057 /* XPathQuery.m */; };
F96E9D59246656A700B5B94A /* HGImageCompleteButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96E9D54246656A700B5B94A /* HGImageCompleteButton.swift */; }; F96E9D59246656A700B5B94A /* HGImageCompleteButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96E9D54246656A700B5B94A /* HGImageCompleteButton.swift */; };
F96E9D5A246656A700B5B94A /* HGImageCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96E9D55246656A700B5B94A /* HGImageCollectionViewController.swift */; }; F96E9D5A246656A700B5B94A /* HGImageCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96E9D55246656A700B5B94A /* HGImageCollectionViewController.swift */; };
F96E9D5B246656A700B5B94A /* HGImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96E9D56246656A700B5B94A /* HGImageCollectionViewCell.swift */; }; F96E9D5B246656A700B5B94A /* HGImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96E9D56246656A700B5B94A /* HGImageCollectionViewCell.swift */; };
...@@ -998,6 +1002,13 @@ ...@@ -998,6 +1002,13 @@
F969BF06244EC38000C79953 /* GoodsCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GoodsCollectionViewCell.xib; sourceTree = "<group>"; }; F969BF06244EC38000C79953 /* GoodsCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GoodsCollectionViewCell.xib; sourceTree = "<group>"; };
F969BF1C244EE67900C79953 /* GoodsManageListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoodsManageListVC.swift; sourceTree = "<group>"; }; F969BF1C244EE67900C79953 /* GoodsManageListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoodsManageListVC.swift; sourceTree = "<group>"; };
F969BF1D244EE67900C79953 /* GoodsManageListVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GoodsManageListVC.xib; sourceTree = "<group>"; }; F969BF1D244EE67900C79953 /* GoodsManageListVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GoodsManageListVC.xib; sourceTree = "<group>"; };
F96A581C24790D9A0070A057 /* libxml2.2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.2.tbd; path = usr/lib/libxml2.2.tbd; sourceTree = SDKROOT; };
F96A584A24790E300070A057 /* TFHppleElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TFHppleElement.h; sourceTree = "<group>"; };
F96A584B24790E300070A057 /* TFHpple.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TFHpple.m; sourceTree = "<group>"; };
F96A584C24790E300070A057 /* XPathQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPathQuery.h; sourceTree = "<group>"; };
F96A584D24790E300070A057 /* TFHpple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TFHpple.h; sourceTree = "<group>"; };
F96A584E24790E300070A057 /* TFHppleElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TFHppleElement.m; sourceTree = "<group>"; };
F96A584F24790E300070A057 /* XPathQuery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPathQuery.m; sourceTree = "<group>"; };
F96E9D54246656A700B5B94A /* HGImageCompleteButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HGImageCompleteButton.swift; sourceTree = "<group>"; }; F96E9D54246656A700B5B94A /* HGImageCompleteButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HGImageCompleteButton.swift; sourceTree = "<group>"; };
F96E9D55246656A700B5B94A /* HGImageCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HGImageCollectionViewController.swift; sourceTree = "<group>"; }; F96E9D55246656A700B5B94A /* HGImageCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HGImageCollectionViewController.swift; sourceTree = "<group>"; };
F96E9D56246656A700B5B94A /* HGImageCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HGImageCollectionViewCell.swift; sourceTree = "<group>"; }; F96E9D56246656A700B5B94A /* HGImageCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HGImageCollectionViewCell.swift; sourceTree = "<group>"; };
...@@ -1023,6 +1034,7 @@ ...@@ -1023,6 +1034,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
F96A581D24790D9A0070A057 /* libxml2.2.tbd in Frameworks */,
E0707DC72462457200E039A8 /* libz.tbd in Frameworks */, E0707DC72462457200E039A8 /* libz.tbd in Frameworks */,
E0404F842476355500D9ACE8 /* SDWebImageMapKit in Frameworks */, E0404F842476355500D9ACE8 /* SDWebImageMapKit in Frameworks */,
F93E32092473CD6500524DFC /* libresolv.tbd in Frameworks */, F93E32092473CD6500524DFC /* libresolv.tbd in Frameworks */,
...@@ -1091,6 +1103,7 @@ ...@@ -1091,6 +1103,7 @@
824621C23DA37CD28A2F345F /* Frameworks */ = { 824621C23DA37CD28A2F345F /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
F96A581C24790D9A0070A057 /* libxml2.2.tbd */,
F93E32082473CD6500524DFC /* libresolv.tbd */, F93E32082473CD6500524DFC /* libresolv.tbd */,
E03984972468F2DA00DFA56F /* SafariServices.framework */, E03984972468F2DA00DFA56F /* SafariServices.framework */,
E03984952468F2D100DFA56F /* Photos.framework */, E03984952468F2D100DFA56F /* Photos.framework */,
...@@ -2106,6 +2119,7 @@ ...@@ -2106,6 +2119,7 @@
F956D560246A2D9C003FF510 /* LMNote */ = { F956D560246A2D9C003FF510 /* LMNote */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
F96A584924790E300070A057 /* Hpple */,
F956D561246A2D9C003FF510 /* TextView */, F956D561246A2D9C003FF510 /* TextView */,
F956D56A246A2D9C003FF510 /* OtherViews */, F956D56A246A2D9C003FF510 /* OtherViews */,
F956D575246A2D9C003FF510 /* LMNoteViewController.h */, F956D575246A2D9C003FF510 /* LMNoteViewController.h */,
...@@ -2355,6 +2369,19 @@ ...@@ -2355,6 +2369,19 @@
path = "商品管理"; path = "商品管理";
sourceTree = "<group>"; sourceTree = "<group>";
}; };
F96A584924790E300070A057 /* Hpple */ = {
isa = PBXGroup;
children = (
F96A584A24790E300070A057 /* TFHppleElement.h */,
F96A584B24790E300070A057 /* TFHpple.m */,
F96A584C24790E300070A057 /* XPathQuery.h */,
F96A584D24790E300070A057 /* TFHpple.h */,
F96A584E24790E300070A057 /* TFHppleElement.m */,
F96A584F24790E300070A057 /* XPathQuery.m */,
);
path = Hpple;
sourceTree = "<group>";
};
F96E9D53246656A700B5B94A /* HGImage */ = { F96E9D53246656A700B5B94A /* HGImage */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
...@@ -2821,6 +2848,7 @@ ...@@ -2821,6 +2848,7 @@
E0516F7F244806C500E373CE /* MsgCenterViewController.swift in Sources */, E0516F7F244806C500E373CE /* MsgCenterViewController.swift in Sources */,
F94A315724628AC600FEC38E /* WorkItemCollectionViewCell.swift in Sources */, F94A315724628AC600FEC38E /* WorkItemCollectionViewCell.swift in Sources */,
F950FDA52451453A00C40530 /* ShopInfoModel.swift in Sources */, F950FDA52451453A00C40530 /* ShopInfoModel.swift in Sources */,
F96A585024790E300070A057 /* TFHpple.m in Sources */,
E0516F822448086700E373CE /* MsgCenterCell.swift in Sources */, E0516F822448086700E373CE /* MsgCenterCell.swift in Sources */,
F95A9ED524551DF900867849 /* UIView+constraints.swift in Sources */, F95A9ED524551DF900867849 /* UIView+constraints.swift in Sources */,
F956D5B9246A33E2003FF510 /* OrderInterface.swift in Sources */, F956D5B9246A33E2003FF510 /* OrderInterface.swift in Sources */,
...@@ -2835,6 +2863,7 @@ ...@@ -2835,6 +2863,7 @@
E0B5308624728FB600FFCC15 /* WarehouseInterface.swift in Sources */, E0B5308624728FB600FFCC15 /* WarehouseInterface.swift in Sources */,
E02FD9EC2455627300E10E27 /* ChuKuViewController.swift in Sources */, E02FD9EC2455627300E10E27 /* ChuKuViewController.swift in Sources */,
E07B1E6F245929060055BA3C /* GYSGLViewController.swift in Sources */, E07B1E6F245929060055BA3C /* GYSGLViewController.swift in Sources */,
F96A585124790E300070A057 /* TFHppleElement.m in Sources */,
E0D197BB2448431C002B080C /* BabyCallback.m in Sources */, E0D197BB2448431C002B080C /* BabyCallback.m in Sources */,
F950FDDD24518B9500C40530 /* FSCalendarCollectionViewLayout.m in Sources */, F950FDDD24518B9500C40530 /* FSCalendarCollectionViewLayout.m in Sources */,
E07B1E5E24591AA50055BA3C /* KeHuXQViewController.swift in Sources */, E07B1E5E24591AA50055BA3C /* KeHuXQViewController.swift in Sources */,
...@@ -2884,6 +2913,7 @@ ...@@ -2884,6 +2913,7 @@
E0C4F4B5244EE9EE00CC7E2F /* YuShouCell.swift in Sources */, E0C4F4B5244EE9EE00CC7E2F /* YuShouCell.swift in Sources */,
F933F6C52452C68B00189561 /* PKHUDSuccessView.swift in Sources */, F933F6C52452C68B00189561 /* PKHUDSuccessView.swift in Sources */,
E09B03A82445B04E00211A51 /* BaseView.swift in Sources */, E09B03A82445B04E00211A51 /* BaseView.swift in Sources */,
F96A585224790E300070A057 /* XPathQuery.m in Sources */,
F933F6CB2452C68B00189561 /* Window.swift in Sources */, F933F6CB2452C68B00189561 /* Window.swift in Sources */,
E0DDCB0F244AD8C500DF54C7 /* DaiQueRenCell.swift in Sources */, E0DDCB0F244AD8C500DF54C7 /* DaiQueRenCell.swift in Sources */,
E042F74024528CD500CDFA12 /* TitleAndOnlyBtnCell.swift in Sources */, E042F74024528CD500CDFA12 /* TitleAndOnlyBtnCell.swift in Sources */,
......
...@@ -35,7 +35,6 @@ class BaseViewController: UIViewController ,NavBarViewDelegate{ ...@@ -35,7 +35,6 @@ class BaseViewController: UIViewController ,NavBarViewDelegate{
self.automaticallyAdjustsScrollViewInsets = false; self.automaticallyAdjustsScrollViewInsets = false;
} }
self.view.backgroundColor = UIColor(named: "app底色") self.view.backgroundColor = UIColor(named: "app底色")
// Do any additional setup after loading the view.
} }
......
//
// TFHpple.h
// Hpple
//
// Created by Geoffrey Grosenbach on 1/31/09.
//
// Copyright (c) 2009 Topfunky Corporation, http://topfunky.com
//
// MIT LICENSE
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#import <Foundation/Foundation.h>
#import "TFHppleElement.h"
@interface TFHpple : NSObject
- (id) initWithData:(NSData *)theData encoding:(NSString *)encoding isXML:(BOOL)isDataXML;
- (id) initWithData:(NSData *)theData isXML:(BOOL)isDataXML;
- (id) initWithXMLData:(NSData *)theData encoding:(NSString *)encoding;
- (id) initWithXMLData:(NSData *)theData;
- (id) initWithHTMLData:(NSData *)theData encoding:(NSString *)encoding;
- (id) initWithHTMLData:(NSData *)theData;
+ (TFHpple *) hppleWithData:(NSData *)theData encoding:(NSString *)encoding isXML:(BOOL)isDataXML;
+ (TFHpple *) hppleWithData:(NSData *)theData isXML:(BOOL)isDataXML;
+ (TFHpple *) hppleWithXMLData:(NSData *)theData encoding:(NSString *)encoding;
+ (TFHpple *) hppleWithXMLData:(NSData *)theData;
+ (TFHpple *) hppleWithHTMLData:(NSData *)theData encoding:(NSString *)encoding;
+ (TFHpple *) hppleWithHTMLData:(NSData *)theData;
- (NSArray *) searchWithXPathQuery:(NSString *)xPathOrCSS;
- (TFHppleElement *) peekAtSearchWithXPathQuery:(NSString *)xPathOrCSS;
@property (nonatomic, readonly) NSData * data;
@property (nonatomic, readonly) NSString * encoding;
@end
//
// TFHpple.m
// Hpple
//
// Created by Geoffrey Grosenbach on 1/31/09.
//
// Copyright (c) 2009 Topfunky Corporation, http://topfunky.com
//
// MIT LICENSE
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#import "TFHpple.h"
#import "XPathQuery.h"
@interface TFHpple ()
{
NSData * data;
NSString * encoding;
BOOL isXML;
}
@end
@implementation TFHpple
@synthesize data;
@synthesize encoding;
- (id) initWithData:(NSData *)theData encoding:(NSString *)theEncoding isXML:(BOOL)isDataXML
{
if (!(self = [super init])) {
return nil;
}
data = theData;
encoding = theEncoding;
isXML = isDataXML;
return self;
}
- (id) initWithData:(NSData *)theData isXML:(BOOL)isDataXML
{
return [self initWithData:theData encoding:nil isXML:isDataXML];
}
- (id) initWithXMLData:(NSData *)theData encoding:(NSString *)theEncoding
{
return [self initWithData:theData encoding:theEncoding isXML:YES];
}
- (id) initWithXMLData:(NSData *)theData
{
return [self initWithData:theData encoding:nil isXML:YES];
}
- (id) initWithHTMLData:(NSData *)theData encoding:(NSString *)theEncoding
{
return [self initWithData:theData encoding:theEncoding isXML:NO];
}
- (id) initWithHTMLData:(NSData *)theData
{
return [self initWithData:theData encoding:nil isXML:NO];
}
+ (TFHpple *) hppleWithData:(NSData *)theData encoding:(NSString *)theEncoding isXML:(BOOL)isDataXML {
return [[[self class] alloc] initWithData:theData encoding:theEncoding isXML:isDataXML];
}
+ (TFHpple *) hppleWithData:(NSData *)theData isXML:(BOOL)isDataXML {
return [[self class] hppleWithData:theData encoding:nil isXML:isDataXML];
}
+ (TFHpple *) hppleWithHTMLData:(NSData *)theData encoding:(NSString *)theEncoding {
return [[self class] hppleWithData:theData encoding:theEncoding isXML:NO];
}
+ (TFHpple *) hppleWithHTMLData:(NSData *)theData {
return [[self class] hppleWithData:theData encoding:nil isXML:NO];
}
+ (TFHpple *) hppleWithXMLData:(NSData *)theData encoding:(NSString *)theEncoding {
return [[self class] hppleWithData:theData encoding:theEncoding isXML:YES];
}
+ (TFHpple *) hppleWithXMLData:(NSData *)theData {
return [[self class] hppleWithData:theData encoding:nil isXML:YES];
}
#pragma mark -
// Returns all elements at xPath.
- (NSArray *) searchWithXPathQuery:(NSString *)xPathOrCSS
{
NSArray * detailNodes = nil;
if (isXML) {
detailNodes = PerformXMLXPathQueryWithEncoding(data, xPathOrCSS, encoding);
} else {
detailNodes = PerformHTMLXPathQueryWithEncoding(data, xPathOrCSS, encoding);
}
NSMutableArray * hppleElements = [NSMutableArray array];
for (id node in detailNodes) {
[hppleElements addObject:[TFHppleElement hppleElementWithNode:node isXML:isXML withEncoding:encoding]];
}
return hppleElements;
}
// Returns first element at xPath
- (TFHppleElement *) peekAtSearchWithXPathQuery:(NSString *)xPathOrCSS
{
NSArray * elements = [self searchWithXPathQuery:xPathOrCSS];
if ([elements count] >= 1) {
return [elements objectAtIndex:0];
}
return nil;
}
@end
//
// TFHppleElement.h
// Hpple
//
// Created by Geoffrey Grosenbach on 1/31/09.
//
// Copyright (c) 2009 Topfunky Corporation, http://topfunky.com
//
// MIT LICENSE
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#import <Foundation/Foundation.h>
@interface TFHppleElement : NSObject
- (id) initWithNode:(NSDictionary *) theNode isXML:(BOOL)isDataXML withEncoding:(NSString *)theEncoding;
+ (TFHppleElement *) hppleElementWithNode:(NSDictionary *) theNode isXML:(BOOL)isDataXML withEncoding:(NSString *)theEncoding;
@property (nonatomic, copy, readonly) NSString *raw;
// Returns this tag's innerHTML content.
@property (nonatomic, copy, readonly) NSString *content;
// Returns the name of the current tag, such as "h3".
@property (nonatomic, copy, readonly) NSString *tagName;
// Returns tag attributes with name as key and content as value.
// href = 'http://peepcode.com'
// class = 'highlight'
@property (nonatomic, strong, readonly) NSDictionary *attributes;
// Returns the children of a given node
@property (nonatomic, strong, readonly) NSArray *children;
// Returns the first child of a given node
@property (nonatomic, strong, readonly) TFHppleElement *firstChild;
// the parent of a node
@property (nonatomic, unsafe_unretained, readonly) TFHppleElement *parent;
// Returns YES if the node has any child
// This is more efficient than using the children property since no NSArray is constructed
- (BOOL)hasChildren;
// Returns YES if this is a text node
- (BOOL)isTextNode;
// Provides easy access to the content of a specific attribute,
// such as 'href' or 'class'.
- (NSString *) objectForKey:(NSString *) theKey;
// Returns the children whose tag name equals the given string
// (comparison is performed with NSString's isEqualToString)
// Returns an empty array if no matching child is found
- (NSArray *) childrenWithTagName:(NSString *)tagName;
// Returns the first child node whose tag name equals the given string
// (comparison is performed with NSString's isEqualToString)
// Returns nil if no matching child is found
- (TFHppleElement *) firstChildWithTagName:(NSString *)tagName;
// Returns the children whose class equals the given string
// (comparison is performed with NSString's isEqualToString)
// Returns an empty array if no matching child is found
- (NSArray *) childrenWithClassName:(NSString *)className;
// Returns the first child whose class requals the given string
// (comparison is performed with NSString's isEqualToString)
// Returns nil if no matching child is found
- (TFHppleElement *) firstChildWithClassName:(NSString*)className;
// Returns the first text node from this element's children
// Returns nil if there is no text node among the children
- (TFHppleElement *) firstTextChild;
// Returns the string contained by the first text node from this element's children
// Convenience method which can be used instead of firstTextChild.content
- (NSString *) text;
// Returns elements searched with xpath
- (NSArray *) searchWithXPathQuery:(NSString *)xPathOrCSS;
// Custom keyed subscripting
- (id)objectForKeyedSubscript:(id)key;
@end
//
// TFHppleElement.m
// Hpple
//
// Created by Geoffrey Grosenbach on 1/31/09.
//
// Copyright (c) 2009 Topfunky Corporation, http://topfunky.com
//
// MIT LICENSE
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#import "TFHppleElement.h"
#import "XPathQuery.h"
static NSString * const TFHppleNodeContentKey = @"nodeContent";
static NSString * const TFHppleNodeNameKey = @"nodeName";
static NSString * const TFHppleNodeChildrenKey = @"nodeChildArray";
static NSString * const TFHppleNodeAttributeArrayKey = @"nodeAttributeArray";
static NSString * const TFHppleNodeAttributeNameKey = @"attributeName";
static NSString * const TFHppleTextNodeName = @"text";
@interface TFHppleElement ()
{
NSDictionary * node;
BOOL isXML;
NSString *encoding;
__unsafe_unretained TFHppleElement *parent;
}
@property (nonatomic, unsafe_unretained, readwrite) TFHppleElement *parent;
@end
@implementation TFHppleElement
@synthesize parent;
- (id) initWithNode:(NSDictionary *) theNode isXML:(BOOL)isDataXML withEncoding:(NSString *)theEncoding
{
if (!(self = [super init]))
return nil;
isXML = isDataXML;
node = theNode;
encoding = theEncoding;
return self;
}
+ (TFHppleElement *) hppleElementWithNode:(NSDictionary *) theNode isXML:(BOOL)isDataXML withEncoding:(NSString *)theEncoding
{
return [[[self class] alloc] initWithNode:theNode isXML:isDataXML withEncoding:theEncoding];
}
#pragma mark -
- (NSString *)raw
{
return [node objectForKey:@"raw"];
}
- (NSString *) content
{
return [node objectForKey:TFHppleNodeContentKey];
}
- (NSString *) tagName
{
return [node objectForKey:TFHppleNodeNameKey];
}
- (NSArray *) children
{
NSMutableArray *children = [NSMutableArray array];
for (NSDictionary *child in [node objectForKey:TFHppleNodeChildrenKey]) {
TFHppleElement *element = [TFHppleElement hppleElementWithNode:child isXML:isXML withEncoding:encoding];
element.parent = self;
[children addObject:element];
}
return children;
}
- (TFHppleElement *) firstChild
{
NSArray * children = self.children;
if (children.count)
return [children objectAtIndex:0];
return nil;
}
- (NSDictionary *) attributes
{
NSMutableDictionary * translatedAttributes = [NSMutableDictionary dictionary];
for (NSDictionary * attributeDict in [node objectForKey:TFHppleNodeAttributeArrayKey]) {
if ([attributeDict objectForKey:TFHppleNodeContentKey] && [attributeDict objectForKey:TFHppleNodeAttributeNameKey]) {
[translatedAttributes setObject:[attributeDict objectForKey:TFHppleNodeContentKey]
forKey:[attributeDict objectForKey:TFHppleNodeAttributeNameKey]];
}
}
return translatedAttributes;
}
- (NSString *) objectForKey:(NSString *) theKey
{
return [[self attributes] objectForKey:theKey];
}
- (id) description
{
return [node description];
}
- (BOOL)hasChildren
{
if ([node objectForKey:TFHppleNodeChildrenKey])
return YES;
else
return NO;
}
- (BOOL)isTextNode
{
// we must distinguish between real text nodes and standard nodes with tha name "text" (<text>)
// real text nodes must have content
if ([self.tagName isEqualToString:TFHppleTextNodeName] && (self.content))
return YES;
else
return NO;
}
- (NSArray*) childrenWithTagName:(NSString*)tagName
{
NSMutableArray* matches = [NSMutableArray array];
for (TFHppleElement* child in self.children)
{
if ([child.tagName isEqualToString:tagName])
[matches addObject:child];
}
return matches;
}
- (TFHppleElement *) firstChildWithTagName:(NSString*)tagName
{
for (TFHppleElement* child in self.children)
{
if ([child.tagName isEqualToString:tagName])
return child;
}
return nil;
}
- (NSArray*) childrenWithClassName:(NSString*)className
{
NSMutableArray* matches = [NSMutableArray array];
for (TFHppleElement* child in self.children)
{
if ([[child objectForKey:@"class"] isEqualToString:className])
[matches addObject:child];
}
return matches;
}
- (TFHppleElement *) firstChildWithClassName:(NSString*)className
{
for (TFHppleElement* child in self.children)
{
if ([[child objectForKey:@"class"] isEqualToString:className])
return child;
}
return nil;
}
- (TFHppleElement *) firstTextChild
{
for (TFHppleElement* child in self.children)
{
if ([child isTextNode])
return child;
}
return [self firstChildWithTagName:TFHppleTextNodeName];
}
- (NSString *) text
{
return self.firstTextChild.content;
}
// Returns all elements at xPath.
- (NSArray *) searchWithXPathQuery:(NSString *)xPathOrCSS
{
NSData *data = [self.raw dataUsingEncoding:NSUTF8StringEncoding];
NSArray * detailNodes = nil;
if (isXML) {
detailNodes = PerformXMLXPathQueryWithEncoding(data, xPathOrCSS, encoding);
} else {
detailNodes = PerformHTMLXPathQueryWithEncoding(data, xPathOrCSS, encoding);
}
NSMutableArray * hppleElements = [NSMutableArray array];
for (id newNode in detailNodes) {
[hppleElements addObject:[TFHppleElement hppleElementWithNode:newNode isXML:isXML withEncoding:encoding]];
}
return hppleElements;
}
// Returns first element at xPath
- (TFHppleElement *) peekAtSearchWithXPathQuery:(NSString *)xPathOrCSS
{
NSArray * elements = [self searchWithXPathQuery:xPathOrCSS];
if ([elements count] >= 1) {
return [elements objectAtIndex:0];
}
return nil;
}
// Custom keyed subscripting
- (id)objectForKeyedSubscript:(id)key
{
return [self objectForKey:key];
}
@end
//
// XPathQuery.h
// FuelFinder
//
// Created by Matt Gallagher on 4/08/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
NSArray *PerformHTMLXPathQuery(NSData *document, NSString *query);
NSArray *PerformHTMLXPathQueryWithEncoding(NSData *document, NSString *query,NSString *encoding);
NSArray *PerformXMLXPathQuery(NSData *document, NSString *query);
NSArray *PerformXMLXPathQueryWithEncoding(NSData *document, NSString *query,NSString *encoding);
//
// XPathQuery.m
// FuelFinder
//
// Created by Matt Gallagher on 4/08/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import "XPathQuery.h"
#import <libxml/tree.h>
#import <libxml/parser.h>
#import <libxml/HTMLparser.h>
#import <libxml/xpath.h>
#import <libxml/xpathInternals.h>
NSDictionary *DictionaryForNode(xmlNodePtr currentNode, NSMutableDictionary *parentResult,BOOL parentContent);
NSArray *PerformXPathQuery(xmlDocPtr doc, NSString *query);
NSDictionary *DictionaryForNode(xmlNodePtr currentNode, NSMutableDictionary *parentResult,BOOL parentContent)
{
NSMutableDictionary *resultForNode = [NSMutableDictionary dictionary];
if (currentNode->name) {
NSString *currentNodeContent = [NSString stringWithCString:(const char *)currentNode->name
encoding:NSUTF8StringEncoding];
resultForNode[@"nodeName"] = currentNodeContent;
}
xmlChar *nodeContent = xmlNodeGetContent(currentNode);
if (nodeContent != NULL) {
NSString *currentNodeContent = [NSString stringWithCString:(const char *)nodeContent
encoding:NSUTF8StringEncoding];
if ([resultForNode[@"nodeName"] isEqual:@"text"] && parentResult) {
if (parentContent) {
NSCharacterSet *charactersToTrim = [NSCharacterSet whitespaceAndNewlineCharacterSet];
parentResult[@"nodeContent"] = [currentNodeContent stringByTrimmingCharactersInSet:charactersToTrim];
/** Memory leak point release, Prevent memory leak */
xmlFree(nodeContent);
/** Memory leak point release, Prevent memory leak */
return nil;
}
if (currentNodeContent != nil) {
resultForNode[@"nodeContent"] = currentNodeContent;
}
/** Memory leak point release, Prevent memory leak */
xmlFree(nodeContent);
/** Memory leak point release, Prevent memory leak */
return resultForNode;
} else {
resultForNode[@"nodeContent"] = currentNodeContent;
}
xmlFree(nodeContent);
}
xmlAttr *attribute = currentNode->properties;
if (attribute) {
NSMutableArray *attributeArray = [NSMutableArray array];
while (attribute) {
NSMutableDictionary *attributeDictionary = [NSMutableDictionary dictionary];
NSString *attributeName = [NSString stringWithCString:(const char *)attribute->name
encoding:NSUTF8StringEncoding];
if (attributeName) {
attributeDictionary[@"attributeName"] = attributeName;
}
if (attribute->children) {
NSDictionary *childDictionary = DictionaryForNode(attribute->children, attributeDictionary, true);
if (childDictionary) {
attributeDictionary[@"attributeContent"] = childDictionary;
}
}
if ([attributeDictionary count] > 0) {
[attributeArray addObject:attributeDictionary];
}
attribute = attribute->next;
}
if ([attributeArray count] > 0) {
resultForNode[@"nodeAttributeArray"] = attributeArray;
}
}
xmlNodePtr childNode = currentNode->children;
if (childNode) {
NSMutableArray *childContentArray = [NSMutableArray array];
while (childNode) {
NSDictionary *childDictionary = DictionaryForNode(childNode, resultForNode,false);
if (childDictionary) {
[childContentArray addObject:childDictionary];
}
childNode = childNode->next;
}
if ([childContentArray count] > 0) {
resultForNode[@"nodeChildArray"] = childContentArray;
}
}
xmlBufferPtr buffer = xmlBufferCreate();
xmlNodeDump(buffer, currentNode->doc, currentNode, 0, 0);
NSString *rawContent = [NSString stringWithCString:(const char *)buffer->content encoding:NSUTF8StringEncoding];
if (rawContent != nil) {
resultForNode[@"raw"] = rawContent;
}
xmlBufferFree(buffer);
return resultForNode;
}
NSArray *PerformXPathQuery(xmlDocPtr doc, NSString *query)
{
xmlXPathContextPtr xpathCtx;
xmlXPathObjectPtr xpathObj;
/* Make sure that passed query is non-nil and is NSString object */
if (query == nil || ![query isKindOfClass:[NSString class]]) {
return nil;
}
/* Create xpath evaluation context */
xpathCtx = xmlXPathNewContext(doc);
if(xpathCtx == NULL) {
NSLog(@"Unable to create XPath context.");
return nil;
}
/* Evaluate xpath expression */
xpathObj = xmlXPathEvalExpression((xmlChar *)[query cStringUsingEncoding:NSUTF8StringEncoding], xpathCtx);
if(xpathObj == NULL) {
NSLog(@"Unable to evaluate XPath.");
xmlXPathFreeContext(xpathCtx);
return nil;
}
xmlNodeSetPtr nodes = xpathObj->nodesetval;
if (!nodes) {
NSLog(@"Nodes was nil.");
xmlXPathFreeObject(xpathObj);
xmlXPathFreeContext(xpathCtx);
return nil;
}
NSMutableArray *resultNodes = [NSMutableArray array];
for (NSInteger i = 0; i < nodes->nodeNr; i++) {
NSDictionary *nodeDictionary = DictionaryForNode(nodes->nodeTab[i], nil,false);
if (nodeDictionary) {
[resultNodes addObject:nodeDictionary];
}
}
/* Cleanup */
xmlXPathFreeObject(xpathObj);
xmlXPathFreeContext(xpathCtx);
return resultNodes;
}
NSArray *PerformHTMLXPathQuery(NSData *document, NSString *query) {
return PerformHTMLXPathQueryWithEncoding(document, query, nil);
}
NSArray *PerformHTMLXPathQueryWithEncoding(NSData *document, NSString *query,NSString *encoding)
{
xmlDocPtr doc;
/* Load XML document */
const char *encoded = encoding ? [encoding cStringUsingEncoding:NSUTF8StringEncoding] : NULL;
doc = htmlReadMemory([document bytes], (int)[document length], "", encoded, HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR);
if (doc == NULL) {
NSLog(@"Unable to parse.");
return nil;
}
NSArray *result = PerformXPathQuery(doc, query);
xmlFreeDoc(doc);
return result;
}
NSArray *PerformXMLXPathQuery(NSData *document, NSString *query) {
return PerformXMLXPathQueryWithEncoding(document, query, nil);
}
NSArray *PerformXMLXPathQueryWithEncoding(NSData *document, NSString *query,NSString *encoding)
{
xmlDocPtr doc;
/* Load XML document */
const char *encoded = encoding ? [encoding cStringUsingEncoding:NSUTF8StringEncoding] : NULL;
doc = xmlReadMemory([document bytes], (int)[document length], "", encoded, XML_PARSE_RECOVER);
if (doc == NULL) {
NSLog(@"Unable to parse.");
return nil;
}
NSArray *result = PerformXPathQuery(doc, query);
xmlFreeDoc(doc);
return result;
}
...@@ -10,10 +10,19 @@ ...@@ -10,10 +10,19 @@
@class LMNDraft; @class LMNDraft;
@protocol LMNoteViewControllerDelegate <NSObject>
- (void)getHTMLByVc:(NSString *)model;
@end
@interface LMNoteViewController : UIViewController @interface LMNoteViewController : UIViewController
@property (nonatomic, readonly) LMNDraft *draft; @property (nonatomic, readonly) LMNDraft *draft;
- (instancetype)initWithDraft:(LMNDraft *)draft; - (instancetype)initWithDraft:(LMNDraft *)draft;
@property (nonatomic, weak) id<LMNoteViewControllerDelegate> delegatedata;
@end @end
...@@ -15,7 +15,10 @@ ...@@ -15,7 +15,10 @@
#import "LMNImageView.h" #import "LMNImageView.h"
#import "LMNImageInputViewController.h" #import "LMNImageInputViewController.h"
#import "LMNWebViewController.h" #import "LMNWebViewController.h"
//#import "TestClass-Swift.h" #import "TestClass-Swift.h"
#import <SDWebImage/SDWebImage.h>
#import "TFHpple.h"
// 屏幕宽度 // 屏幕宽度
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
// 屏幕高度 // 屏幕高度
...@@ -38,6 +41,8 @@ ...@@ -38,6 +41,8 @@
@property (nonatomic, assign) NSInteger cursorIndex; @property (nonatomic, assign) NSInteger cursorIndex;
@property (nonatomic, assign) CGFloat keyboardHeight; @property (nonatomic, assign) CGFloat keyboardHeight;
@property (nonatomic, strong) NSMutableArray *imgIndexArr;
@property (nonatomic, strong) NSMutableArray *imgUrlArr;
@end @end
...@@ -64,6 +69,7 @@ ...@@ -64,6 +69,7 @@
textView; textView;
}); });
[self.view addSubview:self.textView]; [self.view addSubview:self.textView];
NSLog(@"old=\n%@",self.draft.textStorage);
self.editButton = ({ self.editButton = ({
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
...@@ -118,6 +124,15 @@ ...@@ -118,6 +124,15 @@
- (void)outVC { - (void)outVC {
NSLog(@"outvc====outvc"); NSLog(@"outvc====outvc");
[self.navigationController popViewControllerAnimated:YES]; [self.navigationController popViewControllerAnimated:YES];
// self.textView.text = @"ugh\nCccc\nThe new kJt";
// [self.textView updateExclusionPaths];
// [self.textView insertImage:[UIImage imageNamed:@"lmn_tool_image"] atIndex:self.cursorIndex];
//
// [self.textView.imgArr addObject:url];
// imageView.imageUrl = url;
} }
- (void)layoutTextView - (void)layoutTextView
{ {
...@@ -164,6 +179,7 @@ ...@@ -164,6 +179,7 @@
- (void)viewWillAppear:(BOOL)animated - (void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
[self.navigationController.navigationBar setHidden:NO];
[self addObservers]; [self addObservers];
} }
...@@ -205,6 +221,8 @@ ...@@ -205,6 +221,8 @@
if (firstLine.length > 0) { if (firstLine.length > 0) {
self.draft.name = firstLine; self.draft.name = firstLine;
self.draft.textStorage = (LMNTextStorage *)self.textView.textStorage; self.draft.textStorage = (LMNTextStorage *)self.textView.textStorage;
NSLog(@"last=\n%@",self.textView.textStorage);
[self.draft save]; [self.draft save];
} }
else { else {
...@@ -214,14 +232,49 @@ ...@@ -214,14 +232,49 @@
- (void)export - (void)export
{ {
[self.textView exportHTML:^(BOOL succeed, NSString *html) { [self.textView exportHTML:^(BOOL succeed, NSString *html) {
NSLog(@"html:\n%@", [NSString stringWithFormat:@"<html>%@</html>",html]); NSLog(@"html:\n%@", [NSString stringWithFormat:@"<html>%@</html>",html]);
LMNWebViewController *vc = [[LMNWebViewController alloc]init]; if (self.delegatedata && [self.delegatedata respondsToSelector:@selector(getHTMLByVc:)]) {
vc.html = [NSString stringWithFormat:@"<html>%@</html>",html]; [self.delegatedata getHTMLByVc:html];
[self.navigationController pushViewController:vc animated:YES]; [self.navigationController popViewControllerAnimated:YES];
}
}]; }];
} }
- (NSString *)getStingByData:(NSString *)htmlString {
// 将html字符串转为NSData
NSString *content = @"";
self.imgIndexArr = [NSMutableArray arrayWithCapacity:10];
self.imgUrlArr = [NSMutableArray arrayWithCapacity:10];
NSData *data = [htmlString dataUsingEncoding:NSUTF8StringEncoding];
// 创建Hpple对象
TFHpple * doc = [[TFHpple alloc] initWithHTMLData:data];
// 搜索XPath寻找标签
NSArray *elements = [doc searchWithXPathQuery:@"//p"];
for (TFHppleElement * element in elements) {
NSLog(@"content:%@" , [element content]);
if (content.length == 0) {
content = [element content];
}else{
content = [NSString stringWithFormat:@"%@\n%@",content,[element content]];
}
TFHppleElement *imgDic = [element firstChildWithTagName:@"img"];
if (imgDic) {
NSString *src = [[imgDic attributes]objectForKey:@"src"];
NSLog(@"src:%@", src);
if (content.length == 0) {
[self.imgIndexArr addObject:@"0"];
}else{
NSString *index = [NSString stringWithFormat:@"%ld",(content.length + 1)];
[self.imgIndexArr addObject:index];
}
NSString *imgSrc = @"https://c.gelifood.com/";
NSString *imgurl = [src stringByReplacingOccurrencesOfString:imgSrc withString:@""];
[self.imgUrlArr addObject:imgurl];
}
}
return content;
}
#pragma mark - input #pragma mark - input
- (LMNImageInputViewController *)imageInputViewController - (LMNImageInputViewController *)imageInputViewController
...@@ -416,28 +469,30 @@ ...@@ -416,28 +469,30 @@
__block LMNImageView *imageView = nil; __block LMNImageView *imageView = nil;
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *result, NSDictionary *info) { [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *result, NSDictionary *info) {
//请求上传图片
TestClass *model = [[TestClass alloc]init];
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10];
[dict setValue:@"RQdwz5QKpeg=" forKey:@"user_token"];
[model saveFileWithImage:result params:dict success:^(NSDictionary<NSString *,id> * data) {
if ([[NSString stringWithFormat:@"%@",data[@"code"]]isEqualToString:@"1"]) {
if (!imageView) { if (!imageView) {
imageView = [self.textView insertImage:result atIndex:self.cursorIndex]; // imageView = [self.textView insertImage:result atIndex:self.cursorIndex];
imageView = [self.textView insertImage:[UIImage imageNamed:@"lmn_tool_image"] atIndex:self.cursorIndex];
} }
else { else {
imageView.image = result; imageView.image = result;
} }
//请求上传图片 NSDictionary *dataDic = data[@"data"];
// TestClass *model = [[TestClass alloc]init]; NSString *url = dataDic[@"url"];
// NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10]; [self.textView.imgArr addObject:url];
// [dict setValue:@"RQdwz5QKpeg=" forKey:@"user_token"]; imageView.imageUrl = url;
// [model saveFileWithImage:result params:dict success:^(NSDictionary<NSString *,id> * data) { }
// if ([[NSString stringWithFormat:@"%@",data[@"code"]]isEqualToString:@"1"]) {
// } failture:^(NSError * error) {
// NSDictionary *dataDic = data[@"data"];
// NSString *url = dataDic[@"url"]; }];
// [self.textView.imgArr addObject:url];
// imageView.imageUrl = url;
// }
//
// } failture:^(NSError * error) {
//
// }];
}]; }];
} }
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#import "LMNImageView.h" #import "LMNImageView.h"
#import "LMNImageLine.h" #import "LMNImageLine.h"
#import <SDWebImage/SDWebImage.h>
@interface LMNImageView () @interface LMNImageView ()
...@@ -74,9 +75,22 @@ static CGFloat const kVerticalMargin = kVerticalInset + kMargin; ...@@ -74,9 +75,22 @@ static CGFloat const kVerticalMargin = kVerticalInset + kMargin;
- (void)setImage:(UIImage *)image - (void)setImage:(UIImage *)image
{ {
_image = image; // _image = image;
self.imageView.image = image; // self.imageView.image = image;
[self setNeedsDisplay];
}
- (void)setImageUrl:(NSString *)imageUrl {
_imageUrl = imageUrl;
[self.imageView sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://z.gelifood.com/%@",imageUrl]]
placeholderImage:[UIImage imageNamed:@"lmn_tool_image"] options:(SDWebImageRetryFailed) completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
CGSize size = image.size;
NSLog(@"网络图片大小=%f,%f",size.width,size.height);
}];
[self setNeedsDisplay]; [self setNeedsDisplay];
} }
#pragma mark - editing #pragma mark - editing
......
...@@ -17,9 +17,12 @@ class TestClass: NSObject { ...@@ -17,9 +17,12 @@ class TestClass: NSObject {
//MARK:--图片(文件)上传 //MARK:--图片(文件)上传
@objc func saveFile(image: UIImage,params:[String:Any],success:@escaping (_ res:Dictionary<String, Any>)->(),failture:@escaping(_ error:Error)->()) { @objc func saveFile(image: UIImage,params:[String:Any],success:@escaping (_ res:Dictionary<String, Any>)->(),failture:@escaping(_ error:Error)->()) {
HUD.flash(.progress)
NetworkRequest.sharedInstance.uploadImage(url: "图片(文件)上传", image: image, params: params, success: { (data) in NetworkRequest.sharedInstance.uploadImage(url: "图片(文件)上传", image: image, params: params, success: { (data) in
HUD.hide()
success(data) success(data)
}) { (error) in }) { (error) in
HUD.flash(.label("上传图片失败"),delay: 1.2)
failture(error) failture(error)
} }
} }
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
range.length -= 1; range.length -= 1;
} }
NSAttributedString *attributedText = [self attributedSubstringFromRange:range]; NSAttributedString *attributedText = [self attributedSubstringFromRange:range];
if ([line isKindOfMode:LMNLineModeModeImage]) { if ([line isKindOfMode:LMNLineModeModeImage]) {
// TODO: 图片部分逻辑未处理。 // TODO: 图片部分逻辑未处理。
...@@ -46,6 +47,7 @@ ...@@ -46,6 +47,7 @@
UIFont *font = attributes[NSFontAttributeName]; UIFont *font = attributes[NSFontAttributeName];
BOOL underline = [attributes[NSUnderlineStyleAttributeName] boolValue]; BOOL underline = [attributes[NSUnderlineStyleAttributeName] boolValue];
BOOL strikethrough = [attributes[NSStrikethroughStyleAttributeName] integerValue] == 1; BOOL strikethrough = [attributes[NSStrikethroughStyleAttributeName] integerValue] == 1;
NSString *fragment = [self htmlWithContent:text font:font underline:underline strikethrough:strikethrough]; NSString *fragment = [self htmlWithContent:text font:font underline:underline strikethrough:strikethrough];
[lineHTML appendString:fragment]; [lineHTML appendString:fragment];
} while (NSMaxRange(effectiveRange) < attributedText.length); } while (NSMaxRange(effectiveRange) < attributedText.length);
......
...@@ -23,5 +23,7 @@ ...@@ -23,5 +23,7 @@
- (void)setTextAlignmentForSelection:(NSTextAlignment)alignment; - (void)setTextAlignmentForSelection:(NSTextAlignment)alignment;
- (LMNImageView *)insertImage:(UIImage *)image atIndex:(NSInteger)index; - (LMNImageView *)insertImage:(UIImage *)image atIndex:(NSInteger)index;
- (void)exportHTML:(void (^)(BOOL succeed, NSString *html))completion; - (void)exportHTML:(void (^)(BOOL succeed, NSString *html))completion;
- (void)insertText:(NSString *)text;
- (void)updateExclusionPaths;
@end @end
...@@ -141,6 +141,8 @@ static CGFloat const kDefaultTextInset = 5.f; // 默认文字会有5.f的缩 ...@@ -141,6 +141,8 @@ static CGFloat const kDefaultTextInset = 5.f; // 默认文字会有5.f的缩
- (void)updateExclusionPaths - (void)updateExclusionPaths
{ {
NSString *text = self.text; NSString *text = self.text;
NSLog(@"updateExclusionPaths=%@",text);
UIEdgeInsets textContainerInset = self.textContainerInset; UIEdgeInsets textContainerInset = self.textContainerInset;
NSTextContainer *textContainer = self.textContainer; NSTextContainer *textContainer = self.textContainer;
LMNTextStorage *textStorage = _textStorage; LMNTextStorage *textStorage = _textStorage;
......
...@@ -94,7 +94,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, UITabBarControllerDeleg ...@@ -94,7 +94,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, UITabBarControllerDeleg
// Create the SwiftUI view that provides the window contents. // Create the SwiftUI view that provides the window contents.
tabBarController.viewControllers = [v1, v2, v3, v4, v5] tabBarController.viewControllers = [v1, v2, v3, v4, v5]
tabBarController.selectedIndex = 2 tabBarController.selectedIndex = 1
let contentView = tabBarController let contentView = tabBarController
......
...@@ -16,7 +16,7 @@ protocol ProductDetailViewControllerDelegate { ...@@ -16,7 +16,7 @@ protocol ProductDetailViewControllerDelegate {
func reloadDataByProductDetailViewController() func reloadDataByProductDetailViewController()
} }
class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITableViewDataSource,TitleAndBtnCellDelegate,GLAlertSelectViewDelegate,GoodsClassViewControllerDelegate,PinPaiListViewControllerDelegate,AddImgCellDelegate,AddGuiGeCellDelegate,CreatNewSpecsViewControllerDelegate,ShangPinGguiGeCellDelegate,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,TitleAndSwitchCellDelegate,TitleAndTFCellDelegate,YuShouWeiKuanFaHuoCellDelegate,UITextFieldDelegate,ShowTimeSelectViewDelegate{ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITableViewDataSource,TitleAndBtnCellDelegate,GLAlertSelectViewDelegate,GoodsClassViewControllerDelegate,PinPaiListViewControllerDelegate,AddImgCellDelegate,AddGuiGeCellDelegate,CreatNewSpecsViewControllerDelegate,ShangPinGguiGeCellDelegate,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,TitleAndSwitchCellDelegate,TitleAndTFCellDelegate,YuShouWeiKuanFaHuoCellDelegate,UITextFieldDelegate,ShowTimeSelectViewDelegate,LMNoteViewControllerDelegate{
var delegate :ProductDetailViewControllerDelegate? var delegate :ProductDetailViewControllerDelegate?
func GLASClose(view: GLAlertSelectView, selectnum: Int, selectArr: Array<Int>) { func GLASClose(view: GLAlertSelectView, selectnum: Int, selectArr: Array<Int>) {
...@@ -247,7 +247,7 @@ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITabl ...@@ -247,7 +247,7 @@ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITabl
"coun_id":"1", //国家id 1(中国) "coun_id":"1", //国家id 1(中国)
"gs_id":gs_id as Any, //商品状态 "gs_id":gs_id as Any, //商品状态
"transportation":transportation as Any, //运输方式,1冷链,2常温,3热链 "transportation":transportation as Any, //运输方式,1冷链,2常温,3热链
"goods_desc":"", //商品详情 html p标签 "goods_desc":goodsDesc as Any, //商品详情 html p标签
"specifications":specifications as Any, //默认规格,选sku中最低价格(需判定阶梯价)的 规格值 "specifications":specifications as Any, //默认规格,选sku中最低价格(需判定阶梯价)的 规格值
"shop_price":shop_price as Any, //默认售价,选sku中最低价格(需判定阶梯价)的价格 "shop_price":shop_price as Any, //默认售价,选sku中最低价格(需判定阶梯价)的价格
"goods_unit":goods_unit as Any, //默认商品单位,选sku中最低价格(需判定阶梯价)的单位 "goods_unit":goods_unit as Any, //默认商品单位,选sku中最低价格(需判定阶梯价)的单位
...@@ -465,6 +465,10 @@ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITabl ...@@ -465,6 +465,10 @@ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITabl
cell.imgBtn.tag = indexPath.row cell.imgBtn.tag = indexPath.row
cell.imgBtn.setImage(UIImage(named: "tjxq"), for: .normal) cell.imgBtn.setImage(UIImage(named: "tjxq"), for: .normal)
cell.btmH.constant = 25 cell.btmH.constant = 25
if goodsDesc.count > 0 {
let goodsDescHmtl = "<html>" + goodsDesc + "</html>"
//增加一个半屏高度web
}
return cell return cell
} }
} }
...@@ -476,6 +480,7 @@ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITabl ...@@ -476,6 +480,7 @@ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITabl
func AddGuiGeCellClick(cell: AddGuiGeCell) { func AddGuiGeCellClick(cell: AddGuiGeCell) {
print("底部广告软文跳转") print("底部广告软文跳转")
let vc = LMNoteViewController() let vc = LMNoteViewController()
vc.delegatedata = self
self.navigationController?.pushViewController(vc, animated: true) self.navigationController?.pushViewController(vc, animated: true)
} }
//MARK: -- 点击按钮事件,跳转或者展示选择界面 //MARK: -- 点击按钮事件,跳转或者展示选择界面
...@@ -1207,4 +1212,9 @@ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITabl ...@@ -1207,4 +1212,9 @@ class ProductDetailViewController: BaseViewController,UITableViewDelegate,UITabl
} }
} }
//MARK:---商品详情回调的数据
var goodsDesc = ""
func getHTMLByVc(_ model: String!) {
goodsDesc = model
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment