// // WRPageMark.h // WeRead (读书) // Reverse-engineered header // // Annotation model for page bookmarks/marks (dog-ear style). // 25 methods identified from binary. The most feature-rich annotation type. // Supports bookmark management, sorting, filtering, and display. // #import #import NS_ASSUME_NONNULL_BEGIN @class WRBook; @class WRBookmark; @class WRPageHighlight; @class WRPageUnderline; // --------------------------------------------------------------------------- // Mark display mode // --------------------------------------------------------------------------- typedef NS_ENUM(NSInteger, WRPageMarkDisplayMode) { WRPageMarkDisplayModeIcon = 0, // Show bookmark icon WRPageMarkDisplayModeList = 1, // Show in list view WRPageMarkDisplayModeInline = 2, // Show inline in text }; // --------------------------------------------------------------------------- // WRPageMark // --------------------------------------------------------------------------- @interface WRPageMark : NSObject @property (nonatomic, copy) NSString *markId; @property (nonatomic, copy) NSString *bookId; @property (nonatomic, copy) NSString *chapterUid; @property (nonatomic, assign) NSInteger chapterOffset; @property (nonatomic, assign) NSInteger pageIndex; @property (nonatomic, copy) NSString *chapterTitle; // display title @property (nonatomic, copy, nullable) NSString *excerptText; // text near the mark @property (nonatomic, assign) NSTimeInterval createTime; @property (nonatomic, assign) NSTimeInterval updateTime; @property (nonatomic, assign) BOOL isSynced; @property (nonatomic, copy, nullable) NSString *syncKey; // Color/style for the mark icon @property (nonatomic, strong, nullable) UIColor *markColor; @property (nonatomic, assign) WRPageMarkDisplayMode displayMode; // Linked annotations at the same position @property (nonatomic, strong, nullable) NSArray *linkedHighlights; @property (nonatomic, strong, nullable) NSArray *linkedUnderlines; #pragma mark - Initialization /// Create a page mark at the given position. - (instancetype)initWithBookId:(NSString *)bookId chapterUid:(NSString *)chapterUid chapterOffset:(NSInteger)offset pageIndex:(NSInteger)pageIndex chapterTitle:(NSString *)title; #pragma mark - Conversion (25 methods, reconstructed) /// Convert to WRBookmark for persistence. - (WRBookmark *)toBookmark; /// Create from WRBookmark. + (nullable instancetype)fromBookmark:(WRBookmark *)bookmark; #pragma mark - Linked Annotations /// Add a highlight linked to this mark. - (void)addLinkedHighlight:(WRPageHighlight *)highlight; /// Add an underline linked to this mark. - (void)addLinkedUnderline:(WRPageUnderline *)underline; /// Remove a linked highlight by ID. - (void)removeLinkedHighlightWithId:(NSString *)highlightId; /// Remove a linked underline by ID. - (void)removeLinkedUnderlineWithId:(NSString *)underlineId; /// Return all linked annotation IDs. - (NSArray *)allLinkedAnnotationIds; #pragma mark - Display /// Return the title for display in the bookmark list. - (NSString *)displayTitle; /// Return the subtitle/detail text. - (NSString *)displaySubtitle; /// Return a formatted date string. - (NSString *)formattedDate; /// Return the mark icon image. - (UIImage *)markIcon; #pragma mark - Sorting & Filtering /// Compare marks by position (for sorting in reading order). - (NSComparisonResult)compareByPosition:(WRPageMark *)other; /// Compare marks by creation date. - (NSComparisonResult)compareByDate:(WRPageMark *)other; /// Check if this mark is in the given chapter. - (BOOL)isInChapter:(NSString *)chapterUid; #pragma mark - Serialization - (NSDictionary *)toDictionary; + (nullable instancetype)fromDictionary:(NSDictionary *)dict; - (nullable NSData *)toJSONData; + (nullable instancetype)fromJSONData:(NSData *)data; #pragma mark - Batch Operations (class methods) /// Sort an array of marks by position. + (NSArray *)marksSortedByPosition:(NSArray *)marks; /// Sort an array of marks by date. + (NSArray *)marksSortedByDate:(NSArray *)marks; /// Filter marks for a specific chapter. + (NSArray *)marksInChapter:(NSString *)chapterUid fromMarks:(NSArray *)marks; /// Filter marks within a position range. + (NSArray *)marksInRange:(NSRange)range fromMarks:(NSArray *)marks; @end NS_ASSUME_NONNULL_END