! Copyright (c) 2022 Approximatrix, LLC ! ! 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 shall be used for Good, not Evil. ! ! 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. program driver use fpoint_pptxzip implicit none type(pptxtracted)::presentation logical::verbose logical::notes integer::i, j, retcode character(len=:), pointer::filename, arg, outname if(command_argument_count() < 1) then call usage() call exit(0) end if retcode = 0 verbose = .false. notes = .false. filename => null() outname => null() i = 1 do while(i <= command_argument_count()) call get_command_argument(i, length=j) allocate(character(len=j)::arg) call get_command_argument(i, value=arg) if(arg == "-n") then notes = .true. else if(arg == "-v") then verbose = .true. else if(arg == "-o") then i = i + 1 call get_command_argument(i, length=j) allocate(character(len=j)::outname) call get_command_argument(i, value=outname) else filename => arg arg => null() end if if(associated(arg)) then deallocate(arg) arg => null() end if i = i + 1 end do if(verbose) then call title() end if call maybe_print(verbose, "Loading "//filename) if(presentation%open(filename)) then call maybe_print(verbose, "File opened at "//trim(presentation%directory)) call presentation%parse() if((.not. notes) .or. presentation%has_notes()) then if(associated(outname)) then open(newunit=j, file=outname, action="write", status="unknown") write(j, '(A)') presentation%to_text(notes_only=notes) close(j) else write(*, '(A)') presentation%to_text(notes_only=notes) end if else call maybe_print(verbose, "No slide notes found in "//filename) retcode = 1 end if call presentation%close() else call maybe_print(verbose, "Failed on "//filename) retcode = 1 end if call exit(retcode) contains subroutine title() implicit none Print *, "FPoint - PowerPoint to Text Converter" Print *, "Copyright 2022 Approximatrix, LLC" end subroutine title subroutine usage() implicit none character(512)::prg call get_command_argument(0, prg) call title() Print *, " " Print *, "Usage: "//trim(prg)//" [options] " Print *, " " Print *, "Options:" Print *, " " Print *, " -o Write output to specified filename instead of console" Print *, " -n Extract notes instead of slide contents" Print *, " -v Be somewhat verbose, probably not enough to be interesting" Print *, " " Print *, "Output is printed to standard out" Print *, " " end subroutine usage subroutine maybe_print(v, str) implicit none logical, intent(in)::v character(len=*), intent(in)::str if(v) then Print *, str end if end subroutine maybe_print end program driver