Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions src/Microdown-Rules/MicFrenchTypoChecker.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
Class {
#name : 'MicFrenchTypoChecker',
#superclass : 'MicChecker',
#category : 'Microdown-Rules-FrenchTypo',
#package : 'Microdown-Rules',
#tag : 'FrenchTypo'
}

{ #category : 'adding' }
MicFrenchTypoChecker >> addResultFor: anElement message: aMessage [
results add: (MicFrenchTypoResult new
micElement: anElement;
inFile: anElement fromFile;
detail: aMessage;
yourself
)
]

{ #category : 'adding' }
MicFrenchTypoChecker >> checkString: aString for: anElement [
| checks |
aString ifNil: [ ^ self ].
checks := {
'[^ ]\:' -> 'There should be a space before :'.
'[^ ]\;' -> 'There should be a space before ;'.
'[^ ]\?' -> 'There should be a space before ?'.
'[^ ]\!' -> 'There should be a space before !'.
' \,' -> 'There should be no space before ,'.
',[^ ]' -> 'There should be a space after ,'.
'\.[^ ]' -> 'There should be no space after .'.
}.
checks do: [ :pair |
| matcher |
matcher := RxMatcher forString: pair key.
(matcher matchesIn: aString) notEmpty ifTrue: [
self addResultFor: anElement message: pair value
]
]
]

{ #category : 'adding' }
MicFrenchTypoChecker >> visitCode: aMicCode [
aMicCode caption ifNil: [ ^ self ].
self checkString: aMicCode caption for: aMicCode.
]

{ #category : 'adding' }
MicFrenchTypoChecker >> visitText: aMicText [
self checkString: aMicText bodyString for: aMicText.
]
109 changes: 109 additions & 0 deletions src/Microdown-Rules/MicFrenchTypoCheckerTest.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
Class {
#name : 'MicFrenchTypoCheckerTest',
#superclass : 'TestCase',
#instVars : [
'fileSystem',
'checker'
],
#category : 'Microdown-Rules-FrenchTypo',
#package : 'Microdown-Rules',
#tag : 'FrenchTypo'
}

{ #category : 'running' }
MicFrenchTypoCheckerTest >> generateFilesystemExample [
| file |
"incorrect cases"
file := fileSystem workingDirectory / 'noSpaceBeforeColon.md'.
file writeStreamDo: [ :stream |
stream nextPutAll: 'Voici le code suivant:'
].
file := fileSystem workingDirectory / 'noSpaceBeforeSemiColon.md'.
file writeStreamDo: [ :stream |
stream nextPutAll: 'Premier exemple; deuxième exemple'
].
file := fileSystem workingDirectory / 'noSpaceBeforeExlamation.md'.
file writeStreamDo: [ :stream |
stream nextPutAll: 'Attention!'
].
file := fileSystem workingDirectory / 'SpaceBeforeComma.md'.
file writeStreamDo: [ :stream |
stream nextPutAll: 'Premier exemple ,deuxième exemple'
].
file := fileSystem workingDirectory / 'noSpaceAfterComma.md'.
file writeStreamDo: [ :stream |
stream nextPutAll: 'Premier exemple,deuxième exemple'
].
"correct cases"
file := fileSystem workingDirectory / 'correct.md'.
file writeStreamDo: [ :stream |
stream nextPutAll: 'Voici le code : exemple, test.'
].
file := fileSystem workingDirectory / 'noSpaceBeforeQuestion.md'.
file writeStreamDo: [ :stream |
stream nextPutAll: 'Comment faire?'
].
]

{ #category : 'running' }
MicFrenchTypoCheckerTest >> setUp [
super setUp.

fileSystem := FileSystem memory.
self generateFilesystemExample.
checker := MicFrenchTypoChecker new.
]

{ #category : 'tests' }
MicFrenchTypoCheckerTest >> testCorrect [
checker checkProject: fileSystem / 'correct.md'.
self assert: checker isOkay.
]

{ #category : 'tests' }
MicFrenchTypoCheckerTest >> testNoSpaceAfterCommaDetected [
checker checkProject: fileSystem / 'noSpaceAfterComma.md'.
self deny: checker isOkay.
self assert: checker results first detail
equals: 'There should be a space after ,'.
]

{ #category : 'tests' }
MicFrenchTypoCheckerTest >> testNoSpaceBeforeColonDetected [
checker checkProject: fileSystem / 'noSpaceBeforeColon.md'.
self deny: checker isOkay.
self assert: checker results first detail
equals: 'There should be a space before :'.
]

{ #category : 'tests' }
MicFrenchTypoCheckerTest >> testNoSpaceBeforeExclamationDetected [
checker checkProject: fileSystem / 'noSpaceBeforeExlamation.md'.
self deny: checker isOkay.
self assert: checker results first detail
equals: 'There should be a space before !'.
]

{ #category : 'tests' }
MicFrenchTypoCheckerTest >> testNoSpaceBeforeQuestionDetected [
checker checkProject: fileSystem / 'noSpaceBeforeQuestion.md'.
self deny: checker isOkay.
self assert: checker results first detail
equals: 'There should be a space before ?'.
]

{ #category : 'tests' }
MicFrenchTypoCheckerTest >> testNoSpaceBeforeSemiColonDetected [
checker checkProject: fileSystem / 'noSpaceBeforeSemiColon.md'.
self deny: checker isOkay.
self assert: checker results first detail
equals: 'There should be a space before ;'.
]

{ #category : 'tests' }
MicFrenchTypoCheckerTest >> testSpaceBeforeCommaDetected [
checker checkProject: fileSystem / 'SpaceBeforeComma.md'.
self deny: checker isOkay.
self assert: checker results first detail
equals: 'There should be no space before ,'.
]
31 changes: 31 additions & 0 deletions src/Microdown-Rules/MicFrenchTypoResult.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Class {
#name : 'MicFrenchTypoResult',
#superclass : 'MicAbstractResult',
#instVars : [
'detail'
],
#category : 'Microdown-Rules-FrenchTypo',
#package : 'Microdown-Rules',
#tag : 'FrenchTypo'
}

{ #category : 'accessing' }
MicFrenchTypoResult >> detail [

^ detail
]

{ #category : 'accessing' }
MicFrenchTypoResult >> detail: aString [

detail := aString
]

{ #category : 'accessing' }
MicFrenchTypoResult >> explanation [
| text |
text := micElement bodyString ifNil: [ '' ].
^ 'Text: "' , text
, '" in file' , fileReference fullName
, ' contains a mistake: ' , detail
]
Loading