Skip to content

Commit

Permalink
Merge pull request #2 from sboh1214/dev
Browse files Browse the repository at this point in the history
release to master branch 0.1.0
  • Loading branch information
sboh1214 authored Sep 28, 2020
2 parents 950f72d + d39094a commit 5af6f97
Show file tree
Hide file tree
Showing 46 changed files with 660 additions and 206 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/Coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
- master

jobs:
test:
coverage:

runs-on: macos-latest

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/Documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
- master

jobs:
build:
documentation:
runs-on: ubuntu-latest

steps:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/Test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macOS-latest, ubuntu-latest]
os: [macOS-latest]
swift: ["5.1", "5.2"]

steps:
Expand Down
2 changes: 1 addition & 1 deletion .swiftpm/xcode/xcshareddata/xcschemes/HwpKit.xcscheme
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
scriptText = "# Type a script or drag a script file from your workspace to insert its path.&#10;if which swiftlint &gt;/dev/null; then&#10; swiftlint&#10;else&#10; echo &quot;warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint&quot;&#10;fi&#10;">
scriptText = "# Type a script or drag a script file from your workspace to insert its path.&#10;if which swiftlint &gt;/dev/null; then&#10; say &quot;Pre build scripts running.&quot;&#10; exec &gt; &quot;${PROJECT_DIR}/prebuild.log&quot; 2&gt;&amp;1&#10; echo &quot;Starting build scheme Pre-actions&quot;&#10; &quot;${PROJECT_DIR}/Build-Phases/That_pre-action_script.sh&quot;&#10; echo `swiftlint autocorrect`&#10; echo `swiftlint`&#10;else&#10; echo &quot;warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint&quot;&#10;fi&#10;">
</ActionContent>
</ExecutionAction>
</PreActions>
Expand Down
16 changes: 12 additions & 4 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,36 @@ import PackageDescription

let package = Package(
name: "HwpKit",
platforms: [.macOS(.v10_11), .iOS(.v9), .tvOS(.v9), .watchOS(.v2)],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "HwpKit",
targets: ["HwpKit"])
targets: ["HwpKit"]
)
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(
url: "https://github.com/CoreOffice/OLEKit.git",
.revision("6a809b91a9a524594c02d990dbce157d7e9cb447")
.revision("14c4e245519cfd9b822f7e365734b6e08e092503")
),
.package(
url: "https://github.com/mw99/DataCompression.git",
.exact("3.6.0")
)
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "HwpKit",
dependencies: ["OLEKit"]),
dependencies: ["OLEKit", "DataCompression"]
),
.testTarget(
name: "HwpKitTests",
dependencies: ["HwpKit"])
dependencies: ["HwpKit"]
)
]
)
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,21 @@
![Coverage](https://github.com/sboh1214/HwpKit/workflows/Coverage/badge.svg)
![Documentation](https://github.com/sboh1214/HwpKit/workflows/Documentation/badge.svg)
[![codecov](https://codecov.io/gh/sboh1214/HwpKit/branch/master/graph/badge.svg)](https://codecov.io/gh/sboh1214/HwpKit)
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fsboh1214%2FHwpKit.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fsboh1214%2FHwpKit?ref=badge_shield)

HWP file reader.

## Install

### Swift Package Manager

## CI/CD

![Test-macOS](https://github.com/sboh1214/HwpKit/workflows/Test-macOS/badge.svg)
![Test-Ubuntu](https://github.com/sboh1214/HwpKit/workflows/Test-Ubuntu/badge.svg)

## License

![GitHub](https://img.shields.io/github/license/sboh1214/HwpKit)
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fsboh1214%2FHwpKit.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fsboh1214%2FHwpKit?ref=badge_shield)

[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fsboh1214%2FHwpKit.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fsboh1214%2FHwpKit?ref=badge_large)
37 changes: 37 additions & 0 deletions Sources/HwpKit/HwpError.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import Foundation

public enum HwpError: Error {
case invalidFilePath(path: String)
case streamDoesNotExist(name: HwpStreamName)
case streamDecompressFailed(name: HwpStreamName)
case invalidDataForString(data: Data, name: String)
case recordDoesNotExist(tag: UInt32)
case invalidFileHeaderSignature(signature: String)
case unidentifiedTag(tagId: UInt32)
}

extension HwpError: CustomStringConvertible {
public var description: String {
switch self {
case let .invalidFilePath(path):
return "Invalid File Path '\(path)'"
case let .streamDoesNotExist(name):
return "Stream '\(name)' does not exist"
case let .streamDecompressFailed(name):
return "Stream '\(name)' failed to decompress"
case let .invalidDataForString(data, name):
return
"""
Cannot covert data to utf16le string
data: '\(data)'
name: '\(name)'
"""
case let .recordDoesNotExist(tag):
return "Record '\(tag)' does not exist."
case let .invalidFileHeaderSignature(signature):
return "Invalid signature in FileHeader stream : get'\(signature)'"
case let .unidentifiedTag(tagId):
return "Cannot Read HwpRecord Tag : '\(tagId)'"
}
}
}
74 changes: 50 additions & 24 deletions Sources/HwpKit/HwpFile.swift
Original file line number Diff line number Diff line change
@@ -1,45 +1,71 @@
import Foundation
import OLEKit
import DataCompression

public struct HwpFile {
let fileHeader: HwpFileHeader
//let previewText : HKPreviewText
var directories: [DirectoryEntry] = []
public class HwpFile {
public let fileHeader: HwpFileHeader
public let docInfo: HwpDocInfo
public let previewText: HwpPreviewText

var warnings: [HwpWarning] = []

init(filePath: String) throws {
public init(filePath: String) throws {
let ole: OLEFile
do {
ole = try OLEFile(filePath)
} catch {
throw HwpError.invalidFilePath(path: filePath)
}
let streams = Dictionary(uniqueKeysWithValues: ole.root.children.map { ($0.name, $0 ) })
let test = Test(ole, streams)

do {
guard let fileHeaderStream = ole.root.children.first(where: { $0.name == HwpStreamName.fileHeader.rawValue }) else {
throw HwpError.streamDoesNotExist(name: HwpStreamName.fileHeader)
}
fileHeader = HwpFileHeader(dataReader: try ole.stream(fileHeaderStream))

} catch {
throw HwpError.invalidFilePath(path: filePath)
}
fileHeader = try HwpFileHeader(test.getDataFromStream(.fileHeader, false))

docInfo = try HwpDocInfo(test.getDataFromStream(.docInfo, fileHeader.isCompressed))

// do {
// guard let previewTextStream = ole.root.children.first(where: {$0.name == HKStreamName.PreviewText.rawValue}) else {
// throw HKError.StreamDoesNotExist(name: HKStreamName.PreviewText)
// }
// previewText = HKPreviewText(dataReader: try ole.stream(previewTextStream))
// }
guard let previewTextStream = streams[HwpStreamName.previewText.rawValue] else {
throw HwpError.streamDoesNotExist(name: HwpStreamName.previewText)
}
let previewTextReader = try ole.stream(previewTextStream)
previewText = try HwpPreviewText(previewTextReader.readDataToEnd())
}

func report(report: inout HwpReportable) throws -> Void {


}

fileprivate struct Test {
private let ole: OLEFile
private let streams: [String: DirectoryEntry]

init(_ ole: OLEFile, _ streams: [String: DirectoryEntry]) {
self.ole = ole
self.streams = streams
}

fileprivate func getDataFromStream(_ streamName: HwpStreamName, _ isCompressed: Bool) throws -> Data {
guard let stream = streams[streamName.rawValue] else {
throw HwpError.streamDoesNotExist(name: streamName)
}
let reader = try ole.stream(stream)
let data = reader.readDataToEnd()
if isCompressed {
if #available(OSX 10.15, *) {
return try (data as NSData).decompressed(using: .zlib) as Data
} else {
guard let decompressedData = data.decompress(withAlgorithm: .zlib) else {
throw HwpError.streamDecompressFailed(name: streamName)
}
return decompressedData
}

} else {
return data
}
}
}

public enum HwpStreamName: String {
case fileHeader = "FileHeader"
case docInfo = "DocInfo"
case summary = "\005HwpSummaryInformation"
case previewText = "PrvText"
case previewImage = "PrvImage"
}
14 changes: 14 additions & 0 deletions Sources/HwpKit/Models/Document Properties/HwpCaratLocation.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import Foundation

public struct HwpCaratLocation: HwpData {
let listId: UInt32
let paragraphId: UInt32
let charIndex: UInt32

init(_ data: Data) {
var reader = DataReader(data)
listId = reader.readUInt32()
paragraphId = reader.readUInt32()
charIndex = reader.readUInt32()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import Foundation

public struct HwpDocumentProperties: HwpData {
public let sectionSize: UInt16
public let startingIndex: HwpStartingIndex
public let caratLocation: HwpCaratLocation

init(_ data: Data) {
var reader = DataReader(data)
sectionSize = reader.readUInt16()
startingIndex = HwpStartingIndex(reader.readBytes(12))
caratLocation = HwpCaratLocation(reader.readBytes(12))
}
}
20 changes: 20 additions & 0 deletions Sources/HwpKit/Models/Document Properties/HwpStartingIndex.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import Foundation

public struct HwpStartingIndex: HwpData {
public let page: UInt16
public let footnote: UInt16
public let endnote: UInt16
public let picture: UInt16
public let table: UInt16
public let equation: UInt16

init(_ data: Data) {
var reader = DataReader(data)
page = reader.readUInt16()
footnote = reader.readUInt16()
endnote = reader.readUInt16()
picture = reader.readUInt16()
table = reader.readUInt16()
equation = reader.readUInt16()
}
}
30 changes: 25 additions & 5 deletions Sources/HwpKit/Models/HwpVersion.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
import Foundation

struct HwpVersion {
let major: UInt8
let minor: UInt8
let build: UInt8
let revision: UInt8
/**
파일 버전. 0xMMnnPPrr의 형태(예 5.0.3.0)
- MM: 문서 형식의 구조가 완전히 바뀌는 것을 나타냄. 숫
자가 다르면 구 버전과 호환 불가능.
- nn: 큰 구조는 동일하나, 큰 변화가 있는 것을 나타냄. 숫
자가 다르면 구 버전과 호환 불가능.
- PP: 구조는 동일, Record가 추가되었거나, 하위 버전에서
호환되지 않는 정보가 추가된 것을 나타냄. 숫자가 달라도
구 버전과 호환 가능.
- rr: Record에 정보들이 추가된 것을 나타냄. 숫자가 달라
도 구 버전과 호환 가능.
*/
public struct HwpVersion: HwpData {
public let major: UInt8
public let minor: UInt8
public let build: UInt8
public let revision: UInt8

init(_ data: Data) {
var reader = DataReader(data)
revision = reader.readUInt8()
build = reader.readUInt8()
minor = reader.readUInt8()
major = reader.readUInt8()
}
}
10 changes: 0 additions & 10 deletions Sources/HwpKit/Models/LineSegment.swift

This file was deleted.

20 changes: 0 additions & 20 deletions Sources/HwpKit/Report/HwpError.swift

This file was deleted.

5 changes: 0 additions & 5 deletions Sources/HwpKit/Report/HwpReportable.swift

This file was deleted.

14 changes: 0 additions & 14 deletions Sources/HwpKit/Report/HwpWarning.swift

This file was deleted.

3 changes: 0 additions & 3 deletions Sources/HwpKit/Streams/BinData/BinaryData.swift

This file was deleted.

10 changes: 0 additions & 10 deletions Sources/HwpKit/Streams/BodyText/Section.swift

This file was deleted.

3 changes: 0 additions & 3 deletions Sources/HwpKit/Streams/DocInfo.swift

This file was deleted.

Loading

0 comments on commit 5af6f97

Please sign in to comment.