\ net2o template for new files

\ Copyright (C) 2016   Bernd Paysan

\ This program is free software: you can redistribute it and/or modify
\ it under the terms of the GNU Affero General Public License as published by
\ the Free Software Foundation, either version 3 of the License, or
\ (at your option) any later version.

\ This program is distributed in the hope that it will be useful,
\ but WITHOUT ANY WARRANTY; without even the implied warranty of
\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
\ GNU Affero General Public License for more details.

\ You should have received a copy of the GNU Affero General Public License
\ along with this program.  If not, see <http://www.gnu.org/licenses/>.

also regexps
\ example of Twitter date: "Mon Oct 08 22:27:35 +0000 2018"

scope: weekdays
0 7 enums Sun Mon Tue Wed Thu Fri Sat
}scope
scope: months
1 12 enums Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
}scope

: twitter-?date ( addr u -- flag )
    (( \( letter c? letter c? letter c? \) \s         \ \1=weekday
       \1 ['] weekdays >body find-name-in 0= ?LEAVE   \ yeah, we can do that!
       \( letter c? letter c? letter c? \) \s         \ \2=month
       \2 ['] months >body find-name-in 0= ?LEAVE     \ yeah, we can do that!
       \( \d \d \) \s                                 \ \3=day
       \( \d \d \) ` : \( \d \d \) ` : \( \d \d \) \s \ \4:\5:\6=time
       {{ ` + \( || \( ` - }} \d \d `? : \d \d \) \s  \ \7=timezone
       \( \d \d \d \d \)                              \ \8=year
    )) ;
: twitter-date>ticks ( -- ticks )
    \8 s>number drop \2 ['] months >body find-name-in name>int execute
    \3 s>number drop ymd2day unix-day0 -
    #24 *
    \4 s>number drop + #60 * \5 s>number drop +
    \7 2 umin s>number drop   #60 *
    \7 dup 2 - /string s>unumber? 2drop over 0< IF - ELSE + THEN -
    #60 * \6 s>number drop +
    #1000000000 um* d>64 ;
previous

: twitter-date ( -- )
    ['] twitter-?date is ?date
    ['] twitter-date>ticks is date>ticks ;

cs-scope: twitter

object class{ tweets
    field: tweet[]
}class

object class{ tweet
    value: retweeted?
    value: truncated?
    value: favorited?
    value: possibly_sensitive?
    $value: source$
    value: entities{}
    value: extended_entities{}
    field: display_text_range[]#
    value: favorite_count#
    value: retweet_count#
    2value: in_reply_to_status_id&
    synonym in_reply_to_status_id_str& in_reply_to_status_id&
    2value: id&
    synonym id_str& id&
    2value: in_reply_to_user_id&
    synonym in_reply_to_user_id_str& in_reply_to_user_id&
    $value: in_reply_to_screen_name$
    64value: created_at!
    $value: full_text$
    $value: lang$
}class

object class{ entities
    field: hashtags[]
    field: media[]
    field: symbols[]
    field: polls[]
    field: user_mentions[]
    field: urls[]
}class

synonym extended_entities entities
synonym extended_entities-class entities-class

object class{ user_mentions
    $value: name$
    $value: screen_name$
    field: indices[]#
    2value: id&
    synonym id_str& id&
}class

object class{ urls
    $value: url$
    $value: expanded_url$
    $value: display_url$
    field: indices[]#
}class

object class{ hashtags
    $value: text$
    field: indices[]#
}class

synonym symbols hashtags
synonym symbols-class hashtags-class

object class{ media
    $value: expanded_url$
    field: indices[]#
    $value: url$
    $value: media_url$
    $value: media_url_https$
    2value: id&
    synonym id_str& id&
    2value: source_status_id&
    synonym source_status_id_str& source_status_id&
    2value: source_user_id&
    synonym source_user_id_str& source_user_id&
    $value: type$
    $value: display_url$
    value: sizes{}
    value: video_info{}
    value: additional_media_info{}
}class

object class{ sizes
    value: thumb{}
    value: small{}
    value: medium{}
    value: large{}
}class

object class{ thumb
    $value: resize$
    value: w#
    value: h#
}class

synonym small thumb
synonym medium thumb
synonym large thumb
synonym small-class thumb-class
synonym medium-class thumb-class
synonym large-class thumb-class

object class{ video_info
    field: aspect_ratio[]#
    value: duration_millis#
    field: variants[]
}class

object class{ variants
    value: bitrate#
    $value: content_type$
    $value: url$
}class

object class{ additional_media_info
    value: monetizable?
}class

object class{ polls
    field: options[]
    64value: end_datetime!
    value: duration_minutes#
}class

object class{ options
    value: position#
    $value: text$
}class

}scope

: twitter-scan ( -- )  twitter-date
    ['] twitter >body to schema-scope
    twitter:tweets-class to outer-class
    ['] twitter:tweets >body to schema-wid
    [: (name) 2drop (name) 2drop s" tweet" key$ $!
	['] noop is before-line ;] is before-line ;

\\\
Local Variables:
forth-local-words:
    (
     (("class{") definition-starter (font-lock-keyword-face . 1)
      "[ \t\n]" t name (font-lock-function-name-face . 3))
     (("}class") definition-ender (font-lock-keyword-face . 1))
    )
forth-local-indent-words:
    (
     (("class{") (0 . 2) (0 . 2))
     (("}class") (-2 . 0) (0 . -2))
    )
End:
[THEN]
