Skip to content

Commit

Permalink
Add Scalafmt, Scalastyle, etc.
Browse files Browse the repository at this point in the history
  • Loading branch information
Olivier Bruchez committed Dec 6, 2017
1 parent 2910a01 commit 4a38daa
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 9 deletions.
1 change: 1 addition & 0 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
maxColumn = 100
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
language: scala

script: sbt scalastyle compile
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# kindle-clippings-to-markdown

[![Build Status](https://travis-ci.org/obruchez/kindle-clippings-to-markdown.svg?branch=master)](https://travis-ci.org/obruchez/kindle-clippings-to-markdown)

Convert Amazon's My Clippings.txt file (Kindle Highlights) into Markdown files (one for each book).
4 changes: 3 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ name := "Kindle clippings to Markdown"

version := "1.1"

scalaVersion := "2.12.3"
scalaVersion := "2.12.4"

scalafmtOnCompile in ThisBuild := true
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version=0.13.15
sbt.version=1.0.1
6 changes: 6 additions & 0 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
logLevel := Level.Warn

resolvers += Resolver.sonatypeRepo("releases")

addSbtPlugin("com.lucidchart" % "sbt-scalafmt" % "1.14")
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0")
93 changes: 93 additions & 0 deletions scalastyle-config.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<scalastyle>
<name>Scalastyle standard configuration</name>
<check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true">
<parameters>
<parameter name="maxFileLength"><![CDATA[800]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
<parameters>
<parameter name="maxLineLength"><![CDATA[160]]></parameter>
<parameter name="tabSize"><![CDATA[4]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true">
<parameters>
<parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
<parameters>
<parameter name="maxParameters"><![CDATA[8]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="true">
<parameters>
<parameter name="ignore"><![CDATA[-1,0,1,2,3]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.ReturnChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.NullChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true">
<parameters>
<parameter name="maxTypes"><![CDATA[30]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true">
<parameters>
<parameter name="maximum"><![CDATA[10]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true">
<parameters>
<parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
<parameter name="doubleLineAllowed"><![CDATA[false]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true">
<parameters>
<parameter name="maxLength"><![CDATA[50]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true">
<parameters>
<parameter name="maxMethods"><![CDATA[30]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"></check>
</scalastyle>
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ case class Book(title: String) {
case class Clipping(contents: String, pageOption: Option[Int], locationOption: Option[String]) {
def markdown: String =
contents +
(pageOption.map(page => s"p. $page") orElse locationOption.map(location => s"loc. $location")).
map(pageOrLocation => s" ($pageOrLocation)").
getOrElse("")
(pageOption.map(page => s"p. $page") orElse locationOption.map(location => s"loc. $location"))
.map(pageOrLocation => s" ($pageOrLocation)")
.getOrElse("")
}

case class KindleClippings(clippingsByBook: Map[Book, Seq[Clipping]]) {
Expand All @@ -36,28 +36,31 @@ case class KindleClippings(clippingsByBook: Map[Book, Seq[Clipping]]) {
object KindleClippings {
def main(args: Array[String]) {
lines(args.headOption.getOrElse("My Clippings.txt")) match {
case Success(lines) => KindleClippings(lines).createMarkdownFiles()
case Success(lines) => KindleClippings(lines).createMarkdownFiles()
case Failure(throwable) => println(s"Error: ${throwable.getMessage}")
}
}

def apply(lines: List[String]): KindleClippings = {
val LinesPerBook = 5

val clippingsByBook = mutable.HashMap[Book, Vector[Clipping]]()

for {
title :: pageOrlocation :: empty :: clippingContents :: separator :: Nil <- lines.grouped(5)
title :: pageOrlocation :: empty :: clippingContents :: separator :: Nil <- lines.grouped(
LinesPerBook)
trimmedTitle = title.trim.replaceAll("\uFEFF", "")
trimmedClippingContents = clippingContents.trim
if trimmedClippingContents.nonEmpty
book = Book(trimmedTitle)
clippingsForBook = clippingsByBook.getOrElse(book, Vector[Clipping]())
pageOption = pageOrlocation match {
case Page(page) => Try(page.toInt).toOption
case _ => None
case _ => None
}
locationOption = pageOrlocation match {
case Location(location) => Some(location)
case _ => None
case _ => None
}
clipping = Clipping(trimmedClippingContents, pageOption, locationOption)
} {
Expand Down

0 comments on commit 4a38daa

Please sign in to comment.